Назад | Перейти на главную страницу

Как определить сетевые адаптеры, подключенные к одному и тому же коммутатору из коробки Linux?

Начальная настройка

Как администратор Linux вы установили новый Linux-сервер с 6 сетевыми адаптерами eth0 - eth5. Интерфейс eth0 настроен правильно, и все остальные интерфейсы в настоящее время работают, но без IP-адреса. Сетевые специалисты просто подключили к этой коробке четыре кабеля. Два кабеля LAN используются для подключения приставки к производственной сети, а два - для подключения приставки к частной сети. Вы знаете только, что eth0 подключен к производственной сети. Но вы не знаете, какая еще сетевая карта подключена к тому же коммутатору, поскольку существуют серверы разных поколений и / или сетевые специалисты используют неправильные сетевые адаптеры для своих подключений.

Задача под рукой

Поскольку эта настройка типична для вашей инфраструктуры, вы хотите автоматизировать настройку интерфейсов связывания. Теперь у вас есть задача определить, какие сетевые адаптеры вообще не подключены и какие сетевые адаптеры связаны с одним и тем же коммутатором, чтобы их можно было связать. У вас есть доступ только к ящикам Linux и вы не можете запрашивать переключатели.

Идеи

Определить статус ссылки очень просто:

ethtool $device | grep 'Link detected' | cut -d ':' -f 2

Но как сопоставить устройства, подключенные к одному коммутатору?

В HP-UX для этой цели есть инструмент под названием linkloop [1]. Официальный инструмент Linux отсутствует (правда, есть старый проект SourceForce).

Возможные решения, которые уже приходили мне в голову:

  1. Слушайте все интерфейсы с помощью tcpdump. Создайте и отправьте пакет ICMP (широковещательный). Интерфейсы, которые видят этот пакет, должны быть подключены к одному коммутатору. -> нужны предложения простых инструментов, которые можно использовать для этого. Я хотел бы использовать простые команды оболочки или Python для написания сценариев.

  2. Попробуйте поговорить с внешним устройством через какой-нибудь простой протокол (HTTP?) И посмотрите, есть ли ответ. -> Возможны ошибки и зависят от внешнего блока.

Есть ли у вас еще идеи или предложения, как решить эту задачу?

Заранее благодарю за все комментарии!

[1] http://linux.die.net/man/1/linkloop

Возможно, коммутаторы уже отправляют вам нужную информацию. Если это коммутаторы Cisco, по умолчанию они будут использовать процесс CDP (протокол обнаружения Cisco), который предоставит вам информацию о коммутаторе, к которому он подключен.

Вы можете использовать tcpdump для просмотра этой информации следующим образом (подставив соответствующий интерфейс):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'

Стандартная версия CDP - это LLDP (протокол обнаружения канального уровня). У некоторых поставщиков это будет по умолчанию, а у других отключено, поэтому ваш пробег будет отличаться. Существует несколько реализаций LLDP для Linux, но если вам нужно что-то похожее на приведенное выше, вы можете использовать это (настройте LLDP на коммутаторе Cisco и протестируйте нижеприведенное, что больше соответствует приведенному выше):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc'

За исключением этого, я бы сказал, что модификация варианта 1, который вы предоставляете, может работать, однако вместо отправки широковещательного ICMP вы можете попробовать обычный ICMP (на хост, не указанный в таблице ARP) и захватить пакеты ARP. Если запрос ARP отправляется на eth0, а вы получаете его на eth1 и eth3, значит, вы знаете, что они находятся в одной VLAN. Самая простая команда для этого следующая:

tcpdump -i eth0 arp

Если коммутаторы являются устройствами cisco, вы можете получить информацию о CDP, при условии, что они объявляют / транслируют информацию о cdp.

например инструменты cdp или cdpr

Если коммутатор будет связываться с вами с помощью LLDP, возможно, вы сможете запустить LLDP и найдите там дополнительную информацию.

Почему бы просто не скачать и не собрать linkloop инструмент? Он не такой уж старый ...

В противном случае я бы просто использовал какой-нибудь инструмент, который будет транслировать через уровень 2, и проверить, что вы получили его через tcpdump.

Отправить широковещательный пакет ICMP просто ping -b 192.168.1.255