在 CentOS 上 iptables 规则不生效,通常不是“iptables 坏了”,而是 系统默认防火墙机制或配置方式发生了变化。下面按 最常见原因 → 排查方法 → 解决方案 给你系统讲一遍。
这是 80% 的原因。
CentOS 7 / 8 / Stream:
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
然后重新加载 iptables:
systemctl restart iptables
CentOS 8 开始:
iptables 实际是 iptables-nft(兼容层)iptables -V
如果看到:
iptables v1.8.x (nf_tables)
说明用的是 nftables 后端
✅ 建议方案
systemctl status iptables
如果没启动:
systemctl start iptables
systemctl enable iptables
iptables 规则 默认不持久化
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
CentOS 7 以后:
iptables-save > /etc/sysconfig/iptables
iptables 是 顺序匹配
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
但前面已有:
iptables -A INPUT -j DROP
✅ 正确做法:
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
端口转发不生效,多半是:
iptables -t nat -A PREROUTING ...
查看 nat 表:
iptables -t nat -L -n -v
Docker 会 自动修改 iptables
排查:
iptables -L -n -v
如果你看到大量 DOCKER 链,说明被 Docker 管理
✅ 解决:
# 1. 是否启用 firewalld
systemctl status firewalld
# 2. iptables 是否运行
systemctl status iptables
# 3. 查看当前规则
iptables -L -n -v
# 4. 查看 nat 表
iptables -t nat -L -n -v
# 5. 查看 iptables 后端
iptables -V
firewalld
nftables
你可以直接把下面信息发我:
cat /etc/centos-release
iptables -V
iptables -L -n -v
我可以 直接给你正确可用的配置方案 ✅