Система обліку трафіку для маршрутизаторів cisco, мережі, статті, бібліотека Лінуксцентра, - експерт

Система обліку трафіку для маршрутизаторів 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
Результатом буде таблиця пар

Для того, щоб обнулити таблицю з трафіком необхідно виконати команду clear ip accounting

3. Налаштовуємо віддалене виконання команд на маршрутизаторі

Зміни в конфігурації роутера для віддаленого отримання статистики (віддаленого виконання команд)

# Дозволяємо виконувати вилучені комманди
> 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

su-2.05 # rsh -l traffic 10.58.0.1 sh ip accounting | more

Accounting data age is 3: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 таблиці: таблиця опису маршрутизаторів і таблиця зберігання даних по трафіку:

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, Update
require '/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\./) # Ігноруємо заголовок і 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

Тепер в базу даних вставлятимуться записи виду:

Отримання даних з бази і підрахунок трафіку
Програми вибірки трафіку можуть бути самими різними. По суті, потрібно правильно сформувати запит до бази і обробити отримані дані. Для прикладу наведемо скрипт, який формує звіт за певний період у вигляді cvs файлу.

# Виконуємо вибірку з бази
$ 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 [3];
>

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 2611, UNIX-сервері під керуванням FreeBSD 4.4, MySQL сервері. Система успішно працює близько 3-х місяців.

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

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

Бібліотека Лінуксцентра. список розділів