OpenVPN Server auf einem Raspberry Pi mit Raspbian Jessie Lite einrichten

OpenVPN ist eine Open Source Software zum Aufbauen eines VPNs. Es existieren Server und Clients für die meisten Betriebssysteme wie Linux, Windows. Mac OS, Android und iOS. In diesem Beitrag beschreibe ich wie ein OpenVPN Server unter Raspbian Jessie Lite eingerichtet werden kann. Ich verwende eine Zertifikatsbasierte Authentifizierung bei meinem OpenVPN Server, was eine höhere Sicherheit als die Authentifizierung basierend auf Passwörtern hat.

Zertifikate generieren

Wie die Zertifikate generiert werden können habe ich im Beitrag Zertifikate mittels Easy-RSA 3 zur OpenVPN Authentifizierung generieren beschrieben.

Installieren

Der OpenVPN Server kann einfach über nachfolgenden Befehl installiert werden.

$ sudo apt-get install openvpn

Konfigurieren

Schlüssel, Zertifikate und CRL

Zuerst muss ein Verzeichnis erstellt werden in dem die ganzen Schlüssel des Servers abgelegt werden sollen. Ich erzeuge diesen immer im OpenVPN Verzeichnis.

$ sudo mkdir /etc/openvpn/keys

Dort müssen nun folgende Dateien, welche durch easy-rsa3 geniert wurden, hinterlegt werden:

  • server.key
  • server.crt
  • crl.pem
  • ca.crt
  • dh.pem

Da diese Dateien teilweise sensitive Informationen enthalten sollten sie mit restriktive Dateiberechtigungen ausgestattet werden. Es reicht wenn root sie lesen kann – mit Ausnahme der crl.pem, welche auch vom Benutzer nobody gelesen werden muss, da der OpenVPN Server unter diesem ausgeführt wird.

$ sudo chown -R root:root /etc/openvpn/keys/
$ sudo find /etc/openvpn/keys/ -type f -exec chmod 400 {} \;
$ sudo chmod 404 /etc/openvpn/keys/crl.pem

Server

Nun kann die Konfiguration des Servers angelegt werden. Sie befindet sich in der Datei /etc/openvpn/server.conf. Ich verwende nachfolgende Konfiguration für meinen VPN Server.

# Adapter, Protocol, Port, and IP range
dev     tun
proto   tcp
port    1194
server  10.8.0.0 255.255.255.0

# Keys, certificates, and security settings
ca               keys/ca.crt
cert             keys/server.crt
key              keys/server.key
dh               keys/dh.pem
crl-verify       keys/crl.pem
remote-cert-tls  client
cipher           AES-256-CBC
auth             SHA512
tls-cipher       TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
tls-server
tls-version-min  1.2
auth-nocache
remote-cert-tls  client

# Logging
status           /var/log/openvpn-status.log 20
log-append       /var/log/openvpn.log
verb             3

# Use low privileged user/group to run the daemon but allow restart via SIGUSR1
user             nobody
group            nogroup
persist-key
persist-tun

# Allow connections between clients
#client-to-client

# Enable compression
comp-lzo

# Allow multiple clients with the same common name
#duplicate-cn

# Keep the connection alive
keepalive        10 120

# Set the DNS Server
push "dhcp-option DNS <IP-des-Routers>"

# Route all traffic through VPN
push "redirect-gateway"

Auch bei dieser Datei benötigt nur root Lesezugriff

$ sudo chown root:root /etc/openvpn/server.conf
$ sudo chmod 400 /etc/openvpn/server.conf

Nun kann der Server neu gestartet werden, damit die Konfiguration geladen wird

$ sudo service openvpn restart

Bei mir hat der OpenVPN Server die Konfiguration nicht gefunden. Ich musste den Raspberry Pi erst komplett neu starten, damit der OpenVPN Server die Konfigurationsdatei findet. Auch muss ich den Raspberry Pi neu starten, wenn ich die Konfigurationsdatei umbenenne.

Zum Überprüfen, ob die Konfiguration geladen wurde kann einfach geschaut werden ob OpenVPN auf dem konfigurierten Port auf Verbindungen wartet. Falls dies der Fall ist sollte nachfolgender Befehl etwas zurückliefern.

$ sudo netstat -tulpn | grep 1194
tcp        0      0 0.0.0.0:1194            0.0.0.0:*               LISTEN      532/openvpn

Falls es beim Starten des OpenVPN Servers Probleme gibt kann er manuell über die Konsole gestartet werden um an zusätzliche Informationen zu kommen.

$ sudo openvpn --config /path/to/server.conf

Falls sich keine Verbindung herstellen lässt sollte überprüft werden, dass der TCP Port 1194 auf dem Router zum Raspberry Pi weitergeleitet wird.

Internet über VPN weiterleiten

Nun muss Raspbian noch so konfiguriert werden, dass die Clients über das VPN eine Verbindung ins Internet herstellen können. Dazu zuerst folgende Befehle ausführen. Falls anstatt eth0 ein anderer Netzwerkadapter verwendet werden soll muss eth0 durch diesen ersetzt werden.

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Nun muss in der Datei /etc/sysctl.conf noch der Kommentar vor nachfolgender Zeile entfernt werden.

net.ipv4.ip_forward=1

Und anschließend neu geladen werden.

$ sudo sysctl -p

Zuletzt muss die Weiterleitung der Pakete noch persistent gespeichert werden, da iptables-Regeln beim Neustart automatisch gelöscht werden. Falls wie im Beitrag Nützliche Tools für Ubuntu Linux 16.04 Server beschrieben das Paket iptables-persistent installiert wurde kann dies einfach mit nachfolgendem Befehl erledigt werden.

$ sudo bash -c "iptables-save > /etc/iptables/rules.v4"

Nun sollte der OpenVPN Server auch nach einem Neustart automatisch starten und es erlauben das Internet über diese Verbindung zu nutzen.