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.
Hey Carsten,
echt tolle Arbeit!
Hat alles super gut und auf Anhieb geklappt.
Alles ist super erklärt und Top verständlich.
Würde dir für diese tolle Arbeit gerne eine kleine Spende da lassen. Hast du einen Spendenlink?
Wäre außerdem Cool, wenn du noch ein Update zu den elliptischen Kurven machen könntest. 🙂
Viele Grüße