最直接方式是执行 sudo iptables -vnL INPUT --line-numbers,其中 -v 显示匹配的包数(pkts)和字节数(bytes),-n 禁用DNS解析确保准确快速,--line-numbers 标注规则序号便于定位与操作。

直接用 iptables -L -v 就能看到每条规则匹配的数据包(pkts)和字节数(bytes),这是验证策略是否真正在起作用最直接的方式。光看规则列表没用,关键得看计数器有没有增长。
用 -v 参数显示真实命中情况
-v(verbose)会强制显示每条规则的匹配统计,输出开头两列就是 pkts 和 bytes。如果某条规则长期显示 0 pkts,说明它根本没被触发——可能流量没经过这条链,也可能被上面更早的规则截断了。
- 执行
sudo iptables -vnL INPUT查看 INPUT 链所有规则及其命中数据 - 加
--line-numbers可同时看到规则序号,方便定位:sudo iptables -vnL INPUT --line-numbers - 若想专注某端口,配合
grep快速筛选,例如查 SSH:sudo iptables -vnL INPUT | grep ':22'
结合 -n 避免解析延迟,确保输出准确
-n 禁用 DNS 反向解析,让 IP 和端口以纯数字形式显示。不加 -n 时,iptables 会尝试把地址转成主机名,不仅慢,还可能卡住或显示错误别名,干扰判断。
- 正确组合是
-vnL或-L -v -n,顺序不影响功能 - 例如
sudo iptables -vnL OUTPUT能快速看清哪些出站连接被放行或拦截 - 特别注意:没有
-n时,anywhere这类显示不可靠,实际可能是0.0.0.0/0或::/0
确认规则生效,不能只看列表,要测+观察
规则写进去了,不代表它在工作。必须有真实流量经过,并观察计数器变化。
- 从另一台机器访问目标端口(如
curl http://server:80或telnet server 22) - 立刻再执行一次
sudo iptables -vnL INPUT | grep ':80',对比 pkts 是否增加 - 如果没变,检查链默认策略(Chain policy DROP/ACCEPT)、接口匹配(in=eth0)、协议类型(tcp/udp)是否一致
- 临时清空计数器可辅助测试:
sudo iptables -Z INPUT(慎用,生产环境会影响监控)
别忘了多表结构,filter 不是全部
iptables -L 默认只查 filter 表,但实际策略常分布在其他表里:
- 端口转发、SNAT/DNAT 在 nat 表:用
sudo iptables -t nat -vnL - QoS、TTL 修改、连接跟踪绕过在 mangle 或 raw 表:分别用
-t mangle、-t raw - 一条规则看似没命中,可能是因为它根本不在 filter 表里,而在 nat 的 PREROUTING 链中提前处理了


















