防火墙规则不生效的关键在于规则是否真正加载进运行时、是否作用于正确zone、是否匹配流量五元组、是否有日志或连接状态验证;firewalld需--permanent加规则后执行--reload,iptables/nftables也须显式应用,且必须确认zone绑定、服务监听地址及报文实际到达情况。

防火墙规则配完不生效,是运维中最常踩的坑。关键不是“有没有加”,而是“加对没、加载没、匹配没、走对路没”。下面分四块说清楚怎么验证。
确认规则已真正加载进运行时
firewalld 的 --permanent 只写配置文件,不进内存;iptables/nftables 的规则也得显式应用才生效。只执行 firewall-cmd --permanent --add-port=8080/tcp 是不够的。
- firewalld:必须跟
firewall-cmd --reload才把永久规则载入运行时 - iptables:用
iptables-restore < rules.v4或service iptables reload(若启用服务) - nftables:用
nft -f /etc/nftables.conf或systemctl reload nftables - 验证方式:执行
firewall-cmd --list-ports或nft list chain inet filter input,看输出里是否真有你加的端口或规则
检查规则是否落在正确的作用域上
规则加在哪个 zone、哪个 interface、哪个 profile,直接决定它管不管用。默认 zone 是 public,但如果你的网卡绑到了 internal,那 public 上的规则就完全不参与匹配。
- 查默认 zone:
firewall-cmd --get-default-zone - 查网卡归属:
firewall-cmd --get-zone-of-interface=eth0(换成你的实际接口名) - 查所有 zone 规则:
firewall-cmd --list-all-zones | grep -A 5 "ports:" - 加规则时务必指定 zone:
firewall-cmd --zone=internal --add-port=22/tcp --permanent
验证流量路径与五元组是否匹配
规则按源IP、目的IP、源端口、目的端口、协议五项精确匹配。差一个字段,就不触发。尤其注意 NAT、SLB、负载均衡后源IP被改写的情况。
- 用
ss -tlnp或lsof -i :80确认服务监听的是哪个 IP 和端口(比如是0.0.0.0:80还是127.0.0.1:80) - 从客户端真实发请求:
curl -v http://your-ip/或telnet your-ip 8080,别只信命令返回 success - 抓包比对:
tcpdump -i any port 8080 -nn看报文是否到达服务器;再查sudo dmesg | tail -20看是否有 drop 日志 - 腾讯云等云防火墙需确认规则建在正确的边界(互联网/NAT/VPC),否则“启用”也是摆设
观察日志和连接状态反馈
光看规则列表是静态快照,要判断“当前是否生效”,得看动态行为——有没有命中的日志、连接数有没有增长、状态跟踪是否一致。
- 启用防火墙日志:
firewall-cmd --set-log-denied=all,然后journalctl -u firewalld -n 50 --no-pager - 查连接跟踪:
conntrack -L | grep :8080,确认 ESTABLISHED 状态是否持续存在 - iptables 规则计数器:
iptables -L INPUT -n -v | grep 8080,看 pkts 列是否在增加 - Windows 防火墙:开启日志后用
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=5156,5157}查允许/阻止事件


















