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).

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.

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.
Hallo dein Tutorial passt aber die Zertifikate benötigen auch das Trusted Flag.
/certificate
set myCa trusted=yes
set server trusted=yes
Deshalb ist bei mir der OpenVpn Server nicht gestartet.
Leider bringt Mikrotik keinerlei Fehlermeldung.
Danke für die Info! Welche Version setzt du ein?
Hallo Florian, als ich den OpenVpn Server eingerichtet habe die 6.46.
Danke für die ausführliche Anleitung. Kam mein Netzwerk nun auch über OpenVPN erreichen.
Danke für das nette Feedback! :-)
Hallo,
“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.”
gibt es hierzu ein Tutorial o.ä?
Ich würde gerne meine ganzen WLAN-Systeme zentral verwalten, d.h., dass ich gerne alle Accesspoints und RB von einer Stelle aus fernwarten möchte.
Vielen Dank schonmal.
VG
Flo
Ein komplettes Tutorial dazu hab ich nicht geschrieben, aber einen Installationsartikel zum CHR: https://blog.effenberger.org/2019/07/04/mikrotik-routeros-in-der-hetzner-cloud-installieren/
Vielleicht hilft das schon weiter. Der Rest ist auf der Todo, ich kann aber nicht versprechen, wann ich wieder dazu komme, ein Tutorial zu schreiben.
Auch von hier “Vielen Dank für die Anleitung!” :)
Bei einer key-size=4096 erscheint auf meinem Hex S (RB760iGS) bei “/certificate sign “VPN CA” name=”VPN CA”
allerding nach einiger Zeit die Fehlermeldung “action timed out – try again,…”
Da Mikrotik selbst auf in seinem Wiki darauf hinweist, daß es mit mipsbe Modellen bei key>4k länger dauern könnte, hab ich es mit 2048 versucht und dann geht es auch durch.
Ok, “länger dauern” “fail” aber Fehlermeldungen scheinen ohnehin nicht die Stärke der Geräte zu sein. :)
Gerne! :)
Das Problem mit “timed out” kenne ich, in der Regel läuft der Job im Hintergrund weiter und wird etwas später trotzdem abgeschlossen, er bricht also nicht ab.
wie unterschlüsselt man?
Was meinst du mit unterschlüsseln?
Hallo Florian und vielen Dank für die verschiedenen Posts. Leider komme ich bei dem Problem Android(11)-Clients für OpenVPN auf Mikrotik CHR nicht weiter, während sie bei Debian-Server problemlos laufen. Ich benutze OpenVPN Connect bzw. OpenVPN für Android. Die z.B. entsprechend der obigen Angabe hergestellte ovpn-Datei führt – einschließlich allerlei möglichen Varianten- zu sofortigen Abbrüchen. Leider ist das Mikrotik-Log zu sparsam, als dass man irgendetwas nützliches daraus entnehmen könnte. Der OpenVPN-Server auf dem CHR läuft mit den Clients auf den remote-Mikrotik-Router völlig problemlos. Any Idea?
Dirk
Ich hab das Ganze noch nicht mit Android getestet – eventuell Probleme mit der Verschlüsselung? Die MikroTiks sind da nicht auf dem aktuellen Stand, evtl. will Android stärkere Verschlüsselung? Gibt’s evtl. ein Debug Log unter Android, das dir mehr verrät? Evtl. Probleme mit IPv4/IPv6?
Android gibt leider nicht mehr her als TCP Disconnect, wohl aber das CHR Server Log (es ist besser als ich glaubte):
“: disconnected “. Also klappt das Aushandeln des TLS nicht. Einen zusätzlichen Konfig-Befehl “cipher AES-256-CBC” verwertet die OpenVPN Version 2.6 wohl nicht (mehr).
Es sieht also fast so aus, als verwende eine der beiden Seiten 2.6 und das funktioniert mit der anderen nicht. Leider verstehe ich nicht genug von TLS und Co., um das Problem zu knacken. Also werde ich die Umstellung des OpenVPN-Servers von Debian auf Mikrotik CHR zunächst mal zurück stellen.
Danke für die Anregungen.
Ich vermute, dass die Verschlüsselung im Android-Client stärker ist als bei MikroTik, deren Implementation ist glaube ich etwas älter. Vielleicht klappt es mit RouterOS 7 besser – das ist allerdings noch im Beta-Stadium, und ich hab noch keine Anleitung dazu…
Vielen lieben Dank für die Anleitung!
Danke für die nette Rückmeldung! :)
Just a tip, you can use this site to create your .config client file: https://ovpnconfig.com.br. It easily decrypts the certificate files.
Thanks a lot for the tip!