linux防火墙规则未生效,主因是规则未加载进内核或被firewalld/nftables覆盖;需确认运行态规则、使用正确命令(如nft list ruleset)、避免顺序错误,并检查匹配计数是否为0。

Linux防火墙规则未生效,通常不是规则写错了,而是没真正加载进内核或被其他机制覆盖。关键要确认规则是否进入运行态,而不是只保存在配置文件里。
iptables规则未执行:service未重启或命令未加sudo
直接用 iptables -A INPUT ... 添加的规则,只在当前会话生效,系统重启即丢失;若用脚本或配置文件(如 /etc/sysconfig/iptables)设置,必须显式重载:
- CentOS 6/7:运行
sudo service iptables restart或sudo systemctl restart iptables - Ubuntu/Debian:默认用
ufw,需sudo ufw enable启用,或sudo ufw reload - 手动添加后忘记
sudo,普通用户无权限写入内核规则表,命令看似成功实则静默失败
nftables替代iptables但旧规则未迁移
较新发行版(如 CentOS 8+、Fedora 33+、Ubuntu 20.04+)默认启用 nftables,iptables 命令只是兼容封装层。此时:
-
iptables-save输出可能为空,因为实际规则存在nft表中 - 应改用
nft list ruleset查看真实规则 - 若坚持用 iptables 语法,确保安装
iptables-nft并确认服务是nftables而非iptables
firewalld正在运行,接管了底层规则
firewalld 是动态管理工具,它会在后台调用 iptables 或 nftables,但直接操作底层命令会被 firewalld 下次重载覆盖:
- 运行
systemctl status firewalld确认是否启用 - 若启用,应使用
firewall-cmd添加规则,例如:sudo firewall-cmd --permanent --add-port=8080/tcpsudo firewall-cmd --reload - 临时停用 firewalld:
sudo systemctl stop firewalld(仅调试用,生产环境慎用)
规则顺序或匹配条件导致“看似无效”
iptables/nftables 是顺序匹配,一旦某条规则匹配并决定 ACCEPT/DROP,后续规则不再检查:
- 常见错误:在
-j ACCEPT规则后加-j DROP,结果所有流量都被前面的 ACCEPT 放行 - 源IP、接口名(如
eth0vsens33)、协议(--tcp未指定--dport)写错,导致规则根本没命中 - 用
iptables -L -n -v查看每条规则的匹配包计数,为 0 表示从未触发,说明条件不匹配










