Software

Heimischen Raspberry Pi mit VPN Tunnel übers Internet erreichbar machen

Raspberry Pi Cluster

Du möchtest deinen Raspberry Pi über einen VPN mit deinem Server verbinden und so über das Internet erreichen können? Ich erkläre dir in diesem Beitrag wie das funktioniert.

Beim experimentieren mit Kubernetes kam ich auf die Idee meinen Raspberry Pi, der zu Hause steht, in das Cluster einzubinden. Dabei habe ich schnell festgestellt, dass ein normales Port-Forwarding mit DynDNS oder SSH-Tunneln nicht in Frage kommt: Kubernetes benötigt u.A. eine Port Range von 30.000 – 32.767 und viele weitere Ports die zugänglich sein müssen.

Da hilft nur eines: den Raspberry Pi per VPN mit meinem Server verbinden. Ich habe mich für Tinc entschieden, einen Open Source Daemon für Virtual Private Networks. Nach erfolgreichem Setup ist jeder Port des Raspberry Pis vom Server aus erreichbar und umgekehrt.

Unser Setup sieht in etwa so aus:

 

Wie funktioniert das Ganze?

Wenn du weißt wie so ein Setup funktioniert kannst du hier direkt zur Anleitung springen.

Bei unserem Setup werden alle Ports unseres Pis im Heimnetz auf dem Server zugänglich gemacht. Der VPN funktioniert ohne Portfreigaben im Router. Der VPN baut  – wie der Name Virtual Private Network schon sagt – ein virtuelles Netzwerk auf, sodass Raspberry Pi und Server sich im gleichen Netzwerk befinden. Wir verwenden zwei private IP-Addressen die wir dem Pi und dem Server in diesem virtuellen Netzwerk zuweisen. Wenn alles eingerichtet ist, können wir den Server auf dem Pi unter der IP 10.0.0.1 und den Pi auf dem Server unter 10.0.0.2 erreichen, so als wären beide in einem gemeinsamen Netzwerk.

Vorraussetzungen

  • Einen eigenen Server mit Linux, einer festen IP und SSH-Zugang
  • Einen Raspberry Pi, Odroid oder sonstigen Linux-Computer der in deinem Heimnetz läuft

 

Installation und Einrichtung des Raspberry Pi VPN Dienstes

Tinc VPN auf dem Server und Computer zu Hause installieren

Tinc Konfiguration auf dem Server anlegen

    1. Öffne  /etc/tinc/tinc.conf mit einem Texteditor
    2. Füge folgenden Inhalt in die Datei ein:

      Damit sagen wir Tinc, dass der Server „server“ heißt, IPv4 verwendet und auf dem Interface tun0  läuft
    3. Tinc Start und Stop-Skripte anlegen
      1. Öffne /etc/tinc/tinc-up und füge folgenden Inhalt ein:

        Hier setzen wir die IP-Addresse über die der Server im VPN-Netzwerk erreichbar sein wird auf 10.0.0.1
      2. Öffne /etc/tinc/tinc-down und füge folgenden Inhalt ein:
      3. Beide Skripte ausführbar machen:
    4. Schlüssel für den Server generieren
    5. /etc/tinc/hosts/server  mit Texteditor bearbeiten und um IP-Addresse des Servers und Subnet erweitern:

Konfiguration auf dem Raspberry Pi zu Hause anlegen

    1. Öffne /etc/tinc/tinc.conf mit einem Texteditor
    2. Füge folgenden Inhalt in die Datei ein:

      Damit sagen wir Tinc, dass der Pi „home“ heißt, IPv4 verwendet und auf dem Interface tun0  läuft. Zudem wird mit ConnectTo  festgelegt, dass sich Tinc mit dem Server „server“ verbinden soll
    3. Tinc Start und Stop-Skripte anlegen
      1. Öffne /etc/tinc/tinc-up und füge folgenden Inhalt ein:

        Hier setzen wir die IP-Addresse über die der Pi im VPN-Netzwerk erreichbar sein wird auf 10.0.0.2
      2. Öffne /etc/tinc/tinc-down und füge folgenden Inhalt ein:
      3. Beide Skripte ausführbar machen:
    4. Schlüssel für den Server generieren
    5. /etc/tinc/hosts/home  mit Texteditor bearbeiten und Subnet erweitern:

Server und Home miteinander bekannt machen

    1. Die Datei /etc/tinc/hosts/home  vom Pi auf den Server nach /etc/tinc/hosts/home  kopieren
    2. Die Datei /etc/tinc/hosts/server  vom Server auf den Pi nach /etc/tinc/hosts/server  kopieren
    3. Auf beiden Geräten mit tincd  Tinc starten.
    4. Fertig!

Du solltest nun auf deinem Server den Pi zu Hause mit ssh pi@10.0.0.2  und auf dem Pi den Server mit  ssh root@10.0.1  erreichen können. Wenn etwas nicht funktioniert hat kannst du Tinc mit tincd -D starten um Debug-Informationen zu erhalten.

Service auf dem Raspberry Pi im Heimnetz aus dem Internet erreichen

Wenn du jetzt z.B. dein PiHole aus dem Internet ansteuern möchtest ist das ganz einfach: Da der Pi jetzt auf allen Ports auf unserem Server unter 10.0.0.2  erreichbar ist, können wir z.B. mit Nginx oder Apache per Virtual-host auf einen Port auf unserem Pi zugreifen:

Tinc VPN beim Neustart mitstarten

Unter Debian bzw. Raspbian ist Tinc bei mir nicht beim Booten mitgestartet. Ich habe systemd verwendet und einen Tinc-Service aufgebaut:

  1. Öffne /etc/systemd/system/mytinc.service  und füge folgendes ein (funktioniert auf dem Pi und Server gleichermaßen):
  2. Services neu laden und den Tinc-Service aktivieren

Fazit

Ich bin mit diesem Setup wirklich sehr zufrieden. Keine nervigen Portfreigaben mehr in der FritzBox oder SSH-Tunnel die immer wieder neu konfiguriert werden müssen. In meinem Fall war es für Kubernetes unumgänglich, aber jedes andere Setup bei dem man einen Dienst auf den Pi im Heimnetzwerk aus dem Internet erreichen will ist hiermit einfach und zuverlässig eingerichtet.

Eure Fragen beantworte ich gerne in den Kommentaren!

Ähnliche Beiträge:

Kommentare (5)

  1. Hallo,

    Ich habe mir mehrere Anleitungen z.B. mit StragSwan angeschaut aber Tinc ist genau für diesen Zweck optimal und einfach einzurichten.

    Den ersten Schritt solltest du ändern auf 1.Öffne /etc/tinc/tinc.conf mit einem Texteditor

    Läuft bei mit auf Buster und RapberryOS auch nach einem Neustart ohne dazu tun.

  2. Servus,
    habe den VPN nach Anleitung installiert. Von Hand starten und er funktioniert.
    Bei der Anleitung „Tinc VPN beim Neustart mitstarten“ kommt bei Eingabe von „sudo systemctl enable mytinc.service“ folgender Fehler.
    The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
    Alias= settings in the [Install] section, and DefaultInstance= for template
    units). This means they are not meant to be enabled using systemctl.

    Possible reasons for having this kind of units are:
    * A unit may be statically enabled by being symlinked from another unit’s
    .wants/ or .requires/ directory.
    * A unit’s purpose may be to act as a helper for some other unit which has
    a requirement dependency on it.
    * A unit may be started when needed via activation (socket, path, timer,
    D-Bus, udev, scripted systemctl call, …).
    * In case of template units, the unit is meant to be enabled with some
    instance name specified.

    Hatte das schon jemand?

    Pi4 und Debian bullseye

Schreibe einen Kommentar