我有一台 Ubuntu 服务器,我想测量通过网络接口传输的数据量(包括传入和传出)。由特定用户。 我该怎么做?
注意:我知道如何测量整台机器的总数据传输量。我想将我的监控限制在特定用户身上。
答案1
您可以使用 iptables 规则来执行此操作。以下是一些命令,它们将跟踪 UID=1000 的用户的所有流量
iptables -I OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
iptables -I INPUT -m mark --mark 1
iptables -I INPUT -j CONNMARK --restore-mark
然后,您可以使用 查看计数器iptables -nvL
。字节数是第二个字段。
对于输入流量,您需要查看 INPUT 下mark match 0x1
末尾带有 的行。对于输出流量,它将是CONNMARK set 0x1
末尾带有 的行。
细节:
iptables -I OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
1
这告诉 iptables对来自 uid=1000 的用户的所有出站流量设置防火墙标记。
iptables -I INPUT -j CONNMARK --restore-mark
这告诉 iptables 使用连接跟踪来找出哪些传入数据包与传出数据包相关联,并恢复流的任何防火墙标记(即,我们上面设置标记的标记)。
iptables -I INPUT -m mark --mark 1
这告诉 iptables 匹配任何带有防火墙标记的传入数据包1
。我们不对它们做任何事情,我们只是使用它,这样它就会增加计数器。
答案2
唯一能真正实现这一点的方法是编写自己的 System Tap 脚本。我做了类似的事情Zabbix监控。链接处的脚本不跟踪每个用户的数据,但它显示了基本概念。