Skip to content

Gluetun VPN FR

Kheopsian edited this page Jul 30, 2026 · 3 revisions

🇬🇧 English · 🇫🇷 Français

Gluetun (VPN)

Faire tourner Hydra derrière un VPN avec gluetun est le setup supporté le plus casse-gueule, d'où sa propre page. Deux choses le rendent spécial :

  1. Le(s) port(s) forwardé(s) peu(ven)t tourner. Avec le port forwarding activé, gluetun donne à Hydra le port forwardé du provider ; chez certains il change à chaque reconnexion. Hydra rebind son listen port à chaud (sans restart — torrents et peers vivants restent up), mais il faut pousser le port courant.
  2. Un port inbound sert un moteur. race et hoard sont deux process qui ne peuvent pas partager un port TCP inbound. Donc le nombre de moteurs que tu peux seeder en inbound derrière un tunnel dépend de combien de ports ton provider forwarde.

Étape 0 — combien de ports ton provider forwarde ?

Ça décide tout ton layout, et c'est une limite provider (combien de ports il laisse gluetun forwarder), pas une limite gluetun. gluetun fait du port forwarding pour ces providers — vérifie ton propre plan, mais à date :

Provider Ports forwardés par gluetun Layout
AirVPN jusqu'à 5 (réservés dans le panel AirVPN) monolithe (race + hoard) sur un gluetun
Perfect Privacy plusieurs (3 auto + jusqu'à 5 custom) monolithe sur un gluetun
ProtonVPN 1, random, tourne (NAT‑PMP)¹ un moteur, ou front-only + un agent par gluetun
PIA 1, dynamique un moteur, ou split
PrivateVPN 1 par serveur un moteur, ou split

¹ Le NAT‑PMP de ProtonVPN peut en mapper plus, mais gluetun n'expose qu'un seul port actuellement (le multi-port est une demande gluetun ouverte).

Règle du pouce : ≥ 2 ports forwardés → fais tourner un monolithe (race + hoard) derrière un gluetun. Un seul → fais tourner un moteur derrière, ou splitte en front-only + un agent par gluetun (plus bas).

Mécanismes gluetun (d'après la doc de gluetun)

  • VPN_PORT_FORWARDING=on l'active.
  • VPN_PORT_FORWARDING_UP_COMMAND tourne quand le forwarding est en place (et à chaque renégociation). Placeholders : {{PORT}} = le premier port forwardé, {{PORTS}} = liste comma-séparée (ex. 16171,16172).
  • FIREWALL_VPN_INPUT_PORTS = ports autorisés en entrée dans le firewall de gluetun (mets-y tes ports forwardés pour que les peers t'atteignent).
  • FIREWALL_OUTBOUND_SUBNETS = sous-réseaux LAN que Hydra a le droit d'atteindre en sortie.
  • Le port forwardé est aussi exposé sur le control server de gluetun et (avant v4) le fichier /tmp/gluetun/forwarded_port.

Hydra partage le netns de gluetun (network_mode: service:gluetun), donc son UI/API (127.0.0.1:8199) et son egress vivent dans le tunnel. Pousse le port avec l'API HTTP de Hydra : POST /api/{race,hoard}/listen-port {"port":N}.

A) Monolithe derrière un gluetun — providers multi-port (AirVPN, Perfect Privacy)

Ces providers te donnent des ports forwardés fixes : tu les réserves dans le panneau du provider et ils ne changent pas. Donc rien de dynamique à pousser — pas d'UP_COMMAND. Il suffit de mettre le port d'écoute de chaque moteur en dur dans default.toml (= tes ports réservés) et de les ouvrir en entrée sur le firewall.

Disons que tu as réservé 16171 (race) et 16172 (hoard) dans le panneau AirVPN.

./config/default.toml :

[race]
listen_port = 16171

[hoard]
listen_port = 16172
services:
  gluetun:
    image: qmcgaw/gluetun
    cap_add: [NET_ADMIN]
    ports:
      - "8199:8199"                    # UI Hydra, via le conteneur tunnel
    environment:
      - VPN_SERVICE_PROVIDER=airvpn
      - VPN_TYPE=wireguard
      # Valeurs WireGuard depuis le Config Generator AirVPN (espace client) :
      - WIREGUARD_PRIVATE_KEY=ta-cle-privee
      - WIREGUARD_PRESHARED_KEY=ta-cle-preshared
      - WIREGUARD_ADDRESSES=10.128.0.2/32
      - SERVER_COUNTRIES=Netherlands                # optionnel : choisir la sortie
      - FIREWALL_VPN_INPUT_PORTS=16171,16172       # ouvrir tes ports réservés en entrée
      - FIREWALL_OUTBOUND_SUBNETS=192.168.1.0/24   # joindre un qBit LAN, etc.

  hydra:
    image: ghcr.io/kheopsian/hydra:latest
    network_mode: "service:gluetun"
    depends_on: [gluetun]
    volumes:
      - ./config:/config
      - /path/to/data:/data

Les deux moteurs ont du vrai inbound, les ports sont figés dans la config, et rien n'a besoin de tourner à la reconnexion. C'est le layout le plus simple quand ton provider te donne assez de ports.

B) Providers mono-port (ProtonVPN, PIA, PrivateVPN)

Tu n'as qu'un port, donc tu ne peux pas donner de l'inbound aux deux moteurs derrière un seul tunnel. Deux options :

  • Un moteur derrière gluetun — même compose qu'en (A) mais pousse le seul {{PORT}} à hoard (ou race) :
    VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -qO- --header="X-Api-Key: $${HYDRA_API_KEY}" --header="Content-Type: application/json" --post-data="{\"port\":{{PORT}}}" http://127.0.0.1:8199/api/hoard/listen-port'
    
  • Inbound sur les deux — fais tourner un contrôleur --front-only plus un moteur --agent-only par gluetun (chacun son port unique). Voir Topologies de déploiement. Un nœud --agent-only n'a pas d'API HTTP, donc pousse son port avec le CLI dans le conteneur agent (hydra set-listen-port /config/<moteur>.sock <port>), déclenché depuis le fichier forwarded-port / control-server de gluetun (un petit watcher) — le UP_COMMAND gluetun tourne dans le conteneur gluetun, où le binaire hydra n'est pas présent.

Pièges

  • Le LAN est injoignable par défaut. Dans le tunnel, localhost est le netns du VPN, pas ton hôte, et le LAN est firewallé. Mets FIREWALL_OUTBOUND_SUBNETS=192.168.x.0/24 sur le service gluetun pour que Hydra joigne un service LAN (ex. un qBittorrent pour l'assistant d'import) ; utilise l'IP LAN, pas localhost.
  • Ouvre les ports forwardés en entrée avec FIREWALL_VPN_INPUT_PORTS, sinon les peers ne peuvent pas t'atteindre.
  • Le listen_port du default.toml : sur les providers à port fixe (AirVPN, Perfect Privacy) c'est le VRAI port — mets-y ton port réservé. Ce n'est un placeholder (écrasé par l'up-command à chaque reconnexion) que sur les providers à port dynamique (Proton, PIA, PrivateVPN).
  • Expose l'UI sur le service gluetun (8199:8199), pas sur le service Hydra — Hydra n'a aucun port à lui sous network_mode: service:gluetun.

Le UP_COMMAND exact (wget vs curl, quoting) varie selon l'image gluetun et ton provider — traite les snippets ci-dessus comme un point de départ et vérifie-les contre un setup qui marche.

Voir aussi Modes réseau et Topologies de déploiement.

Clone this wiki locally