首页/网络/网络排障速查/iptables 计数器追踪拦截规则

iptables 计数器追踪拦截规则

用规则计数器定位是哪条规则吃掉了流量:-v 显示包数与字节数,多次采样看增量,比逐条猜规则快得多;nft 也用同思路看 counters。

网络排障速查网络更新于 2026-10-13

iptables 计数器追踪是什么

报文被防火墙悄悄丢弃时,日志里往往什么都没有。iptables 与 nftables 的每条规则都带包数与字节数计数器,用 -v 列出并多次采样看增量,就能判断到底是哪条规则吃掉了流量。相比逐条读规则猜逻辑,计数器把『哪条规则命中』从推理变成了观测,是排查入站被拦最快的手段。

基本信息

适用平台Linux(iptables-legacy / iptables-nft / nftables)
权限要求root 或具备 CAP_NET_ADMIN
关键选项-v 显示计数器、-n 数字显示、--line-numbers 显示规则序号
进阶手段临时插入 LOG 规则,或用 nft monitor trace 精确跟踪

典型使用场景

  • 端口不通但服务在监听:确认是否被本机防火墙规则拦下
  • NAT 与端口映射异常:查看 nat 表 PREROUTING 的 DNAT 计数
  • 规则顺序疑云:某条宽泛的 DROP 在允许规则之前,计数器会直接指出
  • 变更后回归验证:改完规则重新采样,确认目标规则开始命中

计数采样

计数采样
# 带序号列出规则与计数器
iptables -L INPUT -nv --line-numbers
# 每秒刷新观察哪条在增长
watch -n1 'iptables -L INPUT -nv --line-numbers | head -20'
# NAT 表需要单独看
iptables -t nat -L PREROUTING -nv --line-numbers
# nft 加 -a 显示 handle,便于精确操作
nft list ruleset -a | head -60

临时加日志定位

临时加日志定位
# 在指定位置插入一条只记录不拦截的规则
iptables -I INPUT 5 -p tcp --dport 8080 -j LOG --log-prefix 'BT-8080-DROP: '
# 实时观察内核日志中的命中记录
dmesg -w | grep BT-8080-DROP
# 排查结束务必删除该规则,避免日志刷爆磁盘
iptables -D INPUT -p tcp --dport 8080 -j LOG --log-prefix 'BT-8080-DROP: '

计数器判读

观察结果含义下一步
某条规则 pkts 为 0从未命中,可以先排除把注意力放到有增量的规则上
某条 DROP pkts 持续增长就是它在拦流量核对它的匹配条件与插入位置
ACCEPT 有增量但仍不通问题不在本机防火墙转去查对端、上游设备或应用监听
nat 表 DNAT 无增量报文没进到该链检查是否被更早的规则或 raw 表拦截
计数器是自规则创建以来的累计值,单次读数只能说明历史。要判断『现在还在不在拦』,必须隔一段时间再采一次样看增量。
改规则前先保存(iptables-save > rules.bak 或 nft list ruleset > rules.nft):误删 SSH 放行规则把自己关在门外,是最常见的高危事故。

易错点

  • 把累计值当当前状态:规则一周前命中过,今天早已不再拦,结论完全跑偏
  • 只看 OUTPUT 链却排查入站拦截:方向弄反,永远找不到那条规则
  • INSERT 位置写错把 LOG 放到 DROP 之后:永远没有日志,误判为规则未命中
  • 排查结束后忘记删除 LOG 规则:内核日志被刷爆,磁盘写满引发更大故障
  • 在 iptables-nft 上混用 legacy 命令:看到的规则集与内核实际生效的不一致

数据来源与参考

  • man 8 iptables(-v 计数器语义)
  • man 8 nft(counters 与 trace)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌