Raspberry Pi als OpenVPN Server

Wie kann ich eigentlich von außerhalb meines eigenen Netzwerks sicher auf interne Ressourcen zugreifen, ohne jeden dafür benötigten Port direkt über das Internet erreichbar zu machen? Will ich so etwas überhaupt? Den Zugriff wahrscheinlich schon. Direkt über das Internet vielleicht eher nicht. Um beide Ziele zu erreichen, wird ein VPN Tunnel benötigt, durch den die komplette Kommunikation abgeschottet von der Außenwelt läuft. Dazu wird im eigenen Netzwerk ein VPN Server aufgebaut. Die meiner Meinung nach beste Lösung hierfür ist OpenVPN. Je nach Netzwerk, kann der OpenVPN Server auch direkt auf dem heimischen Router laufen Klick.

Da nicht jeder OpenWRT oder ähnliches einsetzt, zeigt dieser Artikel, wie ein OpenVPN Server auf einem günstigen Raspberry Pi installiert werden kann. Somit ist es sehr einfach, für wenig Geld einen eigenen OpenVPN Server zu betreiben. Für den erfolgreichen Einsatz gibt es zwei Voraussetzungen, die hier nicht weiter beschrieben werden. Dazu gibt es bereits sehr viele gute Anleitungen im Netz.

1. Es muss ein Port Forwarding (UDP 1194) auf den Raspberry Pi eingerichtet werden.

2. Damit der Zugriff auch über das heimische DSL funktioniert, wird ein DynDNS Eintrag benötigt.

Der Zugriff auf den Raspberry Pi funktioniert über SSH. Dazu muss eine Session aufgebaut werden. Windows User nehmen hierfür das Tool Putty.

ssh pi@raspberrypi

Als Erstes wird das installierte Debian / Raspbian auf einen aktuellen Stand gebracht.

sudo apt-get update && sudo apt-get upgrade

Damit das Port Forwarding auch an der richtigen Stelle ankommt, wird eine statische IP Adresse vergeben. In diesem Beispiel ist es die ‚192.168.1.199‘.

sudo nano /etc/network/interfaces

Sollte die Zeile ‚iface eth0 inet manual‘ vorhanden sein, muss diese auskommentiert werden.

#iface eth0 inet manual

Die Konfiguration für die statische IP Adresse sieht wie folgt aus. Natürlich muss hier die Konfiguration an die eigenen Gegebenheiten angepasst werden.

# IPv4 address
iface eth0 inet static
        address 192.168.1.199
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1

Nach den Änderungen muss der Netzwerkdienst einmal durchgestartet werden.

sudo systemctl restart networking.service

Jetzt sollte die neue Konfiguration bereits angewendet werden. Dies kann einfach mit ‚ifconfig‘ überprüft werden.

ifconfig
eth0      
	  Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          inet addr:192.168.1.199  Bcast:192.168.1.255 Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7579 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3415 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9015323 (8.5 MiB)  TX bytes:387584 (378.5 KiB)

Nun kann die OpenVPN Software direkt aus den Paketquellen installiert werden.

OpenVPN

sudo apt-get install openvpn

Für die Authentifizierung am OpenVPN Server werden Zertifikate verwendet. Diese werden sowohl für den Server als auch für die Clients benötigt. Diese Schritte habe ich bereits in älteren Artikeln, die nach wie vor gültig sind, beschrieben.

OpenVPN Zertifikate unter Windows erzeugen: Klick

OpenVPN Zertifikate unter Linux erzeugen: Klick

Folgende Zertifikate gehören in das Verzeichnis „/etc/openvpn/easy-rsa/keys/“.

ca.crt
server.crt
server.key
tlsauth.key
dh4096.pem

Aus Sicherheitsgründen werden die Berechtigungen für die Zertifikate neu gesetzt.

sudo chown -R root:root /etc/openvpn/easy-rsa/keys/
sudo find /etc/openvpn/easy-rsa/keys/ -type f -exec chmod 400 {} \;

Jetzt kann die Konfigurationsdatei für den Server erzeugt werden. Diese liegt unter „/etc/openvpn/server.conf“

sudo nano /etc/openvpn/server.conf
dev tun
proto udp
port 1194
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3
persist-tun
persist-key
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh4096.pem
tls-auth /etc/openvpn/easy-rsa/keys/tlsauth.key 0
cipher AES-256-CBC
auth SHA512
keepalive 10 120
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA
server 10.199.10.0 255.255.255.0
tls-server
tls-version-min 1.2
auth-nocache
duplicate-cn
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.220.220"
push "dhcp-option DNS 208.67.222.222"
push "block-outside-dns"

Wer sich für die einzelnen Konfigurationen der server.conf interessiert, kann dies hier nachlesen: Klick. Um die Konfiguration abzusichern, wird hierfür auch die Berechtigung neu gesetzt.

sudo chmod 600 /etc/openvpn/server.conf

Der OpenVPN Server kann jetzt auch gestartet werden.

sudo systemctl enable openvpn.service
sudo systemctl start openvpn.service

Ab jetzt sollte unter „ifconfig“ auch ein „tun0“ Device auftauchen.

Im nächsten Schritt geht es darum, dass Routing zu konfigurieren. Dazu soll der Zugriff auf interne Netzwerk Ressourcen und Internetzugang ermöglicht werden. Hierfür muss zunächst das IPv4 Forwarding aktiviert werden. Dazu muss in der Datei „/etc/sysctl.conf“ die Zeile „net.ipv4.ip_forward=1“ aktiviert werden.

sudo nano /etc/sysctl.conf

Raspberry Pi OpenVPN Server

Damit die Änderung übernommen wird, muss die Konfiguration gespeichert werden.

sudo sysctl -p

Jetzt müssen noch Änderungen an der Firewall vorgenommen werden. Damit die Regeln auch bei einem Neustart des Raspis funktionieren, wird ein Paket nachinstalliert.

sudo apt-get install iptables-persistent

Die Regeln werden in ein kleines Shell Skript gespeichert, um es bei Anpassungen etc. schnell wieder ausführen zu können.

sudo nano /usr/local/bin/iptables.sh
#!/bin/bash
iptables -t filter -F
iptables -t nat -F
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s '10.199.10.0/24' -j MASQUERADE
iptables-save > /etc/iptables/rules.v4

Das Skript wird zuerst ausführbar markiert und dann direkt gestartet.

sudo chmod +x /usr/local/bin/iptables.sh && sudo sh /usr/local/bin/iptables.sh

Die geschriebenen Regeln können bei Bedarf nachträglich überprüft werden.

sudo nano /etc/iptables/rules.v4

Ab jetzt ist der OpenVPN Server einsatzbereit und kann direkt genutzt werden. Über den VPN Tunnel ist jetzt sowohl der Zugriff auf Ressourcen möglich, als auch der Internetzugang, welcher komplett durch den Tunnel geroutet wird. Beispiele für eine dazu passende OpenVPN Client Konfiguration und Optimierungen finden sich hier:

OpenVPN Client Konfiguration für Windows / Linux: Klick

OpenVPN Client unter iOS: Klick

OpenVPN Durchsatz optimieren: Klick

Email Benachrichtigung bei OpenVPN Verbindung: Klick