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 Feld an 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 bei Internetzugriff auf die Fritz!Box für HTTPS aktiviert
    Daraufhin speichern, dann wird euch in der Zeile Internetadresse Ihrer FRITZ!Box eure DynDns Domain angezeigt.
    Das https:// ist für uns uninteressant, wir brauchen nur xxxxxxxxxxxxxxxxxx.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.

Niklas

Fachinformatiker für Systemintegration Microsoft AD, Exchange, Terminal Server, Citrix XenApp/Desktop, VMWare vSphere, Firewalls, Fortigate, IPFire Linux (VPN, Webserver, etc..) niklas@it-lang.eu

Ulm