Pull to refresh

Покопаемся в мозгах «умного» свича

Reading time3 min
Views39K
Пару лет назад у меня появился сервер мониторинга zabbix. Естественно, сразу захотелось получать как можно больше информации о своём оборудовании. На обычных компьютерных системах zabbix агент даёт для этого самые широкие возможности. С сетевым оборудованием всё сложнее. Команда snmpwalk печатает простыню разных значений и счётчиков, но извлечь оттуда что-то полезное — не так-то просто.

Рассмотрим управляемые свичи. Классический пример с ними — опрашивать состояние каждого порта, а также объём и состав прошедшего трафика. Делается это средствами самого zabbix, как именно смотрите здесь. Только мне мониторинг этих параметров не нужен. Гораздо интереснее отслеживать, какие устройства подключены к коммутатору. Он ведь хранит и обновляет таблицу привязки mac адресов к портам, надо её только достать и красиво оформить. Однажды я нашёл на хабре, как получить эту таблицу. Двумя snmp запросами извлекаем списки портов и mac адресов, а потом по суффиксам значений OID-ов устанавливаем соответствие. Подробности смотрите в исходном посте, а здесь рассказывается, как улучшить такой мониторинг.

У исходной реализации есть несколько недостатков. Во-первых, запуск внешнего скрипта для опроса каждого порта создаёт чрезмерную нагрузку на zabbix сервер, а если по какой-то причине скрипт отработает некорректно или не завершится за положенное время, элемент данных может по-тихому перейти в состояние «не поддерживается», и информация перестанет обновляться. Во-вторых, идентифицировать устройство по mac адресу неудобно, нагляднее иметь его ip адрес или даже доменное имя. В-третьих, так как данные берутся из кеша свича, хорошо бы этот кеш предварительно «разогреть», иначе мы не увидим оборудование, неактивное в сети последнее время.

Чтобы решить эти проблемы, я написал небольшую программу на python. Это демон. С заданной периодичностью он сканирует локальную сеть, опрашивает свичи и посылает информацию на сервер zabbix. Информация по всем портам всех коммутаторов сначала записывается во временный файл, а потом за одно подключение передается серверу утилитой zabbix_sender (с помощью ключа --input-file). Для опроса коммутаторов по snmp используется стандартная программа snmpwalk. Перед этим демон проводит arp сканирование доступных локальных сетей сканером nmap. Это, с одной стороны, «разогревает» кеш, а с другой, даёт отображение mac адресов в ip. Полученные таким образом ip адреса демон может дополнительно преобразовывать в доменные имена (работает, если определены реверсивные доменные зоны).

Так выглядит результат на zabbix сервере


На картинке представлен коммутатор HP Procurve 2520. С помощью vlan'ов на нём определено семь подсетей: пять — локальных и две — внешних к разным интернет-провайдерам. Два mac адреса внизу как раз принадлежат шлюзам провайдеров. Машина с демоном во внешние подсети не смотрит, поэтому ip адреса не определись. Если на порту висит много устройств, для наглядности отображается запись «another switch» (при желании это отключается).

А вот история по одному из портов. К нему подключен ip-телефон и компьютер. Видно, как сотрудник включил компьютер в начале дня, работал, работал… а потом ушёл пораньше. Пятница всё-таки.


Демон называется smonitor и доступен на github.com:
git clone github.com/ifke/smonitor.git

Для отладки работы и отслеживания ошибок демон пишет логи через службу syslog с категорией daemon. Кроме того, предусмотрен запуск программы в режиме отладки, когда демонизации не происходит и все логи выводятся на консоль. Для этого используется ключ --debug:
./smonitor.py --debug

Настройки приложения находятся в файле Settings.py. Там тоже python код, но он состоит только из определения переменных, поэтому разобраться несложно. Подсказки по доступным параметрам смотрите в файле Settings.py.sample.rus. Так как использую в основном ubuntu, программа тестировалось на этом дистрибутиве, и инструкция по установке есть только для него. То же касается и коммутаторов — проверял демон на том, что есть в наличии: HP Procurve 2520, HP Procurve 1700 и D-Link DES-3028. Судя по этой информации, с оборудованием Cisco без допиливания программа работать не будет, потому что snmp запросы нужно делать отдельно по каждому vlan'у.

Демон не привязан именно к zabbix. Чтобы подружить его с другой системой мониторинга, достаточно переписать одну функцию, отвечающую за отправку данных. На самом деле, улучшать можно ещё много всего. Например, решить обратную задачу, то есть показывать для хостов, к какому порту какого свича они подключены. Научить демон определять, как соединены между собой коммутаторы. Добавить импорт соответствия mac и ip адресов из файла, тогда можно организовать полноценный мониторинг без arp сканирования, в том числе и сетей, к которым у демона нет непосредственного подключения (а кеш разогревать ping запросами по списку ip адресов). Короче, идей много только бы хватило времени и сил для борьбы с ленью.
Tags:
Hubs:
+15
Comments13

Articles

Change theme settings