Dynamisches DNS bei INWX mit eigener Domain

Ich verwalte alle meine Domains bei InterNetWorX (welcher nebenbei erwähnt, ein ziemlich schnieker Domain-Registrar ist, den ich uneingeschränkt empfehlen kann).

Dieser bietet unter anderem eine API an, mit der ich Domaineinstellungen ändern kann. Da ich meinen Homeserver gerne von außen erreichen möchte, lag die Idee nahe, beides zu kombinieren.

Mit folgendem Script, welches ich auf Github gestellt habe, ist es mir möglich, die Nameservereinstellungen automatisch so anzupassen, so dass zum Beispiel http://homeserver.meinedomain.de immer auf meinen Server im heimischen Arbeitszimmer zeigt. So bin ich unabhängig von anderen Diensten und kann ihn eben auch mit meiner eigenen Domain nutzen. Nebenbei kostet mich das alles nichts extra, da die Funktion eben bei INWX eingebaut ist.

Das Script nsupdate.sh wird auf dem Server zu Hause stündlich per cron aufgerufen. Es liest dann die WAN-IP des Anschlusses aus und vergleicht sie mit der IP, die im Nameserver für die Subdomain hinterlegt ist. Wenn sich beide unterscheiden, trägt sie die aktuelle IP per XML-Voodo in den Nameserver ein.

#!/bin/bash

# Update a nameserver entry at inwx with the current WAN IP (DynDNS)

# Copyright 2013 Christian Busch
# http://github.com/chrisb86/

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# from which site should we get your wan ip?
IP_CHECK_SITE=http://checkip.dyndns.org

source nsupdate.config

LOG=$0.log

NSLOOKUP=$(nslookup -sil $HOSTNAME - ns.inwx.de | tail -2 | head -1 | cut -d' ' -f2)
WAN_IP=`curl -s ${IP_CHECK_SITE}| grep -Eo '<[[:digit:]]{1,3}(.[[:digit:]]{1,3}){3}>'`

API_XML="nameserver.updateRecord

                  user

                     $INWX_USER

                  pass

                     $INWX_PASS

                  id

                     $INWX_DOMAIN_ID

                  content

                     $WAN_IP

"

if [ ! "$NSLOOKUP" == "$WAN_IP" ]; then
    curl -silent -v -XPOST -H"Content-Type: application/xml" -d "$API_XML" https://api.domrobot.com/xmlrpc/
    echo "$(date) - $HOSTNAME updated. Old IP: "$NSLOOKUP "New IP: "$WAN_IP >> $LOG
else
    echo "$(date) - No update needed for $HOSTNAME. Current IP: "$NSLOOKUP >> $LOG
fi

Konfiguriert wird das ganze in der nsupdate.config. Diese liegt im selber Folder, wie das Script selbst. Hier werden die Zugangsdaten für INWX angegeben. Außerdem steht hier die Subdomain, die wir für DynDNS nutzen wollen und die ID, unter welcher die Domain bei INWX geführt wird.

# nsupdate.config

# Login credentials for the inwx admin interface
INWX_USER="USERNAME"
INWX_PASS="PASSWORD"

# The hostname that you want to update and it's ID from the inwx interface
# You get the ID when you edit the given nameserver entry and hover the save button.
HOSTNAME="subdomain.example.com"
INWX_DOMAIN_ID="123456789"

Diese Lösung läuft bei mir jetzt seit einigen Monaten sehr zuverlässig. Die Aktuelle Version findest Du immer auf meiner Github-Seite. Getestet habe ich es nur auf dem Mac und FreeBSD.

18 thoughts on “Dynamisches DNS bei INWX mit eigener Domain

  1. Super Sache, vielen Dank. Was vielleicht angemerkt werden sollte: $HOSTNAME sollte geändert werden in zB $HOST_NAME, da es vorkommen kann, dass das jeweilige Gerät seinen eigenen Hostnamen verwendet anstatt den in der .config-Datei eingegebenen. Vielen Dank für dieses schöne Script!

  2. Coole Kiste, probiers gerade unter Ubuntu aus. Sieht soweit ganz gut aus, wobei der DNS Eintrag im Moment noch stimmt und somit das einloggen INWX noch nicht getestet wurde.

  3. Funktioniert das Skript noch ein Jahr nach Veröffentlichung?

    Erhalte hier eine Fehlermeldung, bin mir aber nicht sicher, ob ich das Skript falsch handhabe oder die API sich in der Zeit schon so verändert hat.

    1. Das Problem war, dass ich die Seite zum checken der IP auf SSL-only umgestellt habe, und das Script bzw. curl damit nicht klar kamen. Sollte auf GitHub gefixt sein.

      1. Hi Chris,
        habe erfreut deine Seite und das Script gefunden, leider funktioniert es nicht (mehr). Hat sie die API evtl. wieder geändert?
        Ich bekomme folgenden Error:
        faultStringparse error. not well formed.

  4. Ich habe versucht das Script mit IPv6 unter Ubuntu zu starten und bekomme aber eine Fehlermeldung.

    faultStringparse error. not well formed.

    • Closing connection 0
    • SSLv3, TLS alert, Client hello (1):
      error occurred at line 34, column 8, byte index 1067faultCode-32700

    Weiter oben sieht noch alles gut aus. An einem zu komplexen Passwort kann es nicht liegen, das hab ich schon geändert.

  5. Super Sache. Gefällt mir. Ist ja gut dokumentiert und schnell einzurichten.

    Was bei mir irgendwie nicht so ganz klappen will ist der Aufruf per cron…

    Wenn ich das .sh script direkt aus Cron starten will scheint es nicht zu funktionieren da er ein Working directory braucht wegen der Config (vielleicht könnte man den nsupdate.d ordner auch einfach mit absolutem Pfad hard coden…) files im nsupdate.d ordner.

    Also habe ich folgendes im crontab eingetragen
    (werde das minütliche Ausführen dann auf ein 5-minütliches ändern sobald es klappt..)

            • pi „cd ~/nsupdate/“ && nsupdate.sh

    Leider wird das Script nicht aufgerufen, jedenfalls ändert sich nichts am Logfile.

    Einer ne Idee was falsch ist?

    danke +vg
    Sebastian

    1. arg.. hätte ich doch noch eine Sache mehr ausprobiert 😉

      mit

      cd ~/nsupdate && ./nsupdate.sh

      scheint es zu klappen.

      Danke nochmal für das tolle script!

  6. Hallo Christian,

    super Teil. Erspart mir das lästige freedns.afraid.org, welches oft genug ausfällt.

    Zwei fragen: in der config-Datei kommt in die vorletzte Teile beispielsweise

    DOMAIN=“meinedomain.de“

    Ist das so richtig? Ich bekomme nämlich immer die Meldung „Hostname was NOT found in DNS cache“ zu anfang des Skripts, oder ist das was anderes?

    Und wie kann man beeinflussen welcher Typ einer Subdomain aktualisiert wird (A, AAAA, CNAME etc.). Ich bräuchte hier „URL“ mit einem Frame-Redirect.

    Ich finde zwar ein

    TYPE=A
    CONNECTION_TYPE=4

    In der nsupdate.sh und habe damit etwas rumgespielt, das scheint es aber nicht zu sein.

  7. Wer auch den Fehler

    * Closing connection 0
    * SSLv3, TLS alert, Client hello (1):
    error occurred at line 1, column 1, byte index 0faultCode-32700

    erhält, der sollte

    API_XML=“nameserver.updateRecord

    user

    $INWX_USER

    pass

    $INWX_PASS

    id

    $INWX_DOMAIN_ID

    content

    $WAN_IP

    durch

    API_XML=“

    nameserver.updateRecord

    user

    $INWX_USER

    pass

    $INWX_PASS

    id

    $INWX_DOMAIN_ID

    content

    $WAN_IP

    „;

    ersetzen. Dann klappt es auch mit dem Nachbarn.

    außerdem sollte als IP_CHECK_SITE (warum steht das nicht in der Config?) eine andere Seite verwendet werden, cURL hatte bei mir große Probleme das aufzurufen und lief in Timeouts. Bspw. http://showip.net

    Ansonsten danke an den Autor für das Skript (genau was ich gesucht habe)!!!
    Gruß
    Tommy

  8. Nachtrag zum letzten Kommentar (und vermutlich auch der Grund weshalb es bei mir nicht ging): In der Anzeige auf der Website werden die XML-Tags entfernt!!!

Schreibe einen Kommentar

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