From: Дмитрий Новиков <dmn@nnz.ru>
Newsgroups: http://www.artmagic.ru/labs/
Date: Mon, 4 Dec 2002 13:01:37 +0000 (UTC)
Subject: Построение системы учета трафика для маршрутизаторов CISCO
Оригинал: http://www.artmagic.ru/labs/cisco.shtml
Система учета трафика для маршрутизаторов CISCO
Вступление
Довольно часто качестве Интернет-маршрутизаторов применяются
аппаратные маршрутизаторы CISCO, которые являются стандартом de facto
для организации соединения по синхронным каналам передачи данных. При
этом в операционной системе маршрутизатора (IOS) заложены все
необходимые свойства для вывода сети в Интернет (NAT, FIREWALL,
routing).
Настроенный маршрутизатор очень стабилен в работе (как аппаратно, так
и программно) и практически не требует внимания - именно поэтому
CISCO-маршрутизаторы занимают стабильное первое место среди аппаратных
решениях доступа к Интернет.
После установки и настройки маршрутизатора, естественной задачей
является подсчет трафика, проходящего через него. И тут возникают
некоторые проблемы, т.к. фирменное ПО менеджмента трафика от CISCO
очень дорогое и покупка его экономически не оправдана, но, с другой
стороны, оставаться совсем без учета трафика также очень опасно.
Однако, как показала практика, решить эту проблему можно весьма
эффективно и практически без особых затрат на основе уже заложенных в
CISCO свойств, пакета свободного программного обеспечения и набора
несложных программ.
Исходные данные
* Синхронный Интернет-канал;
* CISCO 2611, IOS 12
* Внутренняя сеть, подключенная через роутер
Задача
Поствалена задача осуществить подсчёт траффика проходящего через
роутер Cisco, не применяя коммерческих средств учета трафика.
Необходимые инструменты
Для ведения статистики по трафику понадобятся следующие инструменты:
* SQL-сервер. Для "складирования". В принципе подойдет любой. В
нашем примере это MySQL
* Рабочая станция, на которой работает Perl, команда rsh, и которая
умеет запускать процессы по расписанию. Для этих целей идеально
подходит любой UNIX-сервер (мы использовали FreeBSD 4.4). В
принципе нет особенных препятсвий реализовать систему на
Windiws-сервере - но понадобиться дополнительное программное
обеспечение (аналог rsh, Active State perl).
Решение
Поставим конкретную задачу: даны локальные сети 10.120.0.0/16 и
10.6.0.0/16, подключенные к Интернет через маршрутизатор Cisco.
Необходимо представить отчет по траффику в Интернет каждой рабочей
станции локальных сетей.
Конфигурация маршрутизатора
1. Конфигурируем интерфейсы
Для начала надо сконфигурировать маршрутизатор для отображения текущих
соединений и количества пакетов.
Для интерфейса Serial0/0 нужно выполнить такие команды:
>conf t
>int Serial0/0
>ip accounting output-packets
2. Смотрим статистику на маршрутизаторе
Теперь маршрутизатор будет собирать исходящие пакеты с этого
интерфейса, информацию о которых можно смотреть командой sh ip
accounting
Результатом будет таблица пар
<источник>
<приемник>
<кол-во пакетов>
<количество байт>
Accounting data age is 03:12
Accounting threshold exceeded for 5016149 packets and 1936384303 bytes
Su-2.05#
PS. Как видно, ip accounting не дает информации о портах соединения.
Теперь этими данными можно пользоваться для "складирования" статистики
куда-либо. В принципе можно хранить статичтику и в текстовых или
бинарных файлах, но мы решили сохранять данные в БД SQL.
Получение статистики с роутера
Для того, чтобы складировать статистику, мы применяли язык Perl и
стандартные библиотеки DBI для работы с базами данных.
1. Структура таблиц.
Мы создали 2 таблицы: таблица описания маршрутизаторов и таблица
хранения данных по трафику:
1. Список маршрутизаторов
#
# Table structure for table 'routers'
#
CREATE TABLE routers (
ID int(10) unsigned NOT NULL auto_increment, ; Идентификатор
Name varchar(100) NOT NULL default '', ; Имя
IP varchar(15) NOT NULL default '', ; IP-адрес
PRIMARY KEY (ID)
) TYPE=MyISAM;
2. Хранение статистики
#
# Table structure for table 'traffic'
#
CREATE TABLE traffic (
ID int(10) unsigned NOT NULL auto_increment,
Day datetime NOT NULL default '0000-00-00 00:00:00',
FromIP varchar(15) NOT NULL default '',
SPort int(10) unsigned NOT NULL default '0',
X12 varchar(7) NOT NULL default '',
X3 int(10) unsigned NOT NULL default '0',
X4 int(10) unsigned NOT NULL default '0',
DPort int(10) unsigned NOT NULL default '0',
Bytes int(10) unsigned NOT NULL default '0',
IFace varchar(20) NOT NULL default '',
RouterID int(10) unsigned NOT NULL default '0',
PRIMARY KEY (ID)
) TYPE=MyISAM;
Адреса сети разбиты на 3 части, для того, чтобы было удобнее считать
трафик:
Например, адрес 10.128.1.2 записываем в таблицу так:
X12=10.128
X3=1
X2=2
2. Сохранение данных
Скрипт для получения статистики с роутера и помещения в базу данных.
Для реализации скрипта нужно уметь делать стандартные операции с SQL
базой (получить, вставить, удалить, изменить данные и т.п.). Для
различных платформ реализации разные, поэтому описания самого
механизма выполнения SQL-запросов через Perl мы не приводим. Мы
пользовались интерфейсом DBI.
#!/usr/bin/perl
# Стандартная библиотека работы с базой данных в ней процедуры
Connect, Select, Exec, Insert,
# Delete, Update
require '/usr/local/traffic/lib/DB2.pl';
foreach $s (@Stat) {
if ($s !~ /^sd{1,3}./) { next; } # Игнорируем заголовок и Summary
$s =~ s/^s+//;
$s =~ s/s+/ /g;
my @Row = split (/ /, $s);
my @Dst = split (/./, $Row[1]);
# Записываем в базу данные по трафику
Insert('Traffic', "'', '$Date', '$Row[0]', '0', '$Dst[0].$Dst[1]',
$Dst[2], $Dst[3], '0', $Row[3], '', $Routers{$ip}");
}
# Очищаем таблицу статистики в маршрутизаторе
`/usr/bin/rsh -l traffic $ip clear ip accounting`
}
3. Запускаем механизм периодического сохранения статистики
В зависимости от платформы реализация может быть разная. Мы
использовали встроенный в UNIX механизм периодического запуска
процессов "cron".
Итак, по крону выполняем скрипт чтобы получать статистику каждые 4
часа. Данный период определяется соотнешением объёма оперативной
памяти роутера и проходящего траффика, чем больше траффик, тем больше
размер таблицы статистики, тем чаще необходимо снимать данные.
crontab -e
# Get 1IP Accounting
0 0-23/4 * * * /usr/local/traffic/IPAccounting.pl
Теперь в базу данных будут вставляться записи вида:
# Dumping data for table 'traffic'
#
INSERT INTO traffic VALUES (1,'2002-07-31
15:28:56','212.176.251.1',0,'193.232',242,69,0,1597,'',1);
INSERT INTO traffic VALUES (2,'2002-07-31
15:28:56','212.176.251.1',0,'216.33',42,76,0,58,'',1);
INSERT INTO traffic VALUES (3,'2002-07-31
15:28:56','195.151.246.5',0,'194.67',45,8,0,270,'',1);
INSERT INTO traffic VALUES (4,'2002-07-31
15:28:56','195.131.31.134',0,'62.118',138,31,0,2135,'',1);
INSERT INTO traffic VALUES (5,'2002-07-31
15:28:56','212.176.251.1',0,'216.33',42,72,0,1269,'',1);
INSERT INTO traffic VALUES (6,'2002-07-31
15:28:56','195.151.246.5',0,'159.153',254,89,0,5873,'',1);
INSERT INTO traffic VALUES (7,'2002-07-31
15:28:56','195.131.0.250',0,'205.188',9,197,0,79,'',1);
Получение данных из базы и подсчёт траффика
Программы выборки трафика могут быть самыми различными. По сути, нужно
правильно сформировать запрос в базу и обработать полученные данные.
Для примера приведем скрипт, формирующий отчет за некоторый период в
виде cvs файла.
Скрипт выборки из быза данных основывается на формировании запроса
вида (для траффика сети 10.120)
Весь траффик у которого адрес назначения - сеть 10.120 (x12='10.120')
и при этом адрес отправителя не сети 10.128 или 10.6 - это
интересующий интернет траффик.
# Выполняем выборку из базы
$sth = Select('Traffic', 'day, fromip, x4, bytes', "fromip not like
'10.128.%' and fromip not like '$NotNet.%' and x12='$Net' and day >
'$StartDate' and day < '$EndDate' and routerid=$Router order by day,
bytes");
while (@res = $sth->fetchrow) {
#print "$res[0] $res[1] $res[2] $res[3]n";
$Sum{$res[2]} += $res[3];
}
1. О маршрутизаторах CISCO можно прочитать по адресу: http://www.cisco.ru,
http://www.cisco.com
2. MySQL Server: http://www.mysql.org
3. Perl включен в комплект любой UNIX-системы. Для Windows Perl можно
скачать с сайта www.activestate.ru.
4. Набор UNIX-утилит для Windows: http://www.cygwin.com.
Примечания
1. Нами реализована система на Cisco 2611, UNIX-сервере под
управлением FreeBSD 4.4, MySQL сервере. Система успешно работает около
3-х месяцев.
2. Отсутвсует ротация данных. За 2 месяца было собрано 266000 записей
в таблице траффика.
3. Нет возможности (или она ещё не изучена) получения статистики по
конкретному интерфейсу, что позволило-бы получать более точные даные о
траффике (например исключить запросы в сеть 195.131.31.0/24)? И
упростить форму запроса в базу данных.
Несмотря на недостатки, описанный способ вполне решает поставленную
задачу.
797 Прочтений • [Построение системы учета трафика для маршрутизаторов CISCO (freebsd cisco traffic statistic mysql)] [08.05.2012] [Комментариев: 0]