为什么原始 PREROUTING 的 iptables 字节数为 0?

为什么原始 PREROUTING 的 iptables 字节数为 0?

我计划用它iptables来测量我的互联网流量(受到 Peter Krumins 的精彩文章的启发http://www.catonmat.net/blog/traffic-accounting-with-iptables)。

用于测量流量的计算机当前转发往返于互联网的所有 LAN 流量。

我试图找出所有传输字节(上传+下载)都计算在哪些链中。filter FORWARD打开几个网站后,该链是唯一一个超过 1 兆字节的链(它显示17M)。它似乎是下载(+ 可能是上传)。

但以下的观察让我产生了怀疑:

me@computer:~$ sudo iptables -vL -t raw
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
me@computer:~$ sudo iptables -vL -t raw
Chain PREROUTING (policy ACCEPT 34 packets, 2244 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 16 packets, 2664 bytes)
 pkts bytes target     prot opt in     out     source               destination         

尽管我访问了一些网站,但该链在第一次raw PREROUTING运行时仍然有 0 个字节(第一次运行的执行时间长达一秒多)。几秒钟后,这两条链都超过 2000 个字节。sudo iptables -vL -t rawsudo iptables -vL -t rawraw

对我来说,它似乎是在第一次查询后开始计数并丢失了所有早期的字节。

我期望raw PREROUTING链能计数全部转发的 LAN 流量的字节数,因为下面的流程图表明:http://stuffphilwrites.com/2014/09/iptables-processing-flowchart

答案1

我已经能够在第一次运行 时在计数器中重现零iptables --list --verbose -t raw。而我的情况的原因很简单,因为iptable_raw在运行命令之前 尚未加载。

由于我的设置中不需要raw表,因此通常不会加载该模块,直到我运行该命令后,该模块才被加载。

通过运行,rmmod iptable_raw我可以卸载模块,并且下次运行时iptables --list --verbose -t raw计数器将重置为零。

一切都按预期进行。我想你遇到的情况也一样。如果你在表中创建规则,raw模块将自动加载,如果你不需要该表中的任何规则,则无需加载模块。

对于列出当前规则,我建议使用 ,iptables-save它将以可以使用 加载的格式输出规则iptables-restore。它将显示当前规则的所有相关详细信息,并且不会加载任何其他模块,它只会显示当前已加载的模块。

第一次运行命令时出现的延迟可能由多种不同的原因造成,很难说清楚您遇到的到底是哪种情况。但有一种可能性是,需要加载模块的磁盘在空闲时已减速,您需要等待该磁盘加速。

相关内容