🔌 Diagnostic réseau OT/IT · au shell Linux

Chapitre 04
Adressage, ARP, routage

Objectifs du chapitre

1. Voir et poser une adresse

Avant de tester quoi que ce soit, il faut savoir où l'on est. La commande de référence est ip addr show, mais pour un coup d'œil rapide on préfère la vue condensée ip -brief addr :

$ ip -brief addr
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.0.71/24 fe80::215:5dff:fe6c:1a2b/64

Ici l'interface eth0 est bien dans le plan de la cellule (192.168.0.0/24). Si ce n'est pas le cas — par exemple parce qu'on vient de brancher un poste neuf — on ajoute une adresse dans le bon subnet :

# Se placer dans le plan machine 192.168.0.0/24
sudo ip addr add 192.168.0.71/24 dev eth0

# Vérifier
ip -brief addr show eth0

# Retirer l'adresse quand on a fini
sudo ip addr del 192.168.0.71/24 dev eth0

Le /24 n'est pas décoratif : c'est lui qui dit à Linux « toutes les adresses 192.168.0.1 à 192.168.0.254 sont sur mon lien local, joignables directement ». Sans le bon masque, l'automate voisin devient un inconnu à router.

Sur un WSL2 en mode NAT (cf. chapitre 1), poser une adresse 192.168.0.71 avec ip addr add ne suffit pas à voir le fil : la trame ne sort jamais de la carte physique. Cette section suppose que tu es sur l'edge ou sur un WSL en mode miroir. Poser une IP donne l'illusion d'être connecté ; seul le trafic réel (§4) le confirme.

Poser une adresse déjà utilisée sur le segment, c'est créer un doublon — la faute OT la plus perturbante (§5). Avant tout ip addr add sur une installation vivante, vérifie que l'IP visée est libre : un arping -D (§5) tranche la question en deux secondes. Ne jamais « prendre » une IP au hasard sur un réseau de production.

2. Le routage : rester local ou passer la passerelle

Quand Linux doit émettre un paquet, il consulte sa table de routage. On la lit avec ip route :

$ ip route
default via 192.168.0.240 dev eth0 # passerelle par défaut (le Scalance/routeur)
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.71

Deux entrées, deux logiques :

Pour atteindre un autre segment de la cellule — mettons un banc d'essai en 192.168.10.0/24 derrière le Scalance .240 — on ajoute une route explicite :

# Joindre le segment 192.168.10.0/24 via le Scalance .240
sudo ip route add 192.168.10.0/24 via 192.168.0.240

# Retirer la route
sudo ip route del 192.168.10.0/24

Retiens la règle du « même quartier » : deux IP dans le même subnet se parlent en direct (ARP + trame Ethernet, couche 2). Deux IP dans des subnets différents ne se voient pas : il faut un routeur (couche 3) pour faire le pont. En OT, ce routeur est très souvent aussi le pare-feu IT/OT — d'où des blocages qui ne sont pas des pannes, mais des règles.

C'est la raison pour laquelle un ping vers un device « hors quartier » peut échouer même si tout fonctionne : le paquet part bien vers la passerelle, mais le pare-feu OT décide de ne pas le relayer. Diagnostiquer, ici, c'est distinguer « pas de route », « route mais filtré » et « device réellement absent ».

3. ARP, le pont L2 ↔ L3

Sur un même subnet, l'IP ne suffit pas à livrer une trame : Ethernet ne connaît que les adresses MAC. Le protocole ARP (Address Resolution Protocol) fait la traduction. Quand ton poste veut parler à 192.168.0.1, il crie en broadcast « qui a 192.168.0.1 ? dis-moi ta MAC », et le CPU répond « c'est moi, 00:1b:1b:2a:10:01 ». Le résultat est mis en cache dans la table des voisins, qu'on lit avec ip neigh :

$ ip neigh
192.168.0.1    dev eth0 lladdr 00:1b:1b:2a:10:01 REACHABLE
192.168.0.20   dev eth0 lladdr 00:1b:1b:2a:10:20 STALE
192.168.0.21   dev eth0 lladdr 00:1b:1b:2a:10:21 REACHABLE
192.168.0.240  dev eth0 lladdr 00:1b:1b:2a:10:f0 STALE

Chaque ligne associe une IP à une MAC (lladdr) et porte un état :

Pour forcer une re-résolution — par exemple après avoir remplacé un équipement, donc changé la MAC derrière une IP — on vide la table :

# Purger toute la table des voisins sur eth0
sudo ip neigh flush dev eth0

# Ou une seule entrée
sudo ip neigh flush 192.168.0.20

Un cache ARP obsolète est un piège de diagnostic classique : on a remplacé une ET 200SP, la nouvelle a la même IP mais une nouvelle MAC, et le poste continue de parler à l'ancienne MAC tant que l'entrée n'a pas expiré. Après tout remplacement de matériel, un ip neigh flush remet les compteurs à zéro.

4. Tester la joignabilité : ping, mais pas seulement

Le réflexe est le ping, qui envoie des paquets ICMP echo request et attend l'echo reply :

$ ping -c4 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.42 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.38 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.40 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.39 ms

--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3051ms
rtt min/avg/max/mdev = 0.380/0.397/0.420/0.015 ms

Quelques options utiles au diagnostic OT :

Mais voici le piège central de l'OT : beaucoup d'équipements industriels ne répondent pas à l'ICMP. Pile réseau minimaliste, ICMP désactivé, ou pare-feu qui le filtre : le device est bien là, parfaitement fonctionnel en Profinet, mais un ping le déclare « injoignable ». Conclure une panne sur ce seul silence est une erreur de débutant.

$ ping -c3 192.168.0.20
PING 192.168.0.20 (192.168.0.20) 56(84) bytes of data.

--- 192.168.0.20 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2043ms

La vraie question n'est pas « répond-il à l'ICMP ? » mais « est-il présent sur le lien ? ». Pour cela on descend d'une couche : arping envoie une requête ARP (couche 2) et attend une réponse ARP. Or tout équipement IP qui possède l'adresse doit répondre à l'ARP pour exister sur le réseau — ICMP filtré ou pas :

$ sudo arping -I eth0 -c3 192.168.0.20
ARPING 192.168.0.20 from 192.168.0.71 eth0
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.703ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.688ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.691ms
Sent 3 probes (1 broadcast(s))
Received 3 response(s)

Verdict : la station .20 est bel et bien là, elle répond en L2 avec sa MAC 00:1b:1b:2a:10:20. Le ping muet ne signifiait qu'une chose : son ICMP est filtré. Le lien est sain.

Un ping sans réponse en OT ne veut pas dire « device absent ». Beaucoup d'automates, capteurs et modules I/O ne répondent pas à l'ICMP par conception. Avant de conclure à une panne, fais un arping -I eth0 <ip> : une réponse ARP prouve la présence sur le lien, même si l'ICMP est fermé.

Combo de terrain pour trancher « présent ou pas » :

$ ping -c2 -W1 192.168.0.20 || sudo arping -I eth0 -c2 192.168.0.20

Si le ping échoue, le arping prend le relais et donne le verdict L2. Deux réponses ARP = joignable ; zéro = vraie absence (à confirmer par câble/port au chapitre 2).

5. Le doublon d'IP, faute OT emblématique

Voici la panne qui rend fou. Deux équipements portent la même adresse IP sur le même segment — typiquement une ET 200SP de rechange configurée avec l'IP de celle qu'elle devait remplacer, mais l'ancienne est restée branchée. Le symptôme : comportement erratique. Le CPU perd puis retrouve la station, les échanges Profinet claquent par intermittence, le ping répond « une fois sur deux » avec des temps qui sautent — parce que c'est tantôt un équipement, tantôt l'autre qui répond.

La cause profonde est au niveau ARP : deux MAC différentes revendiquent la même IP. La table des voisins oscille :

$ ip neigh show 192.168.0.20
192.168.0.20 dev eth0 lladdr 00:1b:1b:2a:10:20 REACHABLE
# quelques secondes plus tard…
$ ip neigh show 192.168.0.20
192.168.0.20 dev eth0 lladdr 00:1b:1b:2a:10:aa STALE

La MAC associée à .20 a changé entre deux lectures : signal d'alerte. Pour confirmer franchement le doublon, on utilise la Duplicate Address Detection de arping avec l'option -D. Elle sonde l'IP et signale toute réponse ; lorsqu'on ne porte pas l'IP, deux MAC différentes qui répondent = doublon avéré :

$ sudo arping -D -I eth0 -c3 192.168.0.20
ARPING 192.168.0.20 from 0.0.0.0 eth0
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.71ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:AA]  0.83ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.69ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:AA]  0.80ms
Sent 3 probes (3 broadcast(s))
Received 4 response(s)  ← plus de réponses que de sondes : DEUX répondeurs

Le diagnostic est sans appel : une seule IP, deux MAC (…:10:20 et …:10:AA) répondent. Il y a bien deux équipements physiques qui se disputent 192.168.0.20. Le nombre de réponses supérieur au nombre de sondes est un indice immédiat.

Switch segment OT Poste diag .71 🔎 who has .20 ? ET 200SP #1 IP .20 · MAC …10:20 « c'est moi » ET 200SP #2 IP .20 · MAC …10:AA « non, c'est moi »
Figure 4.1. Le doublon d'IP : une seule requête ARP « qui a 192.168.0.20 ? » déclenche deux réponses avec des MAC différentes (contours rouges). arping -D rend cette collision visible ; le CPU, lui, la vit comme une station qui apparaît et disparaît.

D'autres indices convergents, à corréler :

$ sudo dmesg | grep -i "using our"
[ 8123.44] eth0: IPv4 duplicate address 192.168.0.20 detected!
[ 8123.44] arp: 192.168.0.20 using our address on eth0
$ sudo arp-scan -I eth0 192.168.0.0/24 | grep 192.168.0.20
192.168.0.20   00:1b:1b:2a:10:20   Siemens AG
192.168.0.20   00:1b:1b:2a:10:aa   (Unknown)   ← doublon

La commande qui tranche un doublon, à connaître par cœur :

$ sudo arping -D -I eth0 -c5 192.168.0.20

Plus de réponses que de sondes, ou des MAC qui alternent : doublon confirmé. Une seule MAC répétée : pas de doublon, l'IP est bien portée par un seul équipement.

Côté S7-1500, un doublon d'IP se signale dans le tampon de diagnostic et sur l'IHM par un message explicite de type « conflit d'adresse IP » / IP address already used, souvent accompagné d'une perte intermittente de la station Profinet concernée. Quand TIA Portal crie au conflit et que ton arping -D montre deux MAC, tu tiens la même vérité par les deux bouts : reste à débrancher physiquement l'intrus (identifié par sa MAC).

La bonne pratique préventive : jamais poser une IP sans l'avoir testée. Un arping -D -I eth0 <ip> qui ne renvoie aucune réponse confirme que l'adresse est libre. Une seule habitude qui évite la moitié des doublons créés lors des remplacements de matériel.

6. traceroute vers l'IT : voir où ça bloque

Quand on veut joindre un serveur du côté IT (supervision, historian, mise à jour) à travers le pare-feu OT, et que ça ne passe pas, traceroute montre le chemin sauté par sauté et il s'arrête :

$ traceroute 192.168.100.10
traceroute to 192.168.100.10 (192.168.100.10), 30 hops max, 60 byte packets
 1  192.168.0.240 (192.168.0.240)  0.51 ms  0.44 ms  0.47 ms   # passerelle OT
 2  * * *                                             # pare-feu : silence
 3  * * *
 4  * * *

Lecture : le premier saut (la passerelle .240) répond ; ensuite, des * * * — le pare-feu IT/OT ne laisse pas passer, ou n'autorise pas ICMP/UDP sur ce trajet. Ce n'est pas forcément une panne : c'est souvent une règle qui fait exactement son travail. L'information utile est « ça meurt au saut 2, donc au pare-feu », pas sur le câble ni sur le serveur cible.

Pour un diagnostic vivant et continu, mtr combine traceroute et ping dans un tableau qui se met à jour : on repère d'un coup d'œil le saut où la perte grimpe.

# Rapport mtr non-interactif, 10 cycles
mtr --report --report-cycles 10 192.168.100.10

Si traceroute meurt au premier saut (même la passerelle ne répond pas), le problème est local — route absente, mauvais masque, mauvais subnet. S'il meurt après la passerelle, le problème est en amont — pare-feu ou routage IT. Ce simple « avant ou après la passerelle ? » oriente la moitié du dépannage L3.

Récapitulatif

Exercices

Exercice 1 — Se placer dans le plan et confirmer le CPU

Ton poste (edge ou WSL miroir) est branché sur le segment mais n'a pas encore d'adresse dans le plan machine. Configure eth0 en 192.168.0.71/24, puis vérifie la joignabilité du CPU 192.168.0.1 par ping et par arping. Interprète le cas où le ping resterait muet.

Voir la solution
$ sudo ip addr add 192.168.0.71/24 dev eth0
$ ip -brief addr show eth0
eth0   UP   192.168.0.71/24 ...

$ ping -c3 192.168.0.1
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.41 ms
... 0% packet loss

$ sudo arping -I eth0 -c3 192.168.0.1
Unicast reply from 192.168.0.1 [00:1B:1B:2A:10:01]  0.70ms
Received 3 response(s)

Le ping répond : le CPU est joignable en L3 et son ICMP est ouvert. Si le ping avait été muet (100% packet loss) mais le arping répondu, on ne conclurait pas à une panne : le CPU serait présent sur le lien (MAC 00:1b:1b:2a:10:01 visible), simplement son ICMP serait filtré. Le verdict « présent » vient de la réponse ARP, pas de l'ICMP.

Exercice 2 — Détecter un doublon d'IP

Le CPU signale un conflit sur la station 192.168.0.20 et les échanges Profinet claquent. Lance la Duplicate Address Detection sur cette IP et explique ce que la sortie ci-dessous révèle.

$ sudo arping -D -I eth0 -c3 192.168.0.20
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.71ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:AA]  0.83ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:20]  0.69ms
Unicast reply from 192.168.0.20 [00:1B:1B:2A:10:AA]  0.80ms
Sent 3 probes (3 broadcast(s))
Received 4 response(s)
Voir la solution

Deux adresses MAC différentes00:1B:1B:2A:10:20 et 00:1B:1B:2A:10:AA — répondent pour la même IP 192.168.0.20. C'est la signature d'un doublon d'adresse IP : deux équipements physiques distincts revendiquent la même adresse. L'indice quantitatif : Received 4 response(s) pour seulement 3 probes — plus de réponses que de sondes, impossible avec un seul répondeur.

Pour corréler et localiser : ip neigh show 192.168.0.20 montrera la MAC osciller, sudo dmesg | grep -i duplicate confirmera côté noyau, et arp-scan listera les deux MAC. La MAC intruse (…:10:AA, non conforme au plan) désigne l'équipement à débrancher.

Exercice 3 — Lire la table des voisins

À partir de la sortie ip neigh ci-dessous, dis pour chaque voisin ce que son état indique sur la santé du lien, et lequel doit t'inquiéter.

$ ip neigh
192.168.0.1    dev eth0 lladdr 00:1b:1b:2a:10:01 REACHABLE
192.168.0.21   dev eth0 lladdr 00:1b:1b:2a:10:21 STALE
192.168.0.42   dev eth0  FAILED
Voir la solution
  • 192.168.0.1 — REACHABLE : le CPU a répondu récemment, entrée fraîche et fiable. Lien sain, rien à signaler.
  • 192.168.0.21 — STALE : l'ET 200SP .21 est connue (MAC présente) mais le cache a refroidi faute de trafic récent. Ce n'est pas une panne : au prochain échange, le noyau revalidera l'entrée (DELAY → REACHABLE). Un simple ping ou arping la « réveille ».
  • 192.168.0.42 — FAILED, sans lladdr : personne n'a répondu à l'ARP, aucune MAC n'est associée. Là, c'est un vrai signal d'absence : l'IP ne correspond à aucun équipement présent sur le lien (device éteint, débranché, ou IP fantôme). C'est celui-ci qui doit t'inquiéter.

Nuance à garder : STALE décrit un cache, pas un état de santé — il ne faut jamais le confondre avec une panne. Seul FAILED (ou une entrée absente après arping) atteste réellement d'une absence sur le segment.