防火墙排查要先看数据包走哪条链,再看规则顺序。这里使用 CentOS 6.5 时代的 iptables filter 表说明基本思路,其他系统可能由 firewalld 或 nftables 管理,不要混用多个持久化入口。
查看规则与计数
iptables -L INPUT -n -v --line-numbers
iptables -L OUTPUT -n -v --line-numbers
iptables -S
行号便于定位,计数能帮助判断请求是否命中。INPUT 处理发往本机的包,OUTPUT 处理本机发出的包,FORWARD 用于转发;端口监听存在,并不代表包已通过这些规则。
顺序影响结果
规则通常按顺序匹配,已经被前面的终止规则接受或拒绝,后面的规则就不会再改变这次决定。追加一条允许规则,若位于更早的拒绝规则之后,就可能没有作用。
放行数据库端口时应同时限制来源范围、协议和目标端口,并考虑已建立连接和回包。不要为了修复某一个服务就清空所有规则,也不要把一条允许所有来源的规则永远插到第一行。
当前生效与持久化分开验证
运行时添加规则不一定自动保存到配置。CentOS 6 的配置文件通常由 iptables 服务加载,后续发行版则可能采用不同机制。修改前保存现状,保留远程管理连接,新增一个连接测试,再按系统约定持久化。
按行号删除规则前应重新查询,因为前一次增删会改变编号。默认策略、回环接口、IPv6 和外部安全组也都要检查。验证成功是受允许来源可以访问、非允许来源被阻止,且重启加载后的行为一致。
参考:Netfilter 文档。