Da seit einiger Zeit DynDNS keine kostenfreien Accounts mehr anbietet und mein DSL-Router keine anderen Anbieter unterstützt, musste hier eine Alternative her. Nachdem ich mich mit einigen Angeboten zu Dynamischen-DNS-Diensten im Internet auseinandergesetzt habe, bin ich beim deutschen Anbieter SPDNS gelandet. Dieser bietet den Dienst kostenlos an und hat einen Firmensitz in Deutschland.

Nun gibt es leider kein fertiges Script zum Aktualisieren, daher habe ich mir ein eigenes erstellt, was auf meiner NAS unter Ubuntu Linux läuft. Es ist in meiner Crontab eingetragen und wird alle 10 Minuten gestartet. Das Script erledigt dabei folgendes:

  • Falls vorhanden, lese die im vorherigen Aufruf ermittelte IP aus
  • Ermittele die reale externe IP mithilfe drei verschiedener, externer Dienste
  • Sofern sich die vorherige IP (sofern ausgelesen) von der ermittelten unterscheidet, melde die neue IP an die Update-Seite. Hierbei kann als zu übermittelnde IP ruhig eine Interne genommen werden, da der Update-Dienst dann die anfragende IP des Update-Aufrufs nimmt.
#!/bin/bash

ipfile=/tmp/external_ip.tmp
if [ -f $ipfile ]
then
external_ip=$(cat $ipfile)
else
external_ip=0
fi

#Use different Web services to check IP as one service could fail.
#If wget result is the IP in one line (with line-break) it's possible to call more URL's in one line
get_ip="$(wget -t 2 -T 5 -q -O- http://checkip.dyndns.org | grep IP | awk '{print $4}')
$(wget -t 2 -T 5 -q -O- "http://ipecho.net/plain")
$(wget -t 2 -T 5 -q -O- "http://icanhazip.com" "http://cfaj.freeshell.org/ipaddr.cgi")"


#See if we have duplicate results. Print out the IP with most duplicate results.
resulting_ip=$(echo "$get_ip" | uniq -c -d | sort | tail -1 | awk '{print $2}')

#Test if external IP is different from last one. If changed, then register new IP and send mail
if [ "$external_ip" != "$resulting_ip" ]
then
    echo $resulting_ip > $ipfile
    #Update spDNS service using internal IP as the service then use the correct external (requesting) IP.
    w3m -o ssl_verify_server=false -dump https://benutzername:kennwort@www.spdns.de/nic/update?"hostname=ddnshostname&myip=192.168.2.1" 2>/dev/null
fi