温馨提示×

centos iptables为何失效

小樊
34
2026-07-07 22:23:34
栏目: 智能运维

CentOSiptables 规则“失效”,通常不是 iptables 本身坏了,而是被其他机制覆盖、未持久化、或被 firewalld/nftables 接管。下面按最常见原因 → 排查方法 → 解决方案来说明。


一、最常见原因汇总(90% 都在这里)

✅ 1. firewalld 正在运行(最常见)

CentOS 7/8 默认使用 firewalld,它会动态管理 netfilter,你手动写的 iptables 规则会被覆盖。

systemctl status firewalld

✅ 如果看到 active (running)

解决方式(二选一):

✅ 方案 A:用 firewalld(推荐)

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

✅ 方案 B:停用 firewalld,改用 iptables

systemctl stop firewalld
systemctl disable firewalld
systemctl start iptables
systemctl enable iptables

✅ 2. iptables 规则没有保存(重启后失效)

CentOS 不会自动保存 iptables 规则

iptables -L
# 重启后规则消失

✅ 保存规则:

CentOS 7

service iptables save
# 或
iptables-save > /etc/sysconfig/iptables

CentOS 6

/etc/init.d/iptables save

✅ 3. 规则顺序错误(被前面的规则匹配)

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

✅ 4. 规则加错表 / 链

常见错误:

场景 正确位置
端口放行 INPUT
NAT nat
转发 FORWARD

❌ 示例错误:

iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
# 但流量是到本机

✅ 排查:

iptables -nvL --line-number

✅ 5. nftables 接管(CentOS 8+)

CentOS 8 开始,iptables 实际是 nftables 的兼容层

systemctl status nftables

✅ 解决:

  • 统一使用 nftables
  • 或完全禁用 nftables 并回退 iptables

✅ 6. Docker / K8s 覆盖 iptables

Docker 会自动插入规则

iptables -t nat -L

✅ 建议:

  • 不要手动删除 Docker 规则
  • 使用 --iptables=false(不推荐)
  • 或配合 Docker 规则写策略

✅ 7. 网络接口不匹配

规则绑定了错误网卡:

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

三、正确示例(CentOS 7 稳定写法)

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 在运行、规则没保存、或顺序写错。

如果你愿意,可以把下面信息贴出来,我可以直接帮你定位是哪一条原因

  1. CentOS 版本(cat /etc/centos-release
  2. 你执行的 iptables 命令
  3. iptables -nvL 输出
  4. 是否使用 Docker / K8s

0