У меня есть сервер Ubuntu, и мне интересно измерить, сколько данных передается (как входящее, так и исходящее) через сетевой интерфейс, конкретным пользователем. Как мне это сделать?
N.B. Я знаю, как измерить общий объем передачи данных всей машины. Я хочу ограничить свой мониторинг конкретным пользователем.
Для этого вы можете использовать правила 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
Это указывает iptables установить метку брандмауэра 1
на весь исходящий трафик от пользователя с uid = 1000.
iptables -I INPUT -j CONNMARK --restore-mark
Это указывает iptables использовать отслеживание соединений, чтобы выяснить, какие входящие пакеты связаны с исходящими пакетами, и восстановить любые метки брандмауэра для потока (то есть те, которые мы установили выше).
iptables -I INPUT -m mark --mark 1
Это указывает iptables на соответствие любым входящим пакетам, имеющим отметку брандмауэра. 1
. Мы ничего с ними не делаем, мы просто используем его, чтобы увеличивать счетчики.
Единственный способ добиться этого - написать собственный сценарий System Tap. Я сделал нечто подобное для Zabbix мониторинг. Сценарий по ссылке не отслеживает данные для каждого пользователя, но показывает основную концепцию.