Unter Linux einen sicheren openVPN-Server einrichten

In Zeiten von Cyber Security, Cloud und Home Office sind sichere Zugänge zu Business-relevanten Daten immer wichtiger. Linux-Experte Renato Testa zeigt uns in diesem Artikel, wie Sie eine sichere openVPN aufsetzen.

Autor Renato Testa
Datum 27.02.2020
Lesezeit 9 Minuten

In diesem Teil meines Linux-Security-Blogs möchte ich euch ein VPN mit openVPN vorstellen.

Im Folgenden werden wir:

  1. eine PKI (Public Key Infrastructure) aufsetzen. Dies benötigen wir, um die Zertifikate und Schlüssel zu generieren
  2. einen openVPN-Server für direkten Internet-Zugang einrichten
  3. Clients (Linux, *BSD, Mac, Windows) mit unserem VPN-Server verbinden

Was ist VPN?

Ein VPN (Virtual Private Network) ist ein abgesicherter Daten-Tunnel der als Transportmedium das Internet benutzt.

Warum VPN nutzen?

  • Public WLANs sind unsicher, du hast keine Ahnung, ob dein Nachbar im Café, Hotel, Parkbank, … gerade dabei ist, dein Gerät auszuspionieren.
  • Als digitaler Nomade hast du keine Ahnung, welche dunklen Seiten der Macht an deinem Datenverkehr teilnehmen.
  • Wie sich immer wieder zeigt: Mobile Geräte sind oft schlecht geschützt, aus welchen Gründen auch immer.
  • GeoIP Blockierung kann dir den Zugang zu Inhalten verwehren.

open vpn

Warum openVPN?

Für die sichere Vernetzung von ganzen Netzen (z.B. Firmenstandorte) verwenden wir u.A. andere Ansätze wie z.B. Libre- oder StrongSWAN. Da wir mit unseren mobilen Geräten aber meist hinter einem DSL-Router stehen, sind oft Protokolle welche obige Ansätze verwenden, blockiert.

Für openVPN stehen für alle gängigen Plattformen entsprechende Clients zur Verfügung:

  • openVPN für Linux/*BSD/Unix basierte Systeme
  • Tunnelblick für macOS
  • openVPN Connect für Windows-Systeme
  • iOS und Android via Appstore
  • openVPN ist ein Service, der auf allen unixoiden Systemen gut unterstützt und eingebettet ist. Die Installation ist auf allen Smart Devices sehr einfach.

Und das Wichtigste: openVPN ist sicher!

Welche Art von VPN gibt es?

Aus Sicht des Benutzers gibt es zwei Anwendungen:

  1. Aus einem unsicheren Netz (Public WLAN) über einen gesicherten Kanal und über einen gesicherten VPN-Server ins Internet zu gelangen.
  2. Vom Home-Office oder aus einem unsicheren Netz (Public WLAN) über einen gesicherten Kanal und über einen gesicherten VPN-Server in das Firmennetzwerk zu gelangen.

Im Folgenden verfolgen wir den ersten Ansatz. Diesen zur zweiten Variante zu erweitern ist reine Konfiguration, da nur das Routing zu einem weiteren, internen, Subnetz hinzukommt und NAT, Masquerading entfällt.

Soweit die Theorie und somit Zeit für eine Tasse Kaffee und die Ärmel hochzukrempeln…
Um dir die Zeit zum Lesen zu verkürzen, können die «glory details» nach belieben per Klick aufgerufen werden.

Zutaten

Für das hier beschriebene VPN benötigst du:

  • Eine unixoide Workstation/Laptop (Mac, Linux, *BSD)
  • Einen Server, der direkt im Internet steht im Land deiner Wahl (bzw. von wo aus du ins Internet willst)
  • Regeln für den Daten-/ Netzwerkverkehr (iptables)
  • Etwas Zeit, um dich einzulesen

Der openVPN-Server

Im Beispiel wurde eine VM mit Debian Buster auf Proxmox verwendet. Der Server besitzt eine öffentliche IP.

Als Erstes installieren wir openVPN:

$ sudo apt upate
$ sudo apt install openvpn

Eine PKI erstellen

Da wir von Null beginnen, brauchen wir eine PKI (Public Key Infrastruktur). Wir brauchen eine CA um die für openVPN benötigten Schlüssel/Zertifikate zu signieren. Dieser, zugegeben etwas langatmige, Schritt belohnt uns mit einer PKI. Diese sollte streng behütet werden in einer VM, die nur gestartet/benutzt wird, wenn Zertifikate generiert/signiert werden müssen.

Darauf laden wir uns EasyRSA, eine Sammlung von Scripts, um Schlüssel, Zertifikate und Requests mit openSSL zu generieren: Code-Details 1: PKI erstellen

Uff, geschafft, zumindest beinahe. Wir haben nun alle Schlüssel und Zertifikate für unseren Server beieinander und verfügen über eine PKI.

Generieren der Client Zertifikate/Schlüssel

Wir verfügen ja nun über die nötige Infrastruktur die es braucht um für unsere Clients Zertifikate und Schlüssel zu beglaubigen (signieren). Da sich dieser Vorgang für jeden Client wiederholt und ich ein recht fauler Mensch bin, packen wir die folgende Aktionen einfach in ein Shell-Script. Dieses Script laden wir auf unseren VPN-Server.

Der Vorteil eines Scriptes liegt natürlich auch darin, dass gewährleistet wird, dass es immer gleich abgearbeitet wird! Das folgende Script führt uns durch alle nötigen Schritte um ein <CLIENT>.ovpn und die zugehörigen Schlüssel/Zertifikate zu generieren. Die Schritte welche eine Aktion auf dem CA-System (PKI) bzw. das kopieren von Dateien zwischen VPN-Server <=> CA-Server benötigen eine funktionierende SSH-Verbindung. Das Script zeigt dir wie.

Code-Details 2: Script: create-vpn-client.sh

Wir haben nun ein Script, welches uns die für den Client benötigten Dateien in einem Zip-Archiv liefert bzw. welches wir unseren Klienten bereitstellen können.

Im nächsten Schritt setzen wir unseren openVPN-Service auf.

Aufsetzen des openVPN-Servers

Wie Eingangs erwähnt muss dies ein System sein, welches direkt erreichbar ist. In meinem Beispiel handelt es sich um eine VM mit Debian Buster auf Proxmox. Wir werden im folgenden den VPN-Service konfigurieren und da wir direkt von diesem Server ins Internet wollen, NAT und Masquerading mittels iptables aufsetzen. Wenn wir gerade bei iptables sind, wird das System auch sonst noch etwas gehärtet.

In einem vorherigen Schritt haben wir das «openvpn»-Packet bereits installiert mittels:

# zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Nun können wir uns eine Basis kopieren oder du kannst auch mein Beispiel übernehmen: Code-Details 3: vpn server.conf

iptables

Damit die in Interfaces (tunN), Protokolle und NAT/Masquerading zusammenspielen, verwenden wir Regeln mit iptables. Zudem muss der Kernel in der Lage sein, IPv4-Pakete forwarden zu können.

IPv4 Pakete forwarden

Meist ist IPv4 ausgeschaltet und muss überhaupt zugelassen werden, damit zwischen den Netzwerk-Interfaces (tunN und ethN) Pakete vermittelt werden.

Mittels:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

lässt sich das herausfinden.

Mittels:

$ sysctl -w net.ipv4.ip_forward=1

wird das forwarden erlaubt. Um es persistent zu ändern muss in der Datei «/etc/sysctl.conf» die entsprechende Zeile geändert werden.

iptables-Regeln

Unsere Regeln wollen oder müssen:

  • aus dem internen openVPN-Netz und dem Netzwerktunnel-Interface Pakete nach aussen leiten
  • von aussen Pakete wiederum via Netzwerktunnel-Interface an das openVPN-Netz leiten
  • IPv6 wird zurückgewiesen
  • SSH, HTTP, HTTPS, DNS sowie der openVPN-Port dürfen rein und raus
  • alles andere wird zurückgewiesen

Mittels:

# ip6tables -F
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle

putzen wir alle Regeln weg. Geht beim Setzen der Regeln etwas schief, werden wir das öfters benutzen (müssen).

Unsere iptables-Anpassungen nehmen wir in den zwei Dateien «/etc/iptables/rules.v4» und «/etc/iptables/rules.v6» vor.

Code-Details 4: iptables rules.v6

Code-Details 5: iptables rules.v4

Die Namen der Interfaces oder das interne Netz musst du entsprechend anpassen!

Obige Dateien werden nun mittels «ip6tables-restore» verarbeitet und somit die Regeln angewendet:

# ip6tables-restore < /etc/iptables/rules.v6
# iptables-restore < /etc/iptables/rules.v4

und können mit

# ip6tables -L
...
# iptables -L
...

aufgelistet werden.

Serverseitig sind wir nun soweit. Das Setup des Servers – PKI, OpenVPN, IPTables – ist, das erste Mal, aufwändig. Aber der Aufwand lohnt sich, weil

  • Learning by doing
  • Der Aufwand nur das erste Mal entsteht
  • Dieser Server beliebig geklont werden kann mit minimalen Anpassungen

OpenVPN-Client einrichten

Linux

  • Das Paket «openvpn» installieren
  • Für das GUI «network-manager-openvpn»
  • Zip-Datei entzippen -> *.ovpn
# apt install openvpn
# openvpn -config <Pfad zum *.ovpn>

oder via GUI mit dem Network-Manager.

MacOS

  • Tunnelblick installieren
  • Zip-Datei entzippen -> *.ovpn
  • Tunnelblick starten und die *.ovpn-Datei installieren

Windows

  • OpenVPN Connect installieren
  • Zip-Datei entzippen -> *.ovpn
  • OpenVPN Connect starten und *.ovpn-Datei installieren

Conclusion

  • Mit regelmässigen Security-Updates reduziert sich der administrative Aufwand unseres VPN-Servers auf ein Minimum.
  • Server können für günstiges Geld in beliebigen Ländern eingerichtet werden.
  • Wir können Public WLAN sicher benutzen mit der GeoIP unserer Wahl.

Über den Autor

Renato Testa

Renato Testa ist seit 25 Jahren in der IT und im Unix-Umfeld tätig. Mitte der 90er-Jahre führte er die ersten Linux-Kurse  bei Digicomp durch. Neben der Systemprogrammierung ist vor allem Systemadministration von Unix/Linux-Systemen sein Hauptgebiet. Im Rahmen verschiedener OSS-Events bei Digicomp hielt er Referate zu Themen wie HA-Firewalls, OpenSolaris oder Linux-Cluster. Seit 2014 ist sein Hauptthema DevOps in verschiedenen Cloud-Projekten. Renato Testa ist seit 1994 Trainer bei Digicomp und ist im Besitze der SVEB I Zertifizierung.