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

15

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

Как администратор Linux вы установили новую версию Linux с 6 сетевыми картами от eth0 до eth5. Интерфейс eth0 настроен правильно, и все остальные интерфейсы в данный момент работают, но без IP-адреса. Сетевые парни просто подключили четыре кабеля к этой коробке. Два кабеля локальной сети используются для подключения блока к производственной сети, а два - для подключения блока к частной сети. Вы только знаете, что 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

Райнер Роттманн
источник
1
Это действительно пахнет домашним заданием - это реальная проблема, с которой вы сталкиваетесь в производственной среде?
voretaq7
2
Могу добавить, что это настоящая проблема и раздражающая. Я давно не в школе ...
Райнер Роттманн
Хорошо - причина, по которой я спрашиваю, состоит в том, как вы сформулировали вопрос, напомнивший мне стиль одного из моих сетевых учебников :-)
voretaq7

Ответы:

10

Возможно, коммутаторы уже отправляют вам нужную информацию. Если они являются коммутаторами 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
YLearn
источник
1
На самом деле я пошел с этим решением и написал небольшой скрипт на python, который запускает tcpdumps как потоки в фоновом режиме, а затем я отправляю запросы arp и вижу, какой интерфейс получает пакеты arp от какого src mac. Работает, но со всеми таймаутами это занимает некоторое время.
Райнер Роттманн
Я полагаю, вы говорите о таймаутах пинга? Вы можете попробовать fping или nmap в качестве параметров, чтобы уменьшить время ожидания до одной секунды. Например, «fping -c1 -t200 192.168.0.1» или «nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1».
YLearn
3

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

mcmeel
источник
3

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

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

Майк Брентлингер
источник
1

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

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

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

user606723
источник
Я просто попытался сделать это, и это не удалось здесь в 2016 году на Ubuntu 14, поэтому YMMV.
Hack Saw