温馨提示×

centosiptables为何不生效

小樊
38
2026-08-29 09:53:33
栏目: 智能运维

CentOSiptables 规则不生效,通常不是“iptables 没配”,而是被别的防火墙或系统机制覆盖/拦截了。下面按最常见原因 → 排查 → 解决来讲。


一、最常见原因(CentOS 7/8 必看)

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

CentOS 7 以后 默认用 firewalld,它会:

  • 接管 netfilter
  • 覆盖你手动写的 iptables 规则

检查

systemctl status firewalld

解决(二选一)

方案 A:关闭 firewalld,用 iptables

systemctl stop firewalld
systemctl disable firewalld

然后确认 iptables 服务:

systemctl start iptables
systemctl enable iptables

方案 B:用 firewalld 而不是 iptables(推荐)

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

✅ 2. 规则顺序错误(REJECT / DROP 在前)

iptables 从头到尾匹配,第一条命中即生效

错误示例

iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

可能在你前面已经有:

-A INPUT -j REJECT

排查

iptables -nvL --line-number

正确写法示例

iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

✅ 3. 规则没保存,重启后丢失

iptables 规则 默认不持久

CentOS 6

service iptables save

CentOS 7+

yum install iptables-services -y
systemctl enable iptables
service iptables save

✅ 4. Docker / K8s 干扰

Docker 自动写 iptables 规则
K8s 用 iptables + ipvs

特征

  • 你加了规则,但 iptables -L 里有一堆 DOCKER-*
  • 端口仍然通 / 不通

排查

iptables -t nat -L -n

解决

Docker 启动参数:

--iptables=false

(不推荐,除非你非常清楚自己在做什么)


✅ 5. 规则写在错误的表 / 链

常见错误:

  • 放在 filter 却想做 NAT
  • 忘了 -t nat

NAT 示例

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

✅ 6. 系统未开启 IP 转发

SNAT / DNAT / 转发不生效

cat /proc/sys/net/ipv4/ip_forward

如果为 0

echo 1 > /proc/sys/net/ipv4/ip_forward

永久:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

✅ 7. 被 SELinux 限制(少见但存在)

getenforce

临时确认:

setenforce 0

二、快速自检清单(建议照着做)

# 1. 是否被 firewalld 抢权
systemctl status firewalld

# 2. 查看规则
iptables -nvL --line-number

# 3. 是否真的命中
iptables -nvL | grep -v "0     0"

# 4. 是否保存
service iptables save

# 5. ip_forward
cat /proc/sys/net/ipv4/ip_forward

三、CentOS 版本建议

CentOS 版本 建议
CentOS 6 iptables
CentOS 7 firewalld 或 iptables-services
CentOS 8 firewalld(iptables 已过时)

四、如果你愿意,我可以直接帮你定位

你可以直接贴出:

  1. CentOS 版本
  2. iptables -nvL
  3. 你执行的 iptables 命令
  4. 想实现什么效果(端口放行 / NAT / 防攻击)

我可以 直接给出精确命令,而不是泛泛而谈。

0