Meist werden OpenVPN-Server unter Linux oder BSD betrieben, eine Installation unter Windows, um dieses z.B. als Einwahlserver für Roadwarrior verwenden zu können ist ebenfalls möglich.
+++ Dieser Beitrag ist veraltet, eine neuere Version gibt es unter OpenVPN-Server unter Windows einrichten – Erste überarbeitete Fassung +++
Die Nutzung von Windows (Server) als VPN-Server empfehlen wir zudem ausdrücklich nicht!
Dieser Beitrag basiert auf ein Kundenszenario mit Windows Server 2012 Standard und OpenVPN 2.3.6 (Community). Die Roadwarrior verwenden sowohl Zertifikate und Benutzername samt Kennwort zur Anmeldung.
OpenVPN-Server installieren und konfigurieren
Den OpenVPN-Installer herunterladen und vollständig (inkl. “OpenSSL Utilities” und “OpenVPN RSA Certificate Management Scripts”) installieren. Eine Basis-Konfiguration samt Benutzerauthentifizierung kann wie folgt aussehen:
port 1194 proto udp dev tun ca "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\ca.crt" cert "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\server.crt" key "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\server.key" dh "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\dh2048.pem" server 10.0.0.0 255.255.255.0 ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\log\\ipp.txt" push "route 192.168.0.0 255.255.255.0" keepalive 10 120 cipher AES-128-CBC persist-key persist-tun status "C:\\Program Files\\OpenVPN\\log\\openvpn-status.log" verb 3 auth-user-pass-verify "C:\\Program Files\\OpenVPN\\config\\auth.bat" via-env script-security 3
Diese Konfiguration als “C:\Program Files\OpenVPN\config\server.ovpn” abspeichern. Der Inhalt der Datei “auth.bat” sieht so aus:
@echo off set n_user=%username% %password%; find /n "%n_user%" "C:\Program Files\OpenVPN\config\users.txt" >result.txt for /f "skip=1" %%a in (result.txt) do set n=%%a if "%n%"=="----------" exit 1 exit 0
Die Benutzer samt Kennwörter an sich werden wiederum in der Datei “users.txt” verwaltet:
username1 password1; username2 password2; ...
easy-rsa vorbereiten
Sowohl der OpenVPN-Server als auch dessen Clients benötigen Zertifikate, damit sich die Gegenstellen gegenseitig ausweisen können. Zu diesem Zweck wird mittels easy-rsa eine Zertifizierungsstelle angelegt.
Einmalig den Befehl
init-config.bat
ausführen. Um Fehler beim Erzeugen der Schlüssel zu vermeiden, die Datei “vars.bat” editieren und folgende Zeile hinzufügen:
set OPENSSL_CONF=C:\Program Files\OpenVPN\easy-rsa\openssl-1.0.0.cnf
In der gleichen Datei kann man folgende Werte anpassen. Dadurch kann man Eingaben beim Erstellen der Zertifikate einsparen bzw. Vorgaben festlegen:
set KEY_COUNTRY=DE set KEY_PROVINCE=Hessen set KEY_CITY=Frankfurt set KEY_ORG=Test Firma set KEY_EMAIL=info@test-firma.de set KEY_CN=changeme set KEY_NAME=changeme set KEY_OU=Buero set PKCS11_MODULE_PATH=changeme set PKCS11_PIN=1234
Folgende Befehle einmalig ausführen:
vars clean-all
CA erstellen
Folgende Befehle einmalig ausführen:
vars build-ca
DH-Parameter erstellen
Folgende Befehle einmalig ausführen:
vars build-dh
Server-Zertifikat erstellen
Folgende Befehle einmalig ausführen:
vars build-key-server server
Client-Zertifikat erstellen
Diese Befehle sollten in der Anzahl der Roadwarrior bzw. Clients ausgeführt werden. Jedem VPN-Benutzer sollte ein eigenes Zertifikat zugeordnet werden.
vars build-key benutzername
Alle Befehle zu easy-rsa samt Erklärungen in englischer Sprache finden sich in der “README.txt” im “easy-rsa”-Ordner.
OpenVPN-Dienst starten
Nach der Installation ist der OpenVPN-Dienst auf manuellen Start konfiguriert. Möchte man das der Dienst nach einem Neustart des Computers automatisch ausgeführt wird, so muss dies in der Dienstesteuerung von Windows entsprechend geändert werden. Der Dienst wird nach der Installation im übrigen noch nicht ausgeführt. Sobald die Konfiguration durchgeführt wurde, muss der Dienst gestartet werden.
Firewall konfigurieren
Per Standard verwendet OpenVPN den Port 1194/udp. Dieser muss sowohl in der Windows-Firewall als auch, sofern der VPN-Server vom Internet aus erreichbar sein soll, im Router freigegeben bzw. per Portforwarding weitergeleitet werden.
Alternativ kann man in der Windows-Firewall statt des Ports die Datei “C:\Program Files\OpenVPN\bin\openvpn.exe” freigeben.
Das Routing muss stimmen
Das Routing muss nicht nur auf den Clients stimmig sein, damit diese den Weg zum Server und ggf. dem dahinter liegenden LAN finden. Für den Fall das Computer hinter dem Einwahlserver erreicht werden sollen, muss auf dem OpenVPN-Server an sich das Routing zwischen den Netzwerkverbindungen der LAN- und der OpenVPN-Schnittstelle aktiviert sein.
Bis einschließlich Windows XP und Server 2003 war dies nur generell für alle Netzwerkverbindungen über eine entsprechende Änderung in der Registrierung und einem Neustart möglich:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters IPEnableRouter=1
Diese Option funktioniert bislang immer noch, einschließlich Windows Server 2012 R2. Mittlerweile lässt sich das Routing etwas differenzierter und vor allem ohne händische Änderung der Registrierung samt Neustart aktivieren:
netsh interface ipv4 set int "LAN-Verbindung" forwarding=enabled netsh interface ipv4 set int "LAN-Verbindung 2" forwarding=enabled
Da der vorhandene Router beim Kunden kein Setzen einer Route gestattet, wurde auf allem vom VPN aus zu erreichenden Computern eine entsprechende Route gesetzt. Unter Windows sieht der Befehl wie folgt aus:
route add VPN-NETZWERK mask SUBNETZMASKE OPENVPNSERVER -p
Passend zu diesem Beitrag ein Beispiel:
route add 10.0.0.0 mask 255.255.255.0 192.168.0.2 -p
Das IP-Netz 10.0.0.0/24 entspricht dem VPN-Netzwerk, 192.168.0.2 ist die IP-Adresse des OpenVPN-Servers und die Option “-p” sorgt dafür, das die Route permanent gesetzt wird und damit auch nach einem Neustart des Computers zur Verfügung steht.
Windows-Clients
Unter Windows kann man neben dem Projekt-eigenen Client (Bestandteil des Installers) z.B. auch den Securepoint OpenVPN-Client verwenden. Letzterer ist in Sachen Optik weniger kryptisch als das Original. Ferner muss man dort keinen workaround einpflegen, damit es keine Probleme mit der Benutzerkontensteuerung (UAC) oder notwendigen Administrator-Berechtigungen für das Setzen der Route gibt.
Eine grundlegende Konfigurationsdatei kann wie folgt aussehen:
client dev tun proto udp remote OPENVPNSERVER resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client.crt key client.key remote-cert-tls server cipher AES-128-CBC verb 3 auth-user-pass
Diese Datei kann in die Clients zzgl. der Zertifikate “ca.crt”, “client.crt” und “client.key” importiert werden.
Quellen
OpenVPN – Authentifizierung am Server
edoceo – Configuring auth-user-pass-verify
Microsoft – How To Enable TCP/IP Forwarding in Windows 2000
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, danke für die Mühe solch eine Anleitung zu schreiben. Ich bleibe jedoch als Anfänger an dem Punkt hängen, wo Sie “EASY-RSA vorbereiten”
beschreiben. Von da an geht es nicht weiter.
Die batch Dateien finde ich nicht (init-config.bat).
Vielleicht haben Sie eine Tip für mich, wie ich weiterkomme.
Ich habe bei meinem Netzwerk auf Kabelanschluss mit fester IP umgestellt. Vorher hab ich mit dem Routerprojekt FLI4L und einem Telekom DSL mit dynamischer IP und DYNDNS ein funktionierendes OPENVPN gehabt. 2 Laptops (Roadwarrior) konnten auf meinen Windows Server 2003 zugreifen (SMB und Exchange/Outlook). Leider kriege ich den Router FLI4L nicht an das Kabelmodem und auf dem Windows Server kriege ich das OpenVPN nicht zum Laufen.
Vielleicht haben Sie ja einen Tip für mich wie ich weiter komme.
Vielen Dank und Grüße aus Kssel R.Böhm
Bei der Installation von OpenVPN alles auswählen (inkl. “OpenSSL Utilities” und “OpenVPN RSA Certificate Management Scripts”). Der Beitrag wurde entsprechend geändert.
Bei Windows Server 2003 sollte das Skript unter “C:ProgrammeOpenVPNeasy-rsa” zu finden sein.
Alle anderen Pfade im Beitrag muss man entsprechend anpassen.
Erstmal Super Tutorial :).
Beim Eintrag für die Regestry “IPEnableRoute=1” fehlt das r am Ende ansonsten Danke hat mir sehr geholfen 🙂
Danke für den Hinweis, hab’s soeben korrigiert.
Hallo.
Das Tut ist richtig gut – habe eben ein wenig “gespielt” – allerdings kann ich am Client einen beliebigen (auch nicht vorhandenen Benutzernamen – users.txt) und ein Kennwort meiner Wahl eingeben, ich werde mit den Zertifikaten “rein” gelassen…..
Die auth.bat wertet hier nicht richtig aus…..habe eben n ganzes Stück gesucht, aber nichts wirklich gefunden…
Kannst Du mir helfen?!
Danke
Wie sieht denn das Log aus?
Der Beitrag basiert im wesentlichen auf dem OpenVPN-Wiki:
http://wiki.openvpn.eu/index.php/Authentifizierung_am_Server
Dort ist auch noch mal ein anderes Auth-skript hinterlegt. Vielleicht klappts ja damit.
Vermutlich liegt es daran:
In der “auth.bat” in Zeile 3:
find /n “%n_user%” C:Program FilesOpenVPNconfigusers.txt >result.txt
Ändern in:
find /n “%n_user%” “C:Program FilesOpenVPNconfigusers.txt” >result.txt
Danach den OpenVPN-Dienst neu starten (geht vermutlich auch ohne, aber sicher ist sicher).
Ich muss es noch testen und ändere dann den Beitrag. Der Original-Code stammt allerdings aus dem Wiki.
So, getestet, das war’s.
Die Sache ist tückisch. Im Wiki wird ein Pfad verwendet, der keine Leerzeichen enthält. Wenn man allerdings bei einer Windows-Installtion die Standard-Pfade verwendet, dann müssen die Anführungszeichen rein. Beitrag ist entsprechend geändert. Schlichtweg unschön ist, das trotz des Fehlers das Skript (quasi) meldet, das das Benutzer vorhanden ist.
Hi Andy,
die Anleitung ist sehr hilfreich, großes Lob dafür.
Ich habe noch ein anderes Szenario was ich gerne testen würde, auf der OpenVPN Website ist es in der FAQ unter “Configuring client-specific rules and access policies” beschrieben.
Ich bekomme alles soweit konfiguriert scheitere aber bei der iptables Geschichte:
# Employee rule
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.66.4.4 -j ACCEPT
# Sysadmin rule
iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 10.66.4.0/24 -j ACCEPT
# Contractor rule
iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT
Klar iptables gibt’s unter Windows Server 2012 nicht, soweit ist mir das bekannt, aber wie kann ich diese Sache unter Windows Server 2012 konfigurieren, damit mein Szenario funktioniert ? Hast du da einen Tipp für mich?
Grüße,
Patrick
Verstehe ich das richtig, das nur bestimmte IP-Netze und entsprechend dem Quellnetz nur bestimmte Ziele zugelassen werden sollen?
Das kommt dann darauf an, welche Firewall unter Windows installiert ist (Bordmittel oder Dritt-Produkt).
Ich versuche alles soweit möglich mit Bordmitteln zu machen, klar OpenVPN tanzt hier aus der Reihe. Ist das mit den Bordmitteln denn überhaupt denkbar und möglich?
Ich möchte einen OpenVPN Server, der über Port 443 zu erreichen ist und anhand der client Konfiguration im ccd Ordner dem Client eine entsprechende IP im bestimmten Subnetz gibt. Die Subnetze können nicht untereinander kommunizieren, nur der Administrator soll auf alle clients in allen Subnetzen zugreifen können.
z.B. (pseudohaft ausgedrück:)
Server (IP: 10.8.0.1/255.255.255.0)
Client 1: 10.8.1.1/255.255.255.0
Client 2: 10.8.1.2/255.255.255.0
Client 3: 10.8.2.1/255.255.255.0
Client 4: 10.8.2.2/255.255.255.0
Admin 1: 10.8.0.2/255.255.255.0
Admin 2: 10.8.0.3/255.255.255.0
Client 1 und Client 2 können kommunizieren, Client 3 und Client 4 können kommunizieren. Client 1/2 kann nicht mit Client3/4 kommunizieren. Admin 1 und Admin 2 können mit allen kommunizieren.
Via OpenVPN kann man den Client entsprechende IP-Konfigs mitgeben.
In wie weit die Windows-Firewall mitspielt, ist ein anderes Thema.
Grundsätzlich müsste man die Interfaces in die jeweilige Netzwerkkategorie von Windows “packen”. D.h.:
LAN = Domain bzw. Private, je nachdem ob sich die Maschine in einem Domänen-Netzwerk befindet oder in einer Arbeitsgruppe bzw. Stand-alone.
OpenVPN = Public
Dann könnte man für Public regeln, welche Netzwerke eingehend überhaupt zugelassen sind.
Die Default Rules müsste man zumindest mal prüfen und ggf. ändern oder deaktivieren.
Bei komplexeren Szenarien ziehe ich persönlich es vor, sowas z.B. mit pfSense oder Securepoint UTM abzubilden, da die Konfiguration mittels GUI (imho) einfacher ist.
Allerdings möchte ich nicht ausschließen, das es mit Windows und der dortigen Firewall ebenfalls machbar ist.
Müsste man mal testen.
Hi,
danke für die Einschätzung, ich werde versuchen das unter Windows 2012 ans laufen zu bekommen und mich dann nochmal melden ob und wie es klappt.
Grüße,
Patrick
Hallo,
erst mal muss ich sagen, eine echt gute Anleitung.
Ich habe folgendes Problem, bei einem Kunden von mir steht ein Windows Server 2012 R2, läuft als DC. Auf den soll von anderen Stellen wiederum zugegriffen werden. Also hab ich nach Anleitung OpenVPN sowohl auf dem Server als auch auf den Clients installiert, die Ports an allen Firewalls freigegeben, aber ich bekomme immer ein TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity), obwohl Netzwerk ja da ist. Wo liegt mein Fehler? Vielen Dank schon mal für eine Antwort…
MfG
Das kann eine Menge Ursachen haben (tcp/udp verwechselt, Port-Forwarding fehlt [sofern notwendig], Firewall-Ports oder Daemons/Exe gesperrt, Fehler in der Server- oder Client-Konfig., …).
TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Was steht den in den Logs (Server als auch Client)?
Evtl. mal mit Wireshark, SmartSniff und co. schauen, ob überhaupt vom Client eine Anfrage beim Server ankommt.
Vielen vielen Dank für den hilfreichen Beitrag ! Wirklich super Anleitung. Frage zum Sicherheitsaspekt: Gibt es triftige Gründe, rein aus der Sicherheitsbetrachtung heraus, einen Linux Server mit Openvpn einem Windows Server mit Openvpn vorzuziehen ?
Also ich bin kein Sicherheitsexperte, aber spontan fällt mir dazu das Thema Firewall ein. Unter Windows sind die Bordmittel recht begrenzt bzw. man kann nur durch Tricks/workarounds das VPN-Interface reglementieren. Unter Linux oder BSD hat man da einfach mehr bzw. bessere Möglichkeiten. Einfacher geht’s imho wenn man fertige Distributionen wie z.B. pfSense verwendet.
danke Andy,
hat super funktioniert: die CIA hat unsere Firewalll nur zu 40% gehackt!
Hi,
scheitere an Punkt 1:
Diese Konfiguration als “C:Program FilesOpenVPNconfigserver.ovpn” abspeichern.
In diesem Ordner hab ich keine Schreibrechte. Ich kann lediglich einen Ordner erstellen.
Dateien im Programme-Ordner können nur mit erhöhten Rechten bearbeitet werden. Mit unter am einfachsten ist es, Notepad oder welchen Editor man auch immer verwendet nach einem Rechtsklick mit “Als Administrator ausführen” zu starten und dann die entsprechenden Datei(en) zu erstellen, zu öffnen oder zu speichern.
Hi,
2. Hürde, init-config.bat gibt es nicht
Hätten Sie zufällig auch eine Anleitung für OpenVPN 2.5.1 ? VG.
Der Beitrag ist sechs Jahre alt, gut möglich das sich in dieser Zeit etwas geändert hat.
Nein.
Ach, schood. OK, trotzdem Danke, vG.
Es hat sich doch was ergeben, hier gibt’s eine überarbeitete Fassung:
OpenVPN-Server unter Windows einrichten – Erste überarbeitete Fassung