WireGuard-Server unter Windows einrichten

WireGuard, das moderne und performante VPN, wird Server-seitig in der Regel unter Linux oder BSD eingesetzt, ein Betrieb ist allerdings auch unter Windows möglich.

Gleich zu Beginn dieses Beitrags sei erwähnt, das es keine offizielle Unterstützung für den Betrieb eines WireGuard-Servers unter Windows gibt und ich bzw. wir einen solchen Betrieb nicht empfehlen! Die GUI ist zudem für den Server-Betrieb eher unbrauchbar, da diese für den Client-Betrieb ausgelegt ist.

Dieser Beitrag basiert auf der Anleitung von Henry Chang:

How to Setup Wireguard VPN Server On Windows

Und der Variante unter cyberpatel.com.

Es wird nur die Nutzung für Roadwarrior beschrieben.

WireGuard herunterladen und installieren

Zu Beginn lädt man entweder den Installer oder die passende MSI beim Anbieter herunter. Direkt nach der Installation startet die GUI, die man gleich wieder beenden sollte.

WireGuard als Server konfigurieren

Damit man WireGuard nutzen kann, ist zunächst für den Server und für jedes Peer (Client) ein Schlüsselpaar sowie zusätzlich ein PSK angelegt werden. Da wie eingangs erwähnt die GUI für dieses Szenario nur bedingt nutzbar ist, wechselt man in die Eingabeaufforderung:

Privaten und öffentlichen Schlüssel generieren:

wg genkey > privatekey.txt
wg pubkey < privatekey.txt > publickey.txt

Die obigen Befehle einmal für den Server und einmal pro Peer/Client ausführen!

Preshared Key (PSK) erzeugen:

wg genpsk > psk.txt

Diesen Befehl einmal pro Peer/Client ausführen!

Wichtig: Die Befehle überschreiben die jeweiligen Dateien! Daher diese nach jedem Ausführen entsprechend vom Namen her anpassen!

Hat man die notwendigen Schlüsselpaare und PSKs erzeugt, kann man die eigentliche Server-Konfiguration anlegen:

[Interface]
PrivateKey = <Privater Schlüssel des WireGuard-Servers>
ListenPort = 51820
Address = <Transfer-Netz, z.B. "192.168.200.1/24">

[Peer]
# Irgendein Name
PublicKey = <Öffentlicher Schlüssel des Peers/Clients>
PresharedKey = <PSK des Peers/Clients>
AllowedIPs = <IP-Adresse aus dem Transfer-Netz für dieses Peer, z.B. "192.168.200.2/32">

Für jedes weitere Peer bzw. jeden weiteren Client muss ein eigener “[Peer]”-Abschnitt angelegt werden!

Die Konfigurationsdatei z.B. unter “C:\WireGuard” als “wg_server.conf” abspeichern.

Hinweis: Nach Möglichkeit nicht unter “C:\Program Files\WireGuard\Data\Configurations” abspeichern, da im Falle das doch mal die GUI gestartet wird, die Konfiguration sonst durch diese verschlüsselt und dann als z.B. “wg_server.conf.dpapi” abgelegt wird.

Der WireGuard-Server-Dienst wird mit folgenden Befehl angelegt und gestartet:

wireguard /installtunnelservice "C:\WireGuard\wg_server.conf"

In der Diensteverwaltung erscheint dieser dann mit

Dienstname: WireGuardTunnel$wg_server
Anzeigename: WireGuard Tunnel: wg_server

Hinweis: Nach jeder Änderung an der Konfiguration muss der Dienst neu gestartet werden.

Routing einrichten

Im Gegensatz zur Einrichtung des Routings eines OpenVPN-Servers unter Windows reicht es nicht aus, einmalig folgende Befehle auszuführen:

netsh interface ipv4 set int "LAN-Verbindung" forwarding=enabled
netsh interface ipv4 set int "wg_server" forwarding=enabled

Der Hintergrund hierzu ist, das die WireGuard-Schnittstelle dynamisch bei der Installation bzw. beim Starten des Dienstes angelegt und bei dessen Beendigung entfernt wird. Um nun nicht jedes Mal händisch das Routing reaktivieren zu müssen, kann man die Konfiguration etwas ändern:

Zunächst muss die Ausführung von Skripten durch den WireGuard-Dienst erlaubt werden:

reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f

Nun ist es möglich bei verschiedenen Stati (PreUp, PostUp, PreDown und PostDown) Befehle bzw. Skripte ausführen zu lassen.

Folgende Zeile im “[Interface]”-Abschnitt der “wg_server.conf” einfügen und den Dienst neu starten:

PostUp = netsh interface ipv4 set int "wg_server" forwarding=enabled

Windows-Firewall

In der Windows-Firewall muss der Port 51820/udp freigegeben werden. Alternativ kann man das Programm

"C:\Program Files\WireGuard\wireguard.exe"

freigeben.

Router konfigurieren

Damit aus dem Internet heraus eine WireGuard-Verbindung aufgebaut werden kann, muss im Router der Port 51820/udp zur IP-Adresse des (internen) WireGuard-Servers weitergeleitet werden.

Um wiederum andere Geräte im LAN des WireGuard-Servers erreichen zu können, muss im Router noch eine Route für das Transfer-Netz zum WireGuard-Server als Gateway gesetzt werden. Am Beispiel einer FRITZ!Box sieht das so aus:

Peer/Client konfigurieren

Eine typische WireGuard-Konfigurationsdatei kann so aussehen:

[Interface]
PrivateKey = <Privater Schlüssel des jeweiligen Peers/Clients>
Address = <IP aus dem Transfer-Netz, z.B. "192.168.200.2/24">
# DNS = LAN-IP des Routers, IP eines DNS-Servers oder -Dienstes

[Peer]
PublicKey = <Öffentlicher Schlüssel des WireGuard-Servers>
PresharedKey = <PSK des jeweiligen Peers/Clients>
AllowedIPs = <LAN des WireGuard-Servers, z.B. "192.168.1.0/24" oder "0.0.0.0/0">
Endpoint = <Öffentliche IP oder FQDN des WireGuard-Servers bzw. Routers>:51820

Möchte man DNS verwenden, entfernt man die Raute, dann werden alle Namensauflösungen an den bzw. dort angegebenen Server weitergeleitet.

Diese Konfiguration kann in der WireGuard-App bzw. -Anwendung unter Windows, Android und Co. importiert werden.

Troubleshooting

Lässt sich der Dienst unter Windows nicht (wieder) mit folgender oder ähnlicher Meldung starten:

Der Dienst "WireGuard Tunnel: wg_server" wurde mit folgendem Fehler beendet: 
Der Prozess kann nicht auf die Datei zugreifen,
da sie von einem anderen Prozess verwendet wird.

Dann liegt dies evtl. daran, das der Port bereits belegt ist. Beispielsweise mit CurrPorts prüfen, ob der Port frei ist bzw. von welchem Prozess dieser belegt ist. Läuft auf dem gleichen System der DNS-Server, kann dies eine Ursache sein, siehe:

Windows: Die dns.exe belegt mehrere tausend Ports

Ein weiterer Grund für diese Fehlermeldung kann sein, das mit den Schlüsseln (…Key) etwas nicht stimmt. Oft handelt es sich um copy & paste-Fehler, d.h. entweder wurden Zeichen vergessen zu kopieren oder die Schlüssel an die falsche Stelle eingefügt.

Einschränkung

Eine Einschränkung scheint es zu geben: Die Clients können zwar auf den WireGuard-Server zugreifen (z.B. ping, rdp, usw.) aber umgekehrt vom Server auf die Clients klappt dies nicht. Die Netzwerkkategorie auf dem VPN-Client ist dabei richtig konfiguriert (Privates Netzwerk) und die gewünschten Dienste sind in der Firewall zugelassen.

Andere Systeme aus dem Netz des WireGuard-Server können allerdings auf die Clients zugreifen. Irgendwie scheint dies ein Routing-Problem zu sein. Ein Ping vom WireGuard-Server zu einem Client mit

ping 192.168.200.6

scheitert. Gibt man allerdings die Quell-Netzwerkschnittstelle bzw. -IP-Adresse an funktioniert es:

ping 192.168.200.6 -S 192.168.1.32

Diese Einschränkung oder dieses Problem scheint auf eine Windows-basierte WireGuard-Server-Installation beschränkt zu sein. Mit WireGuard unter AVM FRITZ!Box oder Securepoint UTM wurde dieses noch nicht beobachtet.

Quellen

WireGuard – Quick Start

ZX2C4 Git Repository – wireguard-windows – Registry Keys for Admins

Update 18.01.2023

Troubleshooting ergänzt.

Update 07.02.2023

Einschränkung ergänzt.

7 Kommentare

  1. Benjamin

    Hallo Andy,

    vielen Dank für Deine Anleitung. Das hat alles soweit funktioniert, ABER ich bekommst es leider nicht hin, dass ich von meinem Windows 10 Client bei aktiver Verbindung zum Server meine lokale Internetverbindung nutzen kann.

    Was übersehe ich?

    Gruß
    Benjamin

  2. Andy

    Hallo Benjamin,

    in der Client-Konfig. muss im Abschnitt “Interface” DNS aktiv sein, z.B.

    DNS = 8.8.8.8

    Statt Google und Co. kann man auch die IP seines eigenen Routers oder DNS-Servers eintragen.
    Und im Abschnitt “Peer” (auch auf dem Client) muss jedweder Traffic umgeleitet werden:

    AllowedIPs = 0.0.0.0/0

    “0.0.0.0/0” entspricht einem redirect-gateway.

    Wenn das so funktioniert, ist es gut, wenn nicht, liegt’s mit Sicherheit an einer Firewall.

  3. Sebastian U.

    Für alle denen das zu kompliziert ist, oder sich ein Fehler eingeschlichen hat, habe ich dieses Tool gefunden:

    es macht alles Automatisch, man muss den Schritt nur “mittels” klick in Gang setzen:

    https://github.com/micahmo/WgServerforWindows

    das Ergebnis war hoch zufriedenstellend

  4. Andy

    Hallo Sebastian,

    vielen Dank für den Tipp. Dieses Tool gab es zum Zeitpunkt des Schreibens meines Blog-Beitrags noch gar nicht.
    Werde ich bei nächster Gelegenheit mal testen.

  5. Antonio T.

    Super erklärt. Allerdings habe ich das Problem, dass die UDP Pakete auf meinem Server ankommen (sehe ich im FireWall log), der Server sie aber nicht verarbeitet.

    Netzwerk-Setup ist: Server (Ethernet:192.168.10.191) -> VodafoneBox (192.168.10.1)
    Server-interne-WireGuard-IP: 10.222.222.1
    Client: Internetzugriff über SIM Karte auf einem Android SmartPhone

    Ich habe alle Schritte wie oben beschrieben ausgeführt, bis auf das Setzen der Konfiguration in der FritzBox. Ich habe nämlich nur das normale KabelModem von Vodafone. Dort lässt sich lediglich das Portforwarding auf Port 51820 einrichten, aber keine Routen zu 10.222.222.1/24.

    Es muss doch möglich sein dem Windows beizubringen die Pakete zwischen den Netzen 192.168.10.x und 10.222.222.x selber zu routen.

    Wäre über Hilfestellung dankbar.

    Grüße
    A.

  6. Andy

    Soll nur auf das Windows zugegriffen werden oder auch auf andere Geräte im LAN? Prinzipiell kann Windows auch Routen, persönlich mache ich das immer vom gewünschten Szenario und dem vorhandenen Möglichkeiten abhängig.

  7. ElMariachi

    Hallo!
    Danke für die Anleitung!
    Ich habe leider noch zwei Probleme mit der “AllowedIP” auf dem Client:
    1. Laut Anleitung (und auch den anderen tutorials die ich fand), sollte man bei AllowedIPja die “echte” LAN-IP des Servers eingeben. Aber wenn ich das mache, kann ich den Server gar nicht pingen.
    2. Wenn ich aös AllowedIP 0.0.0.0/0 angebe, dann habe ich auf dem Client keinen Zugriff auf das Internet mehr, aber die Verbindung zum Server funktioniert.
    Im Moment habe ich als AllowedIP auf dem client die “Transfer-IP” des Servers (also 192.168.200.1) eingestellt. So kann ich den Server erreichen und habe dennoch Zugang zum Internet. Aber es muss doch Gründe geben, dass es nicht normal funktioniert.

    Vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑