Extended MAC Discovery
Часто возникает задача определения точки подключения к сети для оконечных уствойств, таких как:
- Видеокамеры
- VOIP-телефоны
- Принт-серверы
- Рабочие станции
- IoT-датчики
Часто устройства являются ограниченно управляемыми и не поддерживают топологические протоколы (lldp, cdp, etc). Последним методом автоматической линковки остается линковка по MAC-адресам. Существующий алгоритм линковки по MAC'ам работает на уровне сегмента и требует, чтобы линкуемое оборудование отдавало таблицу MAC'адресов, что в случае тупых оконечных устройств часто невозможно. В связи с этим предлагается дополнительный быстрый способ линковки по MAC'адресам.
Основной принцип
Вводится понятие "прямая линковка по MAC". Прямая линковка возможна, когда мы уверены, что между конкретным портом коммутатора доступа и конкретным портом оконечного устройства нет никаких промежуточных железок.
Для прямой линковки нам необходимо:
- Промаркировать порты коммутатора доступа, как пригодные для прямой линковки
- Промаркировать один порт оконечного устройства, как пригодный и предпочтительный для прямой линковки
- Получить таблицу MAC'адресов с коммутатора доступа
- Провести привязку портов
Расширение IGetInterfaces
В словаре interfaces
добавляется дополнительный опциональный аттрибут:
"hints": StringListParameter(choices=[
"uplink",
"uni",
"nni"
])
Поле hints
позволяет разработчикам скрипта get_interfaces
отдать дополнительную информацию об особенностях работы порта. Например, многие домашние wifi-роутеры имеют отдельный WAN
-порт для подключения к сети Internet и блок LAN
-портов, образующих внутренний простейший bridge. Порты не равноправны между собой и имеют разное назначение. Или VOIP-телефоны часто имеют один порт для подключения к сети и дополнительный порт для подкдючения компьютера.
Предлагаемые значения hints
на первом этапе:
-
uplink
- порт предназначен для подключения к вышестоящей сети -
uni
- user network interface. Порт для подключения конечных юзеров -
nni
- network-to-network interface. Внутрисетевой интерфейс
Расширение коллекции Interface
Добавляется поле hints
и заполняем его по результатам interface discovery
Расширение ConfDB
Добавляем в синтаксисе раздел
interfaces
<name>
hints
Расширение Interface Classification Rule
Добавляется возможность указывать hints
как условие для матчера
Расширение Interface Profile
Существующая настройка
mac_discovery_policy = StringField(
choices=[("d", "Disabled"), ("m", "Management VLAN"), ("e", "Enabled")], default="d"
)
И заменяется на значения:
- Disabled - отключено
- Management VLAN - для совместимости
- Transit - бывший Enabled
- Direct Downlink - разрешить direct mac в роли порта коммутатора доступа
- Chained Downlink - direct mac с возможностью построения цепочек
- Direct Uplink - разрешить direct mac в роли оконечного устройства
Расширение MAC check
После сбора MAC'адресов, в случае, если на железке есть интерфейсы с признаком Direct Downlink
или Chained Downlink
сохраняем для этих портов артефакт mac_direct_downlink
Проверка mac_direct
Активируется, если существует артефакт mac_direct_downlink
.
Для случая Direct Downlink
:
- Находим на всех портах оборудование по chassis id
- Проверяем, что у него есть строго один порт
direct uplink
- Проверяем, что на один порт
direct downlink
приходится не более одного портаdirect uplink
- Осуществляем линковку методом
direct mac
. Если там уже естьdirect_mac
с другой железкой - заменяем - Все неподтвержденные линки
direct mac
отцепляем принудительно
Для случая Chained Downlink
:
- Если на порту не более одного MAC'а, то поведение эквивалентно
Direct Downlink
- Если больше одного MAC'а - проверям:
- что для каждого из них существует строго один порт
Direct Uplink
- все объекты имеют разный
level
вmanaged object profile
- что для каждого из них существует строго один порт
- Сортируем объекты по
level
в порядке убывания - Проверяем, что все объекты, кроме последнего, имеют строго один порт
Direct Downlink
- Собираем цепочки по принципу uplink/downlink методом
direct mac
. Если там уже естьdirect_mac
с другой железкой - заменяем - Все неподтвержденные линки
direct mac
отцепляем принудительно
direct uplink
можно линковать только с direct downlink
или с chained downlink
Замечания
- [Учтено, см.
Chained Downlink
] Ситуация при которой соединение выглядит как PC <-> Phone <-> Switch, как будет решаться. За портом будут светиться MAC адреса компьюетера и телефона, у PC будет один аплинк, у телефона будет 1 аплинк и 1 порт без подсказки. Вижу здесь 2 варианта:- ввести возможность одного промежуточного устройства (т.е. при которой мы за портом находим 2 устройства, и явно видно что одно линкуется через второе)
- данный вариант реализовывать не прямой, а Cloud линковкой
-
mac_discovery_policy
сейчас отввчает за сбор MAC адресов с интерфейса. Видимо, необходимо поменять её назначение, иначе получается двойственная ситуация, если я хочу собрать маки но не линковать, то такой опции нет. - Пункт Все неподтвержденные линки direct mac отцепляем принудительно, полагаю здесь стоит использовать механизм устаревания линков, иначе мы получим много флапов. Комп выключили на ночь и мы его разлинковали, железка упала и мы её разлинковали, это будет грустно