Назад | Перейти на главную страницу

Как мне измерить передачу данных через сетевой интерфейс, относящийся к конкретному пользователю?

У меня есть сервер 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 мониторинг. Сценарий по ссылке не отслеживает данные для каждого пользователя, но показывает основную концепцию.