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
ZX2C4 Git Repository – wireguard-windows – Registry Keys for Admins
Update 18.01.2023
Troubleshooting ergänzt.
Update 07.02.2023
Einschränkung ergänzt.
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
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
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.
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
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.
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.
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.
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!