Ключевые слова:freebsd, cisco, traffic, statistic, mysql, (найти похожие документы)
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
Результатом будет таблица пар
<источник>
<приемник>
<кол-во пакетов>
<количество байт>
Source
195.131.0.250
64.12.24.130
63.236.41.114
195.161.113.76
195.131.31.3
195.131.0.250 Destination
62.118.249.10
10.128.95.2
195.131.31.213
195.131.31.3
195.161.113.76
64.154.80.51
Packets
3403
450
5216
44
61
58
Bytes
219250
89292
598654
16280
5827
9650
.
.
.
195.151.246.5 64.12.174.185
4188
377781
217.146.192.41 195.131.31.3
14634
5449030
195.131.31.3 217.146.192.41
20285
1907788
Для того, чтобы обнулить таблицу с трафиком необходимо выполнить
команду clear ip accounting
3. Настраиваем удаленное выполнение команд на маршрутизаторе
Изменения в конфигурации роутера для удалённого получения статистики
(удалённого выполнения комманд)
>conf t
# Разрешаем выполнять удалённые комманды
>ip rcmd rsh-enable
# Пользователь traffic с хоста 10.58.0.2, локальный пользователь root
имеет уровень привилегий 8
>ip rcmd remote-host traffic 10.58.0.2 root enable 8
# Разрешить уровню привилегий 8 выполнять следующие комманды
# обнулять статистику
>privilege exec level 8 clear ip accounting
# собирать статистику
>privilege exec level 8 show ip accounting
Пример успешного выполнения удалённой комманды на маршрутизаторе (с
адресом 10.58.0.1) с UNIX-компьютера:
su-2.05# rsh -l traffic 10.58.0.1 sh ip accounting | more
<источник>
<приемник>
<кол-во пакетов>
<количество байт>
Source
195.131.0.250
64.12.24.130
63.236.41.114
195.161.113.76
195.131.31.3
195.131.0.250 Destination
62.118.249.10
10.128.95.2
195.131.31.213
195.131.31.3
195.161.113.76
64.154.80.51
Packets
3403
450
5216
44
61
58
Bytes
219250
89292
598654
16280
5827
9650
.
.
.
195.151.246.5 64.12.174.185
4188
377781
217.146.192.41 195.131.31.3
14634
5449030
195.131.31.3 217.146.192.41
20285
1907788
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';
Connect('TrafficBase', '10.128.1.43', 'root', '');
# С каких роутеров собирать статистику - ip - ID в таблице роутеров
$Routers{'10.58.0.1'} = 1;
$Routers{'10.55.3.1'} = 3;
foreach $ip (keys %Routers) {
# Получаем данные с маршрутизатора
@Stat = split(/\n/, `/usr/bin/rsh -l traffic $ip sh ip accounting`);
@AD = localtime;
$Date = sprintf("%4d-%02d-%02d %02d:%02d:%02d", $AD[5] + 1900, $AD[4]
+ 1, $AD[3],
$AD[2], $AD[1], $AD[0]);
foreach $s (@Stat) {
if ($s !~ /^\s\d{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 - это
интересующий интернет траффик.
require 'DB.pl';
# Задаем начальные параметры выборки
$StartDate = '2002-09-10 00:00:00';
$EndDate = '2002-09-30 00:00:00';
$Router = 3;
$Net = '10.6';
$NotNet = '10.120';
# Выполняем выборку из базы
$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];
}
foreach $ip (sort {$a <=> $b} keys %Sum) {
$Sum{$ip} = $Sum{$ip}/1E6;
$S += $Sum{$ip};
$Sum{$ip} =~ s/\./,/;
printf ("$Net.0.%d;%s;\n", $ip, $Sum{$ip});
}
print "-------------------------------\n";
$S =~ s/\./,/;
printf ("Total;%s;\n", $S);
Результат работы скрипта - cvs файл
10.6.0.2;2,50131;
10.6.0.4;0,190212;
10.6.0.5;1,97279;
10.6.0.6;14,875368;
.
.
.
10.6.0.103;74,21923;
10.6.0.104;14,346887;
10.6.0.105;2,884767;
10.6.0.106;1,04632;
10.6.0.110;1,867212;
10.6.0.112;1,327554;
10.6.0.151;8,126519;
10.6.0.152;3,669052;
10.6.0.153;0,625454;
10.6.0.154;3,835585;
10.6.0.155;2,207297;
10.6.0.157;4,4e-005;
10.6.0.201;130,717364;
-------------------------------
Total;1041,25119;
Ссылки:
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)? И
упростить форму запроса в базу данных.
Несмотря на недостатки, описанный способ вполне решает поставленную
задачу.
ip accounting статистику по SNMP забирать самоубийство, если данных много, то за 5 минут 5-и минутная выборка даже не успевает по SNMP забраться, SNMP - очень много CPU отъедает как на Cisco, так и на машине которая забирает статистику. Так что для ip accounting только RSH и остается.
266000 записей за два месяца, с нескольких маршрутизаторов?
Издеваетесь.
У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает 1000 записей.
И что нам делать ? все это вместит и обработает mysql?
Чтобы не было много записей, у меня просходит обработка данных сразу после каждого снимания с киски. получается очень маленький файлик длиной килобайт 10-18, статистика ведется на 3 цисках паралельно по 12-ти сетям класса С (Съем статистика каждые 5 минут). Создается 3 файлика в день(по количеству цисок). Для особо скрытых товарищей доступ на циски можно осуществлять по ssh. Для просмотр данных написан отдельный скриптик - выдает данные по любым подсеткам с детализацией по адресам, по дням или в любом сочетании. Выдача статистика по всем сетям за месяц занимает секунд 20-40 (в месяц обрабатывается трафик в 200-300GB).
>266000 записей за два месяца, с нескольких маршрутизаторов?
>Издеваетесь.
>У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает
>1000 записей.
>И что нам делать ? все это вместит и обработает mysql?
>Чтобы не было много записей, у меня просходит обработка данных сразу после
>каждого снимания с киски. получается очень маленький файлик длиной килобайт 10-18,
>статистика ведется на 3 цисках паралельно по 12-ти сетям класса С
>(Съем статистика каждые 5 минут). Создается 3 файлика в день(по количеству
>цисок). Для особо скрытых товарищей доступ на циски можно осуществлять по
>ssh. Для просмотр данных написан отдельный скриптик - выдает данные по
>любым подсеткам с детализацией по адресам, по дням или в любом
>сочетании. Выдача статистика по всем сетям за месяц занимает секунд 20-40
>(в месяц обрабатывается трафик в 200-300GB).
>
>>266000 записей за два месяца, с нескольких маршрутизаторов?
>>Издеваетесь.
>>У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает
>>1000 записей.
>>И что нам делать ? все это вместит и обработает mysql?
Очень интересно и что это за файлик такой маленький, какой формат и что в нем? По-подробнее можно?
Формат - обычный текстовый, в нем хранится информация по сетям и накапливающийся в течении суток трафик по каждому из адресов.
название файлика число_месяц_год_циска.stat
например:
192.168.0;0;0;0;0;0;1232323;2324;343412;1232;...=
192.168.1;6666;2323;3434;2323;4545;4545;4545;4545;...=
описание:
сетка(192.168.1);
прием(общий)по адресу(192.168.1.0);
передача(общая) по адресу (...0);
локальный прирем по адресу (...0);
локальная передача по адресу (...0);
далее 4 числа стаистика по адресу 192.168.1.1 и.т.д до 255 =
= - маркер конца данных по сетке
локальный прием и передача - это работа внутри нашей сети - трафик обычно дешевле делают
обновление данных каждые 5 минут через обычный телнет или ssh (clear ip accounting+show ip accounting checkpoint+clear ip accounting checkpoint)
снятие данных по всем сетям со всех цисок - позволит забывчивым счетоводам подсчитать трафик задним числом и позволяет свободно меремещать сетки с одной циски на другую (считать легче на той циске к которой непосредственно подключен пользователь - не пропадет локальный трафик)
>Формат - обычный текстовый, в нем хранится информация по сетям и накапливающийся
>в течении суток трафик по каждому из адресов.
>название файлика число_месяц_год_циска.stat
>например:
>192.168.0;0;0;0;0;0;1232323;2324;343412;1232;...=
>192.168.1;6666;2323;3434;2323;4545;4545;4545;4545;...=
>описание:
>сетка(192.168.1);
>прием(общий)по адресу(192.168.1.0);
>передача(общая) по адресу (...0);
>локальный прирем по адресу (...0);
>локальная передача по адресу (...0);
>далее 4 числа стаистика по адресу 192.168.1.1 и.т.д до 255 =
>= - маркер конца данных по сетке
>
>локальный прием и передача - это работа внутри нашей сети - трафик
>обычно дешевле делают
>
>обновление данных каждые 5 минут через обычный телнет или ssh (clear ip
>accounting+show ip accounting checkpoint+clear ip accounting checkpoint)
>
>снятие данных по всем сетям со всех цисок - позволит забывчивым счетоводам
>подсчитать трафик задним числом и позволяет свободно меремещать сетки с одной
>циски на другую (считать легче на той циске к которой непосредственно
>подключен пользователь - не пропадет локальный трафик)
Честно говоря не полностью включаюсь....
А скрипт который формирует этот файлик.
Ты подал идею что бы группировать записи по принимающим осчитываемы сетей и по адресам отправляющим те че сетей, тогда действительно будет меньше записей и файлик уменьшится..
Вместо 'show ip accounting/clear ip accounting' лучше использовать связку 'clear ip accounting/ show ip accounting checkpoint/clear ip accounting checkpoint' - не будет потерь пакетов
Обсолютно согласен.
Еще лучьше на cisco указать побольше размер accounting буфера, т.к. по умолчанию 512 строк.
Напимер 5000 строк:
ip accounting-threshold 5000
Через пару недель будет готова доведенная до ума программа снятия статистики с маршрутизаторов (бесплатная), если кому надо присылайте свои пожелания, постараюсь учесть.
Вот скрипт который снимает ip accounting с кошки по snmp
http://citrin.pp.ru/my/ip-accounting.pl времени написать к нему документацию нет, но надеюсь кому надо разберется.
Я тоже сомневаюсь, чтобы snmp грузил кошку сильнее чем rsh хотя в данном случае (большой объем данных) это вполне возможно.