验证防火墙规则是否生效需四步:一查请求是否抵达主机,用tcpdump抓SYN包;二查规则计数器是否增长;三验拦截动作(DROP超时、REJECT报错);四排顺序冲突,确保ESTABLISHED规则在前、放行规则在默认DROP前。

测试防火墙规则是否真正生效,不能只看规则列表,关键要验证“请求是否被拦、为何被拦、拦得对不对”。下面分四步实操验证。
确认请求是否抵达主机
很多问题其实出在防火墙之前——云平台安全组、负载均衡、前置 NAT 或物理网络策略已把包拦掉了。先绕过这些干扰:
- 用 tcpdump 抓包确认 SYN 是否到达本机: tcpdump -i any port 80 -c 3(访问 Web 时执行,看到 SYN 就说明流量到了)
- 如果没抓到任何包,检查云控制台的安全组、VPC 网络 ACL 或宿主机 iptables 的 raw 表(PREROUTING 链可能提前丢包)
- 本地 curl 测试需加 -v 或 -I,避免因 DNS 或超时误判
检查规则计数器是否增长
iptables/nftables 规则带计数器(pkts 列),这是最直接的命中证据:
- 运行 iptables -L INPUT -n -v,记下目标规则当前 pkts 值
- 从外部发起一次请求(如 curl -I http://服务器IP)
- 再次查看该规则 pkts 是否 +1;若没变,说明请求根本没匹配到这条规则——可能是协议/端口写错、源 IP 不符,或规则顺序靠后被前面的 DROP 截断
验证拦截动作是否执行到位
DROP 和 REJECT 效果不同,测试方式也不同:
- DROP:客户端会卡住、超时(无响应),用 curl -v 可见 connection timed out
- REJECT:客户端立刻收到 RST 包,curl 显示 Connection refused
- 临时封禁某 IP 后,用另一台机器 ping 或 telnet 测试,确认所有端口都不可达(不只是 Web)
- 若只封了 80 端口但 SSH 仍通,说明规则生效;若 SSH 也断了,大概率是 -I 插入位置错误,把 DROP 放到了 ESTABLISHED 规则前面
排查规则顺序与默认策略冲突
iptables 自上而下匹配,顺序决定一切:
- 用 iptables -L INPUT -n --line-numbers 查看规则序号
- 确保 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 在所有放行规则之前(通常第 1 行)
- 确保具体放行规则(如开放 22 端口)在默认 DROP 策略之前;否则 -A INPUT -j DROP 之后的规则永远不生效
- firewalld 用户注意:firewall-cmd --list-all 显示的是最终合并规则,但实际生效顺序由 zone 优先级和 rich rule 位置决定,富规则建议用 --permanent 持久化后 reload


















