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.

Headless Raspberry Pi mit Raspbian Jessie Lite einrichten

In diesem Beitrag beschreibe ich, wie ein Headless Raspberry Pi mit Raspbian Jessie Lite eingerichtet werden kann. Dazu wird neben dem Raspberry Pi auch eine passende (micro)SD-Karte mit mindestens 2 GB benötigt.

Ein Anleitung für das aktuelle Raspbian Stretch Lite ist hier verfügbar:

Raspbian Image herunterladen

Raspbian Jessie Lite ist eine auf Debian Jessie basierende Linux Distribution für den Raspberry Pi. Sie wird offiziell von der Raspberry Pi Foundation unterstützt. Ein Image kann auf der offiziellen Raspberry Pi Homepage heruntergeladen werden.

Raspbian herunterladen
Raspbian herunterladen

Nach dem Download (1) kann noch der SHA-1 Hashwert (2) überprüft werden. Wie dies mit dem Windows Subsystem for Linux erreicht werden kann habe ich in dem Artikel Hashwert einer Datei unter Ubuntu Linux 16.04 berechnen beschrieben.

Image auf (micro)SD-Karte kopieren

Nun kann das Image auf die (micro)SD-Karte geschrieben werden. Dazu kann das Programm Etcher verwendet werden. Es lässt sich einfach über die offizielle Homepage herunterladen.

Etcher herunterladen
Etcher herunterladen

Nach der Installation kann Etcher einfach über das Startmenü gestartet werden.

Etcher starten
Etcher starten

Zuerst muss das heruntergeladene zip-Image ausgewählt werden. Dazu muss zuerst auf „Select image“ geklickt werden.

Erster Schritt von Etcher
Erster Schritt von Etcher

In dem nun angezeigten Dialog muss zuerst das zip-Image ausgewählt werden (1). Anschließend muss es mit einem Klick auf „öffnen“ (2) bestätigt werden.

Image im ersten Schritt von Etcher auswählen
Image im ersten Schritt von Etcher auswählen

Anschließend muss das richtige Ziellaufwerk – die (micro)SD-Karte – ausgewählt werden, falls dies nicht schon automatisch geschehen ist. Dazu muss zuerst auf „Change“ geklickt werden.

Zweiter Etcher Schritt
Zweiter Etcher Schritt

Nun muss zuerst das Laufwerk ausgewählt (1) und anschließend auf „Continue“ (2) geklickt werden.

Ziellaufwerk im zweiten Etcher Schritt auswählen
Ziellaufwerk im zweiten Etcher Schritt auswählen

Abschließend muss nur noch auf „Flash!“ geklickt werden.

Etcher Schritt 3 starten
Etcher Schritt 3 starten

Nun Startet der Kopiervorgang. Etcher kopiert zuerst das Image, validiert es anschließend und wirft zuletzt die (micro)SD-Karte aus.

Kopiervorgang in Schritt 3 von Etcher
Kopiervorgang in Schritt 3 von Etcher

Nach erfolgreicher Validierung wird eine Erfolgsmeldung angezeigt.

Etcher Kopiervorgang Abgeschlossen
Etcher Kopiervorgang Abgeschlossen

SSH Aktivieren

Da wir den Raspberry Pi Headless betreiben müssen wir uns per SSH auf ihn verbinden können. Aus Sicherheitsgründen ist SSH bei Raspbian standardmäßig deaktiviert. Um es zu aktiveren muss auf der Boot Partition eine Datei mit dem Namen SSH angelegt werden. Diese benötigt keinen Inhalt. Während des Startens prüft Raspbian, ob diese Datei vorhanden ist. Ist sie es wird SSH aktiviert und die Datei gelöscht. So ist es auch ohne Bildschirm und Tastatur möglich den SSH Server zu aktivieren. Damit diese Datei erstellt werden kann muss die (micro)SD-Karte durch aus und wieder einstecken erneut gemountet werden. Sie wurde von Etcher nach erfolgreichem Kopieren automatisch ausgeworfen.

SSH Server von Raspbian aktivieren
SSH Server von Raspbian aktivieren

Nun kann die (micro)SD-Karte ausgeworfen und in den Raspberry Pi gesteckt werden. Anschließend kann der Raspberry Pi mit einem Netzwerk- und Micro-USB Kabel verbunden werden.

Raspbian konfigurieren

IP-Adresse herausfinden

Um Raspbian konfigurieren zu können muss zuerst die IP-Adresse herausgefunden werden. Dies kann z.B. über die Weboberfläche des Routers, oder, falls Linux verwendet wird, über netdiscover erledigt werden. Falls netdiscover noch nicht installiert ist kann es einfach über die offiziellen Paketquellen installiert werden

$ sudo apt-get install netdiscover

Anschließend muss es als root gestartet werden und gibt alle Netzwerkgeräte inklusive ihrem Hersteller aus.

$ sudo netdiscover | grep Raspberry
192.168.0.126 b8:27:eb:72:a5:3c 1 60 Raspberry Pi Foundation

SSH-Verbindung aufbauen

Standardmäßig existiert unter Raspbian der Benutzername pi mit dem Passwort raspberry.

Mit diesen Informationen ist es nun möglich sich nun per SSH auf dem Raspberry Pi anzumelden.

$ ssh pi@192.168.0.126

Falls die von mir in Sichere SSH Konfiguration vorgestellte Client SSH Konfiguration verwendet wird kommt wird beim Verbindungsaufbau nachfolgende Fehlermeldung angezeigt

The authenticity of host '192.168.0.126 (192.168.0.126)' can't be established.
ED25519 key fingerprint is SHA256:WNOAK/cDizRRBkENqcHlCXiXCr5FXQJQhw3V5sOUVpU.
> Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.126' (ED25519) to the list of known hosts.
Permission denied (publickey,password).

Dies liegt daran, dass standardmäßig keine Passwörter zur Anmeldung an SSH Servern erlaubt sind. Daher muss wie im Beitrag SSH Authentifizierung über Passworte für einzelne Verbindungen erlauben beschrieben der Parameter PasswordAuthentication auf yes gesetzt werden um die Anmeldung über Passwörter für diese Verbindung wieder bzw. temporär zu erlauben.

Passwort ändern

Beim Einloggen über SSH wird eine Warnung angezeigt, falls der Benutzer pi noch das Standardpasswort raspberry nutzt.

$ ssh pi@192.168.0.126
> pi@192.168.0.126's password:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon May  1 17:17:04 2017 from 192.168.1.137

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

Diese Warnung sollte ernst genommen werden. Mittels des Befehlt passwd kann das Passwort des Benutzers einfach auf ein sicheres geändert werden. Bevor das neue Passwort angegeben werden kann muss zur Bestätigung zuerst das alte eingegeben werden. Die Ausgabe sollte wie nachfolgend aussehen.

$ passwd
Changing password for pi.
> (current) UNIX password:
> Enter new UNIX password:
> Retype new UNIX password:
passwd: password updated successfully

Danach sollte die Warnung beim Verbinden nicht mehr angezeigt werden.

System aktualisieren

Bevor der Raspberry Pi weiter eingerichtet wird sollten zuerst alle Pakete aktualisiert werden. Dies kann einfach mit folgenden beiden Befehlen geschehen.

$ sudo apt-get update
$ sudo apt-get upgrade

Zeitzone anpassen

Standardmäßig wird UTC als Zeitzone in Raspbian verwendet. Die Zeitzone kann ganz einfach über das Tool raspi-config angepasst werden.

Um die aktuell eingestellte Zeitzone auszugeben kann der Befehl date verwendet werden.

$ date
Sat  26 Aug 07:41:35 UTC 2017

Zum Ändern der Zeitzone kann raspi-config verwendet werden.

$ sudo raspi-config

In dem nun Grafischen Menü muss zuerst 4 Localisation Options ausgewählt und mit Enter bestätigt werden

Lokalisierungsoptionen von Raspbian
Lokalisierungsoptionen von Raspbian

Jetzt muss I2 Change Timezone ausgewählt und mit Enter bestätigt werden.

Zeitzone von Raspbian anpassen
Zeitzone von Raspbian anpassen

Als Geographic Area nun Europe auswählen und bestätigen.

Gebiet der Zeitzone von Raspbian festlegen
Gebiet der Zeitzone von Raspbian festlegen

Im nächsten Menü als Time Zone Berlin auswählen.

Zeitzone von Raspbian auf Berlin setzen
Zeitzone von Raspbian auf Berlin setzen

Nach dem Beenden von raspi-config (z.B. über Esc) wird die neue Zeitzone angezeigt.

Current default time zone: 'Europe/Berlin'
Local time is now:      Sat  26 Aug 09:42:52 CEST 2017.
Universal Time is now:  Sat  26 Aug 07:42:52 UTC 2017.

Nun kann nochmals mittels des date Befehls überprüft werden das die Zeitzone auch angepasst wurde.

$ date
Sat  26 Aug 09:43:08 CEST 2017

WLAN Kanäle konfigurieren

Pro Region bzw. Land sind andere WLAN Kanäle erlaubt. Daher sollte das WLAN Land auch gesetzt werden. Dazu wieder raspi-config starten

$ sudo raspi-config

Wie beim Einstellen der Zeitzone wieder 4 Localisation Options im ersten Menü auswählen und mit Enter bestätigen

Lokalisierungsoptionen von Raspbian
Lokalisierungsoptionen von Raspbian

Jetzt muss I4 Change Wi-Fi Country ausgewählt werden.

WLAN Land von Raspbian anpassen
WLAN Land von Raspbian anpassen

In der Liste der Länder nun DE Germany auswählen.

WLAN Land von Raspbian auf Deutschland setzen
WLAN Land von Raspbian auf Deutschland setzen

Abschließend wird noch eine Bestätigung angezeigt.

Bestätigung der Änderung des WLAN Lands von Raspbian
Bestätigung der Änderung des WLAN Lands von Raspbian

Damit die Änderung des WLAN Lands übernommen werden muss der Raspberry Pi einmal neu gestartet werden. Dies wird beim Beenden von raspi-config über Finish im Hauptmenu automatisch angeboten.

Neustart von Raspbian nach Konfigurationsänderung
Neustart von Raspbian nach Konfigurationsänderung

Alternativ kann auch nachfolgender Befehl im Terminal genutzt werden

$ sudo reboot

Hostname ändern

Es sollte auch noch der Name unter dem der Raspberry Pi im Netzwerk sichtbar ist, der sogenannte Hostname, angepasst werden. Dies kann auch wieder ganz einfach über raspi-config erledigt werden.

$ sudo raspi-config

Diesmal muss 2 Hostname im Hauptmenü ausgewählt werden

Raspbian Hostname ändern
Raspbian Hostname ändern

Direkt danach wird ein Hinweis angezeigt welche Zeichen im Hostnamen erlaubt sind

Raspbian Hostname ändern Hinweis
Raspbian Hostname ändern Hinweis

Nach dem Bestätigen kann der neue Wunschhostname eingegeben werden (1). Anschließend muss der Dialog mit OK (2) bestätigt werden.

Raspbian neuer Hostname setzen
Raspbian neuer Hostname setzen

Damit die Änderung des Hostnamens wirksam werden muss der Raspberry Pi einmal neu gestartet werden. Dies wird beim Beenden von raspi-config über Finish im Hauptmenu automatisch angeboten.

Neustart von Raspbian nach Konfigurationsänderung
Neustart von Raspbian nach Konfigurationsänderung

Alternativ kann auch nachfolgender Befehl im Terminal genutzt werden

$ sudo reboot

SSH Konfigurieren

Anschließend kann wie im Beitrag SSH Authentifizierung mittels Public-Keys beschrieben die SSH Anmeldung auf Public-Keys umgestellt werden. Anschließend sollte auch die SSH Konfiguration des Raspberry Pi’s wie im Beitrag Sichere SSH Konfiguration beschrieben abgesichert werden.

Aliase setzen

Ich verwende auf allen meinen Systemen bestimmte Aliase im Terminal. Das definieren der Aliase in Raspbian ist identisch mit dem in Ubuntu 16.04. Daher kann einfach meine Anleitung im Beitrag Terminal Aliase in Linux verwendet werden.

Nützliche Tools installieren

Es gibt einige Tools die ich immer wieder verwende die aber nicht alle standardmäßig installiert sind. Um sie nicht jedes Mal bei Bedarf installieren zu müssen installiere ich sie immer schon beim Einrichten des Systems. Meine Tools habe ich im Beitrag Nützliche Tools für Ubuntu Linux 16.04 Server beschrieben, welcher so auch für Raspbian gilt.

Automatische Sicherheitsupdates

Raspbian kann so konfiguriert werden, dass es Sicherheitsupdates automatisch installiert. Wie dies funktioniert habe ich im Beitrag Automatische Installation von Sicherheitsupdates unter Raspbian Jessie Lite beschrieben.

Statische IP-Adresse Vergeben

Eventuell möchte man dem Raspberry Pi eine statische IP-Adresse geben um ihn immer unter dieser erreichen zu können. Wie dies umgesetzt werden kann habe ich in dem Beitrag Einem Raspberry Pi mit Raspbian Jessie Lite oder Raspbian Stretch Lite eine Statische IP-Adresse zuweisen beschrieben.

Nun kann der Raspberry Pi nach den eigenen Bedürfnissen eingerichtet werden.

Einem Raspberry Pi mit Raspbian Jessie Lite oder Raspbian Stretch Lite eine Statische IP-Adresse zuweisen

Wenn ein Raspberry Pi beispielsweise als VPN Server verwendet werden soll, ist es sinnvoll ihm im lokalen Netzwerk eine feste IP-Adresse zu geben. So ist sichergestellt, dass er immer die gleiche IP-Adresse hat, auf welche der Port weitergeleitet wird.

Raspbian basiert auf Debian. Daher ist auch in Raspbian standardmäßig der DHCP Client Daemon (DHCPCD) aktiviert, welcher die IP-Adresse zuweist. Um eine Feste IP-Adresse zuzuweisen muss nur die Datei /etc/dhcpcd.conf angepasst werden. Diese einfach als root öffnen.

$ sudo nano /etc/dhcpcd.conf

In der Konfigurationsdatei muss am Ende die feste IP-Adresse definiert werden. Für Ethernet sind die Zeilen 2-8 und für WLAN die Zeilen 10-16 im Beispiel relevant.

  • Interface definiert die Netzwerkschnittstelle für welche die IP-Adresse festgelegt wird (eth0 = Ethernet, wifi0 = WLAN)
  • static ip_address legt die gewünschte IP-Adresse fest. Die /24 am Ende muss stehen bleiben, da sie die Subnet Maske definiert (/24 ist äquivalent zu 255.255.255.0).
  • static routers ist die IP-Adresse des Gateways (normalerweise der Router)
  • static domain_name_servers ist die IP-Adresse des DNS Servers (normalerweise der Router)
[...]
# Static IP-Address for Ethernet

interface eth0

static ip_address=192.168.10.42/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

# Static IP-Address for WiFi

interface wlan0

static ip_address=192.168.10.43/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

Nach dem Ändern muss der Raspberry Pi einmal neu gestartet werden, damit die Änderungen in Kraft treten.

$ sudo reboot

Anschließend können über die neu festgelegte IP-Adresse Verbindungen zum Raspberry Pi aufgebaut werden.