Як дізнатись які порти на комутаторах вже не використовуються

Трохи більше року тому зіткнувся з проблемою, знайомою, мабуть, кожному адміну: в одній із комунікаційних шаф закінчилися майже всі вільні порти. Візуально було видно, що майже до кожного порту підключено кабель, вільних залишилося лише один-два порти, а потрібно підключити близько десяти нових девайсів.

Мені було чітко зрозуміло, що насправді використовуються не всі порти: якісь, швидше за все, підключали тимчасово, а потім забули відключити, мережні принтери могли перемістити і підключити до іншого комутатора, частина портів були підключені для користувачів, які змінили свої часи кабінети і т.д.

Відключення неактивних портів було неприйнятним, тому що те, що якийсь порт в даний момент не активний, не говорить про те, що він не використовувався 10 хвилин тому, а користувач просто відключив свій комп'ютер, і, скажімо, поїхав на зустріч. У той час, всі комутатори користувача були фірми Cisco моделі 3560, що мали 100Mbps-порти для користувачів і гнізда SFP для швидкого каналу до концентруючих комутаторів, так що витрачати як мінімум $2500 на додатковий комутатор, коли впевнений, що на насправді це зовсім необов'язково, просто рука не піднімалася.

Дізнатися, які порти на комутаторах не використовувалися протягом останнього місяця.

Усі комутатори були налаштовані відсилати свої повідомлення на центральний syslog сервер. У моєму прикладі використовувався Syslog-NG на Arch Linux, але, природно, можна використовувати будь-яке інше syslog-рішення та/або дистрибутив Лінукса. Для ротації логів використовувався logrotate і логи старіші за один місяць стиралися. Також щодо комутаторів: я вважаю, що на будь-якому керованому комутаторі можна налаштувати відправлення повідомлень на віддалений syslog-сервер - крім Cisco, у мене досвід тільки зNortel та HP – наскільки я пам'ятаю, вони також підтримують цю функцію.

Принцип роботи

Комутатори Cisco за промовчанням генерують повідомлення під час активації та деактивації портів, а оскільки всі комутатори були налаштовані відсилати повідомлення на центральний syslog сервер, все, що залишалося, це проаналізувати файли, що зберігають повідомлення від комутаторів. Нагадаю, що на сервері був налаштований logrotate, тому повідомлення не зберігалися більше одного місяця. Думаю, що можна сміливо припустити, що порт, який не використовується протягом місяця, швидше за все більше не потрібен, і його можна використовувати під інші потреби.

Приклади налаштувань

Налаштувати комутатор Cisco для надсилання повідомлень на віддалений syslog-сервер дуже просто, слід перейти в режим конфігурування (configure terminal) і внести лише одну команду:

Ось рядки з syslog-ng.conf, які відповідають за прийом повідомлень по мережі:

source remote_udp udp(); >;

Щоразу, коли до порту комутатора підключається обладнання, спливає таке повідомлення:

Apr 27 16:38:44 switch1 330827: Apr 27 15:39:27.317: %LINK-3-UPDOWN: Interface FastEthernet0/4

А ось приклад повідомлення у разі відключення обладнання:

27 квітня 16:38:53 switch1 330830: 27 квітня 15:39:37.635: %LINK-3-UPDOWN: Interface FastEthernet0/4, змінений стан

Ось алгоритм аналізу лог файлів:

1. Виберіть лише повідомлення, що надходять від певного комутатора 2. Виберіть лише повідомлення, що включають рядок “LINK-3-UPDOWN” 3. Відрізати непотрібні частини рядків (час, назва комутатора і т.д.), залишивши тільки порт і його номер 4. Вибрати тільки повідомлення, що включають рядок “FastEthernet” (у моєму випадку всі порти були100Mbps, гігабітними були тільки підключення до концентруючих комутаторів) 5. Відрізати все, крім порту 6. Відсортувати 7. Залишити тільки унікальні рядки

Реалізація на bash:

cat /var/log/remote/switches.log* grep $1 grep LINK-3-UPDOWN cut -d ':' -f 8 cut -d ' '-f 3 grep FastEthernet cut -d '/' -f 2 cut - d', '-f 1 sort -n uniq

Приклад використання

Як видно, скрипт видав усі порти, чий статус (активний/неактивний) змінювався протягом останнього місяця. Але що робити, якщо якийсь із перелічених вище портів був безперервно активний весь цей час і його статус не змінювався? Підключаємося до потрібного комутатора, і виконуємо наступну команду:

show interface description include down

Ця команда відображає список усіх неактивних портів. Якщо порт неактивний, і його статус не змінювався протягом останнього місяця, це означає, що йому можна шукати інше застосування.

Доповнення

Дане рішення відмінно працює з окремими комутаторами, у яких всі користувальницькі порти 100Mbps. Але незабаром ми почали додавати нові комутатори моделей 2975 і 2960, що виробляються ті ж Cisco. Всі порти у них гігабітні, а так само вони оснащені стековими модулями, що дозволяють об'єднувати кілька комутаторів в одну керовану одиницю, а це призводило до зміни найменування портів, тому що враховувався не тільки номер порту, а й номер комутатора в стеку.

Ось модифікована реалізація

cat /var/log/remote/switches.log* grep $1 grep LINK-3-UPDOWN cut -d ':' -f 8 cut -d ' '-f 3 grep GigabitEthernet cut -d 't' -f 4 cut - d','-f 1 sort-t'/'-k 1,1n-k 3,3n uniq

Висновок

Описане рішення успішно працює в нашій організації вже більше року без будь-яких модифікацій.Його плюси це низька ціна (у нашому випадку зовсім безкоштовно, тому що syslog сервер вже був), легке налаштування (у нашому випадку налаштування не знадобилося, тому що всі комутатори вже були налаштовані на відсилання повідомлень на віддалений syslog сервер) і дуже просте використання. Це рішення заощадило нам купівлю додаткових комутаторів, у яких насправді не було потреби і допомагає в плануванні нашої мережі, адже тепер ми будь-якої миті можемо дізнатися кількість вільних портів на будь-якому комутаторі, що дозволяє вчасно готуватися до потреб організації, що росте.

Хардкорна конфа за С++. Ми запрошуємо лише профі.