Raspberry Pi: Heimnetze mit OpenVPN verbinden

[vgwort line=“100″ server=“vg05″ openid=“3c9cf33f10c744f6a5400c3646e11d56″]

Private Netze lassen sich über Internet mit verschlüsselten Tunneln zu virtuellen Netzen verbinden. Ein gängiges Tool ist dafür OpenVPN. Zahlreiche Anleitungen beschreiben die  Einrichtung eines OpenVPN Servers sowie eines oder mehrerer  OpenVPN Clients. Die für die Verbindung benötigten Schlüssel erzeugt eine lokale CA (Certification Authority).

Um zwei Heimnetze zu verbinden ist dieser Aufwand recht hoch. OpenVPN bietet eine einfache Möglichkeit zwei Rechner mit einem gemeinsamen Schlüssel zu verbinden. Dabei gibt es keinen zentralen Server; beide Rechner sind gleichwertig. Dies ist sogar deutlich schneller, als eine Sternverbindung über einen zentralen Server.

Im Folgenden beschreibe ich, wie dies geht.

Da ich derzeit nur Debian und Raspbian verwende, muss jeder die Schritte ggf. für seine Linux Distributionen anpassen. Die Unterschied sollten gering sein.

Zuerst benötigen wir in jedem Heimnetz einen Linux-Rechner. Meine Wahl fällt auf zwei Raspberry Pi mit Raspbian. Es reichen weniger leistungsfähige Geräte, aber die Pi sollen bei mir noch andere Aufgaben im Netz übernehmen.

Materialliste

Materialliste

  • 2 x Raspberry Pi 3B + (~ 70 €)
    Zurzeit preiswerter als die älteren Modelle
  • 2 x SD-Karte 16GB (~25€)
  • 2 x Gehäuse (~ 15 €)
    nicht notwendig, aber schöner
  • 2 x USB-Netzteil e(~15 €)
    mindestens 2.000 mAh, selbst gute Geräte liefern nicht verlässlich 5 Volt, was zu Unterspannungsalarmen führt.
  • 2 x USB-Kabel mit Schalter (~ 10 €)
  • 2 x Patchkabel RJ-45 (~ 1 €)

Damit kommen wir auf etwa 135 €. Nur um die Netze zu verbinden, wäre diese ein teurer Spaß. Aber: Der Mehrwert ergibt sich daraus, dass ich das zweite Netz jederzeit komplett aus der Ferne warten und überwachen kann. Dies spart mir erheblich Zeit. Darüber hinaus nutze ich die Raspberry als Server, so dass sich der Aufwand nicht nur den Spaß und über die Verbindung der Netze  rechnet.

Für die Beschreibung setze ich ein jungfräuliches, fertig konfiguriertes Raspbian voraus. Wie dies erstellt wird, findet sich im Netz oder unter Raspberry Pi: Image modifizieren

Im ersten lokalen Netzwerk (Heimnetz 1) verbindet ein Speedport W921V das LAN mit dem Internet; im zweiten Netzwerk (Heimnetz2) eine FRITZ!Box 7330.

Das Heimnetz 1 nutzt den Adressbereich 192.168.2.0/24, das Heimnetz 2 den Adressbereich 192.168.178.0/24.

Wichtig: Beide Netze müssen unterschiedliche Adressbereiche nutzen. Gegebenenfalls müssen die Adressbereichen in einem Netz  geändert werden.

Die Standardeinstellungen der FRITZ!Box für die Adressbereiche.

Beiden Raspberry Pi müssen feste IP-Adressen zugewiesen werden. Dies geht entweder über den Router (Speedport oder FRITZ!Box) und die MAC Adresse oder auf dem Raspberry Pi in der Datei  /etc/dhcpcd.conf.

Anmerkung: Der Speedport erlaubt leider kein feste Vergabe der IP-Adresse anhand der MAC hier kann nur die Lease-Zeit auf maximal drei Wochen festgelegt werden.  Im Heimnetz 1 habe daher ich den Weg über die Konfiguration im Raspberry Pi gewählt, im Heimnetz 2 hat die FRITZ!Box dies übernommen, die allerdings auch die erste IP-Adressse vergeben hat.

Wichtig: Diese Adressen sollten dauerhaft gleich bleiben. Siehe den Haken bei der FRITZ!Box

## ... 
# Example static IP configuration: 
interface eth0
static ip_address=192.168.2.3/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.3
## ... 
Festlegung der IP-Adresse in der Fritzbox

OpenVPN nutzt von Haus aus den Port 1194 über UDP. Diesen müssen wir nun in den Routern auf den jeweiligen Raspberry Pi umleiten:

Anmerkung: Zusätzlich leite ich die Ports 22 (ssh), 80 (http) und 443 (https) um. Über SSH kann ich den entfernten Pi aus der Ferne warten. Dies ist hilfreich, wenn OpenVPN ausfällt. Über den Web-Sever lässt sich der Pi ebenfalls kontrollieren.

Portfreigaben auf der FRITZ!Box konfigurieren.
Portfreischaltungen/- umleitungen auf dem Speedport

Verbleibt eine weitere Aufgabe: Die IP-Adressen der Heimnetze 1 und 2 sind nicht fest. Sie wechseln bei einem Netz sogar täglich. Für die Verbindung brauchen wir die öffentlichen IP-Adressen der beiden Netzwerke kennen. Hierfür eignet sich ein öffentlicher DynDSN Service. Speedport und FRITZ!Box können sich bei entsprechenden Servern anmelden.

Neben einem Dutzend vordefinierten DynDNS Diensten erlaubt die FRITZ!Box eine benutzerdefinierte Einstellungen.

Die FRITZ!Box ist hier deutlich besser ausgestattet als der Speedport der Telekom.

Da ich einen VServer (diesen hier) betreibe, nutze ich meinen eigenen DynDNS, die Raspberry Pi übernehmen das Anmelden der IP Adressen.

Dazu dient der folgende  Eintrag in der Datei /etc/bind/named.conf.local

zone "dyn.byggvir.de" {
    type master;
    file "/etc/bind/zones/dyn.byggvir.de.zone";
    allow-update { key "dyn.byggvir.de." ;} ; 
    allow-transfer { acl_trusted_transfer; };
};

Die Sub-Domäne lautet dyn.byggvir.de und die beide Heimnetze bekommen die Namen h1 und h2. Für das Update der Adressen sorgt folgendes Script, das für jeden Pi angepasst werden muss und ich unter /usr/local/bin/mynsupdate ablege.

#!/bin/bash
#
# Datiert die Adresse eines Heimnetzes
#

server=ns.byggvir.de  # << insert your hostname here
zone=dyn.byggvir.de   # << insert your hostname here
host=h1               # << insert your hostname here
secret="<<your key here>>"

ipv4=$(wget -4 -q -O - http://yourip.byggvir.de/yourip.php)
ipv6=$(wget -6 -q -O - http://yourip.byggvir.de/yourip.php)

cat <<EOF | nsupdate
server $server
zone $zone.
key $zone $secret
update delete $host.$zone.
update add $host.$zone. 600 A $ipv4
update add $host.$zone. 600 AAAA $ipv6
send
EOF

Mit dem obigen Script werden die IPv4- und IPv6-Adresse über einen Eintrag in der /etc/crontab durch die Raspberry Pi regelmäßig (alle zehn Minuten) aktualisiert.

*/10 *  * * *   root    /usr/local/bin/mynsupdate

Damit dies Funktioniert muss nsupdate auf beiden Pi installiert sein. Dazu ist das Paket Dazu müssen die dnsutils installiert werden.

sudo apt install dnsutils


Nun sind die Vorbereitungen fertig. Wir können OpenVPN installieren.

sudo apt install openvpn

Der Dienst wird automatisch gestartet, ist aber noch nicht konfiguriert, so dass wir keien Tunnel sehen.

Für den Tunnel benötigen wir einen statischen Schlüssel, den wir auf einem Pi mit folgendem Befehl erzeugen und uns anzeigen können:

openvpn --genkey --secret /etc/openvpn/heimnetz.key

Nun erstellen wir die Konfigurationsdateien /etc/openvpn/heimnetz.conf für unser kleines Netz.

Heimnetz 1 auf Pi 1:

remote h2.dyn.byggvir.de 1194
dev tun
ifconfig 172.16.1.1 172.16.1.2
secret /etc/openvpn/heimnetz.key
comp-lzo 

Heimnetz 2 auf Pi 2:

remote h1.dyn.byggvir.de 1194
dev tun
ifconfig 172.16.1.2 172.16.1.1
secret /etc/openvpn/heimnetz.key
comp-lzo 

Dies ist eine minimale Konfiguration, aber: sei funktioniert. Nach dem Befehl sudo systemctl restart openvpn auf beide Raspberry Pi sollte es nun mit der Verbindung klappen.

pi@pi1:~ $ ping -c 4 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=19.8 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=19.6 ms
64 bytes from 172.16.1.2: icmp_seq=3 ttl=64 time=19.7 ms
64 bytes from 172.16.1.2: icmp_seq=4 ttl=64 time=19.8 ms

--- 172.16.1.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 19.659/19.779/19.844/0.186 ms

Wenn nicht: Fehler suchen.

Mit ungefähr 20 ms ist die Round Trip Time (RTT) nicht schlecht. Die RTT zu meinem VServer beträgt im Heimnetz 1 etwa 25 ms und im Heimnetz 2 etwa 20 ms. Würde ich die Netze über den VServer als zentralen OpenVPN-Server führen, betrüge die RTT knapp 50 ms.

IP-Routen

Nun müssen die Raspberry Pi nur noch das Netzwerk auf der anderen Seite kennen. Da der Befehl „push route“ in den Konfigurationsdateine bei mir keine Wirkung zeigt, setze ich die Routen manuell.

Pi 1:

ip route add 192.168.178.0/24 via 172.16.1.2

Für den Pi 2 müssen die Adressen entsprechend angepasst werden.

Nun müssen nur noch die Clients und die Router diese Verbindung kennen. Dies geht beim Speedport leider nicht. Die Konfigurationsmöglichkeiten des Speedport sind eher rudimentär. Statische Routen sind bein Speedport nicht möglich.

Die FRITZ!Box erlaubt eine Einstellung von statischen IPv4 Routen. Diese sind etwas versteckt über Heimnetzübersicht – Netzwerkeinstellungen – Statische Routingtabelle (Button IPv4-Routen) zu erreichen.

Auf anderen Rechnern im Netz muss diese Verbindung ebenfalls bekannt gemacht werden. Auf dem Heimnetz 1 erfolgt dies unter Linux auf der Kommandozeile temporär mit:

ip route add 192.168.178.0/24 via 192.168.2.3

Alternativ und dauerhaft im Netzwerkmanager mit:

Manuelle Einrichtung der Netzwerkkarte.
Das Netz der Gegenseite wird unter Routen hinzugefügt.

Alternativ können die Routen über DHCP verteilt werden.

Aufrechterhalten der Verbindung

Eine OpenVPN Verbindung geht gerne verloren. Wenn die temporären öffentlichen IP-Adressen geändert werden, erkennt OpenVPN dies nicht und baut die Verbindung nicht wieder auf.

Ein kleines Script unter /usr/local/bin/checkvpn, das mit root-Rechten gestartet werden muss, prüft auf beiden Raspberry Pi regelmäßig die Verbindung und startet OpenVPN bei fehlender Verbindung neu.

Hier das Script für den Pi 1.

#!/bin/bash

# Script to check the OpenVPN tunnel

COUNTERPART="172.16.1.2"        # < Insert IP-address of the other site
REMOTENET="192.168.178.0/24"    # < Insert remote network in CIDR notation

ping -qc 4 $COUNTERPART > /dev/null

if [ "$?" != 0 ]
then
  logger -i "Ping error, restarting OpenVPN"
  systemctl restart openvpn
else
  logger -i "Connection up and runing!"
fi

ip route | grep $REMOTENET > /dev/null

if [ "$?" != 0 ]
then
  # Add route to remote Network  
  ip route add $REMOTENET via $COUNTERPART
fi

BTW: Ein Vergleich der beiden DSL-Router geht eindeutig zu Gunsten der FRITZ!Box aus. Ein Speedport kommt mir nicht mehr ins Haus.

Links

  • Virtuelle Netzwerke mit Open VPN aufbauen – so geht’s ; abgerufen 17.08.2818
    pc-welt.de