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

Пару лет назад у меня появился сервер мониторинга 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 адресов). Короче, идей много только бы хватило времени и сил для борьбы с ленью.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 13

    0
    А еще можно прикрутить базу соответствия префиксов MAC-адресов производителям оборудования, чтобы видеть не голые маки, а названия вендоров.
      0
      Это делается даже проще: при arp сканировании nmap показывает вендора вместе с mac адресом.
        0
        Реализовывать постоянный мониторинг при помощи arp-сканирования — не самая лучшая идея. По возможности, весь мониторинг должен быть пассивным, везде, где это можно реализовать.
          0
          Согласен и в перспективе планирую добавить получение информации о сети из других источников, чтобы была возможность минимизировать нагрузку на сеть.
          –1
          это делается даже ещё проще, get запросом на тот-же coffer,com.
        +1
        А реализовать это не сбором по snmpwalk, а методом собирания trap'ов?
        Про HP не знаю, но на D-Link прекрасно работает схема с snmptrapd.
        Нагрузки меньше при большой сети.
          0
          Некоторые управляемые на поддерживают snmp traps (тот же дешёвый HP Procurve 1700).
          Как это у вас выглядит? Каждый раз когда на коммутаторе обновляется кеш привязки mac адресов к портам, отправляется trap?
            0
            Смену статуса порта коммутатор понимает реал-тайм и посылает трап, а принимается и обрабатывается он trap handler'ом на сервере. Брать данные из fdb таблицы — no way по многим причинам. Вот когда-то делал наколенное решение для д-линков: underaze.livejournal.com/12705.html
              0
              Если статус порта на свиче при подключении хоста не меняется, как на последнем скриншоте, где компьютер подключен через коммутатор на ip телефоне, отправка трапа всё равно происходит?
              Почему именно не нужно брать данные из fdb таблицы?
          0
          Существует семейство протоколов, позволяющих определять соседа. Например открытые LLDP, NDP, закрытый CDP. Используя их можно сразу получить информацию о соседе. Их используют платные системы мониторинга для первоначального построения схемы сети
            +1
            Добрый вечер, летом решил по примеру добавить мониторинг портов, чтобы удобнее корректировать работы в удаленных офисах.
            Из закладок как раз воспользовался упомянутым примером: habrahabr.ru/post/154723/
            Сейчас еще не спеша обновляю ее, но уже работает с оригинальным LLD шаблонами. И можно добавить в интерфейс zabbix, выбирать группы, видно разницу между shutdown портами и link down, а также выводить чуть больше информации и еще по мелочи.
            Но не будучи хорошим PHP программистом, не все пока красиво.
            Идею со связаными устройствами, в частности отображение MAC адресов, я не добрался, но хотел бы переложить бы на трапы. Возможно для начала воспользуюсь вашим вариантом.
            Master ветка, пока не обновляется, я недавно получил от автора последний вариант скриптов и еще не смержил.
            Последний рабочий вариант тут: github.com/pioneerit/zabbix_switch_ports/tree/ver_0.2
            Желающие воспользоваться и улучшить могут смело обращаться тут или через github.

            P.S. Спасибо за напоминание про LLDP, нужно будет воспользоваться для построения карты — blog.zabbix.com/maps-for-the-lazy/2898/
              0
              Спасибо за статью, отличное улучшение моего способа из habrahabr.ru/post/128439/
              От себя отмечу, что для получения кучи данных по свичам, в том числе и mac-адресов на конкретных портах, теперь можно использовать не только Zabbix + скрипты, но и весьма годный сервер мониторинга Observium, который из коробки умеет собирать по SNMP и визуализировать данные с активки. С заббиксом ему не сравниться, но зато и никаких трудозатрат на настройку он не требует. Сам использую Заббикс для алертов и мониторинга серверов, а Observium для визуализации данных с активки.
                0
                Посмотрите на nocproject.org, возможно там уже решено много ваших задач

                Only users with full accounts can post comments. Log in, please.