Содержание
В этой статье собраны способы мониторинга трафика, проходящего через сервер. Чаще всего задача мониторинга встаёт для роутеров, обеспечивающих связь с интернетом.
Мониторинг в реальном времени
Для мониторинга трафика в реальном времени можно использовать утилиту jnettop
:
sudo jnettop
Или, как вариант, vnstat
с ключом –live
:
sudo vnstat --live
Можно также воспользоваться достаточно удобной утилитой с псевдографическим интерфейсом, которая называется iptraf
:
sudo iptraf
Журналирование активности средствами iptables
Стандартный пакетный фильтр iptables
иногда может быть очень полезен для анализа какого-то конкретного типа трафика. iptables
позволяет записывать в системный журнал активность по выбранным критериям. Например, с помощью iptables
можно легко отследить, какой компьютер посылает данные во внешнюю сеть по 25 порту (SMTP), таким образом вычислив заражённый компьютер в локальной сети.
Для записи данных в файл журнала предназначено действие LOG
(и более мощное ULOG
). Подробный его синтаксис и возможные параметры можно посмотреть в документации по iptables
.
Важным аспектом является то, что iptables
сам не ведёт файлы журналов. Вместо этого действие LOG
отправляет информацию системному демону журналирования, и уже он записывает её в журнал, коим чаще всего является /var/log/syslog
. В итоге получается каша, в которой очень непросто разобраться. Поскольку iptables
сам не занимается ведением журнала, то перенаправить запись в отдельный файл средствами самого iptables
невозможно.
К счастью, в Ubuntu существует простой способ рассортировать данные по нужным журналам средствами используемой системы журналирования rsyslog
. Достаточно при записи в журнал добавлять некий уникальный префикс. Например, вот так:
sudo iptables -t filter -A FORWARD -s 192.168.0.0/16 -m tcp -p tcp --dport 25 -j LOG --log-prefix "iptables: "
Теперь все записи в журнале, соответствующие этому критерию, будут начинаться с «iptables: ». Осталось добавить правило сортировки в систему журналирования. Для этого можно создать файл /etc/rsyslog.d/10-iptables.conf
со следующим содержанием:
:msg, contains, "iptables: " -/var/log/iptables.log & ~
Вторая строчка означает, что дальнейшую работу с этой записью производить не надо, т.е. она не должна попадать в другие журналы.
После создания нового файла конфигурации не забудьте переконфигурировать rsyslog
:
sudo /etc/init.d/rsyslog reload
Теперь вся активность, соответствующая добавленному правилу iptables, будет записываться в файл /var/log/iptables.log
. Если вы хотите надолго оставить журналирование, то не забудьте добавить этот файл в систему ротации логов logrotate
, а то в какой-то момент у вас может закончиться место на диске.
Подробней про управление записью журнала можно почитать в документации по rsyslog.
Утилиты Vnstat и Vnstati
Vnstat это очень простой инструмент для учёта трафика. Он есть в репозиториях Ubuntu, так что установка не вызывает сложностей. Vnstat не требует тонкой настройки, просто считает трафик и позволяет просматривать статистику. Для обычного пользователя этого чаще всего более чем достаточно.
Чтобы начать подсчёт трафика надо выполнить команду, которая создаст базу данных для указанного интерфейса:
sudo vnstat -u -i eth0
Подсчёт трафика происходит автоматически, база данных обновляется при выключении сетевого устройства. Но есть возможность обновить базу вручную:
sudo vnstat -u
Для просмотра статистики достаточно просто ввести:
vnstat
Также можно использовать ключи:
-h, --hours по часам -d, --days за день -m, --months за месяц -w, --weeks за неделю -t, --top10 top10 -s, --short короткий вывод -l, --live мониторинг в реальном времени
Vnstati это утилита для визуализации статистики, с ней тоже все просто. Вот, например, короткий скрипт, который выводит на экран статистику в виде картинки:
#! /bin/bash vnstat -u vnstati -vs -o ~/vnstati.png eog ~/vnstati.png
Обе утилиты имеют еще некоторые возможности, не забывайте про ключ --help и утилиту man!
Netflow - мониторинг с ведением статистики
Для мониторинга с ведением статистики одним из популярных решений является технология Netflow.
Для сбора статистики с помощью Netflow необходимо на нужные интерфейсы повесить специальные Netflow-сенсоры, которые будут собирать информацию и передавать Netflow-коллектору, который может располагаться на другой машине.
Информацию, собранную коллектором, можно визуализировать с помощью графического фронтенда, или же анализировать с помощью утилит командной строки.
В качестве сенсоров можно использовать доступные в стандартных репозиториях fprobe
или softflowd
.
Сенсор fprobe
Для установки сенсора fprobe можно, например, выполнить такую команду:
sudo apt-get install fprobe
Установщик спросит, на каком интерфейсе слушать трафик, и куда передавать собранную статистику - введите нужные вам параметры и fprobe
начнёт работать. Например, для Nfsen в примере ниже нужно указать порт 9995.
Автозапуск при перезапуске сети
Демон fprobe всегда аварийно завершается, когда интерфейс, к которому он привязан, выключается (переходит в состояние DOWN). И не запускается автоматически снова, когда интерфейс возобновляет работу.
Если вам по каким-то причинам нужно периодически переключать интерфейсы, то чтобы обойти данную проблему fprobe можно в файл /etc/network/interfaces
после описания интерфейса добавить строчки
up service fprobe start down service fprobe stop
Например, могло бы получится нечто похожее на:
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
# fprobe
up service fprobe start
down service fprobe stop
Теперь при использовании утилит, которые перечитывают этот файл (ifup
и ifdown
), fprobe будет корректно завершаться и автоматически запускаться при переключении состояния интерфейса. При этом при старте системы fprobe
будет пытаться запуститься два раза (один раз стандартным способом, другой - через /etc/network/interfaces
), и хотя у него это не получится, но всё же для порядка лучше автозапуск системного демона fprobe
убрать:
sudo update-rc.d -f fprobe remove
Несколько демонов fprobe на одном компьютере
Если вы хотите запустить на одном компьютере сразу несколько демонов fprobe
(чтобы слушать несколько интерфейсов), то придётся немного изменить стартовые скрипты.
Для начала отредактируйте имеющийся стартовый скрипт /etc/init.d/fprobe
, заменив в нём строчку
NAME=fprobe
на строчку
NAME="fprobe[0]"
И, кроме этого, строчку
DAEMON_OPTS="-i$INTERFACE $OTHER_ARGS $FLOW_COLLECTOR"
на строчку
DAEMON_OPTS="-l 1:0 -i$INTERFACE $OTHER_ARGS $FLOW_COLLECTOR"
Первое число добавленного параметра запуска -l
(«1») говорит fprobe
использовать syslog
для журналирования, а второе является идентификатором процесса. Именно второе число и нужно менять при запуске нескольких копий fprobe
, и оно же должно стоять в квадратных скобочках в параметре NAME
соответствующего стартового скрипта.
Теперь, чтобы создать все необходимые параметры и скрипты для запуска второй копии fprobe
, скопируйте /etc/init.d/fprobe
в /etc/init.d/fprobe_1
:
sudo cp /etc/init.d/fprobe /etc/init.d/fprobe_1
И /etc/default/fprobe
в /etc/default/fprobe_1
:
sudo cp /etc/default/fprobe /etc/default/fprobe_1
Отредактируйте /etc/default/fprobe_1
для работы со вторым интерфейсом.
Теперь надо отредактировать стартовый скрипт /etc/init.d/fprobe_1
для второго процесса fprobe
. Замените числа в параметре NAME
и DAEMON_OPTS
на нужные:
NAME="fprobe[1]" DAEMON_OPTS="-l 1:1 -i$INTERFACE $OTHER_ARGS $FLOW_COLLECTOR"
Кроме этого, измените код загрузки конфигурационного файла таким образом, чтобы он обращался к файлу fprobe_1. Вместо примерно следующего:
# Include fprobe defaults if available if [ -f /etc/default/fprobe ] ; then . /etc/default/fprobe fi
должно получится что-то вроде:
# Include fprobe defaults if available if [ -f /etc/default/fprobe_1 ] ; then . /etc/default/fprobe_1 fi
Также в новых версиях Ubuntu в начале этого файла содержится специальный комментарий для системы загрузки. Он начинается со строчки
### BEGIN INIT INFO
В этом комментарии также необходимо заменить строчку
# Provides: fprobe
на строчку
# Provides: fprobe_1
Убедитесь, что всё работает, как надо. Для этого запустите оба fprobe
, потом загляните в любой менеджер процессов (например, htop
) и найдите там оба демона.
Если всё нормально, то добавьте второй демон fprobe
в автозагрузку командой
sudo update-rc.d fprobe_1 defaults
Конечно, если вы пропишете запуск второго демона fprobe
в /etc/network/interfaces
, то добавлять его в автозагрузку не стоит.
Таким образом можно запустить сколько угодно демонов fprobe
, просто меняя идентификатор.
Коллектор Nfdump и визуализатор данных Nfsen
Nfdump и Nfsen - это коллектор с сопутствующими утилитами и веб-интерфейс визуализации собранных данных. Nfdump доступен в стандартных репозиториях Ubuntu, а Nfsen можно скачать с официального сайта http://nfsen.sourceforge.net/. Там же можно посмотреть скриншоты, чтобы составить представление о том, что такое Nfsen.
В качестве сенсора для этой связки можно использовать любой доступный, например fprobe
или softflowd
.
Nfdump можно поставить через любой пакетный менеджер, например, командой
sudo apt-get install nfdump
Nfsen необходимо распаковать куда-нибудь на сервер из архива с исходными текстами и выполнить несколько несложных операций. Для начала необходимо поставить все нужные для работы пакеты:
sudo apt-get install apache2 libapache2-mod-php5 librrds-perl libmailtools-perl
После этого зайти в папку etc/
в директории, куда вы распаковали Nfsen, и переименовать находящийся там файл nfsen-dist.conf
в nfsen.conf
. Это основной конфигурационный файл Nfsen. Его необходимо отредактировать под ваши нужды. Ниже приведены только опции, которые нужно изменить для базовой конфигурации Nfsen:
# Директория, куда установится Nfsen. $BASEDIR = "/srv/nfsen"; # Если хотим веб-интерфейс поставить в ту же папочку, что и всё остальное $HTMLDIR = "${BASEDIR}/www"; # Местоположение утилит Nfdump для Ubuntu и Debian $PREFIX = '/usr/bin'; # Пользователь для запуска nfcapd - демона-коллектора $USER = "www-data"; # Пользователь и группа для запуска веб-интерфейса $WWWUSER = "www-data"; $WWWGROUP = "www-data"; # Источники сбора данных - имя, локальный порт, на котором слушать, цвет графика %sources = ( 'router1' => { 'port' => '9995', 'col' => '#0000ff', 'type' => 'netflow' }, 'router2' => { 'port' => '9996', 'col' => '#00ff00', 'type' => 'netflow' }, );
Подробную документацию по доступным возможностям можно почитать на официальном сайте Nfsen.
В Ubuntu 12.04 LTS с Perl 5.14 и nfsen 1.3.6p1 нет import Socket6. В файлах «libexec/AbuseWhois.pm» и «libexec/Lookup.pm» заменить:
use Socket6;
на
Socket6->import(qw(pack_sockaddr_in6 unpack_sockaddr_in6 inet_pton getaddrinfo));
После редактирования конфига можно установить Nfsen. Для этого достаточно из директории, куда вы его распаковали, выполнить команду
./install.pl etc/nfsen.conf
Всё, что осталось, это запустить Nfsen. В примере выше в качестве директории для установки Nfsen указан путь /srv/nfsen/. В этом случае для запуска можно использовать команду
/srv/nfsen/bin/nfsen start
Чтобы интегрировать Nfsen в систему качестве автоматически запускаемого сервиса выполните две примерно такие команды:
ln -s /srv/nfsen/bin/nfsen /etc/init.d/nfsen update-rc.d nfsen defaults 20
Теперь, если вы оставили настройки веб-сервера по умолчанию, веб-интерфейс должен быть доступен по адресу http://yourserver/nfsen/nfsen.php.
Для мониторинга скорости соединения и трафика можно также использовать стандартный апплет панели cairo-dock - netspeed и популярное средство системного мониторинга conky.