Le homelab fonctionne avec des adresses RFC1918 privées derrière un routeur grand public. Le VPS est sur l'internet public avec une IP statique. Les faire communiquer entre eux — de façon fiable, sécurisée, sans rien exposer inutilement — c'est exactement ce pour quoi un VPN site-à-site existe.
J'utilise WireGuard pour cela. Il est rapide, a une surface d'attaque minimale (environ 4 000 lignes de code contre ~100 000 pour OpenVPN), et la configuration est suffisamment simple pour être entièrement comprise. Pas d'autorité de certification, pas de PKI complexe — juste des paires de clés et des plages d'IP autorisées.
Une fois le tunnel en place :
flowchart TD
classDef internet fill:#f9f9f9,stroke:#333,stroke-width:2px;
classDef vps fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
classDef homelab fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
classDef tunnel fill:#fff3e0,stroke:#ef6c00,stroke-width:2px;
Internet([Internet])
subgraph VPS [VPS — IP Publique]
VPS_WG["WireGuard\n10.10.0.1/24"]
VPS_NGINX["NGINX"]
VPS_App["App Rust\nPort 9080"]
end
subgraph Homelab [Homelab — LAN Privé]
HL_WG["WireGuard\n10.10.0.2/24"]
Forgejo["Forgejo\n192.168.10.x"]
Runner["Runner Forgejo"]
Staging["Conteneur Staging"]
end
Internet -->|HTTPS| VPS_NGINX
VPS_NGINX --> VPS_App
VPS_WG <-->|UDP chiffré 51820| HL_WG
Runner -->|déploiement via tunnel| VPS_App
Runner --> Staging
class Internet internet;
class VPS_WG,VPS_NGINX,VPS_App vps;
class HL_WG,Forgejo,Runner,Staging homelab;
Sur le VPS, WireGuard écoute sur le port UDP 51820. Le VPS a une IP publique statique, c'est donc l'endpoint stable auquel le homelab se connecte :
# /etc/wireguard/wg0.conf — VPS
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <clé-privée-vps>
# Peer homelab
[Peer]
PublicKey = <clé-publique-homelab>
AllowedIPs = 10.10.0.2/32, 192.168.10.0/24
AllowedIPs côté VPS inclut l'adresse WireGuard du homelab (10.10.0.2) et le sous-réseau LAN du homelab (192.168.10.0/24). Cela indique au noyau du VPS de router les paquets destinés au LAN du homelab via le tunnel.
Activer le forwarding IP sur le VPS :
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
Le peer du homelab a une IP publique dynamique (connexion résidentielle), il initie donc la connexion vers le VPS et la maintient avec un keepalive :
# /etc/wireguard/wg0.conf — Homelab (pfSense ou Linux)
[Interface]
Address = 10.10.0.2/24
PrivateKey = <clé-privée-homelab>
# Peer VPS
[Peer]
PublicKey = <clé-publique-vps>
Endpoint = <ip-publique-vps>:51820
AllowedIPs = 10.10.0.1/32
PersistentKeepalive = 25
PersistentKeepalive = 25 envoie un paquet de handshake toutes les 25 secondes, maintenant le tunnel actif à travers le NAT et les routeurs grand public qui sinon supprimeraient les connexions UDP inactives.
Générez des paires de clés sur chaque côté — ne transférez jamais les clés privées sur le réseau :
# Sur chaque machine
wg genkey | tee privatekey | wg pubkey > publickey
N'échangez que les clés publiques. Chaque côté conserve sa clé privée localement.
# Sur l'un ou l'autre côté
wg show
# Tester la connectivité
ping 10.10.0.1 # depuis homelab → endpoint tunnel VPS
ping 192.168.10.5 # depuis VPS → hôte homelab
Un handshake réussi affiche latest handshake dans la sortie de wg show. En l'absence, vérifiez que le port UDP 51820 est ouvert sur le pare-feu du VPS et que les clés publiques correspondent à ce que chaque côté a configuré pour son peer.
Le runner Forgejo du homelab déploie sur le VPS via le tunnel. Le script de déploiement se connecte en SSH à 10.10.0.1 (l'adresse WireGuard du VPS) plutôt qu'à l'IP publique — le trafic reste dans le tunnel chiffré, et le port SSH du VPS n'a pas besoin d'être accessible publiquement.
ssh -i /home/runner/.ssh/deploy_key [email protected] \
"podman pull registry.home.internal/app:latest && \
podman restart app"
WireGuard · pfSense · Linux · Podman · Forgejo CI