Aller au contenu
Administration Linux medium

Diagnostic réseau Linux : guide pratique par scénario

18 min de lecture

Quand un service ne répond pas, la question n’est pas “quelle commande utiliser ?” mais “à quelle couche se situe le problème ?”. Ce guide vous donne une méthodologie de diagnostic réseau structurée : vous partez du symptôme, suivez un parcours logique, et identifiez la cause. Les commandes sont organisées par scénario d’incident, pas par ordre alphabétique.

  • Diagnostiquer méthodiquement un problème réseau en suivant les couches OSI
  • Choisir la bonne commande selon le symptôme observé
  • Interpréter les résultats pour identifier la cause racine
  • Utiliser les outils modernes (ip, ss, mtr) plutôt que les commandes dépréciées

Avant de diagnostiquer efficacement, maîtrisez ces fondamentaux :

  • Modèle OSI : comprendre les 7 couches et leur rôle
  • Adressage IP : notation CIDR, masques, sous-réseaux
  • Protocoles : TCP vs UDP, ICMP, DNS
  • Routage : passerelle par défaut, tables de routage

Identifiez votre symptôme et suivez le parcours correspondant :

SymptômeParcoursPremière commande
Machine distante injoignableHôte injoignableping -c 3 <ip>
Service/port ne répond pasPort ne répond pasnc -zv <ip> <port>
Résolution de nom échoueDNS ne fonctionne pasdig <domaine>
Connexion lente ou instableRéseau lentmtr <destination>
Requête HTTP en erreurHTTP ne fonctionne pascurl -I <url>

Symptôme : Impossible de joindre une machine distante (SSH timeout, ping sans réponse, connexion refusée).

  1. Vérifier la connectivité de base

    Fenêtre de terminal
    ping -c 3 192.168.1.100

    Si réponse → L’hôte est joignable, le problème est ailleurs (port, firewall applicatif).

    Si timeout → Continuez le diagnostic (ICMP peut être bloqué).

  2. Vérifier votre propre configuration IP

    Fenêtre de terminal
    ip addr show
    # Chercher : inet 192.168.x.x/24 sur l'interface active

    Vérifier : L’interface a-t-elle une IP ? Est-elle dans le bon sous-réseau ?

  3. Vérifier la route vers la destination

    Fenêtre de terminal
    ip route get 192.168.1.100
    # Résultat attendu : via 192.168.1.1 dev eth0

    Si “unreachable” → Problème de routage, vérifier la passerelle.

  4. Vérifier la passerelle par défaut

    Fenêtre de terminal
    ip route show default
    # Résultat attendu : default via 192.168.1.1 dev eth0

    Si absente → Ajouter avec ip route add default via <gateway>.

  5. Tester la passerelle elle-même

    Fenêtre de terminal
    ping -c 3 192.168.1.1

    Si timeout → Problème entre vous et le routeur (câble, switch, VLAN).

  6. Tracer le chemin complet

    Fenêtre de terminal
    mtr -r -c 10 192.168.1.100

    Interpréter : À quel saut la perte de paquets commence-t-elle ?

Fenêtre de terminal
# Afficher toutes les interfaces et leurs IP
ip addr show
# Afficher uniquement les interfaces UP
ip link show up
# Afficher la table de routage complète
ip route show
# Afficher les voisins ARP (résolution MAC)
ip neigh show
# Afficher les statistiques d'interface
ip -s link show eth0

Symptôme : Connexion refusée ou timeout sur un port spécifique (SSH, HTTP, base de données).

  1. Tester la connectivité au port

    Fenêtre de terminal
    nc -zv 192.168.1.100 22
    # Succès : Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!
    # Échec : nc: connect to 192.168.1.100 port 22 (tcp) failed: Connection refused

    Connection refused → Le port n’est pas en écoute côté serveur.

    Timeout → Un firewall bloque le flux.

  2. Vérifier que le service écoute (sur le serveur)

    Fenêtre de terminal
    ss -tlnp | grep :22
    # Attendu : LISTEN 0 128 0.0.0.0:22 *:* users:(("sshd",pid=1234,fd=3))

    Si aucune ligne → Le service n’est pas démarré.

    Si 127.0.0.1:22 → Le service n’écoute que sur localhost.

  3. Vérifier le firewall local (sur le serveur)

    Fenêtre de terminal
    sudo iptables -L -n -v | grep -E "22|ssh"
    # Ou avec nftables :
    sudo nft list ruleset | grep -E "22|ssh"

    Chercher : Une règle DROP ou REJECT sur le port concerné.

  4. Vérifier le pare-feu UFW (si installé)

    Fenêtre de terminal
    sudo ufw status verbose
    # Vérifier que le port est autorisé
  5. Tester depuis le serveur lui-même

    Fenêtre de terminal
    nc -zv 127.0.0.1 22

    Si OK en local mais pas à distance → Firewall ou configuration d’écoute.

Fenêtre de terminal
# Tous les ports TCP en écoute avec le processus
ss -tlnp
# Tous les ports UDP en écoute
ss -ulnp
# Connexions TCP établies
ss -tn state established
# Filtrer par port
ss -tn 'sport == :22'
# Filtrer par adresse distante
ss -tn 'dst 192.168.1.0/24'
# Statistiques détaillées des connexions
ss -ti

Symptôme : Impossible de résoudre un nom de domaine (ping google.com échoue, mais ping 8.8.8.8 fonctionne).

  1. Tester la résolution DNS

    Fenêtre de terminal
    dig google.com +short
    # Attendu : 142.250.xxx.xxx

    Si vide ou SERVFAIL → Problème DNS.

  2. Vérifier le serveur DNS configuré

    Fenêtre de terminal
    cat /etc/resolv.conf
    # nameserver 192.168.1.1
    # ou nameserver 127.0.0.53 (systemd-resolved)
  3. Tester avec un DNS public

    Fenêtre de terminal
    dig @8.8.8.8 google.com +short

    Si ça marche → Votre DNS local est défaillant.

  4. Tester la connectivité au serveur DNS

    Fenêtre de terminal
    nc -zvu 192.168.1.1 53
    # DNS utilise UDP port 53
  5. Vérifier le cache DNS local

    Fenêtre de terminal
    # Avec systemd-resolved
    resolvectl statistics
    resolvectl flush-caches
Fenêtre de terminal
# Requête simple (enregistrement A)
dig google.com
# Réponse courte uniquement
dig google.com +short
# Enregistrements MX (serveurs mail)
dig google.com MX
# Résolution inverse (IP vers nom)
dig -x 8.8.8.8
# Tracer la délégation DNS complète
dig google.com +trace
# Utiliser un serveur DNS spécifique
dig @1.1.1.1 google.com
# Afficher uniquement la section réponse
dig google.com +noall +answer

Symptôme : Latence élevée, connexions qui traînent, timeouts intermittents.

  1. Mesurer la latence et les pertes

    Fenêtre de terminal
    mtr -r -c 20 google.com

    Interpréter :

    • Loss% > 5% = problème de congestion ou de lien
    • Avg > 100ms vers un serveur local = anormal
    • StDev élevé = connexion instable
  2. Identifier le goulot d’étranglement

    Regarder à quel saut la latence augmente brusquement ou les pertes commencent.

  3. Tester la bande passante

    Fenêtre de terminal
    # Sur le serveur distant
    iperf3 -s
    # Sur votre machine
    iperf3 -c <serveur> -t 30
  4. Surveiller le trafic en temps réel

    Fenêtre de terminal
    # Vue globale par connexion
    sudo iftop -i eth0
    # Statistiques d'interface
    ip -s link show eth0
  5. Vérifier les erreurs d’interface

    Fenêtre de terminal
    ip -s link show eth0 | grep -E "errors|dropped|overrun"
    # Tout doit être à 0
Fenêtre de terminal
# Rapport après 10 envois
mtr -r -c 10 google.com
# Mode continu (interactif)
mtr google.com
# Afficher les IP sans résolution
mtr -n google.com
# Utiliser TCP au lieu d'ICMP
mtr --tcp -P 443 google.com
# Utiliser UDP
mtr --udp google.com

Symptôme : Page web inaccessible, erreur 502/503/504, timeout sur une API.

  1. Tester la connectivité HTTP

    Fenêtre de terminal
    curl -I https://example.com
    # HTTP/2 200 = OK
  2. Mesurer les temps de réponse

    Fenêtre de terminal
    curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nFirst byte: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null -s https://example.com

    Interpréter :

    • DNS > 1s → Problème de résolution
    • Connect > 1s → Problème réseau ou serveur saturé
    • TLS > 2s → Négociation TLS lente
    • First byte > 5s → Backend lent
  3. Tester sans TLS (si applicable)

    Fenêtre de terminal
    curl -I http://example.com
  4. Vérifier les en-têtes de réponse

    Fenêtre de terminal
    curl -v https://example.com 2>&1 | head -50
  5. Tester avec un autre DNS

    Fenêtre de terminal
    curl --resolve example.com:443:93.184.216.34 https://example.com
Fenêtre de terminal
# En-têtes uniquement
curl -I https://example.com
# Verbose (détails connexion)
curl -v https://example.com
# Ignorer les erreurs de certificat (test uniquement)
curl -k https://example.com
# Timeout personnalisé
curl --connect-timeout 5 --max-time 10 https://example.com
# Suivre les redirections
curl -L https://example.com
# Avec timing détaillé
curl -w "@curl-timing.txt" -o /dev/null -s https://example.com
IntentionCommandeExemple
Mon IP et interfacesip addr showip a
Ma table de routageip route showip r
Les ports en écoutess -tlnp-
Les connexions établiesss -tn state established-
Le trafic en temps réelsudo iftop -i eth0-
Les voisins ARPip neigh showip n
Les règles firewallsudo iptables -L -n -v-
IntentionCommandeExemple
Si une machine répondping -c 3 <ip>ping -c 3 8.8.8.8
Si un port est ouvertnc -zv <ip> <port>nc -zv 192.168.1.1 22
La route vers une destinationmtr -r <ip>mtr -r google.com
La résolution DNSdig <domaine>dig google.com +short
La bande passanteiperf3 -c <serveur>-
Un endpoint HTTPcurl -I <url>curl -I https://api.example.com
IntentionCommandeExemple
Quel process utilise un portss -tlnp | grep :<port>ss -tlnp | grep :80
Les connexions d’une IPss -tn 'dst <ip>'ss -tn 'dst 10.0.0.1'
Le propriétaire d’une IPdig -x <ip>dig -x 8.8.8.8
Les serveurs DNS d’un domainedig <domaine> NSdig google.com NS
La version d’un servicenmap -sV -p <port> <ip>nmap -sV -p 22 192.168.1.1

Non. ICMP est souvent filtré. Une machine peut être parfaitement accessible sur ses ports de service tout en ignorant les pings. Testez toujours avec nc -zv sur un port spécifique.

Non. Un port peut être en écoute (LISTEN) sans que le service soit fonctionnel. Par exemple, un serveur web peut écouter sur le port 80 mais renvoyer des erreurs 500. Testez toujours le protocole applicatif (curl, mysql -e "SELECT 1").

La résolution DNS fonctionne = pas de problème DNS ?

Section intitulée « La résolution DNS fonctionne = pas de problème DNS ? »

Non. Le cache DNS peut masquer un problème. Videz le cache (resolvectl flush-caches) et retestez. Vérifiez aussi le TTL des enregistrements.

Non. Les * * * signifient que le routeur ne répond pas aux paquets ICMP TTL-exceeded, pas qu’il est en panne. Le trafic peut très bien passer. Seule une perte de paquets constante à partir d’un saut indique un problème.

Pas toujours. Une connexion peut rester en ESTABLISHED même si l’autre extrémité est morte (half-open). Les keepalives TCP détectent ça, mais avec un délai. Vérifiez les compteurs de trafic (ss -ti).

#!/bin/bash
# diagnostic-host.sh <ip>
HOST=$1
echo "=== Diagnostic de $HOST ==="
echo -e "\n--- Ping ---"
ping -c 3 $HOST
echo -e "\n--- Route ---"
ip route get $HOST
echo -e "\n--- Ports standards ---"
for port in 22 80 443; do
nc -zv -w 2 $HOST $port 2>&1
done
echo -e "\n--- Traceroute ---"
mtr -r -c 5 $HOST
#!/bin/bash
# diagnostic-dns.sh <domaine>
DOMAIN=$1
echo "=== Diagnostic DNS de $DOMAIN ==="
echo -e "\n--- Résolution A ---"
dig $DOMAIN A +short
echo -e "\n--- Serveurs de noms ---"
dig $DOMAIN NS +short
echo -e "\n--- Serveurs mail ---"
dig $DOMAIN MX +short
echo -e "\n--- Test avec DNS publics ---"
echo "Google (8.8.8.8):"
dig @8.8.8.8 $DOMAIN +short
echo "Cloudflare (1.1.1.1):"
dig @1.1.1.1 $DOMAIN +short
#!/bin/bash
# diagnostic-http.sh <url>
URL=$1
echo "=== Diagnostic HTTP de $URL ==="
echo -e "\n--- Timing ---"
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nFirst byte: %{time_starttransfer}s\nTotal: %{time_total}s\nHTTP code: %{http_code}\n" -o /dev/null -s "$URL"
echo -e "\n--- En-têtes ---"
curl -I -s "$URL" | head -20

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

8 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  1. Diagnostiquer par couche OSI : physique → liaison → réseau → transport → application
  2. Utiliser les commandes modernes : ip remplace ifconfig/route, ss remplace netstat
  3. Un ping timeout ne prouve rien : ICMP est souvent filtré, testez le port réel
  4. Un port ouvert ≠ service fonctionnel : testez toujours le protocole applicatif
  5. mtr > traceroute : vision continue, statistiques, détection des problèmes intermittents
  6. dig > nslookup : sortie parsable, options avancées, trace complète
  7. Sécurité : tcpdump et nmap sont dangereux en production, utilisez des bastions dédiés
  8. Documenter les résultats : gardez une trace des commandes et sorties pour les post-mortems

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.