The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Построение системы учета трафика для маршрутизаторов CISCO (freebsd cisco traffic statistic mysql)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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)? И упростить форму запроса в базу данных. Несмотря на недостатки, описанный способ вполне решает поставленную задачу.

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, Аноним (1), 15:42, 01/01/2003 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    правильней собирать статистику по snmp
     
     
  • 2.2, uldus (?), 16:21, 01/01/2003 [^] [ответить]    [к модератору]
  • +/
    >правильней собирать статистику по snmp

    ip accounting статистику по SNMP забирать самоубийство, если данных много, то за 5 минут 5-и минутная выборка даже не успевает по SNMP забраться, SNMP - очень много CPU отъедает как на Cisco, так и на машине которая забирает статистику. Так что для ip accounting только RSH и остается.

     
  • 2.16, шторм (?), 09:52, 24/07/2003 [^] [ответить]    [к модератору]
  • +/
    У нас за 1.5 мес накопилось 8 млн записей и таблица перестала открываться
     
  • 1.3, KisaSoft (?), 09:58, 21/01/2003 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    Думаеться мне что Netflow покорректней будет...
     
  • 1.4, Аноним (4), 15:08, 05/02/2003 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    да очень тяжелая тема. можно использовать mrtg и написать небольшой скрипт для обработки логов, т.к. mrtg выводит по интерфейсам только графики
     
  • 1.5, A Cloackwork Orange (?), 09:59, 10/02/2003 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    266000 записей за два месяца, с нескольких маршрутизаторов?
    Издеваетесь.
    У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает 1000 записей.
    И что нам делать ? все это вместит и обработает mysql?
     
     
  • 2.7, creator (?), 13:20, 21/02/2003 [^] [ответить]    [к модератору]  
  • +/
    Чтобы не было много записей, у меня просходит обработка данных сразу после каждого снимания с киски. получается очень маленький файлик длиной килобайт 10-18, статистика ведется на 3 цисках паралельно по 12-ти сетям класса С (Съем статистика каждые 5 минут). Создается 3 файлика в день(по количеству цисок). Для особо скрытых товарищей доступ на циски можно осуществлять по ssh. Для просмотр данных написан отдельный скриптик - выдает данные по любым подсеткам с детализацией по адресам, по дням или в любом сочетании. Выдача статистика по всем сетям за месяц занимает секунд 20-40 (в месяц обрабатывается трафик в 200-300GB).

    >266000 записей за два месяца, с нескольких маршрутизаторов?
    >Издеваетесь.
    >У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает
    >1000 записей.
    >И что нам делать ? все это вместит и обработает mysql?


     
     
  • 3.8, A Clockwork Orange (?), 15:38, 21/02/2003 [^] [ответить]    [к модератору]  
  • +/
    >Чтобы не было много записей, у меня просходит обработка данных сразу после
    >каждого снимания с киски. получается очень маленький файлик длиной килобайт 10-18,
    >статистика ведется на 3 цисках паралельно по 12-ти сетям класса С
    >(Съем статистика каждые 5 минут). Создается 3 файлика в день(по количеству
    >цисок). Для особо скрытых товарищей доступ на циски можно осуществлять по
    >ssh. Для просмотр данных написан отдельный скриптик - выдает данные по
    >любым подсеткам с детализацией по адресам, по дням или в любом
    >сочетании. Выдача статистика по всем сетям за месяц занимает секунд 20-40
    >(в месяц обрабатывается трафик в 200-300GB).
    >
    >>266000 записей за два месяца, с нескольких маршрутизаторов?
    >>Издеваетесь.
    >>У нас с одного маршрутизатора с восьмью каналами за 5 минут созревает
    >>1000 записей.
    >>И что нам делать ? все это вместит и обработает mysql?


    Очень интересно и что это за файлик такой маленький, какой формат и что в нем? По-подробнее можно?

     
     
  • 4.9, creator (?), 23:37, 21/02/2003 [^] [ответить]    [к модератору]  
  • +/
    Формат - обычный текстовый, в нем хранится информация по сетям и накапливающийся в течении суток трафик по каждому из адресов.
    название файлика число_месяц_год_циска.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)

    снятие данных по всем сетям со всех цисок - позволит забывчивым счетоводам подсчитать трафик задним числом и позволяет свободно меремещать сетки с одной циски на другую (считать легче на той циске к которой непосредственно подключен пользователь - не пропадет локальный трафик)

     
     
  • 5.10, A Clockwork Orange (?), 10:46, 25/02/2003 [^] [ответить]    [к модератору]  
  • +/
    >Формат - обычный текстовый, в нем хранится информация по сетям и накапливающийся
    >в течении суток трафик по каждому из адресов.
    >название файлика число_месяц_год_циска.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)
    >
    >снятие данных по всем сетям со всех цисок - позволит забывчивым счетоводам
    >подсчитать трафик задним числом и позволяет свободно меремещать сетки с одной
    >циски на другую (считать легче на той циске к которой непосредственно
    >подключен пользователь - не пропадет локальный трафик)


    Честно говоря не полностью включаюсь....
    А скрипт который формирует этот файлик.
    Ты подал идею что бы группировать записи по принимающим осчитываемы сетей и по адресам отправляющим те че сетей, тогда действительно будет меньше записей и файлик уменьшится..

     
     
  • 6.11, creator (?), 11:55, 25/02/2003 [^] [ответить]    [к модератору]  
  • +/
    ICQ: 40748143
    расскажу поподробнее..
    если интересует могу поделиться скриптикоами для сбора статистики и по ее обработке
     
  • 1.6, Анатолий (?), 12:58, 18/02/2003 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Вместо 'show ip accounting/clear ip accounting' лучше использовать связку 'clear ip accounting/ show ip accounting checkpoint/clear ip accounting checkpoint' - не будет потерь пакетов
     
     
  • 2.12, Виктор Вяткин (?), 04:59, 07/03/2003 [^] [ответить]    [к модератору]  
  • +/
    Обсолютно согласен.
    Еще лучьше на cisco указать побольше размер accounting буфера, т.к. по умолчанию 512 строк.
    Напимер 5000 строк:
    ip accounting-threshold 5000
     
  • 1.13, Руслан (?), 16:23, 15/03/2003 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Увы у меня при попытки соединения по rsh выдает
    poll: protocol failure in circuit setup
    хотя все делал по мануалу...
    помогите плиз кто может
     
     
  • 2.14, Creator (?), 22:40, 16/03/2003 [^] [ответить]    [к модератору]  
  • +/
    Через пару недель будет готова доведенная до ума программа снятия статистики с маршрутизаторов (бесплатная), если кому надо присылайте свои пожелания, постараюсь учесть.
     
     
  • 3.15, Zarathustra (?), 07:21, 30/05/2003 [^] [ответить]    [к модератору]  
  • +/
    Можно посмотреть как-нибудь?
     
  • 3.17, Владимир (?), 18:26, 11/11/2003 [^] [ответить]    [к модератору]  
  • +/
    Где готовую помотреть? Оченна нада ....
     
  • 3.19, Сергей (?), 23:44, 11/01/2004 [^] [ответить]    [к модератору]  
  • +/
    Тоже очень бы хотелось посмотреть программу
    Тема очень актуальная
     
  • 1.18, php (?), 15:31, 19/12/2003 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Вот веселье будет если система за 5 минут не успеет отработать и запустится вторая копия скрипта.. :)))
     
  • 1.20, Салягин (??), 10:27, 28/06/2004 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    rsh грузит циску будь здоров, snmp работает быстрее и без траблов. Проверено.
     
     
  • 2.21, citrin (ok), 09:53, 07/10/2004 [^] [ответить]    [к модератору]  
  • +/
    Вот скрипт который снимает ip accounting с кошки по snmp
    http://citrin.pp.ru/my/ip-accounting.pl
    времени написать к нему документацию нет, но надеюсь кому надо разберется.
    Я тоже сомневаюсь, чтобы snmp грузил кошку сильнее чем rsh хотя в данном случае (большой объем данных) это вполне возможно.
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:




      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor