测量每个用户或每个进程的累积网络统计信息

测量每个用户或每个进程的累积网络统计信息

我已经在 Google 上搜索了几个小时——在 Linux 下,我想知道用户或进程通过所有 IP 协议发送和接收的累计字节数。我在搜索中发现的最好的方法是使用 iptables 为用户标记数据包,例如:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1

看来“tc”可以用它来调整流量,但我只想要统计数据——我不想调整流量。我想要类似这样的数据:“用户 U 自时间 Y 以来已传输使用 XMB”。我不知道如何从这些标记的数据包中获取统计数据。另外,我查看了 nethogs,但它们似乎在测量瞬时流量,而我需要累积计数。有人有什么想法吗?

答案1

iptables -m 所有者技巧只能跟踪针对某个用户发出的数据包(根据定义)。它不能用于跟踪针对该用户接收的数据包。

我承认,我一时想不出有什么好办法。在黑暗中摸索,这将涉及在内核级别应用补丁,例如,仅允许特定用户绑定到网络堆栈上的特定端口范围(类似于只有 root 可以绑定到端口 1024 及以下的网络套接字的想法)。然后,您可以在这些端口范围上应用 iptables 流量日志记录,并确定任何流量都是针对且仅针对允许绑定到这些端口的相应用户。缺点是,这将给不知道这些限制的用户应用程序造成严重破坏,当他们决定尝试绑定到端口时,内核说不。

使用 SE Linux 也可能实现此目的,但我怀疑这可能会成为系统管理员维护的噩梦:http://www.linuxquestions.org/questions/linux-server-73/how-can-i-restrict-ports-for-users-to-bind-to-667153/

答案2

如果您在 OUTPUT 链中使用 -j CONNMARK,然后在 INPUT 链中与 -m connmark 匹配,您将能够检索该信息。

以下是跟踪用户 nobody (id 65534) 的传入/传出流量的示例:

# iptables -I OUTPUT -m owner --uid-owner 65534 \
                     -m comment --comment 'out - user nobody - uid 65534' \
                     -j CONNMARK --set-mark 65534
# iptables -I INPUT -m connmark --mark 65534 \
                    -m comment --comment 'in - user nobody - uid 65534'


因此,您可以通过运行 iptables-save -c 来获取计数器值(行上的第一个值):

# iptables-save -c | grep 'uid 65534'
[2585:3797434] -A INPUT -m connmark --mark 0xfffe -m comment --comment "in - user nobody - uid 65534"
[1166:63139] -A OUTPUT -m owner --uid-owner 65534 -m comment --comment "out - user nobody - uid 65534" -j CONNMARK --set-xmark 0xfffe/0xffffffff

答案3

对于会计:您可以完全省略 -j 而不提供目标。正如手册页所述:

-j, --jump target ... If this option is omitted in a rule (and -g  is
    not used), then matching the rule will have no effect on the
    packet's fate, but the counters on the rule will be incremented.

答案4

如果能标记出来就说明可以记录了。查看iptables man pages中的LOG目标扩展。这里简单介绍一下:http://www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html

我想您可以为此添加一个日志轮换条目并使用它来触发一个脚本,该脚本总结日志条目并删除该文件。也许是每小时?

相关内容