在 CentOS 上 iptables 规则“失效”,通常不是 iptables 本身坏了,而是被其他机制覆盖、未持久化、或被 firewalld/nftables 接管。下面按最常见原因 → 排查方法 → 解决方案来说明。
CentOS 7/8 默认使用 firewalld,它会动态管理 netfilter,你手动写的 iptables 规则会被覆盖。
systemctl status firewalld
✅ 如果看到 active (running):
解决方式(二选一):
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
systemctl stop firewalld
systemctl disable firewalld
systemctl start iptables
systemctl enable iptables
CentOS 不会自动保存 iptables 规则
iptables -L
# 重启后规则消失
✅ 保存规则:
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
/etc/init.d/iptables save
iptables 从上到下匹配,第一条命中即停止
❌ 示例错误:
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
✅ 正确写法:
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
常见错误:
| 场景 | 正确位置 |
|---|---|
| 端口放行 | INPUT |
| NAT | nat 表 |
| 转发 | FORWARD |
❌ 示例错误:
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
# 但流量是到本机
✅ 排查:
iptables -nvL --line-number
CentOS 8 开始,iptables 实际是 nftables 的兼容层
systemctl status nftables
✅ 解决:
nftablesDocker 会自动插入规则
iptables -t nat -L
✅ 建议:
--iptables=false(不推荐)规则绑定了错误网卡:
iptables -A INPUT -i eth0 ...
但系统实际是:
ip addr
# ens33 / enp0s3
# 1. 是否 active
systemctl status firewalld
systemctl status iptables
# 2. 是否真的生效
iptables -nvL
# 3. 是否被 nftables 接管
lsmod | grep nf_tables
# 4. 规则顺序
iptables -nvL --line-number
# 5. 是否保存
cat /etc/sysconfig/iptables
systemctl stop firewalld
systemctl disable firewalld
iptables -F
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j DROP
service iptables save
systemctl enable iptables
CentOS 上 iptables 失效,99% 是因为 firewalld 在运行、规则没保存、或顺序写错。
如果你愿意,可以把下面信息贴出来,我可以直接帮你定位是哪一条原因:
cat /etc/centos-release)iptables -nvL 输出