Как администратор 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).
Возможные решения, которые уже приходили мне в голову:
Слушайте все интерфейсы с помощью tcpdump. Создайте и отправьте пакет ICMP (широковещательный). Интерфейсы, которые видят этот пакет, должны быть подключены к одному коммутатору. -> нужны предложения простых инструментов, которые можно использовать для этого. Я хотел бы использовать простые команды оболочки или Python для написания сценариев.
Попробуйте поговорить с внешним устройством через какой-нибудь простой протокол (HTTP?) И посмотрите, есть ли ответ. -> Возможны ошибки и зависят от внешнего блока.
Есть ли у вас еще идеи или предложения, как решить эту задачу?
Заранее благодарю за все комментарии!
Возможно, коммутаторы уже отправляют вам нужную информацию. Если это коммутаторы 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