VPNSmith
self-host-vpnINFO

WireGuard in Docker (2026): Der saubere Weg zum Selbsthosting mit docker-compose

WireGuard in Docker richtig betreiben: linuxserver/wireguard vs. wg-easy, die docker-compose-Datei, NET_ADMIN und sysctl Stolperfallen, Persistenz und wann ein Container einer Bare-Metal-Installation überlegen ist.

Von Eric Gerard · Gründer · VPNSmith - Spezialist für selbstgehostete VPNs & DSGVO-VPS5 Min. LesezeitPhoto via Unsplash

Affiliate-Hinweis - Dieser Leitfaden enthält Links zu Contabo, dem VPS, den wir für unser eigenes selbstgehostetes WireGuard verwenden. Wenn Sie über unseren Link bestellen, erhalten wir eine Provision ohne zusätzliche Kosten für Sie. Wir dokumentieren nur, was wir tatsächlich betreiben.

WireGuard in Docker zu betreiben, bietet Ihnen das, was Container wertvoll macht: einen Server, den Sie in Minuten hochfahren, herunterfahren, versionieren und auf einen anderen Host verschieben können, ohne dass auf der Maschine selbst Pakete installiert werden müssen. Der Haken dabei ist, dass ein VPN-Container kein normaler Container ist - er greift auf den Netzwerk-Stack des Kernels zu, daher sind einige Flags unverzichtbar. Wenn Sie diese richtig setzen, ist ein containerisiertes WireGuard genauso schnell wie ein Bare-Metal. Wenn nicht, verbindet sich der Tunnel, leitet aber stillschweigend nichts weiter.

Dies ist der saubere, produktionsreife Weg, es zu tun.

Zuerst das eine, was die Leute bei "WireGuard in Docker" falsch machen

WireGuard ist ein Kernel-Modul. Wenn Sie "WireGuard in Docker betreiben", erfolgen die Verschlüsselung und das Routing weiterhin im Linux-Kernel des Hosts - der Container enthält nur die Benutzerwerkzeuge (wg, wg-quick) und Ihre Konfiguration. Deshalb gibt es keinen Leistungseinbruch: Der Datenpfad betritt nie den Container.

Das erklärt auch die Anforderungen. Um von innerhalb eines Containers ein Netzwerk-Interface zu erstellen und zu verwalten, benötigt dieser Container erweiterte Netzwerkfähigkeiten (NET_ADMIN), und der Host muss das Weiterleiten von Paketen erlauben (net.ipv4.ip_forward=1). Diese sind keine optionalen Sicherheitsmaßnahmen - ohne sie startet der Container entweder nicht oder kommt tot hoch.

Wählen Sie Ihr Image: linuxserver/wireguard vs. wg-easy

Zwei Images decken fast jeden Anwendungsfall ab:

  • linuxserver/wireguard - ein sauberer, konfigurationsgesteuerter Server. Sie definieren Peers über Umgebungsvariablen oder durch Bearbeiten von Dateien in einem gemounteten /config-Verzeichnis. Es generiert Client-Konfigurationen und QR-Codes beim ersten Lauf. Am besten, wenn Sie Infrastruktur-als-Code, viele Peers oder Ihre Einrichtung in ein privates Repo einpflegen möchten.
  • wg-easy - WireGuard plus ein Web-Dashboard. Erstellen und widerrufen Sie Peers über einen Browser, scannen Sie QR-Codes für Telefone, sehen Sie sich Live-Übertragungsstatistiken pro Client an. Am besten für eine Handvoll Geräte und schnelles Onboarding ohne CLI. Wir behandeln es von A bis Z - inklusive der Passwort-Änderung in v14 - im vollständigen wg-easy-Self-Host-Leitfaden.

Beide sind ausgereift und weit verbreitet. Die Entscheidung ist Dashboard-vs-Dateien, nicht Qualität.

Die docker-compose-Datei (wg-easy)

Server-Racks in Blau beleuchtet in einem Rechenzentrum
Server-Racks in Blau beleuchtet in einem Rechenzentrum

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:latest
    container_name: wg-easy
    environment:
      - WG_HOST=vpn.example.com        # Ihre VPS-Domain oder öffentliche IP
      - PASSWORD_HASH=<bcrypt-hash>     # Web-UI-Login
      - WG_DEFAULT_DNS=1.1.1.1
    volumes:
      - ./config:/etc/wireguard         # Persistenz - behalten Sie dies auf dem Host
    ports:
      - "51820:51820/udp"               # WireGuard-Daten
      - "51821:51821/tcp"               # Web-UI (diesen auf Ihre IP beschränken)
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Drei Zeilen erledigen die Hauptarbeit und sind die üblichen Fehlerquellen:

  • cap_add: NET_ADMIN ermöglicht es dem Container, das wg0-Interface zu verwalten. Ohne diese kann der Container den Tunnel nicht hochfahren.
  • sysctls: net.ipv4.ip_forward=1 verwandelt die Box in einen Router. Ohne diese verbindet sich der Tunnel, aber es wird kein Verkehr darüber geleitet - die häufigste Ursache für "es sagt verbunden, aber nichts funktioniert".
  • volumes: ./config speichert Schlüssel und Peers auf dem Host, sodass ein erneutes Erstellen nicht jeden Client löscht.

Öffnen Sie den UDP-Datenport öffentlich; beschränken Sie den TCP-Web-UI-Port auf Ihre eigene IP - lassen Sie 51821 niemals offen für das Internet.

Die Host-Checkliste (tun Sie dies, bevor Sie den Container beschuldigen)

Ein Container kann perfekt sein und dennoch nichts weiterleiten, weil die darunterliegende Schicht versagt:

  1. Cloud-Firewall: Öffnen Sie 51820/udp in der Sicherheitsgruppe Ihres Anbieters, nicht nur auf dem Host. Dies ist der häufigste stille Fehler auf einem VPS. Siehe welchen Port WireGuard nutzt und wie du ihn öffnest, falls Sie den Standardport ändern.
  2. Host-Kernel-Modul: Die meisten modernen Distributionen liefern das WireGuard-Modul im Kernel (Linux 5.6+). Wenn modprobe wireguard auf dem Host fehlschlägt, installieren Sie die Kernel-Header - der Container kann kein Modul laden, das der Host nicht hat.
  3. DNS für Clients: Setzen Sie WG_DEFAULT_DNS, damit Clients keine Anfragen an einen beliebigen Resolver leiten, den sie zuvor verwendet haben. Kombinieren Sie dies mit unserem WireGuard DNS-Leak-Präventionsleitfaden.

Wann ein Container die richtige Wahl ist - und wann nicht

Verwenden Sie Docker, wenn Sie andere Dienste auf derselben Box betreiben und WireGuard isoliert und reproduzierbar haben möchten, wenn Sie das Dashboard von wg-easy nutzen möchten oder wenn Sie häufig über Hosts hinweg neu bereitstellen. Das gesamte Setup wird zu einer Compose-Datei, die Sie versionieren und verschieben können.

Verzichten Sie auf Docker, wenn der VPS nichts anderes als WireGuard macht. Ein Bare-Metal apt install wireguard plus eine Konfigurationsdatei ist einfacher, hat ein bewegliches Teil weniger und ist trivial skriptbar - siehe unsere WireGuard-Konfigurationsvorlagen und den vollständigen Contabo + WireGuard Selbsthost-Walkthrough. Für eine VPN-Box mit nur einem Zweck fügt der Container eine Verpackung hinzu, die Sie nicht benötigen.

Der VPS darunter

Ob containerisiert oder nicht, WireGuard benötigt einen Host mit einer öffentlichen IP und einer anständigen Uplink-Verbindung. Ein kleiner VPS reicht aus - WireGuard ist so leicht, dass eine Instanz für 4-6 €/Monat ihren Netzwerkport lange vor der CPU auslastet. Wir betreiben unseren auf Contabo wegen des Preis-zu-Bandbreiten-Verhältnisses:

Holen Sie sich einen Contabo VPS für Ihren WireGuard-Container →

Für den vollständigen Preis-/Leistungsvergleich zwischen Anbietern siehe den günstigsten VPS für ein WireGuard VPN.

Die ehrliche Einschränkung

Docker macht WireGuard portabel, nicht sicherer. Der Container teilt den Host-Kernel, läuft mit NET_ADMIN und ist nur so abgesichert wie der Host. Er isoliert WireGuard nicht von der Maschine - jeder mit Root-Zugriff auf dem Host besitzt den Tunnel. Behandeln Sie den Container als Bereitstellungskomfort, härten Sie den Host, als ob WireGuard direkt darauf installiert wäre, und halten Sie den Web-UI-Port vom öffentlichen Internet fern. Tun Sie das, und containerisiertes WireGuard ist das sauberste Selbsthost-Setup, das es gibt.

★ Nürnberger DSGVO-Rechenzentrum · ✓ Dedizierte IPv4 inklusive · 200+ Mbps garantiert

Hoste dein VPN auf deinem eigenen VPS → ContaboVoller Root-Zugriff · öffentliche IPv4 · wähle deine Region

Häufig gestellte Fragen

Ist WireGuard in Docker langsamer als auf Bare Metal?
Kein nennenswerter Unterschied. WireGuard läuft im Linux-Kernel des Hosts, nicht innerhalb des Containers - der Container enthält nur die Benutzerwerkzeuge (wg, wg-quick) und die Konfiguration. Der Datenpfad ist in beiden Fällen dasselbe Kernel-Modul, sodass Durchsatz und Latenz einer Bare-Metal-Installation entsprechen. Der Container ist Verpackung, keine Leistungsschicht.
Welches Image sollte ich verwenden - linuxserver/wireguard oder wg-easy?
linuxserver/wireguard ist der minimale, konfigurationsdateigesteuerte Server: Sie verwalten Peers durch Bearbeiten von Dateien oder Umgebungsvariablen. wg-easy fügt eine Web-UI hinzu, um Peers zu erstellen, QR-Codes anzuzeigen und Live-Übertragungsstatistiken zu sehen - viel benutzerfreundlicher für einige Geräte. Wählen Sie linuxserver/wireguard für Infrastruktur-als-Code und viele Peers; wählen Sie wg-easy, wenn Sie ein Dashboard und schnelles Client-Onboarding möchten.
Warum startet mein WireGuard-Container nicht oder leitet keinen Verkehr weiter?
Drei übliche Ursachen. Erstens, der Container benötigt die NET_ADMIN-Fähigkeit (und in einigen Setups SYS_MODULE), um das Interface zu verwalten - fügen Sie `cap_add: [NET_ADMIN]` hinzu. Zweitens, IP-Weiterleitung muss aktiviert sein: setzen Sie `sysctl: net.ipv4.ip_forward=1` in Compose oder auf dem Host. Drittens, der veröffentlichte UDP-Port (standardmäßig 51820/udp) muss sowohl in Ihrer Cloud-Firewall als auch auf dem Host geöffnet sein. Fehlt einer davon, kommt der Tunnel hoch, leitet aber nichts weiter.
Brauche ich immer noch einen VPS, um WireGuard in Docker zu betreiben?
Nur wenn Sie einen öffentlichen Ausgangspunkt mit einer stabilen IP möchten - für den Fernzugriff auf ein Heimnetzwerk können Sie den Container auf einem Heimserver hinter Port-Weiterleitung betreiben. Für ein VPN, zu dem Sie von überall aus eine Verbindung herstellen (und um eine saubere statische IP zu erhalten), ist ein kleiner VPS die Standardwahl. Eine Instanz für 4-6 €/Monat sättigt ihren Uplink mit WireGuard problemlos.
Wie kann ich Peers und Schlüssel über Container-Neustarts hinweg beibehalten?
Binden Sie das Konfigurationsverzeichnis an den Host (z.B. `./config:/config`). Schlüssel und Peer-Definitionen befinden sich dort, sodass `docker compose down && up` jeden Client funktionsfähig hält. Speichern Sie niemals Schlüssel nur in der beschreibbaren Schicht des Containers - ein erneutes Erstellen löscht sie und jeder Client muss sich erneut anmelden.