如何计算两台Unix机器之间传输的数据量

Gee*_*eek 3 networking

我有两台互相 ping 的 Linux 机器。对于每个 ping 请求,他们在响应中附加一个数据包。无法确定 ping 的频率。

我如何确定它们通过网络相互传输了多少 GB 的数据?

Gil*_*il' 7

假设您对路径上某处的 Linux 机器具有 root 访问权限(端点,甚至是中间的路由器),您可以编写一个 iptables 规则来匹配应用程序流量并将其定向到一个特定的链,该链只接受所有数据包. 内核在每个链上维护一个字节和数据包计数器。假设您要计算的数据包从 IP 10.1.2.3 TCP 端口 42123 到 IP 10.7.8.9 TCP 端口 42789:

iptables -I FORWARD -p tcp -s 10.1.2.3 --sport 42123 -d 10.7.8.9 --dport 42789 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

在源主机上替换FORWARDOUTPUTINPUT在目标主机上替换为。您可以读取计数器,iptables -nvxL FORWARD 42其中 42 是规则的数量(第一个规则是数字 1)。

如果要计算两个方向,请对每个方向执行此操作。以已知的时间间隔读取计数器以测量带宽使用情况。

如果您创建一个中间链,您可以获得一点灵活性。

iptables -N myapp_counter
iptables -A myapp_counter -j ACCEPT
iptables -I FORWARD -p tcp -s 10.1.2.3 --sport 42123 -d 10.7.8.9 --dport 42789 -j myapp_counter
iptables -I FORWARD -p tcp -s 10.7.8.9 --sport 42789 -d 10.1.2.3 --dport 42123 -j myapp_counter
Run Code Online (Sandbox Code Playgroud)

通过此设置,计数器的计数器myapp_counter将包括两个方向的流量。遍历链的另一个好处是您可以原子地读取链上的计数器并将其设置为 0 iptables -nvxZL myapp_counter。而且您无需计算规则编号,因此可以更轻松地自动设置。