Come identificare le schede di rete collegate allo stesso switch da un box Linux?


15

Configurazione iniziale

Come amministratore Linux hai installato un nuovo box Linux con 6 schede NIC da eth0 a eth5. L'interfaccia eth0 è configurata correttamente e tutte le altre interfacce sono attualmente attive ma senza indirizzo IP. I ragazzi della rete hanno semplicemente collegato quattro cavi a questa scatola. Due cavi LAN vengono utilizzati per collegare la scatola alla rete di produzione e due per collegare la scatola a una rete privata. Sai solo che eth0 è collegato alla rete di produzione. Ma non sai quale altra scheda NIC è connessa allo stesso switch in quanto esistono diverse generazioni di server e / o i ragazzi della rete usano le NIC sbagliate per le loro connessioni.

Compito a portata di mano

Poiché questa configurazione è tipica della tua infrastruttura, vuoi automatizzare la configurazione delle interfacce di bonding. Ora hai il compito di rilevare quali schede di rete non sono affatto collegate e quali schede di rete sono collegate allo stesso switch in modo che possano essere collegate. Hai accesso solo alle caselle Linux e non puoi eseguire query sugli switch.

idee

Rilevare lo stato del collegamento è semplice:

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

Ma come abbinare i dispositivi collegati allo stesso switch?

In HP-UX esiste uno strumento a tale scopo chiamato linkloop [1]. Manca lo strumento ufficiale Linux (esiste un vecchio progetto SourceForce).

Le possibili soluzioni che mi sono già venute in mente sono:

  1. Ascolta su tutte le interfacce con tcpdump. Crea e invia un pacchetto ICMP (broadcast). Le interfacce che vedono quel pacchetto devono essere collegate allo stesso switch. -> bisogno di suggerimenti di strumenti semplici che possono essere utilizzati per questo. Vorrei usare semplici comandi shell o Python per lo scripting.

  2. Prova a parlare con un box esterno tramite un protocollo semplice (HTTP?) E vedi se c'è una risposta. -> Errore incline e dipendente da una scatola esterna.

Hai ulteriori idee o suggerimenti su come risolvere questo compito?

Grazie in anticipo per tutti i commenti!

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


1
Questo ha davvero l'odore dei compiti a casa: è questo un vero problema che stai affrontando in un ambiente di produzione?
voretaq7,

2
Vero problema e fastidioso, potrei aggiungere. Sono fuori dalla scuola da molto tempo ...
Reiner Rottmann,

OK - il motivo per cui ti chiedo è il modo in cui hai formulato la domanda che mi ha ricordato lo stile di uno dei miei libri di testo in rete :-)
voretaq7

Risposte:


10

Gli switch potrebbero già inviarti le informazioni desiderate. Se si tratta di switch Cisco, per impostazione predefinita utilizzeranno un processo chiamato CDP (Cisco Discovery Protocol) che fornirà informazioni sullo switch a cui è collegato.

È possibile utilizzare tcpdump per visualizzare queste informazioni con quanto segue (sostituendo l'interfaccia appropriata):

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

La versione standard di CDP è LLDP (protocollo di rilevamento del livello di collegamento). Alcuni fornitori lo avranno attivato per impostazione predefinita e altri disattivati, quindi il tuo chilometraggio varierà. Esistono alcune implementazioni LLDP per Linux, ma se si desidera qualcosa di simile a quanto sopra, è possibile utilizzarlo (impostare LLDP su uno switch Cisco e testare quanto segue, che è più coerente con quanto sopra):

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

A parte questo, direi che una modifica dell'opzione 1 fornita potrebbe funzionare, tuttavia, invece di inviare un ICMP broadcast, puoi provare un normale ICMP (a un host non presente nella tabella ARP) e acquisire i pacchetti ARP. Se la richiesta ARP viene inviata su eth0 e la ricevi su eth1 ed eth3, allora sai che si trovano sulla stessa VLAN. Il comando più semplice per questo è il seguente:

tcpdump -i eth0 arp

1
In realtà sono andato con questa soluzione e ho scritto un piccolo script Python che esegue tcpdumps come thread in background e quindi invio richieste arp e vedo quale interfaccia riceve i pacchetti arp da cui src mac. Funziona ma con tutti i timeout ci vuole del tempo.
Reiner Rottmann,

Presumo tu stia parlando dei timeout del ping? È possibile provare a fping o nmap come opzioni per ridurre il timeout a meno di un secondo. Ad esempio, "fping -c1 -t200 192.168.0.1" o "nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1".
Impara

3

Se lo switch comunicherà con te usando LLDP, potresti essere in grado di eseguire LLDP e trovare ulteriori informazioni lì.



1

Perché non scaricare e costruire lo linkloopstrumento? Non è così vecchio ...

Altrimenti, utilizzerei solo uno strumento che trasmetterà sul livello 2 e verificherò che lo ricevi tramite tcpdump.

L'invio di un pacchetto ICMP broadcast è semplice ping -b 192.168.1.255


Ho appena provato a farlo, e non è riuscito qui nel 2016 su Ubuntu 14, quindi YMMV.
Hack Saw è stato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.