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

我打算使用iptables来衡量我的互联网stream量(由Peter Krumins的伟大文章http://www.catonmat.net/blog/traffic-accounting-with-iptables启发)。

旨在测量stream量的计算机当前转发所有来自互联网的LANstream量。

我试图找出链中的所有传输字节(上传+下载)计数。 打开几个网站(它显示17M )后, FORWARD filter链是唯一一个超过1兆字节的链。 这似乎是下载(+上传也许)。

但是下面的观察让我怀疑:

 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 

即使我访问了一些网站,当运行sudo iptables -vL -t raw时, raw PREROUTING链仍然有0个字节(第一次运行sudo iptables -vL -t raw时间超过了一个长的执行时间第二)。 几秒钟后,两条raw链都有超过2000个字节。

对我来说,它似乎开始计数后,第一个查询和丢失所有较早的字节。

我期望raw PREROUTING链计数转发的LANstream量的所有字节,因为下面的stream程图表明: http : //stuffphilwrites.com/2014/09/iptables-processing-flowchart

我已经能够在第一次运行iptables --list --verbose -t raw在计数器中重现零。 在我的情况下,原因就是iptable_raw没有被加载,直到我运行命令。

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

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

这一切都按预期工作。 而且我猜这是发生在你身上的一样。 如果您在raw表格中创build规则,模块将自动加载,如果您不需要该表格中的任何规则,则无需加载模块。

对于列出当前的规则,我推荐使用iptables-save ,它将以可以用iptables-restore加载的格式输出规则。 它将显示您当前规则的所有相关细节,并且不会加载任何其他模块,只会显示当前加载的那些模块。

第一次执行命令时的延迟可以用许多不同的理由来解释,很难说出哪一个是你的情况。 但是有一种可能性是模块需要加载的磁盘在空闲的时候被旋转下来了,所以你需要等待磁盘启动。