
iptables规则混乱时,核心是理清逻辑顺序、定位冗余规则、重建可维护结构。不靠蛮力删光重来,而是分步梳理,确保服务不中断、策略不失控。
先看清当前规则全貌
用带行号和数值化输出的命令一次性看全:
- iptables -L --line-numbers -n -v:显示所有链规则,含编号、包/字节数、IP和端口数字格式,避免DNS解析干扰
- 如只查 INPUT 链:iptables -L INPUT --line-numbers -n
- 若规则过多,加 | less 分页查看,或 | grep -E "(DROP|REJECT|192\.168)" 快速筛选关键项
识别并清理无效或冲突规则
常见混乱来源包括重复允许、顺序颠倒、宽泛规则压在精细规则之上。重点检查:
- 重复规则:相同匹配条件(如 -p tcp --dport 22 -s 10.0.0.0/24)出现多次,保留第一条,其余按行号删除
- 位置错误:比如“允许 ESTABLISHED 连接”规则写在了“拒绝所有 ICMP”之后——它就永远不生效。应确保状态跟踪规则靠前
- 宽泛覆盖:一条 -A INPUT -j ACCEPT 在中间,会让其后所有规则失效。找到它,评估是否真需全局放行;否则删掉
按逻辑分层重建规则结构
推荐固定顺序,符合数据包匹配流程,也便于后期维护:
-
第1层:本地通信与基础信任
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -
第2层:明确放行的服务
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT -
第3层:有约束的访问控制
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 5/sec -j ACCEPT -
第4层:兜底拒绝
iptables -P INPUT DROP(设为默认策略,而非最后加一条 -j DROP)
保存并验证规则持久性
临时规则重启即丢,必须显式保存:
- Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4
- CentOS/RHEL 6:service iptables save
- CentOS/RHEL 7+(使用 firewalld):不要直接改 iptables,改用 firewall-cmd 或切换回 iptables-services
- 验证是否生效:iptables-restore -t (语法测试)
规则整理不是一次操作,而是建立习惯:每次增删都用 -I 插入到合适位置、定期用 --line-numbers 检查、修改前先备份 iptables-save > backup-$(date +%F).rules。清晰比“能用”更重要。










