Extraire les adresses MAC du réseau via une formation Python

Extraire les adresses MAC du réseau via une formation Python

Un jeudi soir après le boulot, les yeux rougis par une journée de tickets d'assistance, je devais lister les adresses physiques de tout un lot d'imprimantes et d'ordinateurs. Pas de budget pour un outil d'inventaire automatique. J'étais à deux doigts de tout recopier à la main depuis les consoles locales, avant de me dire qu'une formation Python axée automatisation devait bien servir à ça.

Le mythe du script magique en trois lignes

Quand on bosse au support informatique, on entend partout que le code va nous sauver la vie. Les vidéos promotionnelles adorent vous montrer un formateur détendu qui tape quatre lignes sur un éditeur sombre, appuie sur entrée, et extrait instantanément toutes les adresses matérielles du quartier. C'est ce miroir aux alouettes qui m'a décidé à suivre un cursus en ligne, de la fin de l'hiver dernier jusqu'au début de l'été, environ quatre mois à bûcher les soirs de semaine.

Dans la théorie, une adresse MAC est simple à appréhender. C'est l'identifiant physique gravé sur la carte réseau, un format standardisé EUI-48 codé sur 48 bits (soit 6 octets), généralement écrit sous forme de six paires hexadécimales séparées par des deux-points ou des tirets. Dans mon esprit de technicien N1, récupérer ces 48 bits pour chaque machine active du bureau semblait être un exercice d'introduction élémentaire. La réalité des premiers cours m'a vite rappelé que le code ne s'exécute jamais dans un monde idéal.

Console PowerShell affichant des commandes réseau et du code Python

Le module d'initiation proposait une approche très scolaire : utiliser la bibliothèque standard subprocess pour lancer la commande système arp -a, puis découper la chaîne de caractères avec des expressions régulières ou un simple split(). Sur la vidéo du formateur, sous macOS, le résultat s'affichait proprement. Sur mon poste de lab, la déception est arrivée sans attendre : la table ARP locale était pratiquement vide.

Pourquoi ? Parce qu'une machine ne garde en mémoire que les correspondances des équipements avec lesquels elle vient de discuter. Si votre ordinateur n'a pas échangé de paquets avec l'imprimante réseau du couloir durant les dernières minutes, son entrée s'efface du cache. Vouloir extraire un inventaire fiable en se contentant de lire la table ARP de son propre PC sans générer de trafic préalable, c'est comme espérer lister les habitants d'un immeuble en regardant uniquement les gens qui sonnent à votre porte.

Quand Scapy entre en scène : bruit de ventilo et droits d'accès

Après deux semaines de modules théoriques sur les boucles et les dictionnaires, le cours abordait enfin un outil plus musclé : la bibliothèque Scapy. L'idée était cette fois d'interroger activement le réseau en s'appuyant sur le protocole ARP, documenté dans la vénérable RFC 826. Au lieu de regarder passivement son cache, le script envoie une requête « broadcast » : il crie sur tout le réseau local pour demander à chaque adresse IP de décliner son adresse MAC.

C'est ici que j'ai pris mes premières claques de débutant. J'avais codé ma petite boucle pour balayer un sous-réseau classique en /24, soit 254 hôtes potentiels à sonder. Tout semblait prêt. J'ai lancé mon script d'un coup de touche Entrée. Au lieu de la jolie liste promise, l'écran a craché une PermissionError rouge vif sur le terminal PowerShell parce que je n'avais pas lancé la console en admin. Le cours ne mentionnait cette contrainte qu'en toute petite note de bas de page. Pour forger des trames brutes de niveau 2 (la couche liaison de données), le système d'exploitation exige des privilèges stricts. Pas question de faire tourner ça en simple utilisateur standard sur un poste verrouillé par l'administrateur du domaine.

Une fois la console relancée avec les privilèges élevés, j'ai relancé l'analyse. Le ventilateur fatigué de mon portable d'occasion s'est emballé dans le silence du salon pendant que Scapy interrogeait le subnet, envoyant ses requêtes trame par trame. La machine soufflait, l'interpréteur moulinait, mais les premières lignes d'adresses physiques sont enfin apparues à l'écran. La sensation de victoire a duré dix minutes. Juste le temps d'essayer le script au bureau le lendemain matin.

Câbles réseau RJ45 branchés sur un commutateur pour tests en atelier

L'angle mort des cours en ligne : les VLANs et la segmentation

Au bureau, mon script n'a remonté qu'une douzaine d'adresses : les trois postes de mon bureau et les deux serveurs de test connectés sur la même prise murale. Rien d'autre. Pas un seul poste de la compta, aucun téléphone IP, aucune imprimante.

Apprendre à extraire des adresses MAC avec Scapy est totalement inutile si l'on ne comprend pas que le protocole ARP est obsolète sur les réseaux modernes segmentés par VLAN. Dans une petite maison ou un tutoriel vidéo enregistré sur une box internet grand public, tout le monde loge dans le même panier de diffusion. Tout le monde s'entend crier. Mais en entreprise, les commutateurs isolent les services : les requêtes de diffusion ARP ne traversent pas les routeurs ni les passerelles de niveau 3. Scapy peut hurler aussi fort qu'il veut, ses trames ARP meurent au pied de la passerelle du sous-réseau local.

Les formations de programmation généralistes traitent le réseau comme une simple tuyauterie logique : vous donnez une plage IP, vous récupérez un dictionnaire, et voilà. Elles n'expliquent presque jamais que pour inventorier un vrai parc d'entreprise, la découverte ARP depuis un poste client est une impasse architecturale. Pour contourner ça, il faut soit déployer un agent local sur chaque sous-réseau, soit interroger directement les commutateurs via SNMP ou des API réseau. Mais ça, ces cours d'automatisation pour débutants l'évacuent pudiquement pour ne pas effrayer les apprenants avec des notions d'infrastructure Cisco ou de routage inter-VLAN.

J'avais déjà rencontré des soucis similaires quand je cherchais à extraire les numéros de série du parc informatique avec Python : le code est rarement le problème principal, c'est l'accès matériel et la topologie qui coincent.

Mon bilan pour un technicien qui hésite à se lancer

Faut-il pour autant fuir ces formations Python quand on est technicien de proximité ? Pas du tout. Mais il faut les aborder avec les bons yeux, sans fantasmer sur une solution miracle prête à l'emploi.

Ce type d'apprentissage m'a surtout servi à démystifier la programmation. Comprendre comment manipuler des chaînes de caractères, parser un fichier CSV ou interroger un système sans paniquer devant une trace d'erreur est un acquis formidable pour le support au quotidien. D'ailleurs, si vous cherchez des applications bien plus immédiatement rentables au travail sans vous heurter aux barrières des pare-feux et des VLANs, je vous conseille plutôt d'explorer comment automatiser le nettoyage des serveurs avec une formation Python pratique, où le script travaille localement sur les disques sans se prendre les pieds dans le protocole ARP.

Vers la fin du printemps, en faisant le tri dans mes scripts d'exercice, j'ai fini par abandonner l'idée du scanner Scapy maison pour notre parc en entreprise. Pour le réseau de prod, nous avons activé les protocoles de supervision standard sur nos commutateurs, ce qui reste mille fois plus propre. En revanche, le script m'a servi plusieurs fois sur mon banc d'atelier pour qualifier rapidement des machines en vrac branchées sur un petit switch isolé. Savoir bricoler un outil d'appoint quand on dépanne du matériel, c'est exactement ce que je cherchais. Rien de plus, rien de moins.