Wichtige Info

Die Inhalte, die du hier siehst stelle ich dir ohne Werbeanzeigen und ohne Tracking deiner Daten zur Verfügung. Trotzdem muss ich die Server bezahlen sowie Zeit in Recherche, Umsetzung sowie Mail Support stecken.
Um dies leisten zu können, verlinke ich in einigen Artikeln auf die Plattform Amazon. Alle diese Links nennen sich Afiliate Links. Wenn du dir mit diesem Link etwas kaufst, dann erhalte ich eine kleine Provision. Dies ändert jedoch NICHT den Preis, den du bezahlst!
Falls du mich also unterstützen möchtest, kannst du auf den Link zum Produkt klicken und hilfst mir dabei, dieses Hobby weiter zu betreiben.
Da ich Keine Werbung schalte und keine Spenden sammle, ist dies die einzige Möglichkeit, meine Systeme und mich zu finanzieren. Ich hoffe du kannst das verstehen :)



Open VPN Server aufsetzen


Vorgeschichte

Seit einigen Wochen spiele ich mit der Idee einige Daten, welche ich für meine Projekte benutze auf einen Server auszulagern, sodass Geräte auf diese zugreifen können und ich gleichzeitig auch von außerhalb diese ansehen oder bearbeiten kann.

Meine erste Idee schien für mich sehr simpel und eigentlich ‘pretty forward’:

Ich besitze eine Fritz!Box 6591, diese hat von Haus aus einen VPN Dienst integriert, jenen sollte ich also verwenden können, um mein Heimnetzwerk mit meinen Servern zu verbinden.
Mein Provider (Vodafone Kabel DE) hat mir (wie auch mittlerweile eig. allen anderen) einen DS-Lite Anschluss zugewiesen, dadurch besitzt meine Fritz!Box keine öffentliche IPv4 Adresse mehr.
Für uns natürlich kein Problem dachte ich… Nutze ich einfach nur IPv6 – meine Server sind ohnehin alle per IPv6 erreichbar und werden auch hauptsächlich über IPv6 angesprochen… Die Alternative ist für mich NAT-T (denke ich zumindest).

Schnell IPSec mithilfe von StrongSwan auf den Servern eingerichtet, PKI aufgesetzt und Zertifikate generiert, damit sich die Geräte auch ordentlich und vor allem sicher verbinden können.

Also sind wir fertig… Alles super? – Nein, leider nicht. Aus irgendeinem Grund kommt keine Verbindung zustande.
Fritz!Box geprüft, alles korrekt eingestellt denke ich… Auch die Server kontrolliert… Alles gut, aber trotzdem keine Anzeichen einer Verbindung. Die Logs angeschaut, aber auch da kommt keine Verbindung zustande.
Vielleicht liegt das Problem am DynDNS (MyFritz) – also alle Adressen statisch gemacht (sind ja zumindest 24h gültig) aber auch hier kein Erfolg.

Nach 2 Tagen trouble Shooting und kurz vor dem Nervenzusammenbruch, stoße ich auf einen Artikel von AVM (Quelle 2) in dem steht, dass die Fritz!Box kein VPN über IPv6 unterstützt…

Die ganze Arbeit umsonst, aber lesson learned – immer die technischen Spezifikationen anschauen, bevor man etwas anfängt.

Ich habe jetzt von Vodafone kostenfrei eine öffentliche IPv4 Adresse erhalten. Jetzt funktioniert VPN auch (alternativ funktioniert es aber auch über IPv4 mit DS Lite) – jedoch habe ich mich jetzt dazu entschieden, Open VPN zu verwenden, da es neben der Möglichkeit von „reinem” IPv6 auch deutlich umfangreicher konfiguriert und verwaltet werden kann.
Die Fritz!Box Geschichte vergessen wir aber nicht, das Thema werden wir in einem späteren Beitrag behandeln.


Disclaimer

Wir setzen hier gemeinsam einen OpenVPN Server auf, welcher von überall aus erreichbar ist. Durch eine fehlerhafte Konfiguration oder falsche Verwendung können Sicherheitsrisiken entstehen, welche im schlechtesten Fall zum Kontrollverlust des Server führen (wenn der OpenVPN z. B. mit root Berechtigungen läuft und ungeschützt konfiguriert werden kann).

Ich übernehme daher keine Haftung für diesen Beitrag. Das hier ist eine Anleitung, wie man einen OpenVPN Server realisieren kann, aber kein Patentrezept für die beste oder genialste Lösung.

Ansonsten viel Spaß beim Aufsetzen.



Was ist das Ziel?

Ziel des ganzen Projekts, wird es sein, per VPN auf einen Webserver zuzugreifen, welcher nicht im Internet stehen soll, zuzugreifen. Alle Heimnetzgeräte sollen per 10.0.0.1/24 auf einen Webserver mit bestimmten Daten Zugriff erhalten (diese Subprojekt ist Bestandteil eines größeren Projekts, welches ich in einem späteren Beitrag genauer beschreiben werde).

In diesem Fall haben alle Heimnetzgeräte (192.168.178.0/24) Zugriff auf den Webserver (und andere Server/Geräte im 10.0.0.0/24 Netz), aber kein Gerät aus dem 10.0.0.0/24 Netz erhält Zugriff auf unser Heimnetzwerk, da dieser für mich nicht benötigt wird und so mein Heimnetzwerk weiter geschützt bleibt. Wenn ein Gerät aus dem 10.0.0.0/24 Netz in mein Heimnetz wollen würde, verwirft das Home Gateway später dieses Paket. Es ist aber problemlos möglich, die ganze Geschichte zu ergänzen oder komplett umzudrehen (Das Heimnetz hat keinen Zugriff auf das VPN Netzwerk, aber per VPN hat man Zugriff auf das Heimnetzwerk, dafür wird das Routing einfach „gedreht”).



Was wird benötigt

Als Hardware verwende ich:

  • VPS Server (von Netcup gemietet) – dieser dient später als OpenVPN Server und beherbergt einen Webserver, auf den ich zugreifen möchte aus meinem Heimnetzwerk)
  • Einen Raspberry Pi 2 – der Raspi dient uns als VPN Gateway. Traffic aus dem Heimnetzwerk wird, wenn die Zieladresse im Netzbereich 10.0.0.0/24 liegt an den VPN Server weitergeleitet.

Verwendete Netze:

  • Heimnetz: 192.168.178.0/24 – Standard Fritz!Box Netz
  • Entferntes (Server-)Netz: 10.0.0.0/24 – diese Adresse kann nur lokal verwendet werden und wird ohnehin nicht extern geroutet.

Verwendete Software:

  • OpenVPN (Community) – (als VPN Server/Client)
  • UFW (als einfache generelle Firewall)
  • IP Tables (leitet später die Heimnetzpakete in das 10.0.0.0/24 Netz weiter).

VPN Server

Zuerst installieren wir eine kleine PKI (Public Key Infrastructure) um uns Zertifikate ausstellen und signieren zu können. Mit diesen können wir uns später gegenüber dem OpenVPN Server authentifizieren.

Im Optimalfall, wird diese CA in einer separaten VM oder einem nicht aus dem Internet erreichbaren Server aufbewahrt, aber der Einfachheit halber, installieren wir die PKI in einen Ordner unter

mkdir /opt/easyRSA && cd /opt/easyRSA

Als Nächstes laden wir uns easyRSA herunter (Quelle 3) – derzeit in Version 3.0.8

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

Danach entpacken wir easyRSA und erstellen unsere CA (Certificate Authority – diese signiert später unsere Zertifikate und gilt als “Vertrauensstelle”)

tar zxvf EasyRSA-3.0.8.tgz && cd EasyRSA-3.0.8

Um die Zertifikate korrekt auszustellen, müssen einige Daten (wie das Land) in den Zertifikaten eingefügt werden, dafür nutzen wir eine Datei von EasyRSA und passen diese an

cp vars.example vars && vi vars

Hier werden nun folgende Daten angepasst (Die Rauten (#) vor den jeweiligen Zeilen müssen entfernt werden).

set_var EASYRSA_REQ_COUNTRY "DE"set_var EASYRSA_REQ_PROVINCE "yourProvince"set_var EASYRSA_REQ_CITY "yourCity"set_var EASYRSA_REQ_ORG "yourOrg"set_var EASYRSA_REQ_EMAIL "your@mail.de"set_var EASYRSA_REQ_OU "your OU"


EasyRSA wird für uns mehrere Zertifikate erstellen, um diese zu generieren wird die SSL Suite benötigt, darum müssen wir sicherstellen, dass SSL installiert ist

openssl version

Der Output sollte z. B. so aussehen:

OpenSSL 1.1.1k 25 Mar 2021

Wenn OpenSSL installiert ist, können wir die PKI Initialisieren:

./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /opt/easyRSA/EasyRSA-3.0.8/pki

Jetzt erstellen wir die CA – dafür werden zwei wichtige Dateien generiert:

ca.crt – das öffentliche Zertifikat der CA. Mit diesem werden wir später unserem openVPN-Server mitteilen, dass er Teil des Web-of-Trust ist und unseren Zertifikaten “vertrauen” kann.

ca.key – der private Schlüssel der CA welcher zum signieren von Zertifikaten und Schlüsseln dieser CA benutzt wird:
Achtung: Dieser Schlüssel sollte privat sein!

./easyrsa build-ca nopass

Während dieses Prozesses wirst du nach einem CA Namen gefragt, hier kannst du eintragen was du willst, oder das Feld leer lassen.

Die CA ist jetzt bereit und kann für uns Zertifikate erstellen.
Als Nächstes erstellen wir einen Cert Request, um neue Zertifikate zu erstellen, um unsere Clients authentifizieren zu können. Dafür könnt ihr euch entweder auf dem Client ebenfalls easyRSA herunterladen und dort den Request erstellen oder ihr kopiert später das Zertifikat von VPN Server zum Client.

./easyrsa gen-req server nopass

Der Parameter nopass verhindert später bei Verwendung des Requests, immer ein Passwort abgefragt wird

Anschließend importieren (nur wenn Ihr auf einem anderen Server die CA habt) und signieren wir den Request (.req File) – Mein Request heißt Server, falls ihr einen anderen gewählt habt, sollte dieser natürlich angepasst werden.

./easyrsa import-req ./pki/reqs/server.req server ./easyrsa sign-req server server

Bei der Signierung müssen nur noch die Daten bestätigt werden (yes) und dann erhält man das Zertifikat.
Zuletzt erstellen wir noch einen Diffie-Hellman-Schlüssel. Dieser wird später benötigt um die Schlüssel sicher zwischen Client und Server auszutauschen.

./easyrsa gen-dh

Dieser Vorgang kann ein wenig Zeit in Anspruch nehmen.

VPN Server installieren und einrichten

Nun haben wir eine funktionierende CA inkl. unserer Zertifikate, also können wir nun den OpenVPN Server installieren und konfigurieren

apt install openvpn

Wir kopieren nun bereits alle benötigten Zertifikate der PKI zum OpenVPN Server Verzeichnis

cp ./pki/issued/server.crt /etc/openvpn/server/server.crt
cp ./pki/ca.crt /etc/openvpn/server/ca.crt
cp ./pki/private/server.key /etc/openvpn/server/server.key
cp ./pki/dh.pem /etc/openvpn/server/dh.pem


Jetzt generieren wir noch einen Key um später unsere Verbindung zu verifizieren (TLS-Auth / HMAC, wenn ihr googeln möchtet)

cd /etc/openvpn/server && openvpn --genkey --secret ta.key


Jetzt haben wir alle wichtigen Zertifikate zum grundsätzlichen Betrieb des VPN Server verfügbar, also konfigurieren wir diesen nun:

Wir kopieren als Erstes die Beispiel Server Konfiguration, in das OpenVPN Verzeichnis:

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf


In diesem könnt ihr grundsätzlich anpassen, wir ändern aber folgendes:

port 443proto tcpca /etc/openvpn/server/ca.crtcert /etc/openvpn/server/server.crtkey /etc/openvpn/server/server.keydh /etc/openvpn/server/dh.pemtopology subnetserver 10.0.0.0 255.255.255.0tls-auth /etc/openvpn/server/ta.key 0;cipher AES-256-CBCdata-ciphers AES-256-CBCdata-ciphers-fallback AES-256-CBCuser ovpn #der User muss per adduser --disabled-login erstellt werdengroup ovpnstatus /var/log/openvpn/openvpn-status.loglog-append /var/log/openvpn/openvpn.logverb 6 #Falls bei euch Fehler auftreten, werden diese im Log sehr detailgenau angezeigtmute 10;explicit-exit-notify 1

Als nächstes weisen wir den Server an, IPv4 Pakete weiterzuleiten:

sysctl -w net.ipv4.ip_forward=1

Zuletzt fügen wir noch eine Route hinzu, sodass der Server weiß, wo die Pakete aus dem 10.0.0.0/24 Netz geleitet werden müssen

ip route add 10.0.0.0/24 dev tun0

Um Benutzer erstellen zu können brauchen wir noch ein File mit den “groben” Parametern

vi /etc/openvpn/client.txt

Mit folgendem Inhalt

client
dev tun
proto tcp
sndbuf 0
rcvbuf 0
tun-mtu 1500
mssfix 1420
remote <<deine öffentliche Adresse des VPN Server>> 443
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA1
auth-nocache
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 6


Als Nächstes fügen wir nun einen Client zum VPN Server hinzu, dafür erstellen wir folgendes Script

mkdir /etc/openvpn/userControl && cd /etc/openvpn/userControl && vi userControl.sh

Script:

!/usr/bin/env bash
if readlink /proc/$$/exe | grep -q "dash"; then
echo "Bitte verwende Bash - SH funktioniert nicht"
exit
fi
if [[ "$EUID" -ne 0 ]]; then 
echo "Das Script muss als root ausgefuehrt werden!" 
exit 
fi 
newclient () 
{
 cp /etc/openvpn/client.txt ~/$1.ovpn echo "" >> ~/$1.ovpn 
cat /etc/openvpn/server/ca.crt >> ~/$1.ovpn echo "" >> ~/$1.ovpn 

echo "" >> ~/$1.ovpn sed -ne '/BEGIN CERTIFICATE/,
$ p' /opt/easyRSA/EasyRSA-v3.0.8/pki/issued/$1.crt >> ~/$1.ovpn echo "" >> ~/$1.ovpn 
echo "" >> ~/$1.ovpn cat /opt/easyRSA/EasyRSA-v3.0.8/pki/private/$1.key >> ~/$1.ovpn 
echo "" >> ~/$1.ovpn echo "" >> ~/$1.ovpn sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/server/ta.key >> ~/$1.ovpn 
echo "" >> ~/$1.ovpn } 
if [[ -e /etc/openvpn/server.conf ]]; 
then while : 
do clear echo "" echo "Bitte waehlen?" 
echo " 1) Benutzer hinzufuegen" 
echo " 2) Benutzer entfernen" 
echo " 3) UserControl schliessen" 
read -p "Option waehlen [1-3]: " option 
case $option in 1) echo echo "Benutze keine umlaute oder special characters!" 
read -p "Name: " -e CLIENT 
cd /opt/easyRSA/EasyRSA-v3.0.8/ EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full 
$CLIENT nopass newclient "$CLIENT" echo 
echo "Nutzer $CLIENT hinzugefuegt, Speicherpfad: " ~/"$CLIENT.ovpn" exit ;; 
2) 
NUMBEROFCLIENTS=$(tail -n +2 /opt/easyRSA/EasyRSA-v3.0.8/pki/index.txt | grep -c "^V") 
if [[ "$NUMBEROFCLIENTS" = '0' ]]; then 
echo echo "Keine Benutzer vorhanden!" 
exit 
fi 
echo 
echo "Welchen Benutzer moechtest du entfernen?:" tail -n +2 /opt/easyRSA/EasyRSA-v3.0.8/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') ' 
if [[ "$NUMBEROFCLIENTS" = '1' ]]; 
then read -p "Waehle einen Benutzer aus [1]: " 
CLIENTNUMBER else 
read -p "Waehle einen Benutzer aus [1-$NUMBEROFCLIENTS]: " 
CLIENTNUMBER 
fi 
CLIENT=$(tail -n +2 /opt/easyRSA/EasyRSA-v3.0.8/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$CLIENTNUMBER"p) 

echo read -p "Moechtest du den Benutzer wirklich Loeschen? $CLIENT? [y/N]: " -e REVOKE if [[ "$REVOKE" = 'y' || "$REVOKE" = 'Y' ]]; 
then 
cd /opt/easyRSA/EasyRSA-v3.0.8/ ./easyrsa --batch revoke $CLIENT EASYRSA_CRL_DAYS=3650 
./easyrsa gen-crl rm -f pki/reqs/$CLIENT.req rm -f pki/private/$CLIENT.key 
rm -f pki/issued/$CLIENT.crt 
rm -f /etc/openvpn/crl.pem 
cp /opt/easyRSA/EasyRSA-v3.0.8/pki/crl.pem /etc/openvpn/crl.pem 
chown ovpn:ovpn /etc/openvpn/crl.pem 
echo echo "Zertifikat fuer den Benutzer $CLIENT zerstoert!" 
else 
echo echo "Zertifikat fuer $CLIENT wurde nicht widerrufen!" 
fi 
exit ;; 
3) exit ;; 
esac 
done 
else 
clear 
echo "OpenVPN ist nicht installiert." 
echo "OpenVPN muss installiert sein!" 
echo "https://blog.justinritter.de" fi


Ggf. müsst ihr nun eure Firewall anpassen, um traffic aus dem Tunnel weiterzuleiten (z.B ins Internet)

Mit dem Script könnt ihr euch nun einen User erstellen. Ihr erhaltet eine .ovpn Datei, welche z. B. auch für den OpenVPN Connect Client funktionieren, jedoch ist die Konfiguration derzeit nicht kompatibel mit TLS-Auth (HMAC) – Falls Ihr auch den Android/IOS/Windows Client verwenden wollt, dann könnt ihr TLS Auth in den Configs einfach deaktivieren, dann funktioniert auch der Mobile Client.

Der Server kann nun gestartet werden und ist einsatzbereit

sudo service openvpn@server restart

Raspberry Pi einrichten

Hier ist leider ein wenig “herumspielen” gefragt, in meinem Fall habe ich einen alten Raspberry Pi 2 verwendet, diesen musste ich händisch updaten, da die Repos unter anderem zu alte SSL Versionen geführt haben. Jedoch funktioniert auch der Raspi 2 tadellos…

Zuerst installieren wir auch hier OpenVPN

apt install openvpn

Nach der Installation die Client Config kopieren

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Auch hier könnt ihr grundsätzlich alles für euch anpassen, alle Daten müssen aber mit dem VPN Server übereinstimmen – Ich ändere hier:

proto tcp
user ovpn #Benutzer kann per adduser --disabled-login erstellt werden
group ovpn
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/raspberry.crt
key /etc/openvpn/server/raspberry.key
remote-cert-tls server
tls-auth /etc/openvpn/server/ta.key 1
cipher AES-256-CBC
# Silence repeating messages
mute 10

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status /var/log/openvpn/openvpn-status.log

# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
# or the other (but not both).
;log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log



Zuletzt müssen für den Client noch alle Zertifikate kopiert werden.

Die Datei raspberry.crt entnehmt ihr dem .ovpn File -> Hier kopiert ihr das Zertifikat aus <ca> […] </ca> heraus und fügt den Inhalt in die Datei ein.
Die Datei raspberry.key wird aus dem Abschnitt <key>[…]</key> herauskopiert.
Zuletzt die Dateien ca.crt und ta.key – diese kopiert ihr vom Server und fügt sie ebenfalls in dem Ordner ein.

Zuletzt fügen wir noch eine routing Regel hinzu, sodass der RaspberryPi als Gateway fungieren kann und Nachrichten aus unserem Heimnetz (Netz 192.168.178.0/24) zu 10.0.0.0/24 übersetzt, dafür geben wir ein:

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE


Und damit der Raspberry Pi weiß, dass er den traffic für 10.0.0.0/24 durch seinen Tunnel schieben muss und nicht über die Default Route (bei mir zur Fritz!Box (192.168.178.1)) – die 10.0.0.3 müsst ihr wahrscheinlich anpassen – hier kommt die VPN Adresse des RaspberryPi’s rein (kann man unter “ip a” ansehen)

sudo ip route add 10.0.0.0/24 via 10.0.0.3 dev tun0

Nun muss der Client noch gestartet werden

sudo service openvpn@client restart

Der VPN Server erhält standardmäßig die IP 10.0.0.1 – diese IP solltet ihr nun pingen können

ping 10.0.0.1

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=5.4 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=11.9 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=8.8 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=4.5 ms
64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=9.9 ms

Falls das nicht geht, versucht zuerst einen lokalen Ping auf dem VPN Server, um zu schauen ob der IP Stack für den VPN Tunnel überhaupt funktioniert (ping 10.0.0.1) – Falls ja, könnt ihr schauen, ob euer Raspi, ebenfalls eine 10er Adresse hat ($ ip a). Falls auch dies der Fall sein sollte, könnt ihr unter

tail -f /var/log/openvpn/openvpn-status.log

den aktuellen Status minutengenau anschauen, oder unter

tail -f /var/log/openvpn/openvpn.log

den durch die Einstellung “Verb” in der Server und Client.conf sehr detailreichen Log ansehen und ggf. damit auf Fehlersuche gehen.

Besondere Achtung würde ich auf Firewall (geschlossene Ports)/ Weiterleitungsverbote (UFW, IP Tables) legen, diese haben bei meinen ersten Schritten viele Probleme gemacht.

Falls ihr eine Verbindung zum Server erhaltet (ping erfolgreich) – aber z. B. keinen Zugriff auf den Webserver erhaltet, schaut nach, dass euer Webserver auf allen Interfaces lauscht (bei Apache2 z. B. durch die Listen directive)

Fritz!Box für den Zugriff auf den VPN Tunnel konfigurieren

Falls auch andere Geräte Zugriff auf den VPN Tunnel (und Dienste im anderen Subnet) haben sollen, dann muss auch die Fritz!Box wissen, wo Pakete mit der Zieladresse im 10.0.0.0/24 Netz weitergeleitet werden müssen. Dafür wird in der Fritz!Box eine statische Route angelegt.

Zuerst muss die Weboberfläche der Fritz!Box geöffnet werden, dafür könnt ihr im Browser eingeben

http://192.168.178.1

Nach dem Login muss unter Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> Statische Routingtabelle eine IPv4 Route eingefügt werden. In unserem Fall muss in die Maske folgendes eingegeben werden:

IPv4-Netzwerk: 10.0.0.0
Subnetzmaske: 255.255.255.0
Gateway: <<Hier muss die Adresse des RaspberryPi rein>> - z.B 192.168.178.4

Zuletzt noch den Haken bei “IPv4-Route aktiv” setzen, damit die Route direkt angewendet wird und bestätigen

Die Fritz!Box leitet nun alle Pakete, die als Zieladresse eine Adresse aus dem 10.0.0.0/24 Netz haben, an das angegebene Gateway weiter. Von dort aus wird der Raspberry Pi die Pakete umsetzen und durch den Tunnel schicken (Die 192.168.178.x wird hinter dem Tunnel nicht mehr geroutet, da diese lokal ist, darum haben wir auf dem Raspberry Pi das Gateway, welches seine eigene Adresse verwendet und dem VPN Server “vorgaukelt”, dass er die Daten haben möchte). Alternativ kann dies auch auf dem VPN Server geschehen (als Prerouting rule).


Nachtrag: Verbindung in das lokale Subnet

Als Nachtrag füge ich jetzt noch die Möglichkeit hinzu, vom Server auf das Heimnetzwerk (192.168.178.0/24) zuzugreifen.

Um den Zugriff zu realisieren, muss OpenVPN zunächst wissen, dass unser Gateway (Raspberry Pi) – das 192.168.178.0/24 Netz zugänglich macht. Dafür müssen wir auf dem OpenVPN Server unter

vi /etc/openvpn/ccd/<<Zertifikatsname des RaspberryPi>>

eine Datei erstellen, mit folgendem Inhal

ifconfig-push 10.0.0.2 255.255.255.0
push "route 10.0.0.0 255.255.255.0"
iroute 192.168.178.0 255.255.255.0

“ifconfig-push 10.0.0.2 255.255.255.0” -> Weist dem Client imemr die Adresse 10.0.0.2 zu
“push “route 10.0.0.0 255.255.255.0″” -> Sagt dem Client, dass er Pakete mit dem Ziel 10.0.0.0/24 durch den VPN tunnel leiten soll
“iroute 192.168.178.0 255.255.255.0” -> Sagt dem OpenVPN Server, dass der Client, auch das Netz 192.168.178.0/24 routet und Pakete mit dem Ziel, zum GW geschickt werden sollen


Zuletzt muss in der Config noch folgendes auskommentiert werden:

#client-config-dir ccd
#client-to-client

route 192.168.178.0 255.255.255.0 10.0.0.2

Jetzt sollte der Ping in das Netz 192.168.178.0/24 möglich sein:

ping 192.168.178.4
PING 192.168.178.4 (192.168.178.4) 56(84) bytes of data.
64 bytes from 192.168.178.4: icmp_seq=1 ttl=64 time=22.7 ms
64 bytes from 192.168.178.4: icmp_seq=2 ttl=64 time=21.6 ms
64 bytes from 192.168.178.4: icmp_seq=3 ttl=64 time=23.9 ms
64 bytes from 192.168.178.4: icmp_seq=4 ttl=64 time=22.6 ms
64 bytes from 192.168.178.4: icmp_seq=5 ttl=64 time=25.3 ms

--- 192.168.178.4 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms

Quellen zum Nachlesen

Quelle 2: https://avm.de/service/wissensdatenbank/dok/FRITZ-Box-6360/1306_Sind-VPN-Verbindungen-zur-FRITZ-Box-mit-IPv6-oder-DS-Lite-moglich/

Quelle 3: https://github.com/OpenVPN/easy-rsa/releases


Back…