webseite bitswap.de

Server-Status

Aktiver Knoten: janus
Uptime: 92 days, 23:3
Load: : 1,83, 1,63, 1,

janus: ONLINE
bridge: ONLINE
darkmatta: OFFLINE
roland: OFFLINE
raspi: ONLINE

Webcams

Cam0
Cam1
bitswap.de:/Home/Projekte/DynDNS-Update_Skript$

DynDNS Update-Skript für Linux

Intro

Seit vielen Jahren ist der DynDNS-Dienst von DynDNS, jetzt Dyn [1] beliebt bei Privatleuten, um Geräte am eigenen Internetanschluss weltweit unter einem festen Namen, anstatt einer ständig wechselnden IP, verfügbar zu haben. Dies wird dadurch begünstigt, dass Dyn bereits bei vielen Plastikroutern vorgegeben ist, und man so keinen zusätzlichen Update-Client braucht. Da Dyn endgültig beschlossen hat, Privatkunden zu vergraulen [2], indem jetzt alle 30 Tage deren Webseite aufgerufen werden muss oder ein Abo bezahlt, bin ich von Dyn komplett abgegangen. Alternativen findet man hier auf dieser Seite.

Funktionsweise

Dyn hat eine eigene REST-API geschaffen [7], welche von diversen Webhostern wie OVH [3] oder STRATO [8] nachgebaut wird. Sie bieten einen sehr ähnlichen DynDNS-Service, der an eine von ihnen verwaltete Domain (DNS) gebunden ist. Dort kann man für die Domain im Nameserver einen speziellen DynHOST-Eintrag erstellen, welchen man dann über eine URL aktualisieren kann. Dabei erfolgt eine Authentifizierung mit Benutzer (DynHOST-Identifier), Passwort, Host (DynHOST) und IP, welche über GET übertragen werden. Dieser DynHOST-RR hat eine wesentlich kürzere TTL, damit bei einer Aktualisierung die neue IP zeitnah verfügbar ist. Es benötigt also nur noch ein Skript auf einem Client, das eine URL abruft, die vorher um die neue IP ergänzt wurde. Wer bereits eine FRITZ!Box oder ein anderes Gerät hat, auf dem man eine benutzerdefinierte Update-URL eingeben kann, der kann dies gleich benutzen. Für OVH und FRITZ!Box gibt es hier [9] eine Anleitung. Die einzutragene Update-URL ist dann:

http://www.ovh.com/nic/update?system=dyndns&hostname=<domain>&myip=<ipaddr>

STRATO scheint da schon was in der FRITZ!Box zu haben. [10] Wer keinen Plastikrouter besitzt, der sowas unterstützt, kann sich vielleicht mit einem Tool aus dem Heise Software-Center [11] oder DirectUpdate [12] helfen. Schließlich habe ich auch selber ein Skript erstellt, welches womöglich viel einfacher ist, und was nun beschrieben wird.

Informationsbeschaffung

Man benötigt natürlich seine eigene, aktuelle IP-Adresse. Es gibt verschiedene Möglichkeiten, diese zu besorgen. Möglich ist, ein kleines PHP-Script, was auf einem beliebigen Host liegt, welches die aktuelle IP zurückgibt. Das kann man dann sehr einfach mit curl auswerten. Solch ein Skript könnte so aussehen:

header('Content-Type: text/plain');
echo $_SERVER['REMOTE_ADDR'];

Auswertung im Shell-Skript könnte so erfolgen:

ip=$(curl http://example.org/ip.php)

Auch ist es möglich, die Webseite WieIstMeineIP [4] zu benutzen. Diese, und weitere Möglichkeiten findet man im Wiki des DebianForums. [5]
Zum Vergleich, welche (alte) IP der Host hat, benötigt man einen Resolver wie host, dig oder nslookup. Mittels host lässt sich die aktuelle IP des Hosts ermitteln, dass cut muss man eventuell nach Länge der IP-Adresse anpassen:

ip=$(host myhost.de | grep 'address' | cut -c 24-)

Das Skript muss anschließend periodisch ausgeführt werden. Ich halte es für sinnvoll, dies alle 2 Minuten auszuführen. Unter Linux bietet sich hier der cron-Daemon an. Ein Eintrag in der Datei /etc/crontab für zweiminütliches Ausführen sieht so aus:

*/2 * * * * user /home/user/ip_update.sh > /dev/null 2>&1

Codebeispiel

Aus diesen Vorgehensweisen hab ich nun ein fertiges Bash-Skript gebastelt, welches man für OVH benutzen kann. Download am Ende der Seite. [6]

#!/bin/bash
# OVH DynDNS IP update script

#------config---------------------

# Domain name to update
dest_host=myhost.de

# OVH DynHOST identifyer
uid=myhost-admin

# Password
pw=mypasswd

# Which method shall be used to get latest IP
# 1=own php script 2=wieistmeineip.de, 3=already active used DynDNS Service
method=2

# Select resolver for dest host
# 1=host, 2=nslookup
resolver=1

# If you want to use an own php script, type url here
skript_url=http://example.org/ip.php

# If you want to use an already active updated DynDNS Service, type hostname here
your_host=myhost.no-ip.com


#----config-end------------------

# Get (maybe old) IP of the dest host by resolver
if [ $resolver = 1 ]

then

# Edit the cut numer of characters until it fits and only shows your ip
ip_old=$(host $dest_host | grep 'address' | cut -c 24-)

elif [ $resolver = 2 ]

then

# IP address starts with 9, if not, edit it here
ip_old=$(nslookup $dest_host | grep -E 'Address: 9' | cut -c 10-)

else

echo "Use one of resolver 1-2"
exit

fi

# Get new IP by method
if [ $method = 1 ]

then

ip_new=$(curl $skript_url)

elif [ $method = 2 ]

then

ip_new=$(wget http://www.wieistmeineip.de -U "" -qO - | egrep -o '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' | uniq)

elif [ $method = 3 ]

then

# Get latest IP of your host
ip_new=$(nslookup $your_host | grep -E 'Address: 9' | cut -c 10-)

else

echo "Use one of method 1-3"
exit


fi



if [ $ip_old = $ip_new ]
then

echo "IP has not changed. Nothing to do."

else

echo "IP has changed. Will now update".
curl "http://$uid:$pw@www.ovh.com/nic/update?system=dyndns&hostname=$dest_host&myip=$ip_new"

fi

Änderungen

08.12.2013 - Strato, FRITZ!Box, andere Tools hinzugefügt

30.09.2013 - Seite erstellt