Як визначити NIC, які підключені до одного комутатора з вікна Linux?


15

Початкова настройка

Як адміністратор Linux, ви встановили свіжу вікно Linux з 6 NIC eth0 to eth5. Інтерфейс eth0 правильно налаштований, і всі інші інтерфейси наразі створені, але без IP-адреси. Хлопці з мережі просто приєднали чотири кабелі до цієї коробки. Два кабелі локальної мережі використовуються для підключення коробки до виробничої мережі, а два - для підключення коробки до приватної мережі. Ви знаєте лише, що eth0 підключений до виробничої мережі. Але ви не знаєте, який інший NIC підключений до того ж комутатора, оскільки є різні покоління сервера та / або хлопці мережі використовують неправильні NIC для своїх з'єднань.

Завдання під рукою

Оскільки ця настройка характерна для вашої інфраструктури, ви хочете автоматизувати конфігурацію сполучних інтерфейсів. Тепер у вас є завдання виявити, які NIC взагалі не підключені, а які NIC пов'язані з одним і тим же комутатором, щоб вони могли бути з'єднані. У вас є лише доступ до скриньки 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 Discovery Protocol), який надасть вам інформацію про комутатор, де він підключений.

Ви можете використовувати 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

1
Насправді я пішов з цим рішенням і написав трохи сценарію python, який виконує tcpdumps як нитки у фоновому режимі, а потім я надсилаю arp запити і дивлюся, який інтерфейс отримує пакети arp, з якого src mac. Працює, але з усіма очіками потрібен певний час.
Райнер Ротманн

Я припускаю, що ви говорите про тайм-аути для ping? Ви можете спробувати 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 і знайти там більше інформації.



1

Чому б не просто завантажити та створити linkloopінструмент? Це не так старе ...

В іншому випадку я б просто застосував якийсь інструмент, який транслюватиметься над шаром 2 і підтверджує, що ви отримуєте його через tcpdump.

Надсилання широкомовного пакету ICMP легко ping -b 192.168.1.255


Я просто намагався це зробити, і це не вдалося тут у 2016 році на Ubuntu 14, так що YMMV.
Hack Saw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.