在 CentOS 上排查 iptables 问题,一般按“由浅入深”的思路来。下面给你一套实战排错流程,适用于 CentOS 6/7(CentOS 8 以后默认是 nftables,但 iptables 仍可兼容)。
systemctl status iptables
或
service iptables status
CentOS 7 默认可能没装 iptables-service
安装:
yum install iptables-services
systemctl enable iptables
systemctl start iptables
iptables -L -n -v
或看 NAT:
iptables -t nat -L -n -v
重点看:
pkts 列)ss -lntp
# 或
netstat -lntp
✅ 如果端口没监听,不是 iptables 的问题
iptables -L INPUT -n -v
常见错误:
iptables -A INPUT -j DROP
(放最后没问题,放前面就全拦)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
如果这样能通,说明就是规则问题。
千万别直接清空规则!
安全做法:
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
如果是云服务器:
原因:没保存
保存规则:
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
CentOS 7:
systemctl restart iptables
查看 NAT 表:
iptables -t nat -L -n -v
示例(DNAT):
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.10:80
iptables -t nat -A POSTROUTING -j MASQUERADE
还要开启转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IPTABLES-DROP: "
看日志:
dmesg | grep IPTABLES
# 或
tail -f /var/log/messages
systemctl status firewalld
如果同时用 iptables + firewalld,会冲突。
建议:
systemctl stop firewalld
systemctl disable firewalld
getenforce
排查时可临时关闭:
setenforce 0
iptables -L -n -v
iptables -t nat -L -n -v
iptables -F # 谨慎!会清空
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
service iptables save
如果你愿意,可以把:
iptables -L -n -v 输出贴出来,我可以帮你直接定位是哪条规则的问题。