Я гуглил часами - под Linux я хочу знать кумулятивные байты, отправленные и полученные пользователем или процессом по всем протоколам IP. Лучшее, что я обнаружил в своих поисках, это то, что iptables можно использовать для маркировки пакетов для пользователя, например:
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1
Похоже, что «tc» может затем формировать трафик с помощью этого, но мне просто нужна статистика - я не хочу формировать трафик. Я хочу что-то вроде: «пользователь U передал использованный XMB с момента Y». Я не могу понять, как получить статистику по этим помеченным пакетам. Кроме того, я смотрел на nethogs, но они, кажется, измеряют мгновенный поток, и мне нужны кумулятивные подсчеты. У кого-нибудь есть идеи?
Если вы используете -j CONNMARK в цепочке OUTPUT, а затем сопоставите с -m connmark в цепочке INPUT, вы сможете получить эту информацию.
Вот пример отслеживания входящего / исходящего трафика для пользователя 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
Уловка iptables -m owner может отслеживать только те пакеты, которые отправляются пользователю (по определению). Его нельзя использовать для отслеживания пакетов, полученных для этого пользователя.
Признаюсь, я не вижу хорошего способа сделать это. При ударе в темноте он будет включать применение патча на уровне ядра, например, чтобы разрешить только определенным пользователям привязываться к определенным диапазонам портов в сетевом стеке (аналогично идее, что только root может связываться с сетевыми сокетами. на порту 1024 и ниже). Затем вы можете применить ведение журнала трафика iptables для этих диапазонов портов и точно знать, что любой трафик предназначен и только для соответствующего пользователя, которому разрешено связываться с этими портами. Обратной стороной является то, что это вызовет хаос для пользовательских приложений, которые не осведомлены об этих ограничениях, когда они затем решат попытаться привязаться к порту, а ядро скажет нет.
Это также можно сделать с помощью SE Linux, но я подозреваю, что это может стать кошмаром для обслуживания системного администратора: http://www.linuxquestions.org/questions/linux-server-73/how-can-i-restrict-ports-for-users-to-bind-to-667153/
Для учета: вы можете полностью опустить -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.
Возможно, самый простой способ, в зависимости от того, как долго вы хотите хранить эти данные, - это просто посмотреть на количество совпадающих пакетов / байтов для ваших правил отметки с помощью iptables -t mangle -L OUTPUT -v
. Вы увидите два столбца слева от вывода, в которых указаны эти показатели.
Если вам нужен ежедневный подсчет, вы всегда можете запланировать iptables -t mangle -Z OUTPUT
чтобы очистить счет в полночь.
Если вы можете пометить его, значит, вы можете зарегистрировать его. Проверьте целевое расширение LOG на страницах руководства iptables. Вот простое введение: http://www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html
Я думаю, вы можете добавить для этого запись о ротации журнала и использовать ее для запуска сценария, который суммирует записи журнала и удаляет файл. может ежечасно?