Система учета трафика для маршрутизаторов CISCO

Рецепт как считать трафик, если доступ к Интернет осуществляется через маршрутизатор 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.564.12.174.185
4188
377781
 
217.146.192.41195.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 clear ip accounting checkpoint

# собирать статистику
>privilege exec level 8 show ip accounting checkpoint

Note: В cisco информация о траффике собирается в таблице active, которая постоянно изменяется. коммандой show ip accounting мы можем просмотреть содержимое этой таблицы. Но, т.к. вывод требует некоего времени, строго говоря отличного от нуля, то появляется неучтённый траффик. По этому для получения траффика мы будем использовать следующую последовательность действий
1) clear ip accounting - переводим данные из таблицы active в таблицу checkpointed - где они не изменяются
2) show ip accounting checkpoint - получение статистики
3) clear ip accounting checkpoint - очистка таблицы checkpointed

Пример успешного выполнения удалённой комманды на маршрутизаторе (с адресом 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.564.12.174.185
4188
377781
 
217.146.192.41195.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 не дает информации о портах соединения.

Note: Последняя строчка - Accounting threshold exceeded for ... говорит о том, что лимит количества записей (параметр ip accounting-threshold) превышен, и указанное количество байт - потерянный траффик. Т.е. чтобы потери информации о траффике не происходило, нужно либо увеличить значение этого параметра (значит таблица траффика будет занимать больше памяти) либо чаще снимать статистику.
Кроме того возможно фильтровать информацию о траффике, задавая с помощью ip accounting-list сети, для которых считать траффик. При этом можно обратить внимание на параметр ip accounting-transits, с помощью которого можно разрешить попадение в базу некоторого количество непршедших фильтр записей. При этом суммарный размер статистики будет всё-равно ограничен значением ip accounting-threshold.
(Artem Naluzhny)

Теперь этими данными можно пользоваться для "складирования" статистики куда-либо. В принципе можно хранить статичтику и в текстовых или бинарных файлах, но мы решили сохранять данные в БД 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

(Подробнее структуру таблиц с комментариями см. на странице.

Сохранение данных

Скрипт для получения статистики с роутера и помещения в базу данных. Для реализации скрипта нужно уметь делать стандартные операции с 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) {

# Переводим данные о траффике из таблицы active в таблицу checkpoint
`/usr/bin/rsh -l traffic $ip clear ip accounting`

# Получаем данные с маршрутизатора из таблицы checkpoint
@Stat = split(/\n/, `/usr/bin/rsh -l traffic $ip sh ip accounting checkpoint`);

@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}");
}

# Очищаем таблицу статистики в маршрутизаторе в таблице checkpoint
`/usr/bin/rsh -l traffic $ip clear ip accounting checkpoint`
}

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 можно прочитать по адресу: www.cisco.ru, www.cisco.com
2. MySQL Server: www.mysql.org
3. Perl включен в комплект любой UNIX-системы. Для Windows Perl можно скачать с сайта www.activestate.ru.
4. Набор UNIX-утилит для Windows: www.cygwin.com.

Примечания

1. Нами реализована система на Cisco 2611, UNIX-сервере под управлением FreeBSD 4.4, MySQL сервере. Система успешно работает около 3-х месяцев.

2. Отсутвсует ротация данных. За 2 месяца было собрано 266000 записей в таблице траффика.

3. Нет возможности (или она ещё не изучена) получения статистики по конкретному интерфейсу, что позволило-бы получать более точные даные о траффике (например исключить запросы в сеть 195.131.31.0/24)? И упростить форму запроса в базу данных.

Несмотря на недостатки, описанный способ вполне решает поставленную задачу.



Данная статья была любезно предоставлена компанией "Ниеншанц-Телеком", производителем компактного сервера Favourite IS на основе ОС UNIX, для предоставления Интернет-доступа и Интернет-сервисов. Взять сервер Favourite IS на тестирование можно, отправив запрос на адрес: Boginsky AT nnz.ru

[ опубликовано 03/05/2005 ]

"Ниеншанц-Телеком" - Система учета трафика для маршрутизаторов CISCO   Версия для печати