Mini-HOWTO für OpenVPN mit FLI4L

Bitte beachten: seit Mai 2014 verwende ich FLI4L nicht mehr. Die folgenden Informationen werden nur zu Archivzwecken aufbewahrt.

Das OpenVPN-Paket stellt die Ablösung für frühere VPN-Lösungen bei FLI4L, wie z.B. OPT_VPND oder OPT_CIPE dar.

Der größte Vorteil von OpenVPN ist die Verfügbarkeit für nahezu alle wichtigen Plattformen, wie Linux und Windows aber auch MacOS und die sehr weitreichenden Konfigurationsmöglichkeiten. Client-Software findet man auf http://openvpn.net/.

OpenVPN als „Road Warrior“ (Tunnel)

Bei einer „Road Warrior“-Konfiguration bietet der Router einem oder mehreren Clients mit OpenVPN Zugriff auf das LAN des Routers. Damit wird eine ähnliche Lösung erreicht, wie beim Einsatz von OPT_VPND unter FLI4L 2.0.8. Der Unterschied zu OPT_VPND besteht darin, dass der Client keine IP-Adresse aus dem LAN erhält und dass der Internet-Traffic des Client nicht automatisch über den Router geleitet wird, sondern nur die Pakete, die für das LAN des Routers bestimmt sind. Auch ist auf Client-Seite ein zusätzliches Stück Software nötig, die erst ab Windows 2000 oder XP nutzbar ist. Wer noch Windows 98 mit PPTP genutzt hat, muss auf eine neuere Windows-Version umstellen (was aber auch aus anderen Gründen sinnvoll ist).

In dieser Konstellation sehen sich die Clients untereinander nicht zwangsläufig. Wer so etwas braucht, z.B. für Spiele, sollte sich die Bridge-Konfiguration von Andreas Winkler weiter unten ansehen.

Erfolgreich getestet habe ich es mit FLI4L 2.1.9 mit Patch 6 und OpenVPN 2.0 rc18 und OpenVPN 2.0 rc21 inklusive GUI 1.0 rc5 unter Windows 2000 und Windows XP. Das Ganze funktioniert aber auch mit FLI4L 3.0.0 und FLI4L 3.2.0 (siehe dazu auch die Anmerkungen am Ende).

Konfiguration von OpenVPN auf dem Router

Die Konfiguration auf dem Router wird in der Datei openvpn.txt vorgenommen. Dort sind folgende Einträge vorzunehmen:

OPT_OPENVPN='yes'
OPENVPN_FEATURES='std'

OPENVPN_N='2'                         # Anzahl der Clients - hier zwei

# Konfiguration des ersten Client

OPENVPN_1_NAME='client1'              # Name des Clients
OPENVPN_1_LOCAL_PORT='10020'          # Eingehender Port fuer die Verbindung
OPENVPN_1_SECRET='client1.secret'     # Key-Datei des Clients
OPENVPN_1_TYPE='tunnel'
OPENVPN_1_REMOTE_VPN_IP='10.0.0.2'    # Client-IP-Adresse
OPENVPN_1_LOCAL_VPN_IP='10.0.0.1'     # Server-IP-Adresse
OPENVPN_1_ROUTE_N='0'
OPENVPN_1_INPUT_LIST_N='1'
OPENVPN_1_INPUT_LIST_1='ACCEPT'
OPENVPN_1_FORWARD_LIST_N='1'
OPENVPN_1_FORWARD_LIST_1='IP_NET_1 ACCEPT BIDIRECTIONAL'

# Konfiguration des zweiten Client

OPENVPN_2_NAME='client2'              # Name des Clients
OPENVPN_2_LOCAL_PORT='10021'          # Eingehender Port fuer die Verbindung
OPENVPN_2_SECRET='client2.secret'     # Key-Datei des Clients
OPENVPN_2_TYPE='tunnel'
OPENVPN_2_REMOTE_VPN_IP='10.0.0.6'    # Client-IP-Adresse
OPENVPN_2_LOCAL_VPN_IP='10.0.0.5'     # Server-IP-Adresse
OPENVPN_2_ROUTE_N='0'
OPENVPN_2_INPUT_LIST_N='1'
OPENVPN_2_INPUT_LIST_1='ACCEPT'
OPENVPN_2_FORWARD_LIST_N='1'
OPENVPN_2_FORWARD_LIST_1='IP_NET_1 ACCEPT BIDIRECTIONAL'

Wichtig: Jeder Client benötigt einen eigenen Abschnitt in der Konfiguration sowie einen eigenen „Einwahl-Port“. Statt der Port-Nummern 10020 oder 10021 kann man auch beliebige, andere Ports verwenden. Man muss aber darauf achten, dass nicht Ports existierender Dienste verwendet werden – daher sind Nummern über 10000 sinnvoll, da alle FLI4L-eigenen Dienste unterhalb von 10000 laufen.

Die IP-Adressen für Server und Client (10.0.0.1, 10.0.0.2 und 10.0.0.5, 10.0.0.6) müssen bestimmte Bedingungen erfüllen:

  1. Sie dürfen nicht im LAN vorhanden sein – weder auf Seite des FLI4L noch auf Seite des Clients.
  2. Es müssen „private“ Adressen sein (192.168.*.* oder 10.*.*.*)
  3. Sie müssen unter Windows aus einem 255.255.255.252-Subnetz kommen, womit nur folgende Kombinationen entsprechend der nachfolgenden Liste zulässig sind
[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]

Diese Liste kann übrigens auch mit der Befehlszeile

openvpn --show-valid-subnets

unter Windows abgefragt werden, nachdem man OpenVPN installiert hat.

Statt „client1“ und „client2“ kann man natürlich aussagekräftigere Namen verwenden, damit man später noch weiss, für wen die Verbindungen definiert wurden.

Die Dateien client1.secret und client2.secret enthalten den Schlüssel für die Verbindung und müssen vor einer Aktualisierung von FLI4L vom Client noch erzeugt werden und sollte ebenfalls passend benannt werden – siehe auch „Erzeugen der Key-Datei“ weiter unten.

Konfiguration des jeweiligen Clients

Auf dem Client ist OpenVPN separat zu installieren – entsprechende Software ist nicht Teil von FLI4L. Ich habe das hier gezeigte Beispiel mit OpenVPN 2.0 rc21 und OpenVPN 2.0 rc18 mit GUI 1.0 rc5 erfolgreich getestet. Siehe dazu http://www.openvpn.org bzw. http://openvpn.se. Des weiteren gehe ich von einer Windows-Installation aus.

„Getrennte“ Netzverbindung im Systray?

Nach der Installation von OpenVPN erscheint im Systray ein zusätzliches Symbol für eine „getrennte“ Netzverbindung. Das ist kein Problem – es handelt es sich nur um die virtuelle Netzwerkverbindung, die später vom OpenVPN-Client verwendet wird. Man darf sie auch nicht löschen, da sonst kein Verbindungsaufbau möglich ist.

Eine Lösung, um die Anzeige der Netzwerkverbindung zu vermeiden ist, den Treiber „unsichtbar“ zu installieren (die Version mit GUI von http://openvpn.se bietet dies optional bei der Installation an). Dazu ist die Textdatei OemWin2k.inf im drivers-Verzeichnis von OpenVPN wie folgt anzupassen – man ändert die Vorgabe für „Characteristics“ im Abschnitt [tap0801.ndi] von 0x81 auf 0x89:

[tap0801.ndi]
   CopyFiles       = tap0801.driver, tap0801.files
   AddReg          = tap0801.reg
   AddReg          = tap0801.params.reg
   Characteristics = 0x89

Zur Erläuterung: der Wert für „Characteristics“ ist normalerweise 0x81. Durch setzen des Flags 0x08 (NCF_HIDDEN) wird dafür gesorgt, dass der Treiber weder im Gerätemanager noch unter den Netzwerkverbindungen erscheint. Das bedeutet aber auch, dass man diese Treiber nur noch mit den entsprechenden Tools von OpenVPN selber entfernen kann und nicht mehr im Windows-Gerätemanager.

Möchte man nachträglich eine Verbindung „verstecken“, muss man die vorhandenen Treiber zuerst löschen („Delete ALL TAP-Win32 virtual ethernet adapters“ im Startmenü), danach die oben genannten Änderungen vornehmen und schliesslich den Treiber wieder einrichten („Add a new TAP-Win32 virtual ethernet adapter“ im Startmenü).

Erzeugen der Key-Datei

Nach der Installation von OpenVPN findet man im Startmenü einen neuen Eintrag „OpenVPN“. Darin ist u.A. auch „Generate a static OpenVPN key“ enthalten.

Mit diesem Menüpunkt kann ein statischer Schlüssel für den Client erzeugt werden. Nachdem der Menüpunkt aufgerufen wurde, sollte ein Konsolefenster geöffnet werden und etwa folgende Meldung erscheinen:

Randomly generated 2048 bit key written to C:\Programme\OpenVPN\config\key.txt

Diese Datei sollte jetzt umbenannt werden (entsprechend dem Beispiel wäre das client1.secret oder client2.secret), damit sie einem späteren Aufruf dieses Menüpunkts nicht unbeabsichtigt überschrieben wird. Eine Kopie davon wird auch für FLI4L benötigt und muss nach /config/etc/openvpn kopiert werden, wobei man ggf. openvpn noch anlegen muss – d.h. wenn FLI4L z.B. auf C:\fli4l liegt, dann wäre das C:\fli4l\config\etc\openvpn.

Auf Client-Seite bleibt die Datei im config-Verzeichnis von OpenVPN.

Konfiguration für die Verbindung

Für die Verbindung ist eine Textdatei mit der Endung .ovpn (z.B. client.ovpn) folgenden Daten im config-Verzeichnis von OpenVPN anzulegen – hier nur beispielhaft für den ersten Client, beim zweiten läuft es analog dazu – nur dass die IP-Adressen, Einwahlport und die „secret“-Datei entsprechend angepasst werden müssen:

remote meine.dyndns.domain
rport 10020
secret client1.secret
dev tun
ifconfig 10.0.0.2 10.0.0.1
route 192.168.1.0 255.255.255.0
comp-lzo
persist-tun
persist-key
ping-timer-rem
ping-restart 60
proto udp
tun-mtu 1500
fragment 1300
mssfix

Unter remote ist die Adresse des Routers anzugeben. Es ist daher sinnvoll, einen Dienst, wie DynDNS o.Ä. zu verwenden, damit der Router unter einem Domain-Namen erreichbar ist.

rport gibt die Port-Nummer an, unter der Router reagiert.

Bei ifconfig sind die gleichen Adressen anzugeben werden, wie in der OpenVPN-Konfiguration auf dem Router (in der Reihenfolge Client-IP und dann Server-IP), sowie unter route das LAN des Routers.

Zusätzlich können noch bei Bedarf weitere Optionen hier eingetragen werden. Genaueres dazu, siehe auch in der Dokumentation von OpenVPN.

Schliesslich ist noch zu beachten, dass die Key-Datei client.secret vorhanden ist und sowohl auf dem Client als auch auf dem Router benötigt wird.

Freigabe des Ports auf dem Router für eingehende Verbindungen

Normalerweise müssen die Ports für den OpenVPN-Server nicht manuell freigegeben werden, da dies automatisch geschieht (wenn dies nicht gewünscht ist, kann man es mit OPENVPN_DEFAULT_OPEN_OVPNPORT='no‚ in der OpenVPN-Konfiguration unterbinden).

Falls man OPENVPN_DEFAULT_OPEN_OVPNPORT='no‚ eingetragen hat, muss man für die Verbindungen, die von außen erreichbar sein sollen, entsprechende Regeln in der Grundkonfiguration von FLI4L ergänzen:

INPUT_LIST_N='2'

INPUT_LIST_1='10020 ACCEPT'
INPUT_LIST_2='10021 ACCEPT'

Hat man bereits andere INPUT-Regeln definiert, sind die Nummern natürlich entsprechend anzupassen.

Verbindungsaufbau auf dem Client

Für den Aufbau einer OpenVPN-Verbindung gibt es mehrere Möglichkeiten:

Variante 1: Kontextmenu im Windows-Explorer

Im Windows-Explorer die Konfigurationsdatei mit der rechten Maustaste anklicken und im Kontextmenü „Start OpenVPN on this config file“ auswählen. Es wird dann ein Konsolefenster geöffnet, in dem OpenVPN Statusmeldungen ausgibt.

Zum Beenden der Verbindung genügt es, in dem aktiven Konsolefenster F4 zu drücken (nicht Alt-F4, sondern F4 alleine!).

Variante 2: Script

Man legt sich ein CMD-Script an (z.B. vpnconnect.cmd) mit folgenden Befehlen:

c:
cd \Programme\OpenVPN\config
c:\Programme\OpenVPN\bin\openvpn.exe --pause-exit --config client.ovpn

Die Angaben von Verzeichnissen und Dateien sind ggf. an die eigene Installation anzupassen. Wird das Script gestartet, passiert dasselbe, wie beim Öffnen der Verbindung über das Kontextmenü.

Variante 3: OpenVPN-GUI

Wen das Konsolefenster von OpenVPN stört, kann optional unter Windows ein zusätzliches Tool installieren – das OpenVPN-GUI (siehe auch http://openvpn.se). Dieses Tool ist mittlerweile in Windows-Version von OpenVPN enthalten. Wenn man nur das GUI alleine heruntergeladen hat, genügt es, das Programm in das bin-Verzeichnis von OpenVPN zu kopieren.

Das GUI stellt ein Icon im Systray bereit, mit dem man per Mausklick Verbindungen aufbauen und trennen kann.

Verbindung klappt, aber die Datenübertragung nicht?

Eine wichtige Vorraussetzung für das Funktionieren einer VPN-Verbindung ist, dass die Netzwerke vom Client und FLI4L unterschiedliche Adressbereiche haben!

Beispiel: FLI4L ist für ein Netz für den Adressbereich 192.168.0.0-192.168.0.255 konfiguriert. Wenn sich nun ein Client über OpenVPN verbindet, darf dessen lokales Netz nicht ebenfalls 196.168.0.0-192.168.0.255 belegen, da sonst beim Client nicht eindeutig geregelt ist, welche Pakete für das eigene Netz bestimmt sind, und welche Pakete über die OpenVPN-Verbindung geschickt werden müssen. Damit ist nicht das „VPN-Subnetz“ aus dem Beispiel gemeint (Client-Adresse 10.0.0.2, Server-Adresse 10.0.0.1), sondern die beiden lokalen Netze von Client und FLI4L.

Verbindung klappt, aber Zugriff auf Windows-Freigaben im Zielnetz nicht?

Generell: Die „Windows Netzwerkumgebung“ funktioniert über einen OpenVPN-Tunnel grundsätzlich nicht – man muss über UNC-Pfade zugreifen bzw. die Freigaben als Netzlaufwerke verbinden.

Wurde versucht, über den Rechernamen (\\pcname\data) zuzugreifen? Das klappt nicht, weil für die Namensauflösung Broadcasts verwendet werden, die durch den Tunnel nicht übertragen werden. Man muss entweder die IP-Adresse angeben, z.B. \\192.168.3.1\data, oder eine Bridge statt einem Tunnel verwenden.

Wurde an den Zielrechnern evtl. die Windows-Firewall eingeschaltet? Dann entweder ausschalten oder eine Ausnahme für den Zugriff von außen eintragen.

Bridge-Konfiguration

Andreas Winkler schlägt folgende Konfiguration für den Einsatz als Bridge vor. Diese Konfiguration eignet sich auch gut für Spiele. Alle übrigen Dinge (Erzeugen der Secret-Datei, Auswahl der IP-Adressen etc.) siehe oben.

Konfiguration auf dem Router

Es ist notwendig, advanced_networking zu installieren mit folgender Konfiguration in der Datei advanced_networking.txt:

OPT_BRIDGE_DEV='yes'
BRIDGE_DEV_N='1'
BRIDGE_DEV_BOOTDELAY='no'

BRIDGE_DEV_1_NAME='root_bridge' # Name ist frei wählbar
BRIDGE_DEV_1_DEVNAME='br0'
BRIDGE_DEV_1_DEV_N='1'
BRIDGE_DEV_1_DEV_1_DEV='eth0' # das Device welches in's Internet geht

Des weiteren muss noch folgende Ergänzung in der Datei base.txt vorgenommen werden:

IP_NET_1_DEV='br0' # Name muss von zu br0 für erste Brücke geändert werden

Der DHCP sollte entsprechend konfiguriert werden, denn aus diesem Pool werden die VPN-Clients bedient. Wünscht man dies nicht so kann man auch feste IP’s vergeben.

Die Konfiguration auf dem Router wird in der Datei openvpn.txt vorgenommen. Dort sind folgende Einträge vorzunehmen – hier etwa für drei Clients (bei mehr Clients entsprechend erweitern und wie beim Tunnel für jeden Client ein eigener Port):

OPT_OPENVPN='yes'
OPENVPN_FEATURES='std'
OPENVPN_WEBGUI='yes'

OPENVPN_N='3'                      # Anzahl der Clients

OPENVPN_1_NAME='client1'           # Name des ersten Clients
OPENVPN_1_LOCAL_PORT='10020'       # Port für eingehende Verbindung
OPENVPN_1_SECRET='client1.secret'  # Name der Secret-Datei des Clients
OPENVPN_1_TYPE='bridge'            # Betriebsart: Bridge
OPENVPN_1_BRIDGE='root_bridge'     # Name der Bridge, wie in BRIDGE_DEV_1_NAME
OPENVPN_1_COMPRESS='yes'           # Datenübertragung komprimieren

OPENVPN_2_NAME='client2'
OPENVPN_2_LOCAL_PORT='10021'
OPENVPN_2_SECRET='client2.secret'
OPENVPN_2_TYPE='bridge'
OPENVPN_2_BRIDGE='root_bridge'
OPENVPN_2_COMPRESS='yes'

OPENVPN_3_NAME='client3'
OPENVPN_3_LOCAL_PORT='10023'
OPENVPN_3_SECRET='client3.secret'
OPENVPN_3_TYPE='bridge'
OPENVPN_3_BRIDGE='root_bridge'
OPENVPN_3_COMPRESS='yes'

Konfiguration des Clients

Für die Verbindung ist eine Textdatei mit der Endung .ovpn (z.B. client.ovpn) mit folgenden Daten im config-Verzeichnis von OpenVPN anzulegen, wobei die Angabe der Portnummer für jeden Client entsprechend der Einstellung im Router vorgenommen wird:

remote meine.dyndns.domain
port 10021
secret client1.secret
dev tap
ping 60
ping-restart 180
proto udp
fragment 1300
mssfix
mute 50
verb 4
nobind
comp-lzo
float

Änderungen ab FLI4L 3.2.0

Bei FLI4L 3.2.0 wurde die Benennung der Paketfilterregeln geändert. Daher sind die Abschnitte bzgl. INPUT- und FORWARD-Regeln dort anders anzugeben. Statt INPUT_LIST heisst es nun PF_INPUT und analog dazu statt FORWARD_LIST nun PF_FORWARD:

OPENVPN_1_PF_INPUT_N='1'
OPENVPN_1_PF_INPUT_1='ACCEPT'
OPENVPN_1_PF_FORWARD_N='1'
OPENVPN_1_PF_FORWARD_1='IP_NET_1 ACCEPT BIDIRECTIONAL'

OPENVPN_2_PF_INPUT_N='1'
OPENVPN_2_PF_INPUT_1='ACCEPT'
OPENVPN_2_PF_FORWARD_N='1'
OPENVPN_2_PF_FORWARD_1='IP_NET_1 ACCEPT BIDIRECTIONAL'

PF_INPUT_N='2'

PF_INPUT_1='10020 ACCEPT'
PF_INPUT_2='10021 ACCEPT'

Weiterführende Informationen

Android und OpenVPN