我已经googling几个小时 – 在Linux下,我想知道所有ip协议的用户或进程发送和接收的累计字节。 在我的search中find的最好的是,可以使用iptables标记用户的数据包,例如:
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1
看来“tc”可以形成交通,但我只是想统计 – 我不想形成交通。 我想要的东西就像:“用户U已经传输使用XMB时间Y”。 我不知道如何从这些标记的数据包中获得统计数据。 另外,我看过nethogs,但他们似乎在测量瞬时stream量,我需要累计计数。 任何人有想法?
iptables -m所有者技巧只能跟踪发送出去的用户的数据包(按照定义)。 它不能用于跟踪为该用户收到的数据包。
我承认,从我的头顶来看,我看不到有这样做的好方法。 在黑暗中,它将涉及到在内核级应用补丁,例如,只允许特定用户绑定到networking堆栈上的特定端口范围(类似于只有root可以绑定到networking套接字在1024以下的端口)。 然后,您可以在这些端口范围上应用iptablesstream量日志logging,并确切知道任何stream量都适用于并且仅限于允许绑定到这些端口的相应用户。 不利的一面是,当用户应用程序不知道这些限制的时候,他们决定尝试绑定到一个端口,而内核说不。
SE Linux也可能做到这一点,但我怀疑有可能成为系统pipe理员维护的噩梦: http : //www.linuxquestions.org/questions/linux-server-73/how-can-i -restrict端口换用户对绑定到667153 /
如果在OUTPUT链中使用-j CONNMARK,然后在INPUT链中使用-m connmark匹配,则可以检索该信息。
下面是一个跟踪用户nobody的传入/传出stream量的示例(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
也许最简单的做法,取决于你想保留这些数据的时间长短,只要用iptables -t mangle -L OUTPUT -v来查看标记规则的匹配数据包/字节数。 您将在输出的左侧看到两列,指示这些指标。
如果你想每天计数,你总是可以安排一个iptables -t mangle -Z OUTPUT清除计数在午夜。
如果你可以标记它,那么这意味着你可以login它。在iptables手册页中检查LOG目标扩展。 这里简单介绍一下: http : //www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html
我想你可以添加一个日志循环条目,并用它来触发一个脚本,总结日志条目并删除文件。 也许每小时?
对于会计:你可以完全抛弃-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.