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.