Segmenter un homelab comme une vraie prod
Monter un homelab en réseau plat, c’est rapide : tout se voit, tout se parle, on branche et ça marche. C’est aussi reproduire chez soi la faute qui fait tomber les vraies prods · un IoT compromis, un conteneur mal configuré, et plus rien ne sépare l’attaquant de mon hyperviseur. J’ai segmenté mon infra avant de la remplir, pas après.
Le pare-feu périmétrique ne protège que la frontière : une fois un hôte interne pris, tout le trafic latéral (est-ouest) circule en clair et personne ne le regarde. C’est ce mouvement latéral, pas l’intrusion initiale, qui transforme un incident en compromission générale. Segmenter, c’est refuser à l’attaquant le déplacement libre qu’un réseau plat lui offre gratuitement.
Chez moi, la découpe suit le niveau de confiance, pas la commodité de câblage. Quatre zones, quatre VLAN : administration hors bande (hyperviseurs, switchs, interfaces de gestion) derrière une MFA WebAuthn/FIDO2 ; services internes critiques ; IoT non maîtrisé, tenu à l’écart de tout le reste ; et une DMZ pour ce qui touche l’extérieur, accès filtré en ZTNA. Le VLAN d’administration est celui qui ne parle à personne par défaut · c’est le dernier que je veux voir joignable.
La sécurité système est renforcée par des profils LSM (Linux Security Modules) tels qu’AppArmor ou SELinux, qui confinent les services exposés, et par une stratégie de sauvegardes immuables (air-gapped), qui assure la résilience et la continuité d’activité face aux attaques destructives. Ces mesures hissent un montage domestique au rang d’une infrastructure solide, où l’on peut expérimenter sans exposer le reste du réseau.
table inet zones {
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
# IoT -> Sortie Internet uniquement (aucun accès interne)
iifname "vlan.iot" ip daddr != 10.0.0.0/8 accept
# Zone de confiance -> Services exposés (DMZ)
iifname "vlan.trust" ip daddr 10.0.30.0/24 tcp dport { 443 } accept
# Le trafic d'administration (vlan.mgmt) reste hermétique par défaut
log prefix "zone-drop " drop
}
}