Wie identifiziere ich NICs, die über eine Linux-Box mit demselben Switch verbunden sind?

15

Ersteinrichtung

Als Linux-Administrator haben Sie eine neue Linux-Box mit 6 NICs eth0 bis eth5 installiert. Die eth0-Schnittstelle ist korrekt konfiguriert und alle anderen Schnittstellen sind derzeit aktiv, jedoch ohne IP-Adresse. Die Netzwerk-Jungs haben einfach vier Kabel an diese Box angeschlossen. Zwei LAN-Kabel verbinden die Box mit dem Produktionsnetzwerk und zwei verbinden die Box mit einem privaten Netzwerk. Sie wissen nur, dass eth0 mit dem Produktionsnetz verbunden ist. Sie wissen jedoch nicht, welche andere Netzwerkkarte an den gleichen Switch angeschlossen ist, da es unterschiedliche Servergenerationen gibt und / oder die Netzwerkmitglieder die falschen Netzwerkkarten für ihre Verbindungen verwenden.

Aufgabe zur Hand

Da dieses Setup für Ihre Infrastruktur typisch ist, möchten Sie die Konfiguration von Bonding-Schnittstellen automatisieren. Jetzt müssen Sie feststellen, welche NICs überhaupt nicht verbunden sind und welche NICs mit demselben Switch verbunden sind, damit sie verbunden werden können. Sie haben nur Zugriff auf Linux-Boxen und können die Switches nicht abfragen.

Ideen

Das Erkennen des Verbindungsstatus ist einfach:

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

Aber wie stimmen Sie die Geräte überein, die an denselben Switch angeschlossen sind?

In HP-UX gibt es dafür ein Tool namens Linkloop [1]. Das offizielle Linux-Tool fehlt (es gibt jedoch ein altes SourceForce-Projekt).

Mögliche Lösungen, die mir bereits in den Sinn gekommen sind, sind:

  1. Lauschen Sie auf allen Schnittstellen mit tcpdump. Erstellen und senden Sie ein ICMP-Paket (Broadcast). Die Schnittstellen, die dieses Paket sehen, müssen mit demselben Switch verbunden sein. -> brauche Vorschläge von einfachen Werkzeugen, die dafür verwendet werden können. Ich würde gerne einfache Shell-Befehle oder Python für das Scripting verwenden.

  2. Versuchen Sie, über ein einfaches Protokoll (HTTP?) Mit einer externen Box zu sprechen und festzustellen, ob eine Antwort vorliegt. -> Fehleranfällig und abhängig von einer externen Box.

Haben Sie weitere Ideen oder Vorschläge, wie Sie diese Aufgabe lösen können?

Vielen Dank im Voraus für alle Kommentare!

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

Reiner Rottmann
quelle
1
Das riecht WIRKLICH nach Hausaufgaben - Ist dies ein tatsächliches Problem, mit dem Sie in einer Produktionsumgebung konfrontiert sind?
Voretaq7
2
Ein echtes Problem und ein nerviges, möchte ich hinzufügen. Ich bin schon lange nicht mehr in der Schule ...
Reiner Rottmann
OK - der Grund, den ich frage, ist, wie Sie die Frage formuliert haben, erinnerte mich an den Stil eines meiner Networking-Lehrbücher :-)
voretaq7

Antworten:

10

Möglicherweise senden Ihnen die Switches bereits die gewünschten Informationen. Wenn es sich um Cisco-Switches handelt, wird standardmäßig ein Prozess namens CDP (Cisco Discovery Protocol) verwendet, der Informationen zu dem Switch bereitstellt, mit dem er verbunden ist.

Mit tcpdump können Sie diese Informationen wie folgt anzeigen (durch Ersetzen der entsprechenden Schnittstelle):

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

Die standardbasierte Version von CDP ist LLDP (Link Layer Discovery Protocol). Bei einigen Anbietern ist diese Option standardmäßig aktiviert und bei anderen deaktiviert, sodass die Anzahl der Meilen variiert. Es gibt einige LLDP-Implementierungen für Linux. Wenn Sie jedoch etwas Ähnliches wie oben möchten, können Sie dies verwenden (Richten Sie LLDP auf einem Cisco-Switch ein und testen Sie das Folgende, was besser mit dem obigen übereinstimmt):

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

Vorbehaltlich dessen würde ich sagen, dass eine von Ihnen bereitgestellte Änderung von Option 1 möglicherweise funktioniert. Anstatt jedoch einen Broadcast-ICMP zu senden, können Sie einen normalen ICMP (an einen Host, der nicht in der ARP-Tabelle enthalten ist) versuchen und die ARP-Pakete erfassen. Wenn eine ARP-Anfrage an eth0 gesendet wird und Sie diese auf eth1 und eth3 erhalten, wissen Sie, dass sich diese im selben VLAN befinden. Der einfachste Befehl dafür lautet wie folgt:

tcpdump -i eth0 arp
YLearn
quelle
1
Eigentlich habe ich mich für diese Lösung entschieden und ein kleines Python-Skript geschrieben, das tcpdumps als Threads im Hintergrund ausführt. Dann habe ich Arp-Anfragen gesendet und festgestellt, welche Schnittstelle Arp-Pakete von welchem ​​src-Mac empfängt. Funktioniert aber mit all den Timeouts dauert es einige Zeit.
Reiner Rottmann
Ich nehme an, Sie sprechen über die Ping-Timeouts? Sie können fping oder nmap als Optionen verwenden, um das Zeitlimit auf unter eine Sekunde zu reduzieren. Zum Beispiel "fping -c1 -t200 192.168.0.1" oder "nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1".
YLearn
3

Wenn der Schalter kommuniziert mit Ihnen LLDP verwenden, können Sie in der Lage zu laufen LLDP und weitere Informationen dort zu finden.

mcmeel
quelle
3

Wenn es sich bei den Switches um Cisco-Geräte handelt, können Sie möglicherweise CDP-Informationen abrufen, vorausgesetzt, sie senden / senden CDP-Informationen

zB cdp tools oder cdpr

Mike Brentlinger
quelle
1

Warum nicht einfach das linkloopTool herunterladen und erstellen ? Es ist nicht so alt ...

Ansonsten würde ich nur ein Tool verwenden, das über Layer 2 sendet und sicherstellt, dass Sie es über tcpdump erhalten.

Das Senden eines Broadcast-ICMP-Pakets ist einfach ping -b 192.168.1.255

user606723
quelle
Ich habe gerade versucht, dies zu tun, und es ist hier im Jahr 2016 auf Ubuntu 14 gescheitert, also YMMV.
Hack Saw