理顺iptables规则的关键是厘清执行顺序、删除冗余、合并同类、固化底线。先用带行号命令查现状,识别重复允许/拒绝、缺established放行、端口重复、nat与filter不匹配等混乱模式,再分步删冗余、移关键规则至前、合多端口为一、设默认drop并加reject提示,最后保存防丢失。

iptables规则混乱,本质是规则顺序错、冗余多、逻辑不清。解决关键不在删多少,而在理清“谁该先过、谁该拦住、谁不该管”。下面从实操角度说清楚怎么把一团乱麻的规则理顺。
先看清现状:用带序号的方式列出规则
直接运行命令,别只看-L:
- sudo iptables -L INPUT -n --line-numbers —— 只看INPUT链,带行号,最常用
- sudo iptables -t nat -L -n --line-numbers —— 查NAT类规则,避免和filter规则混在一起
- sudo iptables -S —— 输出原始命令格式,适合备份或复盘逻辑(比如看到-A INPUT -j DROP在第20行,就知道它可能挡住了后面所有规则)
识别典型混乱模式
以下情况一出现,基本就是规则失控信号:
- 同一IP或网段被反复允许又拒绝(如先-A INPUT -s 192.168.1.100 -j ACCEPT,后面又-D INPUT -s 192.168.1.100 -j DROP,但没删干净)
- 默认策略是DROP,但没放通ESTABLISHED/RELATED连接,导致SSH断连后无法恢复
- 大量重复端口规则(比如80端口被写了5条ACCEPT,分散在不同位置)
- nat表里PREROUTING和POSTROUTING规则与filter表中的INPUT/FORWARD不匹配(例如做了DNAT却没开FORWARD或对应INPUT)
分步整理:删、移、合、固
不建议一次性全清,按节奏操作更稳妥:
- 删冗余:用行号精准删除,比如sudo iptables -D INPUT 7删第7条;或按条件删,如sudo iptables -D INPUT -s 10.0.0.0/8 -j DROP
- 移顺序:把关键基础规则提到前面——本地回环(-i lo)、已建立连接(-m conntrack --ctstate ESTABLISHED,RELATED)、SSH白名单(-p tcp --dport 22 -s 192.168.10.0/24)
- 合同类:把多个端口合并成一条,如HTTP/HTTPS/DNS:-p tcp -m multiport --dports 22,80,443 -j ACCEPT;UDP也可类似处理
- 固底线:整理完务必设置默认策略,例如sudo iptables -P INPUT DROP,再确认最后一条是-j REJECT --reject-with icmp-host-prohibited(比DROP更友好,便于排障)
保存和防丢失
Linux重启后规则消失是常态,必须固化:
- Ubuntu/Debian:sudo iptables-save > /etc/iptables/rules.v4
- CentOS 6:sudo service iptables save
- CentOS 7+(使用iptables-services):sudo iptables-save > /etc/sysconfig/iptables,再systemctl restart iptables
- 额外建议:每次大改前执行sudo iptables-save > /root/iptables-$(date +%F).bak,留个退路









