Получаем MAC-адреса от Cisco с помощью SNMP (PHP)

Как-то мысль пришла в голову о том, что хорошо бы иметь свою систему мониторинга для Cisco, с помощью которой иметь однозначное понятие в каком кабинете подключен тот или иной компьютер к сети. Причем делать это автоматически и, желательно, с WEB-интерфейсом. Радует то, что на наше счастье существует такая вещь, как SNMP – Simple Network Management Protocol. Устройства Cisco его поддерживают весьма неплохо. Учитывая, что в примере мы будем собирать MAC-адреса, нам потребуется библиотека BRIDGE-MIB, которую (как и другие) можно скачать с http://www.cisco.com/public/sw-center/netmgmt/cmtk/mibs.shtml, указав конкретную модель своего устройства.

Что мы имеем? Коммутатор с L3 (Cisco Catalyst 3560G), получаем все MAC-адреса, которые записаны в коммутаторе:

# show mac-address-table

show mac-address-table
show mac-address-table

Те, что с VLAN: All – это внутренние адреса портов. А вот Vlan: 1 – собственно осевшие МАКи. Обращаем внимание на тип: Dynamic и номер порта (Gi0/N). Это нам пригодится.

Далее, я завел виртуальную машину с Apache+PHP, в котором раскомментировал модуль snmp (для Apache2 устанавливается php5-extensions и выбирается модуль snmp).

Пишем скрипт на PHP.

Создаем вот такой скрипт:

Скрипт выборки MAC и портов
Скрипт выборки MAC и портов

Немного поясню его:

Завуалировал я свой IP и имя community.

Функция snmpwalk принимает параметры IP адрес коммутатора, имя комьюнити (см. ниже), и путь OID. Этот путь со сложным сочетанием цифр и точек можно получать из документации к Cisco MIB-файлов, т.е. описание “ветвей дерева”, где можно читать тот или иной параметр.

По пути 1.3.6.1.2.1.17.1.1 у нас лежит массив mac-адресов, а по пути 1.3.6.1.2.1.17.1.2 – соответствующие имена портов.

Обрезаю все лишнее из вывода через substr (так как выводятся тестом Hex STRING: и INTEGER типы данных);

Вывожу попарно вот таком виде:

Вывод скрипта
Вывод скрипта

Нетрудно понять, что если на порту несколько MAC-ов, то либо там находится какой-то коммутатор, либо подключались другие компьютеры за короткий промежуток времени, либо порт магистральный.

Поэтому лучше сразу пометить все магистральные порты и их не выводить, либо выводить с пометкой.

Настраиваем SNMP Community.

Входим в Cisco устройство:

# conf t
(config)# snmp-server community foo RO

Вместо foo можно указать любое имя для комьюнити, а RO – это ReadOnly, так как с помощью SNMP можно не только читать параметры, но и записывать их. Но нам пока это не нужно.

Теперь то, как я вижу развитие этого проекта:

  1. С определенным интервалом (cron) опрашиваются все Cisco коммутаторы и информация заносится в базу данных.
  2. В базе хранится информация о магистральных портах, о том, какой порт в какой кабинет ведет (по патч-панели проследить, это Const), какой компьютер какой MAC имеет (опрос ARP);
  3. Веб-интерфейсом рисуется карта (план здания) по этажам и у каждого кабинета подписываются включенные компьютеры;
  4. Генерировать репорты в случае:
  • если MAC адрес обнаруживается на другом порту (не магистральном) – переноска на новое место;
  • если обнаруживается новый MAC – несанкционированное подключение;
  • если на одном порту появляется несколько MAC-ов – подключение разветвителя в виде свитча или хаба;

При желании эту тему можно развивать. Кто что думает, полезная вещь?

Друзья! Вступайте в нашу группу Вконтакте, чтобы не пропустить новые статьи! Хотите сказать спасибо? Ставьте Like, делайте репост! Это лучшая награда для меня от вас! Так я узнаю о том, что статьи подобного рода вам интересны и пишу чаще и с большим энтузиазмом!

Также, подписывайтесь на наш канал в YouTube! Видео выкладываются весьма регулярно и будет здорово увидеть что-то одним из первых!


Like this post? Please share to your friends:

Comments:

Comments: 9
  1. Толстопард

    > Кто что думает, полезная вещь?
    Полезная, полезная.
    > Simple Network Management Protocol. Устройства Cisco его поддерживают весьма неплохо.
    Предлагаю указать конкретный стандарт, чтобы смотреть его в ТТХ при выборе свитча. В данном случае, емнип, это библиотека BRIDGE-MIB.
    > Завуалировал я … community.
    Неужели v1 в продакшене?
    > Теперь то, как я вижу развитие этого проекта
    У меня самой востребованной (мной)) фичей оказался поиск мака в сети. Помогает а) найти комп в сети и б) узнать, к какому порту какого свитча подключена розетка, в которую я воткнул ноут. Писал то ли на баше, то ли на питоне.
     
    ЗЫ Админ, верни анона. А у регистрантов ещё и чудовищная понэль появляется, вкупе с шапкой сайта и панелями браузера они занимают аккурат полэкрана.

    1. litladmin (автор)

      Спасибо, дополнил статью о BRIDGE-MIB. В SNMP+Cisco я только осваиваюсь, поэтому буду рад услышать некоторые комментарии о возможном применении.

      Насчет v1 – я так понимаю, с безопасностью не очень хорошо. Чем будет отличаться работа с v2/3 от v1? 

      Насчет поиска компьютера в сети – примерно такую цель я и преследовал.

      MAC-адрес в сети найдется в нескольких экземплярах, нужно будет только исключить магистральные порты из списка и тогда получим единственный порт. А зная куда он ведет – патч-панель – однозначно локализовать компьютер в сети.

      Насчет анонов – подумаю. Надоедает разгребать спам-комментарии разных китайцев. Тем паче, комменты я сделал dofollow. Насчет панели – в ближайшее время попробую что-нибудь придумать.

      1. menpavel

        Мне кажется, snmp v1, v2 можно использовать. Один из вариантов добавить везде на усройствах некий влан для управления. а доступ в этот влан сделать только для машин админа.

      2. Толстопард

        > Насчет v1 — я так понимаю, с безопасностью не очень хорошо. Чем будет отличаться работа с v2/3 от v1?
        Шифрование в первую очередь, в v1 тупо plaintext.

        > MAC-адрес в сети найдется в нескольких экземплярах, нужно будет только исключить магистральные порты из списка
        В идеале да. У меня обстановка такая, что редкий комп включается в управляемый свитч, и на каждом порту масса маков. Access от trunk отличается глазуально по номеру — магистрали обычно 1 (традиционно), 25-26, 49-50 (gigabit/GBIC/SFP-порты). Но вообще классно было бы.

        Ещё, кстати
        >если на одном порту появляется несколько MAC-ов — подключение разветвителя в виде свитча или хаба
        Есть вариант разрешить один мак на одном порту, попутно тем самым защитив себя от пары занятных атак. Но тогда не узнаешь, что у тебя есть потенциально опасный пользователь :)

        ЗЫ Понэль таки отключилась галочкой в профиле.

        1. litladmin (автор)

          plaintext передается имя community? Больше ж там ничег нет. Если оно RO, какие потенциальные проблемы могут быть ещё?

          Магистрали у меня у самого обычно как раз SFP-порты (оптика, + не везде, но есть медь (резерв)), там уже да, 1-ый порт.

          Насчет разрешить мак на порту – это PortSecurity? В принципе да, хорошая функция. А потенциально опасных надо ловить на ханипоты ))

          1. Толстопард

            > Если оно RO, какие потенциальные проблемы могут быть ещё?
            Хозяин барин, но я бы побоялся всю инфу по своей сети дяде сливать. Кстати, в description у меня физическое положение свитча, что ещё добавляет пикантности :)
            > Насчет разрешить мак на порту — это PortSecurity?
            Да, на xgu есть хорошая статья по безопасности на link layer, мне особенно понравилась идея превратить свитч в хаб :D

  2. drpsih_83@mail.ru

    Все красиво, но я воспользовался в таком варианте observium, показывает и что подключено и ip подключенного устройства к порту. в description я написал ip, а в программе указал кабинет и этаж.

    1. litladmin (автор)

      Да, масса есть готовых решений. Мне было интересно сделать всё максимально на “низком уровне”, + практиковать своё PHP :)

      1. drpsih_83@mail.ru

        Я соглашусь, что когда есть время то очень важно повысить навыки и по практиковать своё PHP, но к сожалению когда тебя в жатые сроки просят развернуть сеть и настроить ее мониторинг по сети, приходиться пользоваться готовыми решениями. В моем сучае это NAGIOS + NAGVIS + OBSERVIUM =)

Leave a Reply