温馨提示×

centos iptables为何策略不生效

小樊
39
2026-10-11 13:59:04
栏目: 智能运维

在 CentOS 上 iptables 规则配置了但不生效,通常不是命令写错,而是被其他机制拦截或覆盖。下面按「最常见原因 → 排查方法」给你一个完整清单。


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

1️⃣ firewalld 正在运行(CentOS 7+ 最常见)

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

systemctl status firewalld

✅ 解决方式(二选一):

方式 A:关闭 firewalld(推荐测试环境)

systemctl stop firewalld
systemctl disable firewalld

方式 B:用 firewalld 管理(生产推荐)

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

2️⃣ 规则加错链 / 顺序不对

iptables 是顺序匹配,第一条命中就结束。

❌ 错误示例:

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

→ 22 永远不会生效

✅ 正确:

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

3️⃣ 没保存 iptables(重启就丢)

CentOS 7+ 默认 不会自动保存 iptables

iptables-save

保存(CentOS 7):

iptables-save > /etc/sysconfig/iptables

或安装:

yum install iptables-services
systemctl enable iptables

4️⃣ 规则在错误的表

iptables 有多个表:

表 用途
filter 默认(拦截/放行)
nat 端口映射
mangle 修改包

❌ 错误:

iptables -t nat -A INPUT ...

(INPUT 不在 nat 表)

✅ filter 表才是 INPUT/OUTPUT/FORWARD


5️⃣ 被 Docker / K8s 接管

Docker 会自动写 iptables 规则,且优先级很高。

查看:

iptables -L -n -v

Docker 规则通常在:

  • DOCKER
  • DOCKER-USER

✅ 正确做法:

iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP

6️⃣ 网络层面问题(不是 iptables)

  • 安全组(云服务器)
  • 上游防火墙
  • SELinux

快速验证:

setenforce 0

二、快速排错命令(必会)

# 查看规则
iptables -L -n -v

# 看是否有 hit
iptables -L -n -v --line-number

# 看 nat
iptables -t nat -L -n -v

# 跟踪包(高级)
iptables -A INPUT -j LOG --log-prefix "IPT:"
dmesg | grep IPT

三、推荐标准做法(CentOS 7+)

✅ 要么用 firewalld ✅ 要么用 iptables-services ❌ 不要混用


四、你可以直接告诉我

如果你愿意,可以贴出:

  1. CentOS 版本(cat /etc/redhat-release)
  2. iptables -L -n
  3. 你想实现什么(如:禁止某 IP / 开放端口)

我可以直接帮你写正确且能生效的规则。

0 踩