Diapositive 1 / 10 · Réseau & Sockets

La Redirection de Ports
From Scratch, Docker & Podman

Comment acheminer le trafic de la carte réseau physique hôte (`eth0`) vers un socket enfermé dans un Network Namespace isolé ?

🌐 Le Défi du Port Forwarding :

Le conteneur possède sa propre adresse IP privée (`172.17.0.2`) invisible depuis l'extérieur. La redirection de port est le pont qui traduit les requêtes de l'hôte (`192.168.1.50:8080`) vers le port interne du conteneur (`172.17.0.2:80`).

Diapositive 2 / 10 · Le Problème Réseau

L'Anatomie du Réseau Isolant

Pourquoi la redirection de port est-elle obligatoire ?

📡 Le Chemin de la Requête Réseau :
Client Externe (Navigateur) ➔ 192.168.1.50:8080 (IP Publique/LAN Hôte)
⬇️ [Redirection de Port / NAT]
Pont Virtuel docker0 / br0172.17.0.1
⬇️ [Paire Veth : veth-host ➔ veth-guest]
Conteneur Isolé ➔ 172.17.0.2:80 (Port interne du conteneur)
Diapositive 3 / 10 · Approche Manuelle

🖼️ Port Forwarding From Scratch (Kernel NAT)

Comment faire avec Netfilter / IPTables sans aucun moteur ?

🛠️ Étape par Étape en Shell Root
  1. Activer le transfert de paquets IPv4 au niveau du noyau :
echo 1 > /proc/sys/net/ipv4/ip_forward
  1. Appliquer une règle **DNAT (Destination NAT)** dans la table `nat` :
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80
  1. (Alternative en espace utilisateur sans iptables) Utiliser `socat` :
socat TCP-LISTEN:8080,fork TCP:172.17.0.2:80
Diapositive 4 / 10 · Approche Docker

Le Modèle Hybride de Docker

IPTables (DNAT) + le binaire auxiliaire `docker-proxy`.

1. Chaîne IPTables `DOCKER` (Trafic Externe)

Docker intercepte le trafic venant des cartes externes via une chaîne personnalisée `DOCKER` dans `iptables`.

iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80
2. `docker-proxy` (Trafic Loopback / Local)

Pour les requêtes `localhost:8080`, Linux contourne parfois `PREROUTING`. Docker lance donc un processus Go léger par port publié pour relayer les sockets localement.

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80
Diapositive 5 / 10 · Approche Podman

La Révolution Podman (Rootless & Daemonless)

Comment faire sans privilèges root et sans modifier `iptables` ?

🔌 `slirp4netns` (Moteur Historique)

Simule une pile TCP/IP complète en **espace utilisateur**. Écoute le port non privilégié de l'utilisateur (>1024) et réinjecte le trafic dans le namespace sans aucun droit root.

⚡ `pasta` / Netavark (Podman 4+)

Nouveau moteur par défaut ultra-rapide (Pass-Through Adapter). Redirige directement les descripteurs de fichiers sockets sans recopie mémoire, atteignant des performances proches du Kernel NAT.

Diapositive 6 / 10 · Benchmark & Latence

Performances & Surcoût Réseau

Comparatif de latence et consommation processeur/mémoire.

⚡ Kernel DNAT (Scratch)
Latence : ~0.08 ms

Zéro surcoût en espace utilisateur. Le processeur traite la paquets directement dans les cartes réseau.

🐳 Docker (IPTables + Proxy)
Latence : ~0.12 ms

Consommation RAM légère (~4 Mo par `docker-proxy`). Traitement Kernel très rapide pour le trafic externe.

🦭 Podman Rootless (`pasta`)
Latence : ~0.15 ms

Surcoût quasi nul avec `pasta`. Légère consommation CPU en mode `slirp4netns` lors des pics à très haut débit.

Diapositive 7 / 10 · Contournements Réseau

Bypass du Port Forwarding

Quand et comment se passer complètement de la redirection de ports ?

🏎️ Mode `--net=host`

Le conteneur partage **directement** le Network Namespace de l'hôte. Il écoute directement sur l'IP physique (`192.168.1.50:80`).

Avantage : Performance maximale | Inconvénient : Zéro isolation réseau
🌉 Mode `macvlan` / `ipvlan`

Attribue une véritable adresse MAC et IP physique du réseau local au conteneur. Le conteneur apparaît comme un serveur physique distinct sur le switch/routeur.

Avantage : Pas de NAT | Inconvénient : Exige le mode promiscuous
Diapositive 8 / 10 · Matrice Synthétique

Tableau Comparatif 3-Voies

Critère From Scratch (Noyau Pure) Docker (Démon Root) Podman (Rootless)
Privilèges Requis Root (`CAP_NET_ADMIN`) Démon Root (`dockerd`) Utilisateur normal (Unprivileged)
Moteur de Redirection Kernel Netfilter (DNAT) / `socat` IPTables + `docker-proxy` `slirp4netns` ou `pasta`
Modification IPTables Manuelle (`iptables -t nat`) Automatique (Chaîne `DOCKER`) Aucune (Espace Utilisateur)
Démon Résident Aucun Oui (`dockerd`) Aucun (Daemonless)
Consommation Mémoire 0 Mo extra (Noyau) ~4-10 Mo par port (`docker-proxy`) ~5-15 Mo (`pasta` / `slirp4netns`)
Diapositive 9 / 10 · Guide Pratique

Commandes Utiles de Diagnostic

Comment inspecter et déboguer les redirections de ports ?

🔍 Boîte à Outils de l'Administrateur SysAdmin
# 1. Vérifier les règles NAT de Docker iptables -t nat -L DOCKER -n -v # 2. Inspecter les ports en écoute sur l'hôte ss -tulpn | grep 8080 # 3. Voir les redirections d'un conteneur Podman podman port <CONTAINER_ID> # 4. Capturer les paquets sur le pont virtuel tcpdump -i docker0 port 80 -n
Diapositive 10 / 10 · Conclusion

Synthèse & Prochaines Étapes

Vous maîtrisez désormais les rouages du réseau conteneurisé.

DIAPORAMA 1

🖼️ Anatomie de Docker vs Scratch →

Découvrez l'isolation par Namespaces, Cgroups & OverlayFS.

LABORATOIRE

🧪 Lab Conteneur From Scratch →

Créez votre propre moteur de conteneur en bash avec `unshare` !

Diapo 1 / 10