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 放行规则把自己关在门外,是最常见的高危事故。