在 CentOS 上 iptables 规则不生效,通常不是“iptables 没配”,而是被别的防火墙或系统机制覆盖/拦截了。下面按最常见原因 → 排查 → 解决来讲。
CentOS 7 以后 默认用 firewalld,它会:
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
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
iptables 规则 默认不持久
service iptables save
yum install iptables-services -y
systemctl enable iptables
service iptables save
Docker 自动写 iptables 规则
K8s 用 iptables + ipvs
iptables -L 里有一堆 DOCKER-*iptables -t nat -L -n
Docker 启动参数:
--iptables=false
(不推荐,除非你非常清楚自己在做什么)
常见错误:
filter 却想做 NAT-t natiptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
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
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 6 | iptables |
| CentOS 7 | firewalld 或 iptables-services |
| CentOS 8 | firewalld(iptables 已过时) |
你可以直接贴出:
iptables -nvL我可以 直接给出精确命令,而不是泛泛而谈。