WireGuard: ein Zugang aus zwei Schlüsseln.

Von der Installation über die Schlüssel bis zur fertigen Konfiguration — mit den Stellen, an denen es in der Praxis klemmt.

WireGuard ist die einfachste Art, von außen in ein eigenes Netz zu kommen: ein Tunnel, der aus zwei Schlüsselpaaren und einer knappen Konfigurationsdatei besteht. Wer einmal mit Zertifikaten gearbeitet hat, ist überrascht, wie wenig dazugehört — es gibt keine Zertifizierungsstelle, keine Aushandlung von Verfahren und keine Benutzerverwaltung.

Genau daraus folgt aber auch, was WireGuard nicht tut: Es verteilt keine Adressen an die Gegenstellen, es kennt keine Anmeldung mit Benutzername und Kennwort, und es läuft ausschließlich über UDP. Jede Gegenstelle wird von Hand eingetragen. Für einen Betrieb mit einer Handvoll Zugängen ist das ideal; für hundert wechselnde Nutzer ist es das falsche Werkzeug.

Installation

Seit Linux 5.6 steckt WireGuard im Kernel selbst, installiert wird nur noch das Werkzeug drumherum:

sudo apt install wireguard

Für Windows, macOS, Android und iOS gibt es fertige Apps vom Projekt selbst. Die Konfiguration ist überall dieselbe Textdatei.

Schlüssel erzeugen

Jede Seite — Server wie Gegenstelle — bekommt ein eigenes Schlüsselpaar. Der private Schlüssel verlässt das Gerät nie, der öffentliche wird der anderen Seite mitgeteilt. Das umask 077 davor ist kein Zierrat: Ohne es liegt der private Schlüssel für jeden lesbar auf der Platte.

umask 077
wg genkey > privatekey
wg pubkey < privatekey > publickey

Zusätzlich lässt sich ein gemeinsames Geheimnis erzeugen, das beide Seiten identisch eintragen. Es legt eine zweite, symmetrische Schicht über die Verbindung; die Dokumentation begründet das mit Widerstandsfähigkeit gegen künftige Quantenrechner.

wg genpsk

Die Konfiguration des Servers

Die Datei liegt unter /etc/wireguard/wg0.conf und ist nach dem Gerät benannt, das daraus entsteht. Sie besteht aus einem Abschnitt für die eigene Seite und je einem Abschnitt pro Gegenstelle.

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <privater Schlüssel des Servers>

[Peer]
# Notebook
PublicKey = <öffentlicher Schlüssel des Notebooks>
AllowedIPs = 10.8.0.2/32

[Peer]
# Telefon
PublicKey = <öffentlicher Schlüssel des Telefons>
AllowedIPs = 10.8.0.3/32

ListenPort ist laut Dokumentation optional — fehlt er, wird ein zufälliger Port gewählt. Auf einem Server, den andere erreichen sollen, gehört er also hin. Der Wert 51820 ist kein Zwang, aber die Zahl, die in der offiziellen Dokumentation durchgehend verwendet wird.

AllowedIPs ist das Herzstück, und es bedeutet zweierlei

Beim Empfang wirkt der Eintrag als Zugriffsliste: Von dieser Gegenstelle werden nur Pakete angenommen, deren Absenderadresse dort steht. Beim Senden wirkt er als Wegetabelle: Pakete an eine dieser Adressen gehen zu genau dieser Gegenstelle. Deshalb trägt der Server pro Gegenstelle nur deren eigene Adresse ein, ein Client dagegen das, was er durch den Tunnel schicken will.

Die Konfiguration der Gegenstelle

# Notebook
[Interface]
Address = 10.8.0.2/32
PrivateKey = <privater Schlüssel des Notebooks>
DNS = 10.8.0.1

[Peer]
PublicKey = <öffentlicher Schlüssel des Servers>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25

Mit AllowedIPs = 10.8.0.0/24 geht nur der Verkehr ins Firmennetz durch den Tunnel, alles andere läuft weiter direkt ins Internet. Soll der gesamte Verkehr durch den Tunnel, steht dort 0.0.0.0/0 — und dann braucht der Server zusätzlich die beiden Dinge aus dem nächsten Abschnitt.

PersistentKeepalive hält die Verbindung durch Router und Firewalls hindurch offen. WireGuard sendet von sich aus nichts, wenn es nichts zu senden gibt; ohne diesen Eintrag vergisst ein Router die Zuordnung nach einigen Minuten, und die Gegenstelle ist von außen nicht mehr erreichbar. Die Dokumentation nennt dafür 25 Sekunden.

Wenn der ganze Verkehr durch den Tunnel soll

Zwei Dinge fehlen dem Server dann noch. Erstens die Erlaubnis, Pakete überhaupt weiterzuleiten:

# in /etc/sysctl.conf eintragen
net.ipv4.ip_forward = 1

# übernehmen
sudo sysctl -p

Zweitens eine Regel, die den Verkehr aus dem Tunnel auf die Internetadresse des Servers umschreibt. Üblich ist, sie an das Gerät zu hängen, damit sie mit ihm kommt und geht — eth0 ist dabei durch die tatsächliche Schnittstelle zu ersetzen:

# in den Abschnitt [Interface] des Servers
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Beide Richtungen gehören in die Regel. Auf einem frisch aufgesetzten Ubuntu fällt es nicht auf, wenn die Rückrichtung fehlt, weil dort ohnehin alles weitergeleitet wird — auf einem System mit Docker oder einer gehärteten Firewall schon.

Starten und dauerhaft betreiben

sudo wg-quick up wg0                  # einmalig starten
sudo wg show                          # Status und letzter Handshake
sudo systemctl enable --now wg-quick@wg0   # beim Hochfahren mitstarten

wg show ist das wichtigste Werkzeug bei der Fehlersuche. Steht dort ein aktueller latest handshake, haben sich beide Seiten erfolgreich begrüßt — ein Problem liegt dann nicht mehr an Schlüsseln oder Erreichbarkeit, sondern an Wegen oder Firewallregeln dahinter.

SaveConfig überschreibt Ihre Datei

Steht SaveConfig = true im Abschnitt [Interface], schreibt WireGuard beim Herunterfahren den aktuellen Zustand in die Datei zurück. Alles, was Sie in der Zwischenzeit von Hand geändert haben — auch Ihre Kommentare — ist dann weg. Auf einem Server, dessen Konfiguration Sie pflegen, lassen Sie den Eintrag besser aus.

Gegenstellen bequem einrichten

Für Telefone ist Abtippen der falsche Weg. Die fertige Konfigurationsdatei lässt sich als QR-Code ausgeben, den die App einliest:

sudo apt install qrencode
qrencode -t ansiutf8 < telefon.conf

Eine neue Gegenstelle bedeutet immer drei Schritte: Schlüsselpaar erzeugen, einen [Peer]-Abschnitt auf dem Server ergänzen, und der Gegenstelle ihre eigene Datei geben. Nach einer Änderung an den Wegen reicht ein Neuladen nicht — dann ist ein Neustart des Geräts mit systemctl restart wg-quick@wg0 nötig.

Wenn es nicht funktioniert

  1. Kein Handshake in wg show: Der Server ist nicht erreichbar. Prüfen Sie, ob der UDP-Port in der Firewall offen ist und — falls der Server hinter einem Router steht — ob er dorthin weitergeleitet wird.
  2. Handshake ja, aber nichts geht: Fast immer fehlt die Weiterleitung oder die Umschreibungsregel. Testen Sie zuerst einen Ping auf die Tunneladresse des Servers. Kommt der an, funktioniert der Tunnel und der Fehler liegt dahinter.
  3. Der Tunnel steht, aber Namen werden nicht aufgelöst: Der Eintrag DNS in der Konfiguration der Gegenstelle fehlt oder zeigt auf einen Server, der durch den Tunnel nicht erreichbar ist.
  4. Die Verbindung schläft ein: PersistentKeepalive auf der Seite ergänzen, die hinter einem Router sitzt.
  5. Es funktioniert aus dem Firmen- oder Hotelnetz nicht: Dort ist ausgehendes UDP gesperrt. WireGuard beherrscht kein TCP, und das ist eine bewusste Entscheidung des Projekts. In solchen Netzen bleibt nur ein Zusatzwerkzeug — oder OpenVPN über Port 443.

Stand: 2026-09-22. Die Angaben habe ich zu diesem Zeitpunkt anhand der Dokumentation der jeweiligen Hersteller geprüft. Anbieter ändern Adressen, Bezeichnungen und Menüwege ohne Ankündigung; prüfen Sie im Zweifel die Angaben Ihres Anbieters. Wer an fremden Systemen arbeitet, braucht die Erlaubnis des Betreibers.

Fragen

Häufige Fragen zu WireGuard

Der Tunnel steht, aber ich komme nirgends hin. Woran liegt das?

Fast immer an einer von zwei Stellen: Entweder fehlt auf dem Server die IP-Weiterleitung, oder es fehlt die NAT-Regel, die den Verkehr aus dem Tunnel auf die Internetschnittstelle übersetzt. Prüfen Sie zuerst, ob ein Ping auf die Tunneladresse des Servers ankommt — wenn ja, ist die Verbindung in Ordnung und der Fehler liegt hinter dem Server.

Muss ich einen Port in der Firewall öffnen?

Auf der Serverseite ja: den in der Konfiguration eingetragenen UDP-Port. Die Clients brauchen keine Freigabe, weil sie die Verbindung von sich aus aufbauen. Wenn der Server hinter einem Router steht, muss dieser Port dorthin weitergeleitet werden.

Die Verbindung schläft nach einiger Zeit ein.

Das ist kein Fehler, sondern Absicht: WireGuard sendet nichts, wenn nichts zu senden ist. Router und Firewalls vergessen die Verbindung dann. Abhilfe schafft der Eintrag PersistentKeepalive beim Peer; in der Dokumentation wird dafür ein Wert von 25 Sekunden genannt.

Kann ich WireGuard auch über TCP betreiben?

Nein, und das ist eine bewusste Entscheidung des Projekts: Es verweist darauf, dass ein Tunnel über TCP innerhalb von TCP erfahrungsgemäß schlechte Leistung bringt. In Netzen, die nur Port 443 über TCP durchlassen, brauchen Sie Zusatzwerkzeuge — oder Sie nehmen dort OpenVPN.

Nicht weitergekommen?

Dann übernehme ich das.

Einen Zugang, der zuverlässig läuft und den niemand im Betrieb pflegen muss, richte ich Ihnen ein. Beschreiben Sie in ein paar Sätzen, was nicht funktioniert — Ihre Anfrage bekommt eine Nummer und geht damit nicht unter.