在 CentOS 上 iptables 规则不生效,通常不是“iptables 没写对”,而是 系统环境或执行方式 的问题。下面按 最常见原因 → 排查方法 → 解决方案 给你系统梳理。
CentOS 7+ 默认使用 firewalld,它会接管 netfilter,iptables 规则可能被覆盖或忽略。
systemctl status firewalld
✅ 方案 A:关闭 firewalld,使用 iptables(传统方式)
systemctl stop firewalld
systemctl disable firewalld
yum install -y iptables-services
systemctl enable iptables
systemctl start iptables
然后重新写入规则:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
service iptables save
✅ 方案 B:直接用 firewalld(推荐)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
但 前面已经有 DROP / REJECT 规则,导致永远匹配不到。
iptables -nvL INPUT --line-number
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
service iptables save
service iptables save
# 或
/usr/libexec/iptables/iptables.init save
ip addr
iptables -nvL -v
iptables -t nat -L -n
✅ 解决:
vim /etc/docker/daemon.json
{
"iptables": false
}
然后重启 Docker(⚠️ 会影响容器网络)
lsmod | grep ip_tables
modprobe ip_tables
modprobe iptable_filter
getenforce
setenforce 0
iptables -t nat -A PREROUTING ...
iptables -L
✅ 正确:
iptables -t nat -L
# 1. 是否 firewalld 在运行
systemctl status firewalld
# 2. iptables 是否真的生效
iptables -nvL INPUT
# 3. 是否保存
service iptables save
# 4. 是否有 Docker
docker ps
# 5. 包是否真的经过该链
iptables -nvL | grep -c packets
你可以直接贴这些信息(复制即可):
cat /etc/os-release
systemctl status firewalld
iptables -nvL INPUT
iptables -nvL -t nat
我可以 直接告诉你哪一条规则没生效、为什么、怎么改。