概述
通过nftables
规则对特定端口范围做计数流量统计,可以借此计算瞬时流量.
写规则
假设这里我统计的是11000-19000
端口范围的流量,入站和出站都统计,然后用计数器来计算流量.
大概流程就是创一个名字叫portstats
的表,然后创两个链,一个叫input_chain
,一个叫output_chain
,
然后创两个计数器,一个叫input_tcp_range
,一个叫output_tcp_range
,然后创两个规则,一个叫input_tcp_range
,一个叫output_tcp_range
.
1 | # 创建表和链 |
创建完成后,可以查看这个表,能直接看到他的流量统计.
在输出中,能看到counter
的流量统计,packets
是包的数量,bytes
是字节数.
input_tcp_range
入站 TCP 流量统计output_tcp_range
出站 TCP 流量统计input_udp_range
入站 UDP 流量统计output_udp_range
出站 UDP 流量统计
当然,你可以直接通过他的
bytes
来计算计数流量,包括瞬时流量
你也能记录到.
1 | nft list table inet portstats |
1 | root@localhost:~# nft list table inet portstats |
流量计算
比如上面的output_tcp_range
当前流量在7699060368
字节,如果要转换到 Mb 单位,你应该:
1 | echo 'scale=2; 7699060368 / 1048576' | bc |
单位是 Mb,这样计算出来的结果仅仅只是计数器记录的流量,并不是瞬时流量.
1 | 7342.39 |
计算瞬时流量
原理也很简单,先获取当前计数器记录的流量,然后 sleep10 秒后,再获取一次计数器记录的流量,然后计算两次的差值.
1 | nft list table inet portstats |
比如我这里两次执行结果的input_tcp_range
.
- 第一次
234844099
- 第二次
4346338221
- 那么瞬时流量计算方式直接参考以下脚本
第二次的结果减去第一次的结果,并且除以 10 的延迟秒,得到瞬时流量(如果要到 Mb 单位则再除以 1048576).
如果你的延迟设置的不是 10 秒,而是 60 秒,那你就得除以 60.
1 | echo 'scale=2; (4346338221 - 234844099) / 1048576 / 10' | bc # 单位是 Mb/s |
1 | 392.10 |
删除规则
如果后续你不想要这个表或者这些规则了,可以直接删除这张表,他会将这个表下的规则,链,计数器一并清理.
1 | nft delete table inet portstats |