OpenVPN-Server unter Windows einrichten

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 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 – Easy Windows Guide

OpenVPN – Erster Tunnel

OpenVPN – Authentifizierung am Server

edoceo – Configuring auth-user-pass-verify

Microsoft – How To Enable TCP/IP Forwarding in Windows 2000

18 Kommentare

  • 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!

Schreibe einen Kommentar

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