OpenVPN Server unter MikroTik RouterOS einrichten

Wie du unter MikroTik RouterOS einen OpenVPN Server einrichtest, um von unterwegs Zugriff auf dein Netzwerk zu bekommen

Durch Home-Office und mobiles Arbeiten wird der Zugriff aufs Unternehmensnetzwerk von unterwegs immer wichtiger. Zum Einsatz kommt dafür in der Regel ein so genanntes Virtual Private Network, kurz VPN genannt. Es erlaubt den sicheren Zugriff von mobilen Geräte wie Laptops, Handys und Tablets, geschützt durch Benutzername, Passwort und Zertifikat.

Dafür existieren verschiedene Verfahren wie IPSec, SSTP oder OpenVPN, die je nach Anwendungsszenario ihre spezifischen Vor- und Nachteile haben. OpenVPN-Clients existieren für alle gängigen Betriebssysteme wie Windows, Linux und macOS, die Serverkomponente steht unter anderem für Linux zur Verfügung. Auch MikroTik RouterOS bietet Unterstützung für OpenVPN als Client und Server an, wenngleich auch mit einigen Einschränkungen (beispielsweise fehlt derzeit der UDP-Support).

OpenVPN Server unter RouterOS
OpenVPN Server unter RouterOS

Der folgende Beitrag zeigt die Installation und Konfiguration der Serverkomponente.

Erstellen der Zertifikate

Der OpenVPN-Zugang ist nicht nur mit Benutzername und Passwort geschützt, sondern arbeitet zudem mit Zertifikaten – für eine erfolgreiche Anmeldung werden alle drei Komponenten benötigt. Ähnlich wie schon in Teil 2 meiner Einsteigerserie beschrieben, erstellen wir die Zertifikate direkt im System. Wer für die Zertifikatsverwaltung eine eigene Lösung einsetzt, kann selbstverständlich auch hierauf zurückgreifen

Zunächst legen wir sowohl die Zertifizierungsstelle (“VPN CA”), das Zertifikat für den OpenVPN-Server (“VPN Server”) und ein individuelles Benutzerzertifikat für einen Beispielbenutzer (“VPN User maxmuster”) an. Als Gültigkeitszeitraum wählen wir zehn Jahre, als Schlüssellänge 4096 Bit, lediglich der Common Name sollte an die eigenen Adressen angepasst werden:

/certificate add name="VPN CA" common-name=vpn.domain.tld days-valid=3650 key-size=4096 key-usage=crl-sign,key-cert-sign
/certificate add name="VPN Server" common-name=vpn.domain.tld days-valid=3650 key-size=4096 key-usage=digital-signature,key-encipherment,tls-server
/certificate add name="VPN User maxmuster" common-name=maxmuster@vpn.domain.tld days-valid=3650 key-size=4096 key-usage=tls-client

Im nächsten Schritt signieren wir alle Zertifikate mit der soeben erstellten Zertifizierungsstelle, denn der OpenVPN-Server prüft beim Verbindungsaufbau den korrekten Herausgeber:

/certificate sign "VPN CA" name="VPN CA"
/certificate sign "VPN Server" name="VPN Server" ca="VPN CA"
/certificate sign "VPN User maxmuster" name="VPN User maxmuster" ca="VPN CA"

Export der Zertifikate

Im Anschluss exportieren wir das öffentliche Zertifikat der Zertifizierungsstelle sowie Zertifikat und privaten Schlüssel des angelegten Benutzers, um sie später auf den Client zu kopieren. Letzteres erreichen wir dadurch, dass wir eine (im Beispiel unsichere) Passphrase angeben, denn dann speichert RouterOS auch den privaten Teil des Zertifikats in der Datei:

/certificate export-certificate "VPN CA" export-passphrase=""
/certificate export-certificate "VPN User maxmuster" export-passphrase=12345678

Anlegen des IP-Pools

Die OpenVPN-Verbindungen sind in unserem Beispiel geroutet, erhalten also ähnlich wie die Clients im lokalen Netzwerk eine IP-Adresse, die Verbindungen werden von der Firewall gefiltert. Dazu definieren wir ein vom Hauptnetzwerk unabhängiges IP-Segment, ähnlich wie in Teil 5 meiner Einsteigerserie für die Einrichtung des DHCP-Servers beschrieben.

Hier ist etwas Fingerspitzengefühl gefragt, denn der OpenVPN-Client muss wissen, welche Pakete ins lokale Netzwerk (z.B. das Home-Office) gehören und welche zum VPN geschickt werden müssen. Es empfiehlt sich daher, für das VPN und das eigentliche Büronetzwerk einen IP-Bereich zu wählen, der sonst nirgendwo anders zum Einsatz kommt. Adressen wie 192.168.0.x, 192.168.1.x, 192.168.10.x, 192.168.100.x, 192.168.178.x und ähnliche sollten daher vermieden werden. Im Beispiel legen wir mittels

/ip pool add name="pool-vpn" ranges=192.168.123.100-192.168.123.199

einen IP-Pool im Bereich 192.168.100-192.168.123.199 an, der für die Adressvergabe an die OpenVPN-Clients genutzt wird.

Konfiguration des OpenVPN-Profils

Weiterhin erforderlich ist ein so genanntes PPP-Profil, das grundlegende Einstellungen der Verbindung regelt. Wir legen es mittels

/ppp profile add name=vpn use-encryption=required local-address=192.168.123.254 dns-server=192.168.123.254 remote-address=pool-vpn use-compression=no

an und legen damit gleichzeitig den lokalen VPN-Endpunkt auf die Adresse 192.168.123.254 fest – diese wird bei einer eingehenden OpenVPN-Verbindung von RouterOS dynamisch angelegt. Auf dieser Adresse steht dann bei entsprechender Konfiguration auch ein DNS-Server zur Verfügung, den wir ebenfalls an die Clients übermitteln – hier lässt sich aber beispielsweise auch ein separater DNS-Server im Unternehmen benennen, sofern dieser über die VPN-Verbindung erreichbar ist.

Anlegen der OpenVPN-Benutzer

Im nächsten Schritt erstellen wir nun für jeden einzelnen Nutzer ein so genanntes PPP-Secret, das auch das Passwort enthält. Zum Verbindungsaufbau werden eine gültige Kombination aus Benutzername und Passwort sowie ein beliebiges Zertifikat benötigt, das von der Zertifizierungsstelle unterschrieben wurde – eine direkte Verbindung zwischen Nutzer und Zertifikat gibt es also nicht.

Mit dem PPP-Profil lassen sich theoretisch auch weitere Dienste wie IPSec, PPPoE oder L2TP nutzen, wir beschränken den Benutzer durch die Angabe des Services auf den OpenVPN-Dienst:

/ppp secret add name=maxmuster profile=vpn password=vpn-PASSWORT_123 service=ovpn

Wichtig: Es sollte hier explizit ein Passwort verwendet werden, das an keiner anderen Stelle genutzt wird – beim Export der Konfiguration zeigt RouterOS diese Kennwörter im Klartext an!

Aktivierung des OpenVN-Servers

Jetzt aktivieren wir den OpenVPN-Server, hinterlegen das einschlägige PPP-Profil und die zu nutzende Zertifizierungsstelle, erzwingen die Nutzung von Zertifikaten und wählen die unter RouterOS höchstmögliche Verschlüsselungsstärke aus:

/interface ovpn-server server set default-profile=vpn certificate="VPN Server" require-client-certificate=yes auth=sha1 cipher=aes256 enabled=yes

Konfiguration der Firewall

Um die OpenVPN-Verbindung zu nutzen, muss in einem letzten Schritt die Firewall für eingehende Verbindungen auf TCP-Port 1194 geöffnet werden:

/ip firewall filter add action=accept chain=input comment="accept OpenVPN" dst-port=1194 protocol=tcp place-before=[find chain="input" comment="accept SSH"]
/ipv6 firewall filter add action=accept chain=input comment="accept OpenVPN" dst-port=1194 protocol=tcp place-before=[find chain="input" comment="accept SSH"]

Die vorstehende, rudimentäre Beispielkonfiguration hängt maßgeblich von der eigenen Firewall ab und sollte daher keinesfalls einfach ungesehen am eigenen System genutzt werden!

Je nach Konfiguration muss auch noch das Routing bzw. die Weiterleitung ins eigene Netz explizit erlaubt werden, beispielsweise mit

/ip firewall filter add action=accept chain=input comment="accept OVPN->LAN" dst-address=192.168.0.0/16 src-address=192.168.123.0/24 place-before=[find chain="input" comment="accept SSH"]
/ip firewall filter add action=accept chain=forward comment="accept OVPN->LAN" dst-address=192.168.0.0/16 src-address=192.168.123.0/24 place-before=[find chain="forward" comment="drop"]

Auch hier gilt wieder, dass die vorstehende, rudimentäre Beispielkonfiguration maßgeblich von der eigenen Firewall abhängt und daher keinesfalls einfach ungesehen am eigenen System genutzt werden sollte!

Download der Client-Zertifikate

Nun geht es an die Konfiguration des Clients, auf den wir zunächst die vorher erzeugten Zertifikate herunterladen und umbenennen, beispielsweise mit

mkdir -p ~/vpnbuero
cd ~/vpnbuero
scp user@router:/"cert_export_VPN CA.crt" ./
scp user@router:/"cert_export_VPN User maxmuster.crt" ./
scp user@router:/"cert_export_VPN User maxmuster.key" ./
mv "cert_export_VPN CA.crt" ca.crt
mv "cert_export_VPN User maxmuster.crt" client.crt
mv "cert_export_VPN User maxmuster.key" client.key

Der private Schlüssel des Client-Zertifikats ist verschlüsselt, was aber nicht von jedem OpenVPN-Client unterstützt wird. Wir unterschlüsseln das Keyfile daher mittels

openssl rsa -in client.key -out client.key

wobei wir zur Eingabe der vorher festgelegten Passphrase (12345678) aufgefordert werden. Anschließend ist der private Schlüssel ohne Passphrase und sollte entsprechend sicher verwahrt werden.

Am Router selbst löschen wir nun die exportieren Dateien mittels

/file remove "cert_export_VPN CA.crt"
/file remove "cert_export_VPN User maxmuster.crt"
/file remove "cert_export_VPN User maxmuster.key"

Konfiguration des OpenVPN-Clients

Im letzten Schritt steht nun die Einrichtung des OpenVPN-Clients an. Je nach Software erfolgt die Konfiguration per grafischer Oberfläche oder klassisch per Konfigurationsdatei. Folgendes Muster, das unbedingt an die eigenen Bedürfnisse angepasst werden sollte, baut eine geroutete OpenVPN-Verbindung zu vpn.domain.tld auf TCP-Port 1194 auf, nutzt zur Authentifizierung die vorher exportierten Zertifikate, wählt die passende Verschlüsselung aus und weist den Client an, das gesamte Subnetz 192.168.234.0/255.255.255.0 bzw. /24 durch die VPN-Verbindung zu tunneln:

dev tun
proto tcp-client
remote vpn.domain.tld 1194
resolv-retry infinite
nobind
persist-key
persist-tun
tls-client
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA1
pull
auth-user-pass
route 192.168.234.0 255.255.255.0
ping 10
verb 3

192.168.234.0 ist in unserem Beispiel der im Büro genutzte, lokale Adressbereich.

Die eigentliche Internetverbindung erfolgt in diesem Beispiel weiterhin wie gewohnt, beispielsweise über das Hotel-WLAN oder den heimischen Internetzugang, und wird nicht über das VPN getunnelt.

Eine VPN-Verbindung unter macOS
Eine VPN-Verbindung unter macOS

Viele OpenVPN-Clients erlauben auch das temporäre Deaktivieren der IPv6-Verbindung, was sich je nach Anwendungsszenario empfiehlt, um Namens- bzw. Adresskonflikte zu vermeiden.

Herzlichen Glückwunsch – unser OpenVPN-Server ist jetzt grundlegend betriebsbereit!

OpenVPN-Server hinter NAT

Wer seinen OpenVPN-Server nicht direkt am Gateway betreibt, der muss an seinem vorgeschalteten Router noch entsprechende statische Routen setzen. Unter OpenWRT sieht eine solche Konfiguration in der /etc/config/network beispielsweise wie folgt aus, wobei 192.168.234.12 die Adresse des OpenVPN-Servers ist:

config route
option interface 'lan'
option target '192.168.123.0'
option netmask '255.255.255.0'
option gateway '192.168.234.12'

Ausblick

RouterOS stellt noch zahlreiche weitere Möglichkeiten für den VPN-Zugang bereit. So lässt sich beispielsweise eine Standortvernetzung realisieren, um entfernte Bürogebäude in einem Netzwerk zusammenzufassen.

Für Home-Office-Anwender lässt sich auch eine kleine RouterOS-basierte Box konfigurieren, die automatisch auf ether1 per DHCP eine IP-Adresse vom heimischen Internetanschluss bezieht und darüber eine VPN-Verbindung ins Büro aufbaut, welche auf ether2-5 und per WLAN zur Verfügung gestellt wird. Auf diese Weise muss sich der Endanwender erst gar nicht mit der Thematik befassen und der Admin kann die Systeme zentral verwalten.

Zur Fernwartung von Routern hinter CGN-Anschlüssen (Carrier Grade NAT) bietet sich die Installation einer RouterOS CHR-Instanz in der Cloud an, auf die sich alle solchen Geräte per VPN verbinden und dadurch alle in einem VPN-Pool ansprechbar sind.

Florian Effenberger

Autor: Florian Effenberger

Florian engagiert sich seit über 14 Jahren für freie Software und ist einer der Gründer der The Document Foundation, der Stiftung hinter LibreOffice

Schreibe einen Kommentar