IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi
In diesem Beitrag gehe ich darauf ein wie man zwischen einer IPFire und einem Raspberry Pi eine OpenVPN Netz-zu-Netz-Verbindung herstellt.
Mein Anwendungszweck
Vorweg ich habe Zuhause eine Fritz!Box und habe auch nicht vor mir eine IPFire Hardware-Appliance anzuschaffen, weil ich für mich persönlich keinen Mehrwert darin sehe, welcher die ca. 200€ teure Hardware rechtfertigen würde.
Ich betreibe eine virtualisierte Serverumgebung hinter einer IPFire und möchte auf diese zugreifen können, ohne jedes mal die VPN-Verbindung von meinem PC aus aufbauen zu müssen.
Vorbereitung
- RaspberryPi mit Raspian und root Zugriff
- Fritz!Box o.ä. (Muss Port Forwarding und statisches Routing beherrschen, ggf. DynDNS)
- root Zugriff auf die IPFire (mit statischer öffentlicher IP-Adresse) und OpenVPN Server konfiguriert
Anmerkung
Anstatt des Raspberry PI’s kann auch ein (alter) PC mit Debian o.ä. benutzt werden.
Theorie
Wir haben auf der einen Seite eine IPFire (in meinem Fall virtuell).
Red0 ist als externes Interface konfiguriert, mit einer öffentlichen IP-Adresse. An green0 liegt das lokale Netz mit der Netzadresse 10.0.0.0/24 an.
Auf der anderen Seite einen Raspberry PI hinter einer Fritz.Box. Ankommende TCP und UDP Pakete bei der Fritz!Box auf Port 1195 werden an den Pi geforwarded. Anschließend wird eine statische Route eingetragen welche darauf verweist das alle Pakete mit dem Ziel 10.0.0.0/24 an den Pi geschickt werden.
Nach erfolgreicher Konfiguration werden die Pakete folgenden Weg nehmen:
PC ➔ Fritz!Box ➔ Raspberry PI –Open VPN Tunnel➔ IPFire ➔ Ziel
Rückweg:
Quelle ➔ IPFire –OpenVPN Tunnel ➔ Raspberry PI ➔ PC
Die lokalen IP-Adressbereiche werden im jeweils anderen LAN geroutet.
Kein Source-NAT etc…
RaspberryPi
Zunächst benötigt der Pi eine statische IP-Adresse, dies kann über 2 Methoden realisiert werden
-
Statische IP-Adresse am Pi festlegen
bash:~$ nano -w /etc/network/interfces
-
Den Inhalt der Datei durch folgenden ersetzen:
auto lo eth0 iface lo inet loopback iface eth0 inet static address 192.168.2.100 netmask 255.255.255.0 network 192.168.2.254 broadcast 192.168.2.255 gateway 192.168.2.1
Anmerkung: Die Adressen sind entsprechend anzupassen.
- DHCP anweisen diesem Gerät jedes mal die gleiche IP-Adresse zuzuweisen (Beispiel FRITZ!Box)
- Webinterface der FRITZ!Box aufrufen (fritz.box)
- Heimnetz ➔ Netzwerk
In dieser Liste dann den Pi heraussuchen, er sollte am Hostname erkennbar sein.
Dann diesen Eintrag bearbeiten und den Haken bei Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.
setzen.
Anschließend wird noch die Paketliste aktualisiert und OpenVPN + Screen installiert. Dies erledigen wir mit folgendem Befehl:
bash:~$ apt-get update && apt-get install openvpn screen -y
Zuletzt und ganz wichtig muss im Kernel noch das Routing aktiviert werden. Dazu öffnen wir die Kernel Konfigurationsdatei:
bash:~$ nano -w /etc/sysctl.conf
Fügen folgende Zeile hinzufügen:
net.ipv4.ip_forward = 1
Und dann die Konfiguration des Kernels neu laden mit folgendem Befehl:
bash:~$ sysctl -p /etc/sysctl.conf
Fritz!Box
Nun passen wir unsere Fritz!Box (o.ä.) an, ich werde nur auf die Konfiguration bei der Fritz!Box eingehen.
- Was muss getan werden?
- Statische Route
- Port-Forwarding
- Falls benötigt DynDNS
Beginnen wir mit dem Routing.
Wozu statisches Routing?
Weil, alle Clients im Heimnetzwerk als Gateway die Fritz!Box angegeben haben. Nun möchten wir an unserem PC z.B. eine SSH-Verbindung zu unserer IPFire herstellen.
Wir geben in unserem SSH-Klienten unsere Ziel-IP ein z.B. 10.0.0.1 nun sieht der PC „Hey, das Ziel befindet sich nicht in meinem LAN, also ab zum Standardgateway (Fritz!Box) mit meinem Paket“.
Genau hier tritt das statische Routing ein, dadurch weiß nämlich die Fritz!Box „Hey, das schicke ich nicht ins Internet, sondern zu der und der IP (in unserem Fall der Raspberry Pi)“.
Dann ist unser Paket dort angelangt wo es hin soll.
Alternativ kann man auch eine statische Route am PC eintragen und diese mit einem Script bei jedem Start des PC’s ausführen lassen, aber wir machen es mit statischem Routing an der Fritz!Box, somit kommt man auch wenn man mal am Laptop ist überall drauf ohne Routen einzutragen.
Nach so viel Theorie ab zur Praxis!
Port-Forwarding
Unser Pi muss unter den öffentlichen IP-Adresse der Fritz!Box erreichbar sein, deshalb leiten wir Port 1195
TCP
und UDP
auf den Pi.
- Webinterface der FRITZ!Box aufrufen (fritz.box)
- Internet
- Freigaben
- Neue Portfreigabe
Das Feldan Computer
anpassen, dort müsst Ihr den Hostnamen eures PI’s her raussuchen, die IP-Adresse wird dann automatisch angepasst.
Selbiges dann nochmal für TCP.
Dyn-DNS
Dynamic-DNS ist von Nöten wenn ihr keine statische IP-Adresse besitzt. Wenn ihr euch sicher seit, dass ihr eine statische IP-Adresse habt dann könnt ihr diesen Part überspringen.
FritzOS bringt von Haus aus einen DynDns mit um diesen zu aktivieren geht man wie folgt vor:
- Webinterface der FRITZ!Box aufrufen (fritz.box)
- Internet
- Freigaben
- Fritz!Box-Dienste
- Internetzugriff
Dort setzt Ihr den Toggle beiInternetzugriff auf die Fritz!Box für HTTPS aktiviert
Daraufhin speichern, dann wird euch in der ZeileInternetadresse Ihrer FRITZ!Box
eure DynDns Domain angezeigt.
Dashttps://
ist für uns uninteressant, wir brauchen nurxxxxxxxxxxxxxxxxxx.myfritz.net
.
IPFire
-
Webinterface der IPFire öffnen
-
Dienste
-
OpenVPN
-
Hinzufügen
Wir wollen eine Netz zu Netz Verbindung, also klicken wir dementsprechend den RadioButton und anschließend auf hinzufügen.
Danach muss die Verbindung konfiguriert werden. -
Name: Wie gewünscht, in den Beispielen verwende ich den Namen „n2n“
-
Konfiguriert als: OpenVPN-Server
-
Lokales Subnet: Ist das Subnet in der sich die IPFire befindet
-
OpenVPN Subnet: Kann frei gewählt werden (darf sich aber nicht mit Lokalen- oder Remotesubnet überschneiden)
-
Ziel-Port: 1195
-
Remote Host/IP: Statische externe IP der Fritz.Box oder DynDyn der Fritz.Box (xxxxxxxxx.myfritz.net)
-
Remote Subnet: Subnet in dem sich euer Pc und eure Fritz.Box befindet
-
Protokoll: UDP
-
Management Port: 1195
Daraufhin speichern. Ihr sehr dann die OpenVPN Oberfläche. Jetzt ladet ihr das Clientpaket in .ZIP Form herunter und entpackt es. Dann habt ihr 2 Dateien (n2n.conf und n2n.p12), welche ihr auf Pi kopiert. Dies kann mit FileZilla oder jedem anderen beliebigen SFTP Klienten gemacht werden. Ich habe mir in /etc/openvpn ein Ordner n2n angelegt und dann diese beiden Dateien dort abgelegt.
Nun starten wir eine SSH-Verbindung zum Pi und loggen uns ein.
bash:~$ cd /etc/openvpn/n2n
bash:~$ openssl pkcs12 -in XXX.p12 -clcerts -nokeys -nodes -out user.pem
bash:~$ openssl pkcs12 -in XXX.p12 -nocerts -nodes -out key.pem
bash:~$ openssl pkcs12 -in XXX.p2 -cacerts -nodes -out ca.pem
Anschließend editieren wir das Config-File:
bash:~$ nano -w n2n.conf
Ihr ersetzt das
pkcs12 n2n.p12
Durch
ca /etc/openvpn/n2n/ca.pem
cert /etc/openvpn/n2n/user.pem
key /etc/openvpn/n2n/key.pem
Und setzt ein #
vor folgende Zeilen um diese auszukommentieren, damit diese wie folgt aussehen
#user nobody
#group nobody
#daemon XXXX
#writepid /var/run/XXX.pid
Das Ganze speichern STRG
+ O
& STRG
+ X
zum Schließen.
Wir haben oben die Zeilen auskommentiert, die diese Verbindung als Deamon gestartet hätte.
Warum?
Weil wir sie dann im Screen starten um so auch zu sehen was passiert. (Erleichtert vor Allem das Troubleshooting um einiges falls was nicht funktioniert.)
Dazu schreiben wir ein Bash Script:
bash:~$ nano -w vpnconnect.sh
#!/bin/bash
modprobe tun
screen -AmdS N2NVPN openvpn --config /etc/openvpn/n2n/n2n.conf
Wenn ihr wollt das eure Verbindung immer beim Start des Pi’s aufgebaut wird ist der einfachste und schnellste Weg ein /etc/rc.local Eintrag.
bash:~$ nano -w /etc/rc.local
In der Text-Datei einfach eine Zeile über exit 0
folgendes schreiben:
bash:~$ /etc/openvpn/n2n/vpnconnect.sh
Das Ganze speichern STRG
+ O
& STRG
+ X
zum Schließen.
Das Script ausführbar machen:
bash:~$ chmod +x vpnconnect.sh
Damit wäre die Konfiguration geschafft.
Verbindung aufbauen
Zum einen müsst ihr am Pi die Client Seite starten:
bash:~$ ./etc/openvpn/n2n/vpnconnect.sh
Zum Anderen unter IPFire Webfrontend ➔ Dienste ➔ OpenVPN den Toggle der Standortverbindung setzten. Um zu überprüfen was geschieht kann man dann den Screen am Pi öffnen. Ist der Verbindungsaufbau erfolgreich kann man noch einmal den jeweils anderen Router/Firewall anpingen um die Funktion noch zu überprüfen. Ansonsten kann man aus dem Screen Informationen auslesen, welche zur Problemlösung beitragen.