OpenVPN-Server unter Windows einrichten – Erste überarbeitete Fassung – Andy's Blog (2024)

Der BeitragOpenVPN-Server unter Windows einrichten gehört trotz seines mehrjährigen Alters mit zu den beliebtesten Veröffentlichungen in diesem Blog. Im Laufe der Zeit hat sich so manches verändert, daher wird es Zeit für eine überarbeitete Fassung.

Gleich Vorweg und Wichtig: Die Nutzung von Windows (Server) als VPN-Server empfehlen wir zudem ausdrücklich nicht!

Auf verschiedenen Wegen werde ich nahezu regelmäßig danach gefragt, ob es ein Update zu diesem Thema gibt oder geben wird. Zuletzt hatte ich dieses im November 2021 via Kommentar noch ausgeschlossen, aber was soll man sagen: Dinge ändern sich und so ergab es sich nun, gerade einmal gut zwei Monate später, das ich dieses Thema doch aufgreifen muss.

Grundsätzlich sei erwähnt, das man einen OpenVPN-Server (in der Community-Ausgabe) unter Windows betreiben kann, ich empfehle dennoch eher richtige VPN-Firewall-Router, wie z.B. pfSense, OPNsense oder Securepoint UTM, die eine ordentliche Implementierung und insgesamt eine einfachere sowie weitreichendere Handhabe bei der Konfiguration und mehr Funktionen aufweisen.

Wie eingangs bereits erwähnt haben sich ein paar Dinge in der Zwischenzeit geändert, da wäre beispielsweise das easy-rsazwischenzeitlich nicht mehr im Bundle enthalten war. Ferner haben sich Konfigurationsoptionen sowie die Verschlüsselung und Pfade geändert.

Die aktuelle Version von easy-rsa lässt sich wohl auch nicht ganz so einfach (unter Windows) nutzen wie in der Vergangenheit. Um es insgesamt dem gemeinen Windows-Administrator einfacher zu machen, wird in dieser Fassung die Zertifikatverwaltung mittels XCA durchgeführt. Dies bietet zudem einen einfacheren Überblick über die ausgestellten Zertifikate und deren Status.

Zwecks Benutzeranmeldung wurde zudem im früheren Beitrag ein Skript verwendet, das aus einer mittlerweile nicht mehr verfügbaren Quelle stammt. Um die Verständlichkeit dieses Abschnitts etwas zu erhöhen, wurde dieses Skript ebenfalls überarbeitet und vereinfacht.

Die folgenden Schritte wurden auf einem Windows Server 2012 R2 durchgeführt, sie sollten allerdings auch unter neueren Windows-Versionen funktionieren. Die OpenVPN-Konfiguration besteht in der Hauptsache aus den beim Setup mitgelieferten Beispielen, die nur wenig angepasst werden. Es handelt sich im ein Roadwarrior-Setup, es geht also um VPN-Verbindungen beispielsweise von Außendienst-Mitarbeitern zur Firma. Nicht behandelt wird die Möglichkeit einer Standortvernetzung (Site-to-Site, s2s). Grundlegende Kenntnisse in Netzwerken, Routing und OpenVPN sowie Zertifiakten sind für die nachfolgende Anleitung durchaus zu empfehlen.

Soviel zum Vorwort, schreiten wir nun zur Tat.

Die aktuelle Version von XCA herunterladen und entpacken (ZIP, portable) oder installieren (MSI). Für diesen Beitrag kommt “xca-portable-2.4.0.zip” zum Einsatz.

Im ersten Schritt muss XCA gestartet und mittels

Datei - Neue Datenbank

eine neue Datenbank erstellt werden. Beim Anlegen einer neuen Datenbank wird man nach einem Kennwort gefragt, dieses sollte sicher gewählt und die entsprechende Datenbank-Datei zudem sicher aufbewahrt werden!

Tipp: Sichere Kennwörter erstellen und deren Verwaltung kann mit KeePass realisiert werden.

Zertifizierungsstelle/CA erstellen

Die Zertifizierungsstelle (engl. certificate authority) ist für das Ausstellen der Zertifikate und für das Vertrauen in diese verantwortlich. Damit eine CA überhaupt Zertifikate ausstellen und sozusagen Unterschreiben kann, ist zunächst das CA-Zertifikat samt privaten Schlüssel notwendig.

Zertifikatvorlagen erstellen

Damit man beim Ausstellen der nachfolgenden Zertifikate nicht immer alles von vorne eingeben muss und damit die jeweiligen Zertifikate für den richtigen Zweck ausgestellt werden, ist das Einrichten der Vorlagen relevant.

  • Auf der Registerkarte “Vorlagen” die Schaltfläche “Neue Vorlage” anklicken” und“[default] CA” auswählen.
  • Die notwendigen Felder (siehe Screenshot) entsprechend angepasst ausfüllen, dabei das Feld “commonName” leer lassen.

  • Ggf. auf der Registerkarte “Erweiterungen” die Laufzeit anpassen.
    Tipp: An dieser Stelle den Haken bei “Mitternacht” setzen, das sieht i.d.R. besser aus und man kann die Ablaufzeiträume besser überschauen.

Die Schritte für “[default] tls-server” (für den OpenVPN-Server) und “[default] tls-client” (für die Roadwarrior) wiederholen. Auch bei diesen ggf. die Laufzeit (die Vorgabe ist ein Jahr) ändern.

Letztlich müssen drei Vorlagen vorhanden sein:

CA-Zertifikat erstellen

  • In XCA auf der Registerkarte “Zertifikate” die Schaltfläche “Neues Zertifikat” anklicken.
  • Auf der Registerkarte “Herkunft” unter “Vorlage für das neue Zertifikat” die zuvor erstellte CA-Vorlage auswählen und auf “Alles übernehmen” klicken.
  • Zur Registerkarte “Inhaber” wechseln und im Feld “Interner Name” und “commonName” z.B. OpenVPN-CA eintragen.
  • Auf “Erstelle einen neuen Schlüssel” sowie anschließend auf “Erstellen” klicken:

  • Abschließend noch auf “OK” klicken, somit ist die grundlegende CA erstellt.

Server-Zertifikat erstellen

  • Auf der Registerkarte “Zertifikate” die Schaltfläche “Neues Zertifikat” anklicken.
  • Auf der Registerkarte “Herkunft” bei “Verwende dieses Zertifikat zum Unterschreiben” das zuvor erstellte CA-Zertifikat auswählen und unter “Vorlage für das neue Zertifikat” die zuvor erstellte Server-Vorlage auswählen sowie auf “Alles übernehmen” klicken.

  • Zur Registerkarte “Inhaber” wechseln und im Feld “Interner Name” und “commonName” z.B. OpenVPN-Server eintragen.
  • Auf “Erstelle einen neuen Schlüssel” sowie anschließend auf “Erstellen” klicken.

Client-Zertifikat(e) erstellen

Für jede VPN-Benutzer muss ein Zertifikat ausgestellt werden, die Schritte entsprechen denen wie für den OpenVPN-Server mit den Unterschieden, das die Client-Vorlage und bei “Interner Namen” sowie “commonName” dann beispielsweise das Schema

OpenVPN-Benutzer

verwendet werden kann.

CRL/Zertifikatsperrliste erstellen und exportieren

Eine Zertifikatsperrliste (engl. certificate revocation list, CRL) wird dringend empfohlen, um etwaige abhanden gekommene Zertifikate widerrufen, also sozusagen sperren zu können. Als Beispiel kann ein verloren gegangenes Notebook oder Smartphone dienen, man möchte sicher nicht, das der Finder sich ggf. einfach so mit dem VPN verbinden kann.

  • In XCA zur Registerkarte “Sperrlisten” wechseln.
  • Auf “Neue Sperrliste” klicken.
  • Eine Gültigkeitsdauer festlegen (Die Vorgabe sind 30 Tage).
  • Sobald die Sperrliste erstellt wurde diese mit einem Klick auf “Export” als “crl.pem” exportieren.

Bitte das Beitrags-Update (s.u.) vom 24.02.2022 zur CRL beachten!

Zertifikate exportieren

Damit die Zertifikate mit OpenVPN genutzt werden können, müssen diese im richtigen Format exportiert werden. Von der CA an sich wird nur das Zertifikat ohne den privaten Schlüssel benötigt! Vom Server als auch den Clients wird jeweils das Zertifikat mit Schlüssel exportiert.

  • Auf der Registerkarte “Zertifikate” das gewünschte Zertifikat auswählen und auf “Export” klicken.
  • Das CA-, Server- und die Client-Zertifikate im Format “PEM (*.crt)” als “ca.crt”, “server.crt” und “client.crt” exportieren.
  • Auf der Registerkarte “Private Schlüssel” nur die Schlüssel für das Server- und die Client-Zertifikate als “PEM privat (*.pem)” mit dem Dateinamen “server.key” und “client.key” exportieren.

Tipp: Klickt man ein Zertifikat oder den privaten Schlüssel mit der rechten Maustaste an, kann aus dem Untermenü “Export” beispielsweise dieses direkt in die Zwischenablage exportiert und von dort aus eine Datei, Notepad, usw. kopiert werden.

Weiteres

Es wird noch der Diffie Hellman (DH) Parameter benötigt:

  • Unter “Extra – DH Parameter erstellen” anklicken, als Wert “2048” eingeben und diese als “dh2048.pem” speichern.

Bemerkung: Sofern OpenVPN mit OpenSSL installiert wurde, kann der Parameter auch mit

openssl dhparam -out dh2048.pem 2048

erstellt werden.

Die aktuelle Ausgabe von OpenVPN (Community) herunterladen und angepasst, gemeint ist nach einem Klick auf “Customize” einschließlich “OpenVPN Service” installieren. Zu diesem Zeitpunkt ist das Version2.5.5 vom 15. Dezember 2021.

Eine Eingabeaufforderung mit erhöhten Rechten öffnen und in den Ordner

C:\Program Files\OpenVPN\bin

wechseln. Als Vorbereitung für tls-auth folgenden Befehl ausführen:

openvpn --genkey tls-auth ta.key

Soweit sind nun alle Voraussetzungen erfüllt. Im nächsten Schritt geht es an die Konfiguration, als Basis dient das Beispiel unter

C:\Program Files\OpenVPN\sample-config\server.ovpn

Diese funktioniert nahezu Out-of-the-Box, allein schon mit den Zertifikaten kann man sich bereits anmelden. Es reicht also aus diese Datei in den Ordner

C:\Program Files\OpenVPN\config-auto

zu kopieren und den Dienst

OpenVPNService

neu starten. An gleicher Stelle müssen (vor dem Dienst-Neustart) die Dateien

ca.crtserver.crtserver.keydh2048.pemta.key

kopiert bzw. eingefügt werden.

Folgende Änderungen in der Konfigurationsdatei gegenüber dem Original durchführen:

topology subnetpush "route 192.168.1.0 255.255.255.0" <- Hier muss das eigene Netz eingetragen werdencrl-verify crl.pem

Die folgenden Zeilen sind nur notwendig, wenn man Namensauflösung (DNS) via VPN verwenden möchte:

push "dhcp-option DNS 192.168.1.10" <- Hier den eigenen DNS-Server eintragenpush "dhcp-option DOMAIN domain.local" <- Hier die eigene DNS-Domain eintragen;push "block-outside-dns" <- ggf. "Einkommentieren", wenn während der VPN-Verbindung auf dem Client keine anderen DNS-Server abgefragt werden sollen

Um ein Plus an Sicherheit zu bekommen, sollte zusätzlich noch eine Anmeldung mittels Benutzername samt Kennwort implementiert werden. Die notwendigen Änderungen sehen wie folgt aus:

auth-user-pass-verify "C:\\Program Files\\OpenVPN\\config-auto\\auth.bat" via-envscript-security 3

Der Inhalt der “auth.bat” ist der folgende:

@echo offset auth=%username% %password%find "%auth%" "C:\Program Files\OpenVPN\config-auto\users.txt"if %errorlevel%==1 exit 1echo exit 0

Der Inhalt der “users.txt” muss wie folgt aufgebaut sein:

<Benutzername> <Kennwort>

Ein Beispiel:

andy MeinSuperGeheimesKennwortandreas DasIstMeinPasswortmartin MeineStimmeIstMeinPass

Kurze Erklärung zum “auth”-Skript:

Zuerst werden der Benutzername und das Kennwort in eine Variable geschrieben,
dann wird die Variable in der “users.txt” gesucht,
wird keine Übereinstimmung gefunden, ist der Rückgabewert “1” und damit ist die Anmeldung gescheitert,
andernfalls ist der Rückgabewert “0” und die Anmeldung war erfolgreich.

Persönliche Bemerkung: Dieses Skript sollte gegenüber der Variante aus dem ersten Beitrag einfacher für alle zu verstehen sein.

Hinweis: Immer wenn man Änderungen an der Konfiguration vorgenommen hat, muss der Dienst neu gestartet werden.

Damit man nicht nur den OpenVPN-Server erreichen kann, muss das Routing in Windows aktiviert werden und entweder im Router oder auf allen zu erreichenden Geräten eine Route bekannt gemacht werden.

In einer Eingabeaufforderung mit erhöhten Rechten auf dem Windows-System, auf dem der OpenVPN-Server installiert ist, Routing für die Schnittstellen aktivieren, die am LAN und VPN beteiligt sind:

netsh interface ipv4 set int "LAN-Verbindung" forwarding=enablednetsh interface ipv4 set int "OpenVPN TAP-Windows6" forwarding=enabled

Tipp: Die richtigen Schnittstellen-Bezeichnungen können wie folgt ermittelt werden:

netsh interface ipv4 show interfaces

Am Beispiel einer AVM FRITZ!Box 7490 kann eine Route für das VPN wie folgt konfiguriert werden:

  • Im Web-Interface der FRITZ!Box zu “Heimnetzwerk – Netzwerk – Netzwerkeinstellungen” wechseln. Ggf. muss die “Erweiterte Ansicht” aktiviert werden.
  • Bei “LAN-Einstellungen” auf “Erweiterte Einstellungen” klicken.
  • Bei “Statische Routingtabelle” auf “IPv4 Routen” klicken.
  • Auf “Neue IPv4 Route” klicken und wie folgt ausfüllen:
    IPv4-Netzwerk: 10.8.0.0
    Subnetzmaske: 255.255.255.0
    Gateway: 192.168.1.10 <- Hier muss die IP-Adresse des OpenVPN-Servers, also des Computers auf dem OpenVPN installiert ist, eingetragen werden.
  • Den Haken setzen bei “IPv4 Route aktiv”.
  • Auf “OK” und “Übernehmen” klicken.

Alternativ kann bzw. muss man auf jedem zu erreichenden Gerät so eine Route gesetzt werden:

route add <VPN-NETZWERK> mask <SUBNETZMASKE> <OPENVPNSERVER> -p

Ein Beispiel:

route add 10.8.0.0 mask 255.255.255.0 192.168.1.10 -p

Die IP-Adresse 192.168.1.10 muss durch die IP-Adresse des OpenVPN-Servers ersetzt werden.

In der Windows-Firewall und sofern ein VPN-Zugriff aus dem Internet erfolgen soll muss jeweils der konfigurierte Port, per Standard ist dies 1194/udp, freigegeben werden.

Kleiner Tipp am Rande: Wer den VPN-Zugriff aus dem Internet einschränken möchte, aber als Router nur eine AVM FRITZ!Box o.ä. einfaches hat, kann in der entsprechenden Regel der Windows-Firewall die Quelle auf bestimmte IP-Adressen begrenzen:

Auf die Frage was mit der Netzwerkkategorie ist, kann dahingehend sozusagen Entwarnung gegeben werden, wenn man DNS in der *.ovpn konfiguriert hat, denn dann erhält die Netzwerkschnittstelle des OpenVPN-Servers ein Präfix. Im Windows-Domänennetzwerk wird so automatisch als Netzwerkkategorie “Domänennetzwerk” für die OpenVPN-Netzwerkkarte festgelegt.

Keine Installation ohne Überraschungen möchte man meinen. Während der erste Beitrag zu diesem Thema unter Windows einfach so lief, musste diesmal erst noch eine kleine Änderung vorgenommen werden. Damit der OpenVPN-tun/tap-Netzwerk-Adapter des OpenVPN-Servers vom Dienst eine IP-Adresse erhalten kann, muss ggf. folgender Befehl ausgeführt werden:

netsh interface ipv4 set global dhcpmediasense=enabled

Anschließend den OpenVPN-Server-Dienst neu starten.

Update 07.02.2023: Offenbar wird zumindest unter Windows Server 2022 durch ein Update oder irgendetwas anderes der Wert der “DHCP-Medienerkennung” (DHCP Media Sense) wieder zurückgesetzt (disabled), in Folge erhält der “OpenVPN TAP-Windows6” keine IP-Adresse vom OpenVPN-Server-Dienst (mehr).

Automatisiert prüfen und neu setzen lässt sich das beispielsweise mit einem kleinen Batch-Skript:

@echo offnetsh interface ipv4 show global | find /i "DHCP-Medienerkennung : disabled"if %errorlevel% equ 0 ( netsh interface ipv4 set global dhcpmediasense=enabled)

“OpenVPN Wintun” ist davon offenbar nicht betroffen. Entweder man führt den obigen Befehl erneut aus oder man wechselt, wenn möglich, zu Wintun. Für letzteres reicht es aus folgende Zeile in der Server-Konfiguration einzufügen:

windows-driver wintun

Und das Routing für die Schnittstelle zu aktivieren:

netsh interface ipv4 set int "OpenVPN Wintun" forwarding=enabled

Auf dem Client reicht es aus, OpenVPN mit den Standard-Vorgaben zu installieren und anschließen die Datei

C:\Program Files\OpenVPN\sample-config\client.ovpn

entweder nach

C:\Program Files\OpenVPN\config

oder nach

C:\Users\%username%\OpenVPN\config

zu kopieren. Ans gleiche Ziel müssen zusätzlich noch folgende Dateien kopiert werden:

ca.crtclient.crtclient.keyta.key

Anschließend editiert man die “client.ovpn” und ändert folgendes ab:

remote <IP oder FQDN des OpenVPN-Servers> 1194auth-user-pass

Startet man nun aus der OpenVPN-GUI heraus die Verbindung wird nach dem Benutzernamen und Kennwort gefragt und die Verbindung wird aufgebaut.

Es ist schön zu sehen, das man OpenVPN auch unter Windows als Server zum Laufen bekommt und das XCA nach der ersten Erwähnung in diesem Blog im Jahre 2010 (!) immer noch existiert und weiterentwickelt wird. Nichts destotrotz kann der OpenVPN-Server unter Linux oder BSD besser abgesichert werden, siehe

Hardening OpenVPN Security

Wenn man allerdings keine andere Option hat, als einen OpenVPN-Server unter Windows zu betreiben, ist das ein durchaus gangbarer Weg.

Andy’s Blog – Application VPN mit Stunnel und XCA

OpenVPN – Support Forum – Server 2012 TAP adapter problem acquiring IP

Microsoft – Docs – So deaktivieren Sie die Funktion “Medienübertragung” für TCP/IP in Windows

OpenVPN- Revoking Certificates

Diverse Ergänzungen.

Damit die Prüfung der Zertifikate ob diese evtl. gesperrt sind zuverlässig funktioniert, muss regelmäßig eine neue CRL erzeugt werden. Damit man diesen Vorgang nicht alle 30 Tage manuell vornehmen muss, kann dieser automatisiert werden.

Zuerst muss in XCA bzw. der Datenbank folgende Änderung vorgenommen werden:

Hinweis: Die CLI-Optionen “–no-gui” oder das Äquivalent mittels Variable funktionierten im Test nicht.

Als nächstes benötigt man ein kleines Batch-Skript:

@echo offrem Konfiguration set XCApath=C:\Tools\xca-portable-2.4.0 set DBpath=C:\Data\XCA set DBname=XCA-OpenVPN01.xdb set DBpassword=<Das Datenbank-Kennwort> cd "C:\Program Files\OpenVPN\config-auto"rem Neue CRL erzeugen: "%XCApath%\xca.exe" --database="%DBpath%\%DBname%" --password="%DBpassword%" --crlgen="OpenVPN-CA" --pem > crl.pemrem Den OpenVPN-Dienst neu starten net stop "OpenVPNService" net start "OpenVPNService"

Die “Konfiguration” muss auf die eigene Umgebung angepasst werden!

Dieses Skript lässt man per Aufgabe z.B. monatlich immer am 28. ausführen, denn der Monatserste oder -letzte könnte wegen der vorgegebenen 30 Tagen zu knapp sein.

Wichtig: Hat man Zertifikate gesperrt bzw. zurückgerufen, sollte man gleich um einen etwaigen Missbrauch zu vermeiden eine neue CRL erzeugen!

Zur Info:

Ist eine CRL abgelaufen, wird das im Log des OpenVPN-Servers wie folgt dargestellt:

2022-02-24 10:48:30 <Öffentliche IP-Adresse des Clients>:60821 VERIFY ERROR: depth=0, error=CRL has expired: ...

Also ziemlich eindeutig. Der OpenVPN-Client wiederum kann sich nicht erfolgreich verbinden.

Der Vollständigkeit halber:

In der OpenVPN-Server-Konfiguration kann man

crl-verify OpenVPN-CA-crl.pem

mit einer vorangestellten “#” auskommentieren. Nach einem Dienst-Neustart wird dann überhaupt keine CRL verwendet. Das ist allerdings in Sachen Sicherheit keine all zu gute Idee!

xca – Commandline

xca – Certificate Revocation Lists

OpenVPN-Server unter Windows einrichten – Erste überarbeitete Fassung – Andy's Blog (8)

Andy

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.

Ähnliche Artikel:

  1. OpenVPN Site-to-Site mit pfSense als Server und Securepoint UTM als Client
  2. OpenVPN-Server unter Windows einrichten
  3. Öffentliche IPv4-Adresse an CGN-/DS-Lite-Anschluss mittels vServer und OpenVPN Peer to Peer (SSL/TLS)
  4. Debian, OpenVPN und nftables: Regeln nach Verbindungsaufbau neu laden
OpenVPN-Server unter Windows einrichten – Erste überarbeitete Fassung – Andy's Blog (2024)

References

Top Articles
Latest Posts
Article information

Author: Moshe Kshlerin

Last Updated:

Views: 5683

Rating: 4.7 / 5 (77 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Moshe Kshlerin

Birthday: 1994-01-25

Address: Suite 609 315 Lupita Unions, Ronnieburgh, MI 62697

Phone: +2424755286529

Job: District Education Designer

Hobby: Yoga, Gunsmithing, Singing, 3D printing, Nordic skating, Soapmaking, Juggling

Introduction: My name is Moshe Kshlerin, I am a gleaming, attractive, outstanding, pleasant, delightful, outstanding, famous person who loves writing and wants to share my knowledge and understanding with you.