DynDNS mit Fritz!Box und INWX

Seit kurzem verlangt der DynDNS-Anbieter dyndns.com, dass mensch sie als Gratis-Nutzer ein mal im Monat auf deren Webseite einloggt. Ein weiterer Stein im Weg der User und bei weitem nicht der Erste. Viele Nerds scheinen inzwischen von DynDNS.com genervt. Ich auch.

DynDNS? Wer nicht weiß was das ist kann jetzt hier einen kurzen Absatz lesen: DNS bedeutet Domain Name Service und ist im Prinzip der Dienst, der aus www.google.de die eindeutige IP-Adresse des Computers macht, der die Anfragen an diese Domain bearbeitet. Wenn ich jetzt als Privatmensch oder kleine Firma selber einen Dienst für Menschen außerhalb meines Heims anbieten will habe ich ein Problem: Meine IP Adresse, bzw. die Adresse meines Routers, ändert sich jedes mal, wenn ich mich neu verbinde, dass passiert spätestens alle 24h mit der Zwangstrennung bei DSL. Wenn ich jetzt also einen Dienst für Menschen anbieten wollen würde müsste ich denen spätestens alle 24h eine neue Adresse geben und hier kommt DynDNS ins Spiel: Jedes mal wenn sich der Router neu verbindet sagt ein kleines Programm im Router einem Server die neue Adresse und dieser ändert dann diese in seinem DNS Server. Jetzt kann ich der Welt die Adresse meinzuhause.dyndns.com geben und diese ändert sich nicht mehr. Hier steht nun wie man selber so etwas baut.

Also zunächst ein mal brauchen wir ein paar Dinge:

  • Eine Fritzbox mit aktuelle Firmware, die sich im „Expertenmodus“ befindet (Einstellungen -> System)
  • Ein kleiner Server irgendwo im Internet oder ein Rechner zu Hause der immer an ist (Raspberry Pi oder so)
  • Eine Domain bei inwx.de (Kostet ab <6€ /Jahr, der Anbieter ist vollumfänglich zu empfehlen)

Auf unserem Server/Minrechner müssen wir jetzt einen kleinen Python Script bauen, der nachher quasi als Übersetzer zwischen Fritz!Box und INWX dient. Dafür gehen wir zunächst per SSH auf unseren Server:

ssh user@server
mkdir fritzinwx

Jetzt müssen wir ein virtualenvironment anlegen und das benötigte Python Paket installieren:

cd fritzinwx
pip install virtualenv
virtualenv .venv
source .venv/bin/activate
pip install bottle

Wenn das erledigt ist brauchen wir die Python 2.7 Pakete von INWX. Diese können hier runtergeladen werden (Benötigt einen Login). Die Dateien aus dem ZIP müssen auf euren Server in das angelegt fritzinwx Verzeichnis (Ich setze mal frech voraus, das ihr ne Idee habt wie das geht). Wenn das erledigt ist müsst ihr zwei Änderungen an den heruntergeladenen Dateien machen. Als erstes muss in der Datei configuration.py in der Zeile 30 folgendes geändert werden:

def get_account_data(print_errors = False, config_file = 'conf.cfg', config_section = 'ote'):

muss geändert werden in

def get_account_data(print_errors = False, config_file = 'conf.cfg', config_section = 'live'):

Außerdem muss in der Zeile 40 der Datei inwx.py folgendes geändert werden:

return apiReturn["resData"]

muss geändert werden in

if "resData" in apiReturn:
    return apiReturn["resData"]
else:
    return "done"

Die Vorbereitungen sind nun abgeschlossen, jetzt müsst ihr noch noch in der conf.cfg Datei eure Daten unter [live] eintragen. Jetzt müssen wir eine neue Datei namens fritzinwx.py anlegen, mit der dann die Fritzbox redet:

from bottle import route, run, get, request
from inwx import domrobot
from configuration import get_account_data

PASSWORD = "blafoo"

@route('/')
def index():
    newip = request.query.newip
    remotePassword = request.query.password
    if remotePassword == PASSWORD:
        api_url, username, password = get_account_data(True)
        inwx_conn = domrobot(api_url, False)
        loginRet = inwx_conn.account.login({'lang': 'en', 'user': username, 'pass': password})
        inwx_conn.nameserver.updateRecord({'id':'1234567','content':newip})
        return 'Updated IP to ', newip
    else:
        return 'No.'

run(host='0.0.0.0', port=8080, debug=False)

Ändert als erstes mal oben das Passwort auf etwas einmaliges und ruhig etwas komplizierteres. Dann müsst ihr bei updateRecord() noch die richtige ID eurer zu ändernden Subdomain eintragen. Die findet ihr raus, in dem ihr euch zum Beispiel den Source Code der inwx.de Nameserver Seite anschaut oder in dem ihr dieses kurze Script ausführt:

from inwx import domrobot, prettyprint
from configuration import get_account_data


api_url, username, password = get_account_data(True)
inwx_conn = domrobot(api_url, False)
loginRet = inwx_conn.account.login({'lang': 'en', 'user': username, 'pass': password})
result = inwx_conn.nameserver.info({'domain':'plaetzchen.cc'})
print(result)

Wenn das Script so weit angepasst ist müsst ihr es nur noch den kleinen Webserver in dem Script starten. Ich benutze dafür einfach den nohup Befehl. Wir könnten es auch anders machen, mehr dazu auf dieser Seite, für dieses Zweck reicht der normale aber eigentlich:

nohup python fritzinwx.py &

Wenn ihr jetzt die Adresse eures Server auf dem angegeben Port in einem Browser aufruft solltet ihr ein einfaches „No.“ zurückbekommen. Wenn ihr jetzt aber http://euer.server:8080/?newip=10.10.10.10&password=euerpassword aufruft solltet ihr im Browser ein OK bekommen und bei INWX sehen können, dass der Eintrag geändert wurde. Jetzt müsst ihr nur noch diese Adresse eurer Fritz!Box zeigen. Dafür geht in die Weboberfläche der Fritz!Box (http://fritz.box) und geht auf Internet -> Freigaben -> DynnamicDNS. Wählt als Anbieter „Benutzerdefiniert“ aus und tragt im Feld Update URL http://euer.server:8080/?newip=&password= ein. Jetzt müsst ihr nur noch im Passwort Feld das Passwort aus dem fritzinwx.py Script eintragen. Die Fritz!Box verlangt auch Eingaben in den anderen Feldern, es ist aber egal was drin steht, für manche Freigaben sollte allerdings bei Domain die richtige stehen. Wenn ihr jetzt eure Fritz!Box ein mal neu verbinden lasst sollte bei inwx.de eure Domain aktualisiert werden. Wenn es Probleme gibt schaut ein mal in die vom nohup Befehl angelegte Datei nohup.out auf eurem Server.

Disclaimer: Das Passwort das in eurem Script steht und genutzt wird, damit kein zufälliger Besucher eure IP ändern kann, wird unverschlüsselt über eure DSL-Leitung verschickt. Benutzt auf jeden Fall irgendein Zufalls-Passwort und keines, dass ihr irgendwo anders schon benutzt! Des weiteren ist eure Fritz!Box damit direkt aus dem Internet erreichbar, geht also sicher, dass ihr sichere Passwörter für den Zugang zu dieser nutzt und dass ihr nur Freigaben macht, die ihr auch wollt.

Was denkst du?