eigener SSH-Based Dyndns-Dienst

Hab mich auch anstecken lassen, von diesem DynDNS-Trend und mir meinen eigenen SSH-Based DynDNS-Server gebaut.
SSH-Based heißt hier, dass die Aktualisierung nicht über eine Webseite oder so klappt, sondern dass sich der Rechner mittels SSH anmelden muss und so seine neue IP-Adresse bekannt gibt.

Voraussetzung dafür ist, dass am DNS-Server also ein SSH-Dienst läuft und der DNS-Server von außerhalb erreichbar ist.

Ich hab meine Inspirationen vom „thesysadmin“ geholt, da ich ebenfalls einen Debian-Based DNS-Server einsetze (genauer: einen raspbian :-))

So, was braucht man alles:

– bind9 als DNS-Server

– einen SSH-Server (open-ssh-server)

– einen SSH-Client (linux, oder z.B. auch Putty unter Windows).

 

Los gehts:

Zuerst wie von thesysadmin vorgeschlagen, eine Domäne (oder Subdomäne) für den DNS-Dienst herrichten. Dann die entsprechenden Keys bauen. Ich hab hier auch symetrische Schlüssel (a HMACMD5) erzeugt. Das muss man sogar, sonst gehen die hier vorgestellten Scripts nicht so.

 

Jetzt hab ich auch den Schlüssel in der Datei „/etc/bind/named.keys“ hinterlegt, genau wie bei thesysadmin angegeben.

 

So, damit waren alle Gemeinsamkeiten fertig.

 

Jetzt wird ein neuer User angelegt, nennen wir ihn mal „dynuser“.

Entsprechender Eintrag in der /etc/passwd:

dynuser::1002:1003:DynDNS service:/home/dynuser:/bin/bash

Eintrag in der /etc/group:

dynuser:x:1003:

Homeverzeichnis anlegen, Passwort setzen und Berechtigungen setzen:

mkdir ~dynuser

mkdir ~dynuser/.ssh

passwd -d dynuser

Da die Logik über SSH läuft, hab ich mir da Gewisses von Gitolite abgekuckt:

in der ~dynuser/.ssh/authorized_keys gehört das da rein (alles in eine Zeile!!)

command=“/usr/local/bin/fundd-update test“,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB…………

Nach dem „no-pty“ gehört der „normale authorized_keys“ Eintrag. also AAAB… steht hier für den Public-Key des SSH-Schlüssels.

Nach „fundd-update“ gehört der Hostnamen-Eintrag, in meinem Fall also „test“ für „test.dyn.example.com“.

 

Die Datei „/usr/local/bin/fundd-update“ sieht so aus:

#/bin/sh
#
# fundd-update
#
# starte per sudo das nsupdate
#
# Version
# V1.0, 20140705, rene@pilz.cc, initial-version

# eval my ip
IP=`echo $SSH_CLIENT|cut -f1 -d‘ ‚`

sudo /root/fundd-update-2 $1 $IP

 

Ich rufe also über sudo ein Script auf, dass dann die wirkliche Aufgabe erledigt. Hab mich zu dieser Variante entschieden, da ich so die maximale Flexibilität habe (autorized_keys ruft script auf, dass dann sudo aufruft). Das Script liegt unter root, damit es vom normalen User nicht eingesehen werden kann und es läuft auch als root, damit hat es auf sämtliche Verzeichnisse und Dateien (auch im etc-Verzeichnis) Zugriff.

Hier die /root/fundd-update-2 Datei (Wichtig! das bei SECRET=.. ist eine Zeile!

#!/bin/sh
#
# fundd-update-2
#
# fuehrt das eigentliche update durch
#
# Version
# V1.0, 20140705, rene@pilz.cc, initial-version

DOMAIN=dyn.example.com

echo „set ip for entry $1.$DOMAIN to $2“

# get password for given element
SECRET=`grep -A3 „key $1.$DOMAIN“ /etc/bind/named.keys|grep secret|cut -f3- -d‘ ‚|tr -d ‚“;’`

nsupdate << EOF
server localhost
zone $DOMAIN
key $1.$DOMAIN $SECRET
update delete $1.$DOMAIN.
update add $1.$DOMAIN. 600 A $2
send
EOF

echo „update finished, RC=$?“

Ich „grepe“ mir hier aus der /etc/bind/named.keys-Datei den entsprechenden Key raus. Da dieser Symetrisch ist, ist das auch der key, der für den dnsupdate verwendet wird.

Die anderen Parameter kommen ja aus /usr/local/bin/fundd-update, dort wurde bereits aus der ssh-session die IP-Adresse herausgelöst.

Der Update wieder sehr ähnlich dem von thesysadmin, danke nochmals dafür 🙂

 

Damit das mit dem sudo auch so funtkioniert muss noch das in die /etc/sudoers rein:

dynuser ALL = NOPASSWD: /root/fundd-update-2

 

 

Wie rufe ich das ganze jetzt auf?

Unter Linux:

ssh dynuser@dyn.example.com

Unter Windows, mit Putty:

plink -l dynuser -i keyfile.ppk dyn.example.com

Idealerweise für das keyfile.ppk kein Passwort setzen, damit man den Aufruf auch automatisieren kann.