Skip to content

🐛 调试与排错

规则没生效?先查这 5 个地方

iptables 规则不生效是新手最头疼的问题。按下面的清单逐一排查:

#检查项命令常见原因
1规则顺序iptables -L -v -n --line-numbers放行规则在拒绝规则后面,永远匹配不到
2表是否正确iptables -t nat -L -nNAT 规则写到了 filter 表,或反之
3默认策略iptables -L -n | head -5默认策略是 ACCEPT,所有规则形同虚设
4其他程序干扰iptables -L -v -n | grep -c ""Docker/ufw/firewalld 自动插入了规则
5网络路径traceroute -T 目标IP数据包根本没到这台机器(中间有防火墙)

Docker 和 iptables 的恩怨

Docker 启动后会自动修改 iptables 规则(创建 DOCKER 链、修改 FORWARD 策略等)。这是很多"iptables 规则莫名消失"的元凶。

bash
# 查看 Docker 插入的规则
iptables -L DOCKER -v -n
iptables -L DOCKER-USER -v -n

# 在 DOCKER-USER 链里添加自定义规则(Docker 不会清空它)
# 注意:必须加在 DOCKER-USER,不是 INPUT!
iptables -I DOCKER-USER 1 -s 10.0.0.0/8 -j ACCEPT
iptables -I DOCKER-USER 2 -j DROP

# 彻底禁止 Docker 修改 iptables(慎用,端口映射、NAT 和容器网络都可能受影响)
# 在 /etc/docker/daemon.json 中设置:
# { "iptables": false }

⚠️ 注意: ⚠️ 血泪教训:很多教程教你在 INPUT 链里加规则限制 Docker 容器端口。但 Docker 端口映射走的是 PREROUTING → DOCKER 链,根本不经过 INPUT。你加了也白加!必须在DOCKER-USER链里操作。

常见排错命令速查

bash
# 查看规则计数器(看哪些规则匹配到了流量)
iptables -L -v -n
# pkts 列不为 0 的规则在工作
# pkts 为 0 的规则要么没流量触发,要么在它前面就被拦截了

# 查看某个链的详细信息(带行号)
iptables -L INPUT -v -n --line-numbers

# 查看 raw 表(连接追踪之前)
iptables -t raw -L -v -n

# 查看 mangle 表(包修改)
iptables -t mangle -L -v -n

# 实时监控规则匹配(watch 每 2 秒刷新)
watch -n 2 'iptables -L -v -n | head -20'

# 用 tcpdump 抓包验证(看数据包是否到达本机)
tcpdump -i eth0 port 80 -nn -c 10

# 用 iptables 的 NFLOG 配合 ulogng2 分析
iptables -A INPUT -j NFLOG --nflog-group 1
ulogd2 -c /etc/ulogd.conf  # 需要安装 ulogd2