在 CentOS 上 iptables 规则配置了但不生效,通常不是命令写错,而是被其他机制拦截或覆盖。下面按「最常见原因 → 排查方法」给你一个完整清单。
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
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
CentOS 7+ 默认 不会自动保存 iptables
iptables-save
保存(CentOS 7):
iptables-save > /etc/sysconfig/iptables
或安装:
yum install iptables-services
systemctl enable iptables
iptables 有多个表:
| 表 | 用途 |
|---|---|
| filter | 默认(拦截/放行) |
| nat | 端口映射 |
| mangle | 修改包 |
❌ 错误:
iptables -t nat -A INPUT ...
(INPUT 不在 nat 表)
✅ filter 表才是 INPUT/OUTPUT/FORWARD
Docker 会自动写 iptables 规则,且优先级很高。
查看:
iptables -L -n -v
Docker 规则通常在:
✅ 正确做法:
iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP
快速验证:
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
✅ 要么用 firewalld ✅ 要么用 iptables-services ❌ 不要混用
如果你愿意,可以贴出:
cat /etc/redhat-release)iptables -L -n我可以直接帮你写正确且能生效的规则。