排查防火墙规则顺序不当的核心是验证规则是否被真正匹配及匹配位置,需用--line-numbers查编号、-v看包计数、确认lo/established/白名单前置,并检查默认策略是否掩盖问题。

排查防火墙规则顺序不当导致的拦截失效,核心是验证“规则是否被真正匹配”以及“匹配是否发生在预期位置”。顺序错不是规则没写,而是它根本没机会执行。
看规则带编号,确认实际执行顺序
别只用 iptables -L,必须加 --line-numbers:
-
sudo iptables -L INPUT -n --line-numbers—— 查 INPUT 链每条规则的位置编号 -
sudo iptables -t nat -L -n --line-numbers—— NAT 表单独查,避免和 filter 混淆 - 重点看 DROP/REJECT 规则出现在第几行:如果它在放行规则(如允许 22 端口)前面,那后面那条就永远不生效
查包计数,验证哪条规则真在起作用
规则写了≠在用。靠计数才能知道流量到底被谁拦了:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
-
sudo iptables -L INPUT -n -v——-v显示 packets 字段,观察某条 DROP 规则的计数是否持续上涨 - 如果某条
-j DROP的 packets 增长很快,而你期望放行的端口规则计数为 0,说明流量根本没走到那条规则——大概率被前面的规则截断了 - 临时把可疑的 DROP 规则删掉或移到末尾,再测试请求是否恢复,可快速定位
检查基础放行是否前置,避免连自己都拦死
很多顺序问题其实源于漏掉了关键前置规则:
- 本地回环(
-i lo -j ACCEPT)必须在最前,否则本机自测都失败 - 已建立连接(
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT)也得靠前,否则 SSH 响应包被 DROP,会直接断连 - SSH 白名单(如
-p tcp --dport 22 -s 192.168.10.0/24 -j ACCEPT)要放在通用 DROP 之前,否则一设默认策略就锁死
验证默认策略是否掩盖了顺序问题
默认策略是“兜底”,但它会让顺序错误更隐蔽:
- 运行
sudo iptables -S | grep "^:INPUT"查当前 INPUT 默认策略,如果是:INPUT DROP,而你又没写任何 ACCEPT 规则,那所有流量都会被默认拦住——看起来像规则没生效,其实是根本没匹配到任何显式规则 - 临时切回
sudo iptables -P INPUT ACCEPT,再测试服务是否恢复;若恢复,说明问题出在规则缺失或顺序错,而非策略本身 - firewalld 用户注意:
public区域默认 target 是default(等效 DROP),不是 ACCEPT,容易误判










