- Мониторинг трафика
- Содержание
- Мониторинг в реальном времени
- Журналирование активности средствами iptables
- Утилиты Vnstat и Vnstati
- Netflow — мониторинг с ведением статистики
- Сенсор fprobe
- Автозапуск при перезапуске сети
- Несколько демонов fprobe на одном компьютере
- Коллектор Nfdump и визуализатор данных Nfsen
- Рулим трафиком в Linux. Аккаунтинг, сбор статистики
- Настройка PPTP-сервера
- Настройка ulog-acctd
- Настройка iptables
- MySQL и схема БД
- Парсим лог
Мониторинг трафика
Содержание
В этой статье собраны способы мониторинга трафика, проходящего через сервер. Чаще всего задача мониторинга встаёт для роутеров, обеспечивающих связь с интернетом.
Мониторинг в реальном времени
Для мониторинга трафика в реальном времени можно использовать утилиту jnettop :
Или, как вариант, vnstat с ключом –live :
Можно также воспользоваться достаточно удобной утилитой с псевдографическим интерфейсом, которая называется iptraf :
Журналирование активности средствами iptables
Стандартный пакетный фильтр iptables иногда может быть очень полезен для анализа какого-то конкретного типа трафика. iptables позволяет записывать в системный журнал активность по выбранным критериям. Например, с помощью iptables можно легко отследить, какой компьютер посылает данные во внешнюю сеть по 25 порту (SMTP ), таким образом вычислив заражённый компьютер в локальной сети.
Для записи данных в файл журнала предназначено действие LOG (и более мощное ULOG ). Подробный его синтаксис и возможные параметры можно посмотреть в документации по iptables .
Важным аспектом является то, что iptables сам не ведёт файлы журналов. Вместо этого действие LOG отправляет информацию системному демону журналирования, и уже он записывает её в журнал, коим чаще всего является /var/log/syslog . В итоге получается каша, в которой очень непросто разобраться. Поскольку iptables сам не занимается ведением журнала, то перенаправить запись в отдельный файл средствами самого iptables невозможно.
К счастью, в Ubuntu существует простой способ рассортировать данные по нужным журналам средствами используемой системы журналирования rsyslog . Достаточно при записи в журнал добавлять некий уникальный префикс. Например, вот так:
Теперь все записи в журнале, соответствующие этому критерию, будут начинаться с «iptables: ». Осталось добавить правило сортировки в систему журналирования. Для этого можно создать файл /etc/rsyslog.d/10-iptables.conf со следующим содержанием:
Вторая строчка означает, что дальнейшую работу с этой записью производить не надо, т.е. она не должна попадать в другие журналы.
После создания нового файла конфигурации не забудьте переконфигурировать rsyslog :
Теперь вся активность, соответствующая добавленному правилу iptables, будет записываться в файл /var/log/iptables.log . Если вы хотите надолго оставить журналирование, то не забудьте добавить этот файл в систему ротации логов logrotate , а то в какой-то момент у вас может закончиться место на диске.
Подробней про управление записью журнала можно почитать в документации по rsyslog.
Утилиты Vnstat и Vnstati
Vnstat это очень простой инструмент для учёта трафика. Он есть в репозиториях Ubuntu, так что установка не вызывает сложностей. Vnstat не требует тонкой настройки, просто считает трафик и позволяет просматривать статистику. Для обычного пользователя этого чаще всего более чем достаточно.
Чтобы начать подсчёт трафика надо выполнить команду, которая создаст базу данных для указанного интерфейса:
Подсчёт трафика происходит автоматически, база данных обновляется при выключении сетевого устройства. Но есть возможность обновить базу вручную:
Для просмотра статистики достаточно просто ввести:
Также можно использовать ключи:
Vnstati это утилита для визуализации статистики, с ней тоже все просто. Вот, например, короткий скрипт, который выводит на экран статистику в виде картинки:
Обе утилиты имеют еще некоторые возможности, не забывайте про ключ —help и утилиту man!
Netflow — мониторинг с ведением статистики
Для мониторинга с ведением статистики одним из популярных решений является технология Netflow.
Для сбора статистики с помощью Netflow необходимо на нужные интерфейсы повесить специальные Netflow-сенсоры, которые будут собирать информацию и передавать Netflow-коллектору, который может располагаться на другой машине.
Информацию, собранную коллектором, можно визуализировать с помощью графического фронтенда, или же анализировать с помощью утилит командной строки.
В качестве сенсоров можно использовать доступные в стандартных репозиториях fprobe или softflowd .
Сенсор fprobe
Для установки сенсора fprobe можно, например, выполнить такую команду:
Установщик спросит, на каком интерфейсе слушать трафик, и куда передавать собранную статистику — введите нужные вам параметры и fprobe начнёт работать. Например, для Nfsen в примере ниже нужно указать порт 9995.
Автозапуск при перезапуске сети
Демон fprobe всегда аварийно завершается, когда интерфейс, к которому он привязан, выключается (переходит в состояние DOWN). И не запускается автоматически снова, когда интерфейс возобновляет работу.
Если вам по каким-то причинам нужно периодически переключать интерфейсы, то чтобы обойти данную проблему fprobe можно в файл /etc/network/interfaces после описания интерфейса добавить строчки
Например, могло бы получится нечто похожее на:
Теперь при использовании утилит, которые перечитывают этот файл ( ifup и ifdown ), fprobe будет корректно завершаться и автоматически запускаться при переключении состояния интерфейса. При этом при старте системы fprobe будет пытаться запуститься два раза (один раз стандартным способом, другой — через /etc/network/interfaces ), и хотя у него это не получится, но всё же для порядка лучше автозапуск системного демона fprobe убрать:
Несколько демонов fprobe на одном компьютере
Если вы хотите запустить на одном компьютере сразу несколько демонов fprobe (чтобы слушать несколько интерфейсов), то придётся немного изменить стартовые скрипты.
Для начала отредактируйте имеющийся стартовый скрипт /etc/init.d/fprobe , заменив в нём строчку
И, кроме этого, строчку
Первое число добавленного параметра запуска -l («1») говорит fprobe использовать syslog для журналирования, а второе является идентификатором процесса. Именно второе число и нужно менять при запуске нескольких копий fprobe , и оно же должно стоять в квадратных скобочках в параметре NAME соответствующего стартового скрипта.
Теперь, чтобы создать все необходимые параметры и скрипты для запуска второй копии fprobe , скопируйте /etc/init.d/fprobe в /etc/init.d/fprobe_1 :
И /etc/default/fprobe в /etc/default/fprobe_1 :
Отредактируйте /etc/default/fprobe_1 для работы со вторым интерфейсом.
Теперь надо отредактировать стартовый скрипт /etc/init.d/fprobe_1 для второго процесса fprobe . Замените числа в параметре NAME и DAEMON_OPTS на нужные:
Кроме этого, измените код загрузки конфигурационного файла таким образом, чтобы он обращался к файлу fprobe_1. Вместо примерно следующего:
должно получится что-то вроде:
Также в новых версиях Ubuntu в начале этого файла содержится специальный комментарий для системы загрузки. Он начинается со строчки
В этом комментарии также необходимо заменить строчку
Убедитесь, что всё работает, как надо. Для этого запустите оба fprobe , потом загляните в любой менеджер процессов (например, htop ) и найдите там оба демона.
Если всё нормально, то добавьте второй демон fprobe в автозагрузку командой
Конечно, если вы пропишете запуск второго демона fprobe в /etc/network/interfaces , то добавлять его в автозагрузку не стоит.
Таким образом можно запустить сколько угодно демонов fprobe , просто меняя идентификатор.
Коллектор Nfdump и визуализатор данных Nfsen
Nfdump и Nfsen — это коллектор с сопутствующими утилитами и веб-интерфейс визуализации собранных данных. Nfdump доступен в стандартных репозиториях Ubuntu, а Nfsen можно скачать с официального сайта http://nfsen.sourceforge.net/. Там же можно посмотреть скриншоты, чтобы составить представление о том, что такое Nfsen.
В качестве сенсора для этой связки можно использовать любой доступный, например fprobe или softflowd .
Nfdump можно поставить через любой пакетный менеджер, например, командой
Nfsen необходимо распаковать куда-нибудь на сервер из архива с исходными текстами и выполнить несколько несложных операций. Для начала необходимо поставить все нужные для работы пакеты:
После этого зайти в папку etc/ в директории, куда вы распаковали Nfsen, и переименовать находящийся там файл nfsen-dist.conf в nfsen.conf . Это основной конфигурационный файл Nfsen. Его необходимо отредактировать под ваши нужды. Ниже приведены только опции, которые нужно изменить для базовой конфигурации Nfsen:
Подробную документацию по доступным возможностям можно почитать на официальном сайте Nfsen.
После редактирования конфига можно установить Nfsen. Для этого достаточно из директории, куда вы его распаковали, выполнить команду
Всё, что осталось, это запустить Nfsen. В примере выше в качестве директории для установки Nfsen указан путь /srv/nfsen/. В этом случае для запуска можно использовать команду
Чтобы интегрировать Nfsen в систему качестве автоматически запускаемого сервиса выполните две примерно такие команды:
Теперь, если вы оставили настройки веб-сервера по умолчанию, веб-интерфейс должен быть доступен по адресу http://yourserver/nfsen/nfsen.php.
Для мониторинга скорости соединения и трафика можно также использовать стандартный апплет панели cairo-dock — netspeed и популярное средство системного мониторинга conky.
Источник
Рулим трафиком в Linux. Аккаунтинг, сбор статистики
Каждый админ должен в своей жизни настроить сендмейл, написать биллинг и обругать маздай 🙂
© bash.org.ru
Сендмейл мы настраивать не будем, как и ругать детище Билли, а попробуем создать что-то вроде биллинга, т.к. этот вопрос рано или поздно встает практически перед всеми системными администраторами.
Статья ориентирована на новичков в администрировании и опытным спецам навряд ли будет интересна.
И так, что мы имеем? Сеть из 50-200 компьютеров, выделенный интернет-канал (ADSL, Ethernet, etc..), linux-роутер. Требуется считать интернет-трафик пользователей (по разным направлениям), ограничивать скорость, определять лимиты трафика в месяц. В дополнение, хочется управлять всем этим через какую-нибудь веб-морду.
За основу возьмем дистрибутив ubuntu-server 8.04.
Чтобы однозначно идентифицировать пользователя и обезопасить кражи трафика при помощи подмены айпи-адресов, настроим VPN-сеть, используя PPTPD.
Практически все действия в консоли будем выполнять от рута, поэтому чтобы не писать каждый раз sudo, пишем:
Настройка PPTP-сервера
# apt-get install pptpd
Открываем конфиг /etc/pptpd.conf и добавляем строчки:
определяем адрес сервера и диапазон адресов пользователей в виртуальной сети.
По-умолчанию pptpd хранит аккаунты пользователей в файле /etc/ppp/chap-secrets, добавляем тестовые аккаунты:
# Secrets for authentication using CHAP
# client server secret IP addresses
user1 pptpd 123 10.1.0.2
user2 pptpd 567 10.1.0.3
обратите внимание на айпи-адреса, они должны быть из диапазона, указанного в параметре remoteip файла /etc/pptpd.conf!
Перезапускаем сервис pptpd:
Разрешаем подключения к нашему сервису:
# iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state —state NEW -m tcp —dport 1723 -j ACCEPT
Вместо 192.168.0.0/24 подставьте адрес своей локальной сети. Пробуем подключиться к нашей виртуальной сети, для этого создаем на машине с Win XP новое VPN — соединение («Создание нового подключения» — «Подключение к сети на рабочем месте» -«Подключение к виртуальной частной сети»). Если все получилось двигаемся дальше.
Настройка ulog-acctd
# apt-get install ulog-acctd
Открываем конфиг /etc/ulog-acctd.conf. Нас интересуют параметры accounting format и fdelay.
Параметр accounting format отвечает за формат записи лога, подробное описание каждого параметра есть в комментариях, так что подробно расписывать не буду. Нам нужен такой формат:
# время отправитель получатель трафик
accounting format=»%t\t%s\t%d\t%b\n»
Параметр fdelay определяет через какой промежуток времени ulog-acctd будет сбрасывать накопленную статистику в лог, выставим его в 10 секунд.
Настройка iptables
# iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j MASQUERADE
Этим правилом сообщаем ulog’у какой трафик логировать:
# iptables -A FORWARD -d 10.1.0.0/24 -j ULOG —ulog-cprange 48 —ulog-qthreshold 50
Нас интересует транзитный трафик, идущий в VPN — сеть.
Теперь протестируем получившуюся связку, подключитесь к сети и попробуйте что-нибудь скачать, в логе /var/log/ulog-acctd/account.log должны появится такие записи:
1224187495 208.67.222.222 10.1.0.2 126
1224187534 205.188.9.192 10.1.0.2 40
1224187556 62.213.122.2 10.1.0.2 10660
1224187594 205.188.9.192 10.1.0.2 40
1224187599 62.213.122.2 10.1.0.2 22130
1224187615 62.213.122.2 10.1.0.2 1037
.
Первое значение — время в формате unix, второе — адрес отправителя, третье — адрес получателя (пользователя), четвертое — количество байт.
MySQL и схема БД
# apt-get install mysql-server
Создаем в MySQL пользователя ulog и импортируем схему БД:
CREATE DATABASE `ulogdb` DEFAULT CHARSET utf8;
CREATE TABLE `data` (
`id` int(11) NOT NULL auto_increment,
`id_user` int(11) NOT NULL,
`ts` int(11) NOT NULL,
`bytes` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET utf8;
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(32) NOT NULL,
`password` varchar(64) NOT NULL,
`ip` varchar(15) NOT NULL,
PRIMARY KEY (`id`),
KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET utf8;
Это упрощенная схема, позже мы ее модернизируем. В таблице data храним агрегированную статистику по трафику, в users информация о пользователях. Добавьте в таблицу users пользователей, которых указали в /etc/ppp/chap-secrets.
INSERT INTO `users` (`login`, `password`, `ip`) VALUES
(‘user1’, ‘123’, ‘10.1.0.2’);
INSERT INTO `users` (`login`, `password`, `ip`) VALUES
(‘user2’, ‘567’, ‘10.1.0.3’);
Парсим лог
# apt-get install libdbd-mysql-perl
Привожу полный текст срипта:
# определяем имя БД, пользователя и пароль
my $db_name = «ulogdb»;
my $db_user = «ulog»;
my $db_pass = «1234»;
# путь к лог-файлу
$account_log = «/var/log/ulog-acctd/account.log»;
# подключаемся к нашей базе
my $DBH = DBI->connect(«DBI:mysql:$db_name:localhost»,$db_user,$db_pass) or die «Error connecting to database»;
# получаем список пользователей в связке ip+id_user
my $STH = $DBH->prepare(«select ip,id from users»);
$STH->execute;
while (@tmp = $STH->fetchrow_array()) <
$users <$tmp[0]>= $tmp[1];
>
$STH->finish;
# делаем временную копию лога и очищаем оригинальный файл
system «cp $account_log /tmp/ulog-parser.tmp && cat /dev/null > $account_log»;
open LOGFILE,» ) <
chomp;
# переменную $saddr пока не используем,
# она пригодится позже
($ts,$saddr,$daddr,$bytes) = split /\t/;
# создаем новую временную метку, необходимо для агрегирования
# статистки пользователя за определенный интервал времени
# в одну запись. интервалом будем считать 1 минуту
# сопоставляем айпи из лога со списком пользователей
# если айпи имеется в базе — наш клиент
# массив со статистикой имеет древовидную структуру:
# метка времени -> id пользователя -> полученный трафик
# подготавливаем запросы к БД
my $STH_CHK = $DBH->prepare(«select id_user,id from data where ts=?»);
my $STH_ADD = $DBH->prepare(«insert into data (id_user,ts,bytes) values(. )»);
my $STH_UPD = $DBH->prepare(«update data set bytes=bytes+? where >
# проходим по всему массиву статистики вложенным циклом
#
for $ts (keys %data) <
# проверяем, если ли в базе записи с такой меткой времени
$STH_CHK->execute($ts);
%ex_data = ();
while (@tmp = $STH_CHK->fetchrow_array()) <
$ex_data <$tmp[0]>= $tmp[1];
>
$STH_CHK->finish;
# выбираем данные о пользователях в текущем периоде
for $id_user (keys %<$data<$ts>>) <
if (exists($ex_data<$id_user>)) <
# если запись уже есть, то просто обновляем значение поля bytes
$STH_UPD->execute($data<$ts><$id_user>,$ex_data<$id_user>);
$STH_UPD->finish;
> else <
# иначе добавляем новую запись
$STH_ADD->execute($id_user,$ts,$data<$ts><$id_user>);
$STH_ADD->finish;
>
>
>
# отключаемся от БД
$DBH->disconnect;
Сохраним скрипт как /usr/bin/ulog-parser.pl и установим атрибуты:
# chmod 700 /usr/bin/ulog-parser.pl
Пробуем запустить, и смотрим, появились ли данные в таблице data:
При минимальных знаниях PHP и SQL сделать вывод статистики не составит труда 😉
На этом я пока закончу, статья и так слишком большая получилась. Если данная тема будет Вам интересна — напишу продолжение (группировка по трафика по направлениям, ограничение скорости).
Источник