1、计数器归零 + 差值对比
【说明】:不加任何规则,只看哪条规则的命中数涨了,哪条 REJECT/DROP 的 pkts 从 0 变成非 0,就是它的问题
#归零全表计数器
iptables -Z
#复现(在容器里发一次请求)
docker exec <ID> curl -s -m 3 http://IP:8443/nodes
#查看所有链里 DROP/REJECT 的命中数
iptables -L -n -v | grep -E ‘Chain|DROP|REJECT’
.
2、加上LOG 规则
【说明】:LOG 只表示”包到了这条链”,不表示”被哪条规则杀的”,所以要配合1中的计数器一起看
#插入–limit 防止日志刷爆
iptables -I INPUT 1 -p tcp –dport 8443 -j LOG \ –log-prefix “TRACE8443: ” -m limit –limit 5/min
#复现(在容器里发一次请求)
docker exec <ID> curl -s -m 3 http://IP:8443/nodes
#看日志
dmesg -T | grep TRACE8443
#删除LOG(规则描述必须和插入时完全一致)
iptables -D INPUT -p tcp –dport 8443 -j LOG –log-prefix “TRACE8443: ” -m limit –limit 5/min
#日志样例及解析
“N=docker_gwbridge OUT= PHYSIN=veth16114e8 SRC=172.17.0.19 DST=10.20.26.8 DPT=8443 SYN“
IN=docker_gwbridge:包从这个网桥进来的 → 所以它被划到哪个 firewalld zone 决定了命运
OUT= 为空 + 出现在 INPUT 链 → 说明目标地址是本机地址,走 INPUT 不走 FORWARD
SRC=172.17.0.19:容器 IP,不是 lo
.
3.raw 表 TRACE
【说明】:可以跟踪”包经过了哪张表、哪条链、第几条规则、最终判决是什么”的完整路径
modprobe nf_log_ipv4
sysctl -w net.netfilter.nf_log.2=nf_log_ipv4
iptables -t raw -I PREROUTING -p tcp –dport 8443 -j TRACE
iptables -t raw -I OUTPUT -p tcp –dport 8443 -j TRACE
dmesg -w # 另开窗口,然后复现
日志:TRACE: filter:INPUT:rule:7 … / TRACE: filter:IN_public:policy:…
.
.
.