FritzBox 7270 als OpenVPN Client

Schon länger habe ich mit dem Gedanken gespielt, meine FritzBox 7270 als OpenVPN Client zu nutzen. Warum sich das immer wieder verschoben hatte…? Ich weiß es nicht. Vll. habe ich keine brauchbare Anleitung gefunden, vll. fehlte mir die Muße.
Nun ist es vollbracht. Meine FritzBox ist nun als OpenVPN Client an meinem OpenVPN Server angemeldet. Einzig noch fehlend: Das Netz hinter der FritzBox muss auch noch auf den OpenVPN Server zugreifen können. Das kommt aber später.

Diese Notizen/ Anleitung soll nur eine Hilfestellung geben. Es wird keine Gewährleistung oder Garantie übernommen. Weiterhin verliert man mit der Modifikation u.U. seinen Gewährleistungsanspruch an AVM.

Voraussetzung:

  • Funktionierender OpenVPN Server (setze ich hiermit voraus)
  • Linux/ UNIX Grundkenntnisse (also wie man vi bedient, cp usw.)
  • Eine FritzBox 7270 mit aktueller Firmware
  • Ein USB Stick am USB Port der FritzBox (wenige MB reichen für VPN aus)

Vorgehen:

  1. Telnet Zugang auf der FritzBox aktivieren, sollte das noch nicht geschehen sein. An einem angeschlossenen Telefon #96*7* wählen. Praktisch: In meinem ISDN Telefon wird einem noch telnetd aktiviert angezeigt.
  2. Telnet Zugang zur FritzBox testen: In einer Konsole/ Terminal telnet IP_der_FritzBox (IP_der_FritzBox ist natürlich durch die IP zu ersetzen) eingeben. Man erhält eine Passworteingabe. Gleiches wie das Passwort für die Weboberfläche.
  3. USB Stick ist an der FritzBox angeschlossen. Wohin der gemountet ist, bekommt man durch den Befehl mount raus:
    /dev/sda1 on /var/media/ftp/Generic-STORAGEDEVICE-01 type vfat (blah.....)

Der einfachste Weg, die Daten (Konfigdateien OpenVPN, Zertifikate, Startskripte) auf den USB Stick zu bekommen: USB Stick an den Rechner anschließen und über diesen die Daten auf den Stick kopieren. Alternativ kann man auch alle Daten fertig machen und zum Beispiel per wget auf der FritzBox von einem HTTP Server ziehen. Das setzt aber voraus, dass man intern im LAN einen selbigen hat bzw. seine Daten über’s Internet kopieren mag (nicht sicher und sollte man unbedingt die Finger von lassen!).

Also haben wir nun den USB Stick am Rechner angeschlossen, gemountet und können auf diesen zugreifen. Wir legen auf diesem ein Verzeichnis openvpn an. In dieses Verzeichnis kopieren wir alle nötigen Dateien und die Skripte.

Auf dem OpenVPN Server erzeugen wir die nötigen Zertifikate. (Wie das genau geht, siehe OpenVPN Howto. In Kurzform: sourcen der vars, build-key name (z.B. fritzbox) aufrufen.).
Die nun erzeugten Zertifikatsdateien fritzbox.crt, fritzbox.csr und fritzbox.key, das Diffie Hellmann Zertifikat und die Server-Zertifikatsdatei ca.crt werden in dieses Verzeichnis kopiert.
Nun noch eine Konfigurationsdatei für den Client anlegen. Wichtig hierbei: Entgegen der bisherigen Konfigurationsdateien muss ein Eintrag hinzu kommen. In der OpenVPN Client Konfiguration muss das Device mit angegeben werden. Andernfalls quittiert der openvpn Client beim Start seinen Dienst, da er das device tun nicht nutzen kann.
Als Eintrag ist dev-node /var/tmp/tun hinzuzufügen.

Eine Beispielkonfig sieht ungefähr so aus:

client # wir sind Client
dev tun #
dev-node /var/tmp/tun # Hier wird das Devide angegeben. wichtig!
proto udp # wir nutzen UDP, kein TCP
remote ip.andere.seite 1194 # die IP/ DNS Name der Gegenseite und Port
resolv-retry infinite # Namensauflösung immer
nobind # wir brauchen den Port nicht zu binden.
persist-key
persist-tun
ca ./ca.crt # Die Zertifikate (Pfadangabe muss richtig sein)
cert ./fritzbox.crt
key ./fritzbox.key
dh ./dh2048.pem
comp-lzo # Komprimierung, sofern auf der Gegenseite auch aktiv.
verb 1 # Fuer Debugging ruhig bis 8 hochsetzen.
mute 20 # Nach x Wiederholungen im Log ruhe.

Wir nennen diese Datei nun einfach mal vpnclient.conf. Diese legen wir auch in das Verzeichnis ab.
Nun fehlt uns noch die Startup Datei, die beim Booten (oder zum Testen händisch) gestartet wird. Die Datei umfasst nur wenige Zeilen:

# Skript startet den VPN Dienst.
# Wird von debug.cfg (aus dem Flash) aufgerufen
# Start des telnet Dienstes
echo telnetd wird gestartet
/usr/sbin/telnetd -l /sbin/ar7login

# wir warten und pruefen, bis Internetverbindung steht:
echo warten auf bestehende Internetverbindung
# hier wird jeweils so lange versucht,
# einen Ping erfolgreich an google
# zu schicken und bei Misserfolg gewartet
while !(ping -c 1 www.google.de); do
sleep 5
done

# tun-Device anlegen, falls noch nicht vorhanden
echo das TUN Device wird erzeugt
mknod /var/tmp/tun c 10 200

# wir geben eine Info raus, dass der VPN Dienst gestartet wird:
echo OpenVPN wird gestartet
# Wir gehen in das Verzeichnis auf dem USB Device:
cd /var/media/ftp/Generic-STORAGEDEVICE-01/vpn
# Aufruf des OpenVPN Binary mit dem Konfigurationsnamen, wird als daemon gestartet
/var/media/ftp/Generic-STORAGEDEVICE-01/vpn/openvpn --client --config vpnclient.conf --daemon

Diese Datei kann händisch ausgeführt werden oder über die debug.cfg aufgerufen werden. Mit Hilfe der debug.cfg im Flashspeicher der Fritzbox wird dieses Skript bei jedem Start ausgeführt. Wir gehen also davon aus, dass der USB Speicher immer an der FritzBox hängt und auf diesen zugegriffen werden kann. Sollte das nicht so sein, so sollte man das Skript etwas anpassen (u.a. eine Pruefung einbauen, ob /dev/sda1 vorhanden ist).
In der debug.cfg reicht es aus, einen Aufruf von startup.sh zu definieren. Mehr braucht dort eigentlich nicht rein. Alternativ kann man diese noch erweitern und jeweils /dev/sda1 auf einen festen „Platz“ mounten. Damit umgeht man das Problem, dass u.U. der Name (wir gehen von /var/media/ftp/Generic-STORAGEDEVICE-01 aus) mal anders ausfallen sollte.

# debug.cfg wird aus flash der FritzBox aufgerufen
mkdir /var/media/ftp/Generic-STORAGEDEVICE-01
mount /dev/sda1 /var/media/ftp/Generic-STORAGEDEVICE-01
/var/media/ftp/Generic-STORAGEDEVICE-01/openvpn/startup.sh

Diese Datei muss noch in den Flash „geschrieben“ werden. Einfach ein cat /pfad/zur/debug.cfg > /var/flash/debug.cfg und fertig. Nun steht dies im Flash und ist damit „rebootsave“.

Zu guter Letzt fehlt noch das OpenVPN Binary, welches ebenfalls auf dem USB Speicher vorhanden sein muss. Das ist ein Binary für MIPS. Herunterladen kann man das Binary aus dem Netz oder durch cross-compiling für MIPS selber bauen. Auf Wunsch werde ich dieses auch hier verlinken. Auf Wunsch nun auch ein Link auf das MIPS OpenVPN Binary. Herunterladen, un’gzippen und ins Verzeichnis kopieren.

Alle Daten sind auf dem USB Speicher? Alle Dateien in dem richtigen Verzeichnis? Dann kann dieser angesteckt werden. Er wird automatisch von der FritzBox gemountet und steht zur Verfügung.

Um den VPN Tunnel zu testen reicht ein Aufruf von startup.sh auf der Konsole. Der Tunnel sollte aufgebaut werden und die Gegenseite per z.B. Ping erreichbar sein. Sollte etwas nicht auf Anhieb klappen kann man das –daemon mal weglassen und gleichzeitig auf dem OpenVPN Server im Log nachsehen, was passiert. Verbose Level für diesen Zweck ruhig hochdrehen.

Das war’s. FritzBox stellt nun zuverlässig (auch nach einem Reboot) den Tunnel her. Vom VPN Server kann nun ohne Probleme auf die FritzBox zugegriffen werden. Gibt es eine Client-to-Client Einstellung, so kann jeder VPN Client ebenfalls auf die FritzBox per VPN zugreifen.

Was noch fehlt (hierzu demnächst Teil II): Routing aus dem hinter der FritzBox befindlichen Netz in das VPN Netz.

Nachtrag: Das Routingproblem mit dem Zugriff aus dem hinter der FritzBox befindlichen Netz auf das VPN Netz ist auch geklärt.
Es reicht nicht aus auf dem System, auf dem auch der OpenVPN Server läuft, eine Route in das Hinter-VPN-Client-Netz auf den VPN Client-Endpunkt zu setzen. In der Konfig des OpenVPN Servers muss auch noch ein Eintrag für die Routen vorhanden sein. Das benötigt der OpenVPN Dienst quasi für „interne Zwecke“.
Wie die Routen zu setzen sind können auch im Artikel OpenVPN Netz hinter FritzBox OpenVPN Client erreichbar machen nachgelesen werden.
/Nachtrag ENDE

Dieser Beitrag wurde unter Allgemeines, Dokus und Tipps, Linux/ UNIX, Technikspielkram abgelegt und mit , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

20 Antworten zu FritzBox 7270 als OpenVPN Client

  1. Jan sagt:

    Würde gerne BlackVPN mit meiner Fritzbox nutzen und bin auf deine Anleitung gestoßen.
    Allerdings verwendet BlackVPN kein Zertifikat zur Authentifizierung, sondern nur plain username/password. Alles was ich habe ist das ca.crt, ta.key und username+password.
    Gibt es eine Möglichkeit hiermit?
    Besten Dank vorab.

    • M3 sagt:

      Hierzu habe ich (für einen anderen Anbieter) eine [Anleitung](https://www.ipredator.se/guide/openvpn/freebsd/native) gefunden, die besagt, dass die Nutzerdaten per openvpn.auth-Datei abgelegt werden können, in der lediglich zwei Zeilen (Klartext) enthalten sind:

      1. Nutzername,
      2. Passwort.

      Diese Datei wird in die openvpn.conf wie folgt eingebunden:

      auth-user-pass /var/media/ftp/USBueckStueck-01/vpn/IPredator.auth

      Ich hoffe das hilft auch bei anderen Anbietern.

  2. Stefan sagt:

    Danke für den Anstoß, ich habe allerdings das selbe problem wie Jan. Fällt dir dazu etwas ein?

    Gruß, Stefan

  3. Michael sagt:

    Hallo!

    Entschuldige mich fuer mein Deutsch. Ich bin nur fuer 4 Monat in Deutschland

    Ich moechte gerne meine Fritz Box als VPN Client benutzen. Jetz habe ich original Firmware: FRITZ!OS 05.22 Firmware-Version: 116.05.22

    Aber wenn ich diese

    /var/media/ftp/Generic-STORAGEDEVICE-01/vpn/openvpn –client –config vpnclient.conf –daemon

    versuche zu machen, dann habe ich /var/media/ftp/Generic-STORAGEDEVICE-01/vpn/openvpn: line 1: syntax error: unexpected „(“

    Was mache ich nicht richtig?

    Danke Shoen.

    • rotzoll sagt:

      Wie sieht deine Datei aus? Vor allem, die erste Zeile. Entweder hast du zu viel in der Datei stehen oder es fehlt dir was.

      gruß,
      malte

      • Christoph sagt:

        Hi,

        vielen Dank für diese Anleitung. Ich habe schon länger nach genau dieser einer Möglichkeit gesucht, auf mein Netzwerk von zugreifen zu können!

        Leider erhalte ich den gleichen Fehler wie Michael, wenn ich OpenVPN direkt über Telnet starten will. Bei mir sieht er so aus:

        /var/media/ftp/Kingston-DataTraveler2-0-01/vpn/openvpn –client –config vpnclient.conf –daemon

        Wenn ich die gesamt sh-Datei starte, bekomme ich eine andere Fehlermeldung, nämlich “ ./startup.sh: line 24: syntax error: unexpected end of file (expecting „do“)“. Meine Datei sieht so aus:

        # Skript startet den VPN Dienst.
        # Wird von debug.cfg (aus dem Flash) aufgerufen
        # Start des telnet Dienstes
        echo telnetd wird gestartet
        /usr/sbin/telnetd -l /sbin/ar7login
        # wir warten und pruefen, bis Internetverbindung steht:
        echo warten auf bestehende Internetverbindung
        # hier wird jeweils so lange versucht,
        # einen Ping erfolgreich an google
        # zu schicken und bei Misserfolg gewartet
        while !(ping -c 1 http://www.google.de); do
        sleep 5
        done

        # tun-Device anlegen, falls noch nicht vorhanden
        echo das TUN Device wird erzeugt
        mknod /var/tmp/tun c 10 200

        # wir geben eine Info raus, dass der VPN Dienst gestartet wird:
        echo OpenVPN wird gestartet
        # Wir gehen in das Verzeichnis auf dem USB Device:
        cd /var/media/ftp/Kingston-DataTraveler2-0-01/vpn
        # Aufruf des OpenVPN Binary mit dem Konfigurationsnamen, wird als daemon gestartet
        /var/media/ftp/Kingston-DataTraveler2-0-01/vpn/openvpn –client –config vpnclient.conf –daemon

        Hast Du eine Idee, wie man das Problem beheben kann?

        Viele Grüße

        Christoph

        Meine Datei sieht so aus:

    • M3 sagt:

      Gleicher Fehler mit der bereitgestellten, vorgefertigten Binary (hier auf einer FritzBox 7390), Ausgabe egal welche Optionen übergeben werden (keine, –help oder komplett mit –client –config file.conf –daemon):

      ./openvpn: line 1: syntax error: unexpected word (expecting „)“)

      Ich sehe kein Problem in der startup.sh oder in meiner vpnclient.conf…

      Gibt es eine Idee?

      Oder gibts eventuell eine Prüfsumme/Hash für den Download :\ oder Anweisungen zum Selbstbau…

  4. No.INI sagt:

    Hallo,
    vielen Dank für diesen Beitrag. Bitte um Einschätzung, ob diese Lösung auch auf andere FB wie z.B. meine 6360 Cable anwendbar ist. Ich bin am Zweifeln, weil ich mich per getunnelte SMB an meine Netzlaufwerk an meinen gemieteten SVR verbinden will, aber eben nicht ohne VPN (unsicher) und der Server biete keine andere Möglichkeit Außer Verb. durch Zertifikat. Vielen Dank im Voraus.

  5. Ben sagt:

    Vielen Dank für deine Anleitung!

    Ich bekomme beim ausführen der startup.sh folgende Fehlermeldung.

    # sh startup.sh
    telnetd wird gestartet
    : not found line 6:
    warten auf bestehende Internetverbindung
    startup.sh: line 25: syntax error: unexpected end of file (expecting „do“)
    #

    Habt Ihr eine Idee woran das liegen könnte?
    Ich kenn mich leider nicht so in der Materie aus. Hier noch meine gesamt startup.sh

    # Skript startet den VPN Dienst.
    # Wird von debug.cfg (aus dem Flash) aufgerufen
    # Start des telnet Dienstes
    echo telnetd wird gestartet
    /usr/sbin/telnetd -l /sbin/ar7login

    # wir warten und pruefen, bis Internetverbindung steht:
    echo warten auf bestehende Internetverbindung
    # hier wird jeweils so lange versucht,
    # einen Ping erfolgreich an google
    # zu schicken und bei Misserfolg gewartet
    while !(ping -c 1 www.google.de); do
    sleep 5
    done

    # tun-Device anlegen, falls noch nicht vorhanden
    echo das TUN Device wird erzeugt
    mknod /var/tmp/tun c 10 200

    # wir geben eine Info raus, dass der VPN Dienst gestartet wird:
    echo OpenVPN wird gestartet
    # Wir gehen in das Verzeichnis auf dem USB Device:
    cd /var/media/ftp/USB-FlashDisk-01/openvpn
    # Aufruf des OpenVPN Binary mit dem Konfigurationsnamen, wird als daemon gestartet
    /var/media/ftp/USB-FlashDisk-01/openvpn/openvpn --client --config vpnclient.conf --daemon

    • rotzoll sagt:

      Kannst du mir noch mal die komplette Konfigurationsdatei von dir zukommen lassen?
      Was steht in Zeile 6. Und wo/ wie endet das Skript?

      Gruß,
      malte

  6. Dennis sagt:

    Hi,

    ich wollte unseren OpenVPN-Server in alle fritz.box Netze integrieren und habe mir deine Anleitung durchgelesen und alles auch so gemacht, doch wie die anderen bekomme ich folgende Meldung bei der Verwendung der „openvpn“ bianry:

    /var/media/ftp/USB-01/vpn/openvpn: line 1: syntax error: unexpected „(“

    Einsatz bei Fritz Box 7390, da ich selbst im IT Bereich tätig bin und da wir Software entwickeln, schließe ich nun auch jegliche Fehler zusätzlich im Bash-Skript aus, da egal mit welchen Parametern der Load der Binary nicht klappt..

    Wäre über eine Hilfe sehr dankbar! 🙂

  7. cyb0b sagt:

    Hallo,

    erstmal danke für dieses Tutorial. Habe ich das jetzt richtig verstanden, das ich damit eine VPN Verbindung in der FritzBox einstellen kann, zB von Perfect Privacy damit dann alle Geräte die am Router angeschlossen sind über diese VPN Verbindung surfen können?

    Vielen Dank 🙂

    • rotzoll sagt:

      Hej,
      ja, richtig. Wenn der Tunnel steht muss dann das Routing der FB angepasst werden. Also das Default-GW auf den Tunnel setzen, ausgenommen den VPN Host.

      Gruss,
      malte

Schreibe einen Kommentar

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