在操作之前请先停下,iptables 封禁 IP 地址看似简单,实则隐藏许多容易忽略的细节。许多用户误以为只需执行 iptables -A INPUT -s 192.168.1.100 -j DROP 即可生效,结果往往规则未起作用,甚至误封自己。要让 iptables 规则正确且稳定地运行,必须掌握以下关键要点。

iptables 封禁 IP 必须使用 -s 和 -j DROP,且顺序不可颠倒
直接运行 iptables -A INPUT -s 192.168.1.100 -j DROP 即可生效,但许多用户容易遗漏 -s(源地址)或误用 -d(目标地址),导致规则无法匹配;此外,-j DROP 不可随意替换为 -j REJECT 而不进行测试——前者静默丢弃数据包,后者会发送 RST 包,某些扫描工具反而会将其视为“端口开放”的信号而继续探测。
常见错误现象:
- 命令执行无报错,但 IP 依然能 SSH 连接:通常原因是缺少
-s或链名错误(例如使用了OUTPUT而非INPUT) - 封禁后自己也无法连接:规则位置太靠前,阻塞了本机回环或已建立的连接,建议在
ESTABLISHED相关规则之后添加封禁规则
封禁单个 IP 与封禁网段的用法不同,/24 并非简单“将最后一位改为0”
封禁单个 IP:iptables -I INPUT -s 203.0.113.45 -j DROP;封禁网段则必须使用 CIDR 表示法,例如封禁整个 C 段应写 203.0.113.0/24,而不是 203.0.113.* 或 203.0.113.0/255.255.255.0——iptables 仅接受斜杠格式。
参数差异:
/24掩码覆盖 256 个 IP 地址(0-255)/16掩码覆盖 65536 个地址(如192.168.0.0/16)- 尽量避免用
/32封禁单个 IP,虽然语法合法但语义冗余,直接写 IP 更清晰
规则无法删除?先查看行号,再使用 -D 加编号,无需记忆完整规则
执行 iptables -L INPUT -n --line-numbers,输出结果的第一列即为行号。若想删除第 3 条规则,直接使用 iptables -D INPUT 3。如果试图用 -D 加完整规则(如 iptables -D INPUT -s 203.0.113.45 -j DROP),必须保证参数顺序、空格、大小写与添加时完全一致——哪怕多一个空格也会导致失败。
容易踩的坑:
- 误删其他规则:行号会随增删动态变化,删除前务必重新执行
--line-numbers确认当前编号 - 删了没生效:规则仍在内存中,但未保存到持久化文件,重启后恢复——这不是删除失败,而是遗漏了保存步骤
重启后规则丢失?不同操作系统的保存方法截然不同
Debian/Ubuntu 安装 iptables-persistent,保存命令为 iptables-save > /etc/iptables/rules.v4;CentOS 7 使用 service iptables save;CentOS 8+ 默认不含 iptables 服务,需安装 iptables-services 或改用 nftables。
性能影响:
- 规则数量越多,匹配速度越慢,超过 50 条时建议改用
ipset(尤其在需要封禁数百个分散 IP 时) - 不要在
FORWARD链上随意添加 DROP 规则——如果不是路由器,通常无需操作此链
在实际操作中,最容易忽略的正是规则加载顺序与持久化机制。封禁 IP 虽只需一条命令,但其生效依赖于链位置、保存操作以及是否与其他规则冲突——仅仅添加一条 DROP 规则远远不够。
