Jak rozpoznać karty sieciowe podłączone do tego samego przełącznika z komputera z systemem Linux?

15

Początkowe ustawienia

Jako administrator Linuksa zainstalowałeś nową skrzynkę Linux z 6 kartami sieciowymi eth0 do eth5. Interfejs eth0 jest poprawnie skonfigurowany, a wszystkie inne interfejsy są obecnie uruchomione, ale bez adresu IP. Faceci z sieci po prostu podłączyli cztery kable do tego urządzenia. Dwa kable LAN są używane do podłączenia urządzenia do sieci produkcyjnej, a dwa są używane do podłączenia urządzenia do sieci prywatnej. Wiesz tylko, że eth0 jest podłączony do sieci produkcyjnej. Ale nie wiesz, która inna karta sieciowa jest podłączona do tego samego przełącznika, ponieważ istnieją różne generacje serwerów i / lub faceci sieci używają niewłaściwych kart sieciowych do swoich połączeń.

Zadanie pod ręką

Ponieważ ta konfiguracja jest typowa dla Twojej infrastruktury, chcesz zautomatyzować konfigurację interfejsów łączenia. Teraz masz zadanie wykryć, które karty sieciowe w ogóle nie są podłączone, a które karty sieciowe są połączone z tym samym przełącznikiem, aby mogły zostać połączone. Masz dostęp tylko do Linux-a i nie możesz przeszukiwać przełączników.

Pomysły

Wykrywanie statusu łącza jest łatwe:

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

Ale jak dopasować urządzenia podłączone do tego samego przełącznika?

W HP-UX jest do tego celu narzędzie o nazwie linkloop [1]. Brakuje oficjalnego narzędzia Linux (istnieje jednak stary projekt SourceForce).

Możliwe rozwiązania, które już przyszły mi do głowy:

  1. Słuchaj na wszystkich interfejsach za pomocą tcpdump. Utwórz i wyślij pakiet ICMP (rozgłoszeniowy). Interfejsy, które widzą ten pakiet, muszą być podłączone do tego samego przełącznika. -> potrzebujesz sugestii prostych narzędzi, które mogą być do tego użyte. Chciałbym używać skryptów jako poleceń powłoki lub Pythona.

  2. Spróbuj porozmawiać z zewnętrznym urządzeniem za pomocą prostego protokołu (HTTP?) I sprawdź, czy jest odpowiedź. -> Podatne na błędy i zależne od zewnętrznego urządzenia.

Czy masz dalsze pomysły lub sugestie, jak rozwiązać to zadanie?

Z góry dziękuję za wszystkie komentarze!

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

Reiner Rottmann
źródło
1
NAPRAWDĘ pachnie pracą domową - czy to rzeczywisty problem, przed którym stoisz w środowisku produkcyjnym?
voretaq7 24.04.13
2
Prawdziwy problem i irytujący, mogę dodać. Długo nie jestem w szkole ...
Reiner Rottmann
OK - powodem, dla którego pytam, jest to, w jaki sposób sformułowane pytanie przypomniało mi styl jednego z moich podręczników sieciowych :-)
voretaq7 25.04.2013

Odpowiedzi:

10

Przełączniki mogą już wysyłać Ci potrzebne informacje. Jeśli są to przełączniki Cisco, domyślnie będą korzystać z procesu o nazwie CDP (Cisco Discovery Protocol), który dostarczy informacji o przełączniku, do którego jest podłączony.

Możesz użyć tcpdump, aby wyświetlić te informacje w następujący sposób (zastępując odpowiedni interfejs):

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

Standardowa wersja CDP to LLDP (protokół wykrywania warstwy łącza). Niektórzy dostawcy mają to domyślnie włączone, a inni wyłączone, więc przebieg może się różnić. Istnieją pewne implementacje LLDP dla Linuksa, ale jeśli chcesz czegoś podobnego do powyższego, możesz tego użyć (skonfiguruj LLDP na przełączniku Cisco i przetestuj poniższe, co jest bardziej spójne z powyższym):

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

Pomijając to, powiedziałbym, że modyfikacja podanej przez ciebie opcji 1 może działać, jednak zamiast wysyłać rozgłaszany ICMP, możesz wypróbować normalny ICMP (do hosta spoza tabeli ARP) i przechwytywać pakiety ARP. Jeśli żądanie ARP zostanie wysłane eth0, a otrzymasz je na eth1 i eth3, to wiesz, że są one w tej samej sieci VLAN. Najprostsze do tego polecenie jest następujące:

tcpdump -i eth0 arp
YLearn
źródło
1
Właściwie poszedłem z tym rozwiązaniem i napisałem mały skrypt Pythona, który uruchamia tcpdumps jako wątki w tle, a następnie wysyłam żądania arp i sprawdzam, który interfejs odbiera pakiety arp z którego src mac. Działa, ale przy wszystkich limitach czasu zajmuje to trochę czasu.
Reiner Rottmann
Zakładam, że mówisz o limitach pingów? Możesz spróbować fping lub nmap jako opcji, aby skrócić limit czasu poniżej jednej sekundy. Na przykład „fping -c1 -t200 192.168.0.1” lub „nmap -sP - max-reties = 1 - limit czasu hosta = 200 ms 192.168.0.1”.
YDowiedz się
3

Jeśli przełącznik będzie komunikował się z Tobą za pomocą LLDP, być może będziesz mógł uruchomić LLDP i znaleźć tam więcej informacji.

mcmeel
źródło
3

Jeśli przełączniki są urządzeniami Cisco, możesz uzyskać informacje CDP, pod warunkiem, że ogłaszają / transmitują informacje CDP

np. narzędzia cdp lub cdpr

Mike Brentlinger
źródło
1

Dlaczego nie pobrać i zbudować linkloopnarzędzia? To nie jest tak stare ...

W przeciwnym razie użyłbym tylko narzędzia, które będzie nadawać na warstwie 2 i sprawdził, czy otrzymujesz je za pomocą tcpdump.

Wysłanie pakietu emisji ICMP jest łatwe ping -b 192.168.1.255

użytkownik606723
źródło
Właśnie próbowałem to zrobić, ale nie udało się to tutaj w 2016 roku na Ubuntu 14, więc YMMV.
Hack Saw