iptables封IP必须加-s和-j DROP,顺序不能错;漏-s或误用-d会导致规则不匹配,-j DROP不可随意替换为-j REJECT,否则可能被扫描器误判为端口开放。
直接执行 iptables -A INPUT -s 192.168.1.100 -j DROP 就能生效,但很多人漏掉 -s(源地址)或写成 -d(目标地址),结果规则不匹配;-j DROP 也不能换成 -j REJECT 后不测试——前者静默丢包,后者会发 RST 包,某些扫描器反而会把它当“端口开放”信号继续试探。
常见错误现象:
-s 或写错了链名(比如用了 OUTPUT 而不是 INPUT)ESTABLISHED 规则之后再加封禁规则封单个 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 个地址(0–255)/16 → 覆盖 65536 个地址(如 192.168.0.0/16)/32 封单个 IP,虽然语法合法,但语义冗余,直接写 IP 更清晰执行 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。
性能影响:
ipset(尤其要封几百个散 IP 时)FORWARD 链乱加 DROP——你不是路由器,大概率不需要碰这条链DROP 远不够。