nethogs — консольный монитор, который показывает сетевой трафик не по адресам и портам, а по процессам. Это быстрый способ ответить на вопрос «кто прямо сейчас выедает канал», не собирая дампы. Утилита читает пакеты через libpcap и сопоставляет сокеты с записями в /proc, поэтому ей нужны повышенные права. Ниже — установка, режимы, логирование и разбор ограничений.
Как работает nethogs
Программа открывает выбранный интерфейс в режиме прослушивания, считает объём пакетов и периодически сверяет таблицу сокетов ядра с процессами. В результате в таблице появляются PID, пользователь, имя программы и два столбца — отправлено и получено. Всё это обновляется в реальном времени в псевдографике, без записи на диск.
Отсюда два важных свойства. Учитывается только трафик через конкретный интерфейс: петлевой обмен и чужие сетевые пространства имён не видны. А короткие соединения между обновлениями успевают закрыться, и их вклад теряется. Для поиска постоянного потребителя канала этого достаточно, для точной тарификации — нет.
Установка и первый запуск
Пакет есть в репозиториях Mint и Ubuntu. Проверьте версию и список интерфейсов: имена вроде enp3s0 или wlp2s0 нельзя угадывать, а советы с eth0 на современных системах часто бесполезны.
sudo apt update
sudo apt install nethogs
nethogs -V
ip -br addr
Запуск без аргументов выбирает интерфейс автоматически, и это не всегда то, что нужно. Если машина подключена по Wi-Fi, а в системе есть виртуальный мост, укажите устройство явно. Клавиша m переключает единицы измерения, q завершает работу. Для сортировки по отправителю нажмите s.
sudo nethogs
sudo nethogs wlp2s0
sudo nethogs -d 2 eth0
sudo nethogs -v 3 eth0
Ключ -d задаёт интервал обновления в секундах, -v меняет формат: 0 — килобайты в секунду, 1 — суммарные килобайты, 2 — байты, 3 — мегабайты. Для диагностики «прямо сейчас» удобен режим скорости, для разбора «за последние минуты» — накопленные значения.
Кто ест канал: практические сценарии
Частый случай — просадка скорости при видеозвонке или загрузке. Запустите монитор на активном интерфейсе и посмотрите верхнюю строку: там будет виновник. Браузер виден как firefox или chrome, синхронизация — как dropbox, обновления — как apt или packagekitd. Строка unknown TCP означает, что сокет закрылся раньше сопоставления.
Для проверки конкретного сервиса ограничьте время наблюдения: -c завершает работу после заданного числа обновлений. Если интерфейсов несколько, перечислите их через пробел — nethogs слушает несколько устройств одновременно.
sudo nethogs -d 1 -c 30 wlp2s0
sudo nethogs -s eth0 wlp2s0
sudo nethogs -t -d 2 -c 10 eth0
nethogs -h
Флаг -t включает трассировочный режим: вместо псевдографики выводятся обычные строки, пригодные для перенаправления в файл. Формат строк зависит от версии, поэтому первые несколько строк всегда просматривайте глазами, прежде чем строить на них автоматику.
Логирование и разбор post factum
Держать интерактивный монитор постоянно бессмысленно: он ест процессор и не хранит историю. Разумный компромисс — снимать срез на несколько минут при появлении проблемы, а затем сортировать лог по отправленным или полученным байтам.
sudo timeout 120 nethogs -t -d 5 eth0 > /tmp/nethogs.log
grep -v '^Refreshing' /tmp/nethogs.log | tail -40
awk '{print $3, $2, $1}' /tmp/nethogs.log | sort -nr | head -20
wc -l /tmp/nethogs.log
В трассировочном выводе первый столбец содержит имя программы, PID и UID через косую черту, второй — отправленное, третий — полученное. Если порядок другой, проверьте заголовок и поправьте индексы в awk. Лог складывайте в каталог, который не переполнит корень: за час может набежать десятки мегабайт.
Для регулярного наблюдения не обязательно писать собственный демон. Достаточно временного юнита systemd, который запустит срез и сам завершится, а результат останется в журнале.
sudo systemd-run --unit=nethogs-probe --collect nethogs -t -d 10 -c 6 eth0
journalctl -u nethogs-probe --no-pager | tail -30
systemctl status nethogs-probe --no-pager
Права без sudo
Постоянный запуск через sudo неудобен и расширяет права оболочки. Утилите нужны две возможности ядра — работа с сетевыми сокетами и захват пакетов. Их можно выдать бинарнику, тогда монитор запустится без пароля.
sudo setcap cap_net_admin,cap_net_raw+ep /usr/sbin/nethogs
getcap /usr/sbin/nethogs
nethogs -V
sudo apt install --reinstall nethogs
Помните: обновление пакета пересоздаёт файл и снимает возможности, поэтому после крупного обновления команду придётся повторить. Последняя строка показывает, как вернуть стандартное поведение. Выдавать такие права стоит только на машине, где вы контролируете все процессы.
Ограничения и точность
nethogs — инструмент наблюдения, а не биллинга. Он не видит трафик других устройств за роутером, не разбирает содержимое пакетов и плохо подходит для учёта UDP. В контейнерах монитор запускают на хосте, иначе внутренние процессы останутся безымянными. Шифрование не мешает: считаются байты, а не полезная нагрузка.
Расхождение с данными провайдера обычно объясняется просто: счётчик интерфейса включает служебный трафик, а монитор показывает только то, что успел сопоставить с процессами. Для сверки используйте статистику ядра и сокеты.
cat /proc/net/dev
ip -s link show wlp2s0
ss -tunp state established
sudo lsof -i -P -n | grep ESTABLISHED
Диагностика
No devices to monitor— имя интерфейса неверно или устройство выключено; проверьтеip -br addr.creating socket failed— не хватает прав или libpcap; запустите черезsudoлибо выдайте capabilities.- Таблица пуста, хотя трафик есть — выбран не тот интерфейс, либо обмен идёт через петлевой
loили другое сетевое пространство имён. - Процессы показаны как
unknown— соединения короткоживущие; уменьшите-dдо одной секунды. - Высокая нагрузка на процессор — увеличьте интервал обновления и не держите монитор постоянно.
- В контейнере видны только процессы хоста — запускайте утилиту на хосте, а не внутри контейнера.
Чтобы понять, куда идёт трафик, переходите от процессов к соединениям: ss покажет адреса и порты, lsof — владельца сокета. Для разбора протокола нужен анализатор пакетов, но начинать стоит с nethogs: он сразу сужает круг подозреваемых.
Итог
nethogs решает одну задачу и делает это хорошо: показывает, какой процесс отправляет и принимает данные через выбранный интерфейс. Установка занимает минуту, запуск — одну команду, а трассировочный режим превращает наблюдение в лог. Держите под рукой ip -br addr, не забывайте про capabilities и помните: монитор видит только свой хост.