Система обліку трафіку для маршрутизаторів CISCO, Бібліотека ЛінуксЦентру http
Досить часто як Інтернет-маршрутизатори застосовуються апаратні маршрутизатори 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 Результатом буде таблиця пар
Щоб обнулити таблицю з трафіком необхідно виконати команду
3. Налаштовуємо віддалене виконання команд на маршрутизаторі
Зміни в конфігурації роутера для видалення статистики (віддаленого виконання команд)
# Дозволяємо виконувати віддалені команди>ip rcmd rsh-enable
# Користувач traffic з хоста 10.58.0.2, локальний користувач root має рівень привілеїв 8rcmd 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
su-2.05# rsh -l traffic 10.58.0.1 sh ip accounting more
Accounting data age 03:12 Accounting threshold exceeded for 5016149 пакетів і 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 таблиці: таблицю опису маршрутизаторів та таблицю зберігання даних з трафіку:
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;
Збереження даних
Скрипт для отримання статистики з роутера та приміщення до бази даних. Для реалізації скрипту необхідно вміти виконувати стандартні операції з SQL базою (отримати, вставити, видалити, змінити дані тощо). Для різних платформ реалізації різні, тому опис самого механізму виконання SQL-запитів через Perl ми не наводимо. Ми користувалися інтерфейсом DBI.
# Стандартна бібліотека роботи з базою даних у ній процедури Connect, Select, Exec, Insert, # Delete, Updaterequire '/usr/local/traffic/lib/DB2.pl';
Connect('TrafficBase', '10.128.1.43', 'root', '');
# З яких роутерів збирати статистику - ip - ID у таблиці роутерів$Routers = 1; $Routers = 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`);
$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\./) < next; ># Ігноруємо заголовок і Summary $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'); >
# Очищаємо таблицю статистики в маршрутизаторіре в таблиці checkpoint `/usr/bin/rsh -l traffic $ip clear ip accounting checkpoint` >
3. Запускаємо механізм періодичного збереження статистики
Залежно від платформи реалізація може бути різною. Ми використовували вбудований UNIX механізм періодичного запуску процесів "cron".
Отже, по крону виконуємо скрипт, щоб отримувати статистику кожні 4 години. Даний період визначається співвідношенням обсягу оперативної пам'яті роутера і трафік, що проходить, чим більше трафік, тим більше розмір таблиці статистики, тим частіше необхідно знімати дані.
# Get 1IP Accounting 0 0-23/4 * * * /usr/local/traffic/IPAccounting.pl
Тепер до бази даних вставлятимуться записи виду:
# Dumping data for table 'traffic' # INSERT INTO traffic VALUES ,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); INSERTINTO 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 файлу.
# Задаємо початкові параметри вибірки$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 fetchrow) < #print "$res[0] $res[1] $res[2] $res[3]\ n"; $Sum += $res[3]; >
Результат роботи скрипта - 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 2611, UNIX-сервері під керуванням FreeBSD 4.4, MySQL сервері. Система успішно працює близько 3 місяців.
2. Відсутня ротація даних. За 2 місяці було зібрано 266 000 записів у таблиці трафіку.
3. Немає можливості (або вона ще невивчена) отримання статистики за конкретним інтерфейсом, що дозволило б отримувати більш точні дані про трафік (наприклад виключити запити до мережі 195.131.31.0/24)? І спростити форму запиту до бази даних.
"Нієншанц-Телеком" - Система обліку трафіку для маршрутизаторів CISCO