Comment identifier les cartes réseau connectées au même commutateur à partir d'un boîtier Linux?

15

La configuration initiale

En tant qu'administrateur Linux, vous avez installé une nouvelle boîte Linux avec 6 cartes réseau eth0 à eth5. L'interface eth0 est correctement configurée et toutes les autres interfaces sont actuellement actives mais sans adresse IP. Les gars du réseau ont simplement attaché quatre câbles à cette boîte. Deux câbles LAN sont utilisés pour connecter le boîtier au réseau de production et deux pour connecter le boîtier à un réseau privé. Vous savez seulement que eth0 est connecté au réseau de production. Mais vous ne savez pas quel autre NIC est connecté au même commutateur car il existe différentes générations de serveurs et / ou les gars du réseau utilisent les mauvais NIC pour leurs connexions.

Tâche à accomplir

Comme cette configuration est typique de votre infrastructure, vous souhaitez automatiser la configuration des interfaces de liaison. Vous avez maintenant la tâche de détecter les cartes réseau qui ne sont pas connectées du tout et celles qui sont liées au même commutateur afin qu'elles puissent être liées. Vous n'avez accès qu'aux boîtes Linux et ne pouvez pas interroger les commutateurs.

Des idées

La détection de l'état du lien est simple:

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

Mais comment faire correspondre les appareils connectés au même commutateur?

Dans HP-UX, il existe un outil à cet effet appelé linkloop [1]. L'outil Linux officiel est manquant (il existe cependant un ancien projet SourceForce).

Les solutions possibles qui me sont déjà venues à l'esprit sont les suivantes:

  1. Écoutez sur toutes les interfaces avec tcpdump. Créez et envoyez un paquet ICMP (diffusion). Les interfaces qui voient ce paquet doivent être connectées au même commutateur. -> besoin de suggestions d'outils simples qui peuvent être utilisés pour cela. Je voudrais utiliser des commandes shell simples ou Python pour les scripts.

  2. Essayez de parler à un boîtier externe via un protocole simple (HTTP?) Et voyez s'il y a une réponse. -> Sujet aux erreurs et dépendant d'un boîtier externe.

Avez-vous d'autres idées ou suggestions pour résoudre cette tâche?

Merci d'avance pour tous les commentaires!

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

Reiner Rottmann
la source
1
Cela sent VRAIMENT comme des devoirs - Est-ce un problème réel auquel vous êtes confronté dans un environnement de production?
voretaq7
2
Vrai problème et ennuyeux, je pourrais ajouter. Je ne suis plus à l'école depuis longtemps ...
Reiner Rottmann
OK - la raison pour laquelle je pose la question est la façon dont vous avez formulé la question qui m'a rappelé le style de l'un de mes manuels de réseautage :-)
voretaq7

Réponses:

10

Les commutateurs peuvent déjà vous envoyer les informations souhaitées. S'il s'agit de commutateurs Cisco, ils utiliseront par défaut un processus appelé CDP (Cisco Discovery Protocol) qui vous fournira des informations sur le commutateur auquel il est connecté.

Vous pouvez utiliser tcpdump pour afficher ces informations avec les éléments suivants (en remplaçant l'interface appropriée):

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

La version standard de CDP est LLDP (protocole de découverte de couche liaison). Certains fournisseurs auront cette option activée par défaut et d'autres désactivés, votre kilométrage variera donc. Il existe certaines implémentations LLDP pour Linux, mais si vous voulez quelque chose de similaire à ce qui précède, vous pouvez l'utiliser (configurer LLDP sur un commutateur Cisco et tester ce qui suit, ce qui est plus cohérent avec ce qui précède):

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

Sauf cela, je dirais qu'une modification de l'option 1 que vous fournissez pourrait fonctionner, cependant, au lieu d'envoyer un ICMP de diffusion, vous pouvez essayer un ICMP normal (vers un hôte ne figurant pas dans la table ARP) et capturer les paquets ARP. Si la demande ARP est envoyée à eth0 et que vous la recevez sur eth1 et eth3, vous savez que celles-ci se trouvent sur le même VLAN. La commande la plus simple pour cela est la suivante:

tcpdump -i eth0 arp
YLearn
la source
1
En fait, je suis allé avec cette solution et j'ai écrit un petit script python qui exécute tcpdumps en tant que threads en arrière-plan, puis j'envoie des requêtes arp et vois quelle interface reçoit les packages arp de quel src mac. Fonctionne mais avec tous les délais d'attente, cela prend un certain temps.
Reiner Rottmann
Je suppose que vous parlez des délais d'attente de ping? Vous pouvez essayer fping ou nmap comme options pour réduire le délai d'attente à moins d'une seconde. Par exemple, "fping -c1 -t200 192.168.0.1" ou "nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1".
Apprendre
3

Si le commutateur communiquera avec vous à l'aide de LLDP, vous pourrez peut-être exécuter LLDP et y trouver plus d'informations.

Mcmeel
la source
3

Si les commutateurs sont des périphériques Cisco, vous pouvez peut-être obtenir des informations CDP, à condition qu'ils annoncent / diffusent des informations CDP

par exemple outils cdp ou cdpr

Mike Brentlinger
la source
1

Pourquoi ne pas simplement télécharger et créer l' linkloopoutil? Ce n'est pas si vieux ...

Sinon, je voudrais simplement utiliser un outil qui diffusera sur la couche 2 et vérifier que vous le recevez via tcpdump.

L'envoi d'un paquet ICMP de diffusion est facile ping -b 192.168.1.255

user606723
la source
J'ai juste essayé de le faire, et cela a échoué ici en 2016 sur Ubuntu 14, donc YMMV.
Hack Saw