В течении многих лет мы, ввиду специфики работы, постоянно сталкиваемся с необходимостью съема FDB-таблиц (Forwarding DataBase) управляемых коммутаторов с данными о коммутации MAC-адресов абонентов и устройств. За это время мимо нас прошли несколько сотен различных моделей устройств многих производителей, а количество версий их прошивок сложно сосчитать. Накопив опыт – можно им и поделиться.
В данном случае затронем лишь тему съема требуемых данных по SNMP-протоколу.
Заранее отмечу, что мы не лоббируем и не стараемся принизить какого-то вендора или модель. Приведённые для примера модели указаны в информационных целях и были в момент написания статьи под рукой.
Итак – SNMP-метод съема информации
Плюсы:
- удобство подключения по SNMP – есть библиотеки и стандартные функции под многие языки программирования. Нет нужды греть голову с Telnet-подключением и авторизацией (отдельная тема);
- некоторые модели бюджетных коммутаторов вообще не имеют возможности Telnet-подключений;
- в большинстве случаев используются стандартные OID для получения требуемой информации.
Минусы:
- скорость получения информации. Достаточно медленно на объемах (съем 2000 MAC-адресов через snmpwalk займет, в лучшем случае, около 40 секунд, в то время как Telnet их выдаст моментально);
- SNMP сильнее нагружает процессор коммутатора – в некоторых случаях под 100% при съеме больших объемов на бюджетных моделях;
- для каждого VLAN (а их могут быть сотни) часто требуется отдельное подключение (об этом ниже);
- иногда различаются особенности реализации функционала у разных вендоров и моделей.
Отдельный момент – подключение по разным протоколам SNMP – v.1 или v.2. Вторая версия более быстра, но некоторые (устаревшие) модели её не поддерживают, либо могут отдать лишь часть данных.
Немного теории
В FDB-таблице коммутатора содержатся записи о том какой MAC-адрес на каком интерфейсе коммутатора находится. Важное уточнение – интерфейсе это не порт. Это МОЖЕТ быть порт, а может быть – номер VLAN или прочий логический объект. А так как нам требуется именно знать номер порта, то, собственно, вся дальнейшая процедура и затевается.
Порядок получения информации
- Получаем список VLAN
- для большинства коммутаторов:
snmpwalk -v2c -c public 192.168.0.1 .1.3.6.1.2.1.17.7.1.4.3.1.1
- для Cisco и подобных
snmpwalk -v2c -c public 192.168.0.1 .1.3.6.1.4.1.9.9.46.1.3.1.1.2
При этом некоторые модели (FoxGate S6224-S4) могут ругаться и ничего так и не дать:
iso.3.6.1.4.1.9.9.46.1.3.1.1.2 = No Such Object available on this agent at this OID iso.3.6.1.2.1.17.7.1.4.3.1.1 = No Such Instance currently exists at this OID
- для большинства коммутаторов:
- Подключаемся к каждому VLAN и запрашиваем индексы «порт-интерфейс» для каждого VLAN. Напоминаю, что подключение по-умолчанию через SNMP выполняется к VLAN default, а чтобы подключиться к конкретному VLAN – требуется указать его после community через @, например:
snmpwalk -v2c -c public@999 192.168.0.1 .1.3.6.1.2.1.17.1.4.1.2
выдаст соотношение «порт-интерфейс» для VLAN ID: 999
Дело в том, что в некоторые VLAN может быть отдана часть портов, в другие VLAN – другая часть и т.д. И только опросив все VLAN можно сложить общую картину по устройству. Пример по Cisco WS-C3550-48 – записи первого VLAN:
iso.3.6.1.2.1.17.1.4.1.2.1 = INTEGER: 1 iso.3.6.1.2.1.17.1.4.1.2.6 = INTEGER: 6 iso.3.6.1.2.1.17.1.4.1.2.8 = INTEGER: 8 iso.3.6.1.2.1.17.1.4.1.2.9 = INTEGER: 9 iso.3.6.1.2.1.17.1.4.1.2.10 = INTEGER: 10
В него отдано только 5 портов. В данном случае номера интерфейсов совпадают с номерами портов.
- Запрашиваем FDB таблицу по VLAN default:
snmpwalk -v2c -c public 192.168.0.1 .1.3.6.1.2.1.17.4.3.1
iso.3.6.1.2.1.17.4.3.1.1.0.12.66.164.241.225 = Hex-STRING: 00 0C 42 A4 F1 E1 iso.3.6.1.2.1.17.4.3.1.2.0.12.66.164.241.225 = INTEGER: 25 iso.3.6.1.2.1.17.4.3.1.3.0.12.66.164.241.225 = INTEGER: 3
Возвращаемые данные состоят из трех логических частей — собственно MAC-адрес, номер интерфейса и тип записи, а именно:
1 - other - запись, полученная не одним из перечисленных ниже способов 2 - invalid - неправильная запись, неактивная в данный момент 3 - learned - запись, изученная динамически 4 - self – это MAC-адрес коммутатора 5 - mgmt - запись, созданная статически
Записи отличаются одиннадцатым (в данном примере) разрядом (1, 2, 3) и характеризуют какой именно параметр содержится в значении.
Однако дьявол в деталях — иногда данные возвращаются испорченными
iso.3.6.1.2.1.17.4.3.1.1.40.16.123.134.116.160 = Hex-STRING: 28 10 7B 86 74 A0 iso.3.6.1.2.1.17.4.3.1.1.44.171.37.96.118.116 = STRING: ",<%`vt" iso.3.6.1.2.1.17.4.3.1.1.48.133.169.66.201.219 = STRING: "0:cBЙЫ" iso.3.6.1.2.1.17.4.3.1.1.64.97.134.11.180.236 = STRING: "@a┼_м" iso.3.6.1.2.1.17.4.3.1.1.64.97.134.24.59.113 = Hex-STRING: 40 61 86 18 3B 71
Поэтому не мешает выполнять проверку на валидность MAC-адреса.
А иногда для MAC-адреса может не найтись второй и третьей записи (номер интерфейса и тип записи). SNMP такой SNMP….
- Запрашиваем FDB таблицу по прочим VLAN (default VLAN там тоже будет, но об этом позже)
snmpwalk -v2c -c public 192.168.0.1 .1.3.6.1.2.1.17.7.1.2
iso.3.6.1.2.1.17.7.1.2.1.1.2.1 = Counter32: 8 iso.3.6.1.2.1.17.7.1.2.1.1.2.888 = Counter32: 1 iso.3.6.1.2.1.17.7.1.2.2.1.2.888.0.12.66.164.241.225 = INTEGER: 25 iso.3.6.1.2.1.17.7.1.2.2.1.2.1.0.21.153.136.45.223 = INTEGER: 2 iso.3.6.1.2.1.17.7.1.2.2.1.2.1.0.33.133.202.27.110 = INTEGER: 1
В начале – поступит информация о количестве записей в каждом из VLAN. К сожалению она иногда не соответствует действительности.
К примеру в FoxGate S6224-S4 показало:
iso.3.6.1.2.1.17.7.1.2.1.1.2.1 = Counter32: 21 iso.3.6.1.2.1.17.7.1.2.1.1.2.888 = Counter32: 114
А в реальности (далее в списке) записей было:
- VLAN 1: 22
- VLAN 82: 1
- VLAN 130: 4
- VLAN 888: 115
- VLAN 2085: 4
И идут сами записи, которые имеют особую структуру:
iso.3.6.1.2.1.17.7.1.2.2.1.2.888.0.12.66.164.241.225 = INTEGER: 25
С конца:
- 6 блоков (0.12.66.164.241.225) – MAC-адрес в десятичной форме
- 1 блок (888) – номер VLAN
Ну а интерфейс, как видно из значения, номер 25.
Однако Cisco может и не выдать таблицу по всем OID
iso.3.6.1.2.1.17.7.1.2 = No Such Object available on this agent at this OID
И тогда начинается увлекательное занятие – подключение к каждому VLAN и съем с него таблицы, указанной пунктом выше.
- Получив все необходимые данные – совмещаем и получаем сначала
MAC – Интерфейс – Порт
А потом:
MAC – Порт
Наконец-то.
Важные моменты
- если на коммутаторе много VLAN (сотня-другая) – то можно даже не пытаться снимать FDB-таблицу по нему. Никаких вменяемых таймаутов не хватит – обходить их все. Это будет очень долго.
- индивидуальные решения под разные модели. Тут речь о местном допиливании итоговых данных. Alcatel OmniStack LS 6224 и Allied Telesyn AT-8000S/24 – хоть возвращаются номера портов 49-52, но в реальности у коммутаторов портов меньше и тут используется прошивка со старших моделей. Требуется заменить 49 порт на 25, 50 на 26 и т.д.
- в некоторых случаях таблица соответствия ИНТЕРФЕЙС-ПОРТ даёт противоречивые данные. Huawei S2326TP-EI-AC хоть и даёт таблицу соответствия, но при этом в FDB выводятся данные с номерами ПОРТОВ, а не интерфейсов и стандартные приёмы преобразования номеров интерфейсов ведут к неправильным данным (двойное преобразование)
- у стекируемых коммутаторов и у шасси будут особые номера интерфейсов
- часть бюджетных моделей коммутаторов вообще не выдаст информацию о FDB-таблице по всем VLAN. Не предусмотрено производителем. Пример: D-Link DES-21XX
Итог
Несмотря на все вышеуказанные «особенности», SNMP-протокол остаётся самым востребованным и удобным методом получения FDB-таблицы. В большинстве случаев нет необходимостей указанных танцев с бубном и обычный годный D-Link, имеющий единственный VLAN, сходу выдаст красивый список с MAC-адресами, и номера портов будут совпадать с интерфейсами, но как знать…
Если статья будет востребована – в следующий раз расскажу особенности съема по Telnet.
- Cisco WS-C3550-48 Cisco IOS Software, C3550 Software (C3550-IPSERVICESK9-M), Version 12.2(35)SE5, RELEASE SOFTWARE (fc1) Copyright © 1986-2007 by Cisco Systems, Inc. Compiled Fri 20-Jul-07 02:23 by nachen
- D-Link DES-3028G Fast Ethernet Switch 2.00.B2700.B27
- D-Link DES-3200-18/C1 Fast Ethernet Switch Build 4.36.B009
- Edge-Core FE L2 Switch ES3528M
- Foxgate S6224-S2 Device, May 24 2008 14:57:13 HardWare version is V1.00 SoftWare version is S6224-S2_1.6.7.0 OS version is 5.1.35.48 MiniRom version is S6224-S2_1.6.3 BootRom version is S6224-S2_1.6.3 Copyright © 2001-2008 by Foxgate, Inc.
- Huawei S2326TP-EI Versatile Routing Platform Software VRP ® software,Version 5.70 (S2300 V100R006C05) Copyright © 2003-2013 Huawei Technologies Co., Ltd.
Автор: UserSide