Raspberry Pi als VPN Client an Fritzbox mit ipsec

Für das offsite Backup war es vorteilhaft den Raspi per VPN in mein Netzwerk zu bekommen. Dises macht portforwarding und konfigurationen an der offsite Location unnötig.

Der bei mir eingesetze Router ist eine Fritzbox 7490

DynDNS sollte auf der FritzBox aktiviert sein, so das sie unter einer Statischen Adresse erreichbar ist. Hierfür bietet sich der MyFritz service von AVM an.

Einrichtung von VPN bei der Fritzbox

Zuerst wird unter System-> FRITZ!Box- Benutzer ein neuer User angelegt.

Hier muss der Zugang aus dem Internet gewährt werden und VPN (natürlich freigeschaltet werden, alles andere wird abgewählt.

wir merken uns die angaben aus den Iphone einstellungen:

  • Beschreibung:
  • Server:arpdggefuegr23723n.myfritz.net
  • Account:vpn_user
  • Kennwort:Kennwort des FRITZ!Box-Benutzers „vpn_user“
  • Zertifikat verwenden ist deaktiviert
  • Gruppenname:vpn_user
  • Shared Secret:TANrpS1y34hHHJGIS4
 Jetz geht es auf den Raspi weiter….

Installation:

sudo apt-get install vpnc

Config erstellen und anpassen:

sudo nano /etc/vpnc/fritzbox.conf

IPSec gateway arpdggefuegr23723n.myfritz.net
IPSec ID vpn_user
IPSec secret TANrpS1y34hHHJGIS4
IKE Authmode psk
Xauth username vpn_user
Xauth password <passwort>
local port 0
DPD idle timeout (our side) 0

erster test des tunnels:

sudo vpnc fritzbox.conf

Beenden der VPn Verbindung:

sudo vpnc-disconnect

Ich habe das starten des Scripts in der /etc/rc.local eingetragen damit die VPN verbindung beim booten aufgebaut wird.

vpnc fritzbox.conf

—- Update —-

da die VPN Verbindung teilweise unkontrolliert abbricht hat Abdelkader Wahb ein Script gemacht, das die Verbindung überwacht und bei bedarf neustartet. Das möchte ich euch nicht vorenthalten:

#!/bin/bash

# hier wird die Logfile-Datei definiert

LOGFILE=/data/log_vpnc/fritzbox.log

# hier wird die IP-Adresse von Fritzbox definiert. wenn die VPN Verbindung steht, dann sollte ping funktionieren.

myHost=“192.168.178.1″

# Wert -> wie oft soll gepingt werden

wert=4

# Ausgabe Wert für „count“ soll bei erfolgreichen ping 4 sein, bei erfolglosen ping 0.

count=$(ping -c $wert $myHost | grep ‚received‘ | awk ‚{print $4}‘)

if [ $count == 4 ]

then

# die kommenden echos sind die Info-Ausgaben in Logfile

echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost  ist erreichbar und VPN Verbindung steht“ | tee -a $LOGFILE

else

echo „“ | tee -a $LOGFILE

echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost ist nicht erreichbar“ |tee -a $LOGFILE

echo „$(date +%Y-%m-%d:%T) :VPN-Verbindung trennen“ |tee -a $LOGFILE

#hier wird das VPNC-Demon gestoppt, damit es nicht meherer im Hintergrund laufen

vpnc-disconnect

# oft ist die Wlan Verbindungen gebrochen. hier werden alle Netzwerkverbindungen neugestartet.

echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen neu starten“ | tee -a $LOGFILE

/etc/init.d/networking restart

# 10 Sekunden warten

sleep 10

# auslesen von der Wlan Ip-Adresse

ipwlan=$(ifconfig wlan0 | grep „inet Adresse“ | cut -b 24-38)

echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen wurde neugestart. WLAN IP-Adresse: $ipwlan “ | tee -a $LOGFILE

echo „$(date +%Y-%m-%d:%T) :VPN Verbindung neu aufbauen, der Skript vpnc_fritzbox starten“ | tee -a $LOGFILE

# starten von VPNC-Demon. PID und VPN-IP Adresse auslesen

vpnc fritzbox.conf

pid=$(pidof vpnc)

ipvpn=$(ifconfig tun0 | grep „inet Adresse“ | cut -b 24-38)

echo „$(date +%Y-%m-%d:%T) :Die VPN-Verbindung wurde erfolgreich aufgebaut. die VPN IP-Adresse ist: $ipvpn. VPNC-Demon ist aktiv unter id: $(pidof vpnc)“ | tee -a $LOGFILE

echo „“ | tee -a $LOGFILE

fi

 

Eintrag im /etc/crontab, damit es bei booten automatisch jede 3 Minuten durchgeführt werden:

*/3  *  * * *   root /etc/init.d/autovpncscript


Danke dafür an Abdelkader , ich werde es demnächst mal testen..

16 Gedanken zu „Raspberry Pi als VPN Client an Fritzbox mit ipsec“

  1. Hallo,
    super genau was ich suche, bin Anfänger,
    Aber bei mir wird im Script entweder die Fritzboxadresse nicht in der Variable übergeben, da der Ping erfolglos bleibt. gebe ich im Testscript Ping 192.168.178.1 ein (steht nur ping … drin), dann bekomme ich eine Antwort
    mfg
    Frank

  2. Danke für die Vorarbeit!
    Ich habe das Skript auch mal gedebugged. Vllt kann ich damit ja jemanden die Arbeit abnehmen 😉

    Folgenden Code in eine shell Datei kopieren. Folgendes Kommando dafür: sudo nano /etc/init.d/autovpnscript.sh

    ———

    #!/bin/bash

    # set -x auskommentieren für den Debug Modus. Die Ausgabe erscheint in der Kommandozeile.

    #set -x

    # hier wird die Logfile-Datei definiert
    # Logfile muss erst mit „sudo nano fritzbox.log“ am Zielort erstellt werden erstellt werden

    LOGFILE=/home/fritzbox.log

    # hier wird die IP-Adresse von Fritzbox definiert. wenn die VPN Verbindung steht, dann sollte ping funktionieren.

    myHost=192.168.178.1

    # Wert -> wie oft soll gepingt werden

    wert=4

    # Ausgabe Wert für „count“ soll bei erfolgreichen ping 4 sein, bei erfolglosen ping 0.

    count=$(ping -c $wert $myHost | grep ‚received‘ | awk ‚{print $4 }‘)

    if [ $count -eq 4 ]

    then

    # die kommenden echos sind die Info-Ausgaben in Logfile

    echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost ist erreichbar und VPN Verbindung steht“ | tee -a $LOGFILE

    else

    echo „“ | tee -a $LOGFILE

    echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost ist nicht erreichbar“ |tee -a $LOGFILE

    echo „$(date +%Y-%m-%d:%T) :VPN-Verbindung trennen“ |tee -a $LOGFILE

    #hier wird das VPNC-Demon gestoppt, damit es nicht meher im Hintergrund lauft

    /usr/sbin/vpnc-disconnect

    # oft ist die Wlan Verbindungen unterbrochen. hier werden alle Netzwerkverbindungen neugestartet.

    echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen neu starten“ | tee -a $LOGFILE

    /etc/init.d/networking restart

    # 12 Sekunden warten

    sleep 12

    # auslesen von der Wlan Ip-Adresse
    # grep Adresse muss bei Englischen Spracheinstellungen evtl. geändert werden. Mit dem Debug Modus ausprobieren

    ipwlan=$(/sbin/ifconfig wlan0 | grep „inet Adresse“ | cut -b 24-38)

    echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen wurde neugestart. WLAN IP-Adresse: $ipwlan “ | tee -a $LOGFILE

    echo „$(date +%Y-%m-%d:%T) :VPN Verbindung neu aufbauen, der Skript vpnc_fritzbox starten“ | tee -a $LOGFILE

    # starten von VPNC-Demon. PID und VPN-IP Adresse auslesen

    /usr/sbin/vpnc fritzbox.conf

    pid=$(pidof vpnc)

    ipvpn=$(/sbin/ifconfig tun0 | grep „inet Adresse“ | cut -b 24-38)

    echo „$(date +%Y-%m-%d:%T) :Die VPN-Verbindung wurde erfolgreich aufgebaut. die VPN IP-Adresse ist: $ipvpn. VPNC-Demon ist aktiv unter id: $(pidof vpnc)“ | tee -a $LOGFILE

    echo „“ | tee -a $LOGFILE

    fi

    ———

    Automatisch alle 3 Minuten

    sudo nano /etc/crontab

    Folgender Code:

    */3 * * * * root sh /etc/init.d/autovpnscript.sh >/dev/null 2>&1

  3. Hi

    Danke für die Hilfe zwei fragen habe ich noch, was muss ich genau in die rc.local Datei eintragen. Beim klappt der Autostart nicht und wie muss ich den Script zum überwachen einbinden? Bin noch ein noob.

    Danke schon mal

  4. Hallo zusammen,
    Vielen Dank für die Anleitung. Habe sie fast Erfolgreich nachbauen können. Ich habe nur das Problem wenn er dir VPN Verbindung verliert baut er keine neue mehr auf. Außer ich starte den Pi neu.

    Woran kann es liegen?
    lg

  5. Hallo,

    Vielen Dank für die Anleitung.
    Leider kann ich via SSH nicht auf den Pi zugreifen auch Ping geht nicht. Laut Protokoll sehe ich auf der Fritz!Box das die VPN Verbindung aufgebaut wurde.
    Muss ich noch irgendwas anderes Einstellen?
    LG

  6. Ich hatte Probleme mit dem Script, insbesondere da kein PATH gesetzt war. Meine Version sieht so aus:

    #!/bin/bash

    # hier wird die Logfile-Datei definiert

    LOGFILE=/var/log/fritzbox.log

    # hier wird die IP-Adresse des Gateways definiert
    myGw=“192.168.0.1″

    # hier wird die IP-Adresse von Fritzbox definiert. wenn die VPN Verbindung steht, dann sollte ping funktionieren.
    myHost=“192.168.10.1″

    # Wert -> wie oft soll gepingt werden
    wert=4
    # Ausgabe Wert für „count“ soll bei erfolgreichen ping 4 sein, bei erfolglosen ping 0.

    ########################## check lokales Netz

    count=$(ping -c $wert $myGw | grep „received“ | awk ‚{print $4}‘)

    if [ $count -eq 4 ]

    then
    # die kommenden echos sind die Info-Ausgaben in Logfile
    echo „$(date +%Y-%m-%d:%T) :Router mit der IP $myGw ist erreichbar“ | tee -a $LOGFILE
    else
    echo „“ | tee -a $LOGFILE
    echo „$(date +%Y-%m-%d:%T) :Router mit der IP $myGw ist nicht erreichbar“ |tee -a $LOGFILE
    echo „$(date +%Y-%m-%d:%T) :VPN-Verbindung trennen“ |tee -a $LOGFILE
    #hier wird das VPNC-Demon gestoppt, damit es nicht meherer im Hintergrund laufen
    /usr/sbin/vpnc-disconnect
    # oft ist die Wlan Verbindungen gebrochen. hier werden alle Netzwerkverbindungen neugestartet.
    echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen neu starten“ | tee -a $LOGFILE
    /etc/init.d/networking restart
    # 20 Sekunden warten
    sleep 20
    # auslesen von der lokalen Ip-Adresse
    ipwlan=$(ifconfig eth0 | grep „inet Adresse“ | cut -b 24-38)
    echo „$(date +%Y-%m-%d:%T) :Netzwerkverbindungen wurde neugestart. LAN IP-Adresse: $ipwlan “ | tee -a $LOGFILE
    echo „$(date +%Y-%m-%d:%T) :VPN Verbindung neu aufbauen, der Skript vpnc_fritzbox starten“ | tee -a $LOGFILE
    # starten von VPNC-Demon. PID und VPN-IP Adresse auslesen
    /usr/sbin/vpnc fritzbox.conf
    sleep 1
    pid=$(pidof vpnc)
    ipvpn=$(ifconfig tun0 | grep „inet Adresse“ | cut -b 24-38)
    echo „$(date +%Y-%m-%d:%T) :Die VPN-Verbindung wurde erfolgreich aufgebaut. die VPN IP-Adresse ist: $ipvpn. VPNC-Demon ist aktiv unter id: $(pidof vpnc)“ | tee -a $LOGFILE
    echo „“ | tee -a $LOGFILE
    fi

    ########################## check Destination Netz

    count=$(ping -c $wert $myHost | grep „received“ | awk ‚{print $4}‘)

    if [ $count -eq 4 ]

    then
    # die kommenden echos sind die Info-Ausgaben in Logfile
    echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost ist erreichbar und VPN Verbindung steht“ | tee -a $LOGFILE
    else
    echo „“ | tee -a $LOGFILE
    echo „$(date +%Y-%m-%d:%T) :Fritzbox mit der IP $myHost ist nicht erreichbar“ |tee -a $LOGFILE
    echo „$(date +%Y-%m-%d:%T) :VPN-Verbindung trennen“ |tee -a $LOGFILE
    #hier wird das VPNC-Demon gestoppt, damit es nicht meherer im Hintergrund laufen
    /usr/sbin/vpnc-disconnect
    # 10 Sekunden warten
    sleep 20
    # starten von VPNC-Demon. PID und VPN-IP Adresse auslesen
    /usr/sbin/vpnc fritzbox.conf
    sleep 1
    pid=$(pidof vpnc)
    ipvpn=$(ifconfig tun0 | grep „inet Adresse“ | cut -b 24-38)
    echo „$(date +%Y-%m-%d:%T) :Die VPN-Verbindung wurde erfolgreich aufgebaut. die VPN IP-Adresse ist: $ipvpn. VPNC-Demon ist aktiv unter id: $(pidof vpnc)“ | tee -a $LOGFILE
    echo „“ | tee -a $LOGFILE
    fi

  7. Hallo,
    Vielen Dank für die Anleitung.
    Kann mir jemand nochmal etwas genauer erklären, wie das mit dem Script funktioniert und wo ich was hinschreiben muss.?
    Vielen Dank

  8. Vielen, vielen Dank für die Hilfe!!! Endlich klappt der Verbindungsaufbau von meinem Server zur Fritzbox!

    Ich will über die VPN-Verbindung den Server mit Hilfe von Nagios (welches im Heimnetzwerk auf einem Pi läuft) überwachen, ohne einen zusätzlichen VPN-Server auf dem Server zu öffnen.

    Jetzt hab ich nur noch ein Problem:
    Ist die VPN-Verbindung zur Fritzbox aufgebaut, ist der Server nicht mehr aus dem Internet erreichbar… Hast Du eine Idee, wie ich das ändere???

    1. Moment mal, du baust von einem Server, welcher wahrscheinlich bei einem der großen Hoster steht und mit fester IP erreichbar ist, eine VPN-Verbindung zu deinem Heimnetz auf um den Server mit Nagios zu überwachen?
      Ich sag nur check_by_ssh und du kannst dir das VPN in dein Heimnetz sparen.

      1. Hallo ITSAW,

        ja richtig, der Server steht bei einem Hoster und hat eine feste IP. SSH ist nicht der präferierte Lösungsweg, da ich zum LogIn Google Authenticator nutze.

  9. Ich bekomme immer die Meldung „no response from target“
    Was mache ich falsch?
    ping zum server funktioniert. Gebe ich einen falschen Servernamen an, kommt auch eine andere Fehlermeldung.
    Verwende ich die Zugangsdaten und Schlüssel auf dem Android-Handy, funktioniert es auch, also die Konfiguration in der Fritzbox scheint richtig zu sein.

      1. Hallo, ich weis die Kommentare sind etwas älter aber immer noch hilfreich. Wer das Problem hat, dass er eine VPN Verbindung ausbauen kann aber aus dem Heimnetzwerk den Raspi nicht anpingen kann, der sollte die Netzwerkadresse des Raspi ändern. In der Fritz Anleitung steht das die Netzwerkadressen der beiden Unterschiedlich sein müssen. Das war bei mir das Problem. UMTS Router und Fritzbox hatten 192.168.1.1, das geht nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.