← Blog

Alexis · 2026-09-29

VPN site-à-site avec WireGuard : homelab vers VPS

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.

Ce que le tunnel accomplit

Une fois le tunnel en place :

Architecture

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;

Configuration du VPS

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

Configuration du homelab

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ération des clés

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.

Vérifier le tunnel

# 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.

Utiliser le tunnel pour le CI/CD

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"

Stack

WireGuard · pfSense · Linux · Podman · Forgejo CI