ARP — Address Resolution Protocol

Couche OSI : L2 — Liaison de données
Protocole : opère entre L2 et L3 (pont entre IP et MAC)

ARP résout une adresse IP en adresse MAC sur un réseau local. Quand un hôte veut envoyer un paquet IP à une IP sur le même LAN, il doit connaître l’adresse MAC correspondante pour construire la trame Ethernet.


Pourquoi ARP est nécessaire

Machine A veut envoyer un paquet à 192.168.1.20
  │
  ├── Construire la trame Ethernet nécessite :
  │   ├── IP source : 192.168.1.10  ✅ (connue)
  │   ├── IP destination : 192.168.1.20  ✅ (connue)
  │   ├── MAC source : AA:BB:CC:DD:EE:FF  ✅ (connue — carte réseau locale)
  │   └── MAC destination : ???  ← ARP résout ça

Fonctionnement : requête/réponse

Machine A (192.168.1.10, MAC: AA:BB:CC:DD:EE:FF)
  │
  │── ARP Request (broadcast) ────────────────────► tous les hôtes du LAN
  │   "Qui a l'IP 192.168.1.20 ? Répondez à AA:BB:CC:DD:EE:FF"
  │   Destination MAC : FF:FF:FF:FF:FF:FF (broadcast)
  │
  │               Machine B (192.168.1.20, MAC: 11:22:33:44:55:66)
  │                    │
  │◄── ARP Reply ──────┘
  │   "C'est moi ! Mon MAC est 11:22:33:44:55:66"
  │   Destination MAC : AA:BB:CC:DD:EE:FF (unicast)
  │
  │ Machine A met en cache : 192.168.1.20 → 11:22:33:44:55:66
  └── Construit la trame Ethernet et envoie le paquet

Cache ARP

Pour éviter une requête ARP à chaque paquet, les hôtes maintiennent un cache ARP (table de correspondance IP → MAC).

# Voir le cache ARP
arp -n           # Linux
arp -a           # Windows/macOS
 
# Exemple de sortie
# Address          HWtype  HWaddress           Flags  Iface
# 192.168.1.1      ether   aa:bb:cc:dd:ee:01   C      eth0
# 192.168.1.20     ether   11:22:33:44:55:66   C      eth0
 
# Vider le cache ARP
sudo ip -s -s neigh flush all   # Linux
netsh interface ip delete arpcache  # Windows
 
# Ajouter une entrée statique
sudo arp -s 192.168.1.20 11:22:33:44:55:66

Les entrées ont un TTL (typiquement 20 minutes sur Linux, 2 minutes sur Windows) — expirées, elles sont rerésolues.


Gratuitous ARP (GARP)

Un hôte peut envoyer un ARP Request pour sa propre IP — c’est un Gratuitous ARP. Il sert à :

  • Annoncer sa présence sur le réseau (mise à jour des caches)
  • Détecter les conflits d’IP (si quelqu’un répond → IP déjà utilisée)
  • Basculement en haute disponibilité (le VIP migre vers un nouveau serveur)
Serveur A prend l'IP virtuelle 192.168.1.100
  → envoie GARP : "192.168.1.100 = MAC de Serveur A"
  → tous les hôtes du LAN mettent à jour leur cache ARP
  → le trafic vers 192.168.1.100 est maintenant routé vers Serveur A

ARP Poisoning — attaque

L’ARP n’a aucun mécanisme d’authentification — n’importe qui peut envoyer de faux ARP Reply.

Attaquant envoie des ARP Reply non sollicités :
  "192.168.1.1 (routeur) → MAC: attaquant"   → à toutes les machines du LAN
  "192.168.1.10 (Machine A) → MAC: attaquant" → au routeur

Résultat :
  Machine A croit que le routeur est l'attaquant
  Le routeur croit que Machine A est l'attaquant
  → Tout le trafic passe par l'attaquant (Man-in-the-Middle)

Contre-mesures :

  • DAI (Dynamic ARP Inspection) sur les switches managés — vérifie les ARP contre la table DHCP
  • Segmentation — VLAN pour limiter le domaine de broadcast
  • 802.1X — authentification au niveau du port réseau

ARP dans Kubernetes

Dans un cluster Kubernetes, ARP est utilisé pour la communication au niveau du nœud :

# Voir les voisins ARP d'un nœud Kubernetes (remplace arp -n en Linux moderne)
ip neigh show
 
# Dans Kubernetes avec MetalLB (mode L2)
# MetalLB répond aux ARP Requests pour les IPs de LoadBalancer
# → les clients du LAN trouvent les IPs de services via ARP

En relation avec