← Toutes les Notes

Homelab : reprendre le contrôle de mes services

Infrastructure auto-hébergée pour mon portfolio, les services privés de la famille (vault, fichiers) et faire du DevSecOps en conditions réelles. Zero port ouvert sur la box, tout passe par un VPS frontal et des tunnels sortants.

Le problème

Je voulais arrêter de filer mes données sensibles à des SaaS dont je dépends complètement. Le vault de mots de passe chez un éditeur tiers, les fichiers partagés famille chez Google, le portfolio chez Vercel, chaque service m'enferme un peu plus et je ne contrôle rien de ce qui se passe en dessous.

L'autre motivation : me former DevOps sur du vrai, pas sur un tuto. Monter une stack qui tourne 24/7, avec de la donnée que j'ai pas envie de perdre, ça force une rigueur que les tutos sandbox ne donnent jamais. Si je casse Authentik le mardi soir, c'est la famille qui peut plus accéder au vault le mercredi matin. Ça change tout dans la façon d'aborder l'archi.

L'approche

Une maison totalement fermée côté Internet, aucun port forward sur la LiveBox, aucun DMZ Host, ni maintenant ni jamais. Toute l'exposition publique passe par un petit VPS Hetzner à 5 €/mois qui sert de frontal. Deux tunnels WireGuard sortants depuis la maison maintiennent la liaison : un pour les services publics (via Pangolin/Newt), un pour l'admin externe (hub WG sur le VPS où le laptop et OPNsense sont peers). Conséquence : mon IP publique maison n'apparaît dans aucun scan Shodan exploitable.

À l'intérieur, segmentation VLAN stricte sur OPNsense bare-metal , 7 zones (MGMT, LAN, IOT, EXPOSED, SVC_PRIV, LAB, BACKUP) avec une matrice firewall en zero-trust : tout est DENY par défaut, chaque flux est justifié. Une compromission dans la DMZ (où vit le terminus du tunnel public) ne peut pas remonter vers Authentik ou les backups.

Authentik centralise l'identité (SSO + MFA TOTP obligatoire), Vaultwarden et Filebrowser-Quantum se branchent en OIDC. PBS sur Raspberry Pi 5 avec ZFS mirror chiffré LUKS pour la sauvegarde 3-2-1, plus un disque cold offsite chez la famille. Tout déployé via Ansible si la baraque brûle, je reconstruis depuis le repo Git.

Pourquoi cette archi en VPS-relay plutôt qu'un port forward classique

C'est le choix le plus contre-intuitif de l'archi. L'approche standard, c'est d'ouvrir UDP/51820 sur la box pour le tunnel d'admin et basta. Simple, zéro dépendance tierce.

Je l'ai écarté pour trois raisons. D'abord la cohérence : les services publics passent déjà par un tunnel sortant vers le VPS (Pangolin/Newt), pourquoi traiter l'admin différemment ? Faire pareil partout = doc plus simple à raisonner et runbook unifié. Ensuite la surface d'attaque : avec zéro port ouvert, mon IP maison n'apparaît dans aucune liste de cibles exploitables. Enfin le futur : si je déménage un jour dans une zone CGNAT, l'archi marche déjà sans rien changer.

Le trade-off assumé : le VPS devient un SPOF pour l'admin distant. Mitigations en place, port de secours sur OPNsense toujours disponible quand je suis sur place, SLA Hetzner à 99,9%, et reconstruction VPS via Ansible en 30 minutes documentée. Hetzner est down 8h max par an en théorie, en pratique nettement moins. J'ai jugé que la cohérence architecturale valait ce risque.

Pourquoi Proxmox + OPNsense bare-metal et pas tout-en-un

Tentation forte au début : virtualiser OPNsense sous Proxmox pour avoir un seul boîtier. Refusé pour une raison simple : si Proxmox plante, le réseau plante aussi. Pas de réseau = pas d'accès à l'hyperviseur pour le diagnostiquer. Cercle vicieux idiot.

OPNsense tourne donc sur son propre mini PC fanless (CWWK N150), Proxmox sur un autre. Quand l'un tombe, l'autre peut servir de point d'entrée pour le diag. Deux euros de plus en électricité, indépendance totale en échange.

Limites & recul

C'est une archi pour 5-10 utilisateurs (famille), pas pour de la prod entreprise. Authentik est en single-instance si le LXC se vautre, plus de SSO le temps du restore PBS (30 min max). Acceptable pour ce contexte, inacceptable pour de la prod. Pareil pour Vaultwarden, Traefik interne, Pangolin sur le VPS pas de HA, mais des backups quotidiens et une procédure DR testée.

Avec le recul, le plus gros piège a été le déclic NTP. OIDC est ultra-sensible aux décalages d'horloge (tokens rejetés si dérive > 30s). J'ai mis du temps à comprendre pourquoi mon login Vaultwarden bouclait silencieusement après un snapshot Proxmox c'était la VM qui partait sans NTP au reboot. Depuis, chrony est dans le rôle Ansible common, posé partout par défaut.

L'autre limite : la LiveBox 6 est imposée par Orange et le canal CWMP/TR-069 n'est pas désactivable. Donc même avec zéro port ouvert, Orange garde un canal de gestion opérateur sur la box. OPNsense fait barrage en aval, mais la LiveBox elle-même reste une boîte noire. À terme, passage en PPPoE direct envisagé pour la virer complètement, gris côté CGV, à voir.

Ce que j'en retiens

Un homelab où tourne du vrai service famille, c'est un terrain d'apprentissage incomparable. Ça force à réfléchir blast radius avant de cliquer, à écrire des runbooks parce que dans 6 mois j'aurai oublié, à tester les restores parce qu'un backup non testé n'existe pas. Le jour où j'ai testé le DR complet d'Authentik et que ça a marché en 28 minutes, j'ai compris que la doc valait autant que le code.

L'autre truc : l'IaC change tout. Quand chaque LXC est reproductible via un rôle Ansible, casser n'est plus un drame c'est un test. Le réflexe "je sauvegarde la config avant de toucher" devient "je commit avant de toucher". Ça libère mentalement.