User Tools

Site Tools


project:dynamicdns

DIY Dynamic DNS Service

Dies ist ein einfach nutzbarer Dynamic DNS Server unterhalb der Zone dyn.<meine.domain>.

Die Aktualisierung des Eintrags geschieht ganz einfach durch den Aufruf der URL

http://dyn.example.com/dyn?digest=md5sum(HOSTNAME:AUTH)

Es wird (als Default) die absendende IP-Adresse eingetragen, das gilt gleichermassen fuer IPv6 und IPv4.

Wenn man den Parameter &ip=xxxx angibt, wird diese Adresse eingetragen:

  • fuer eine IPv4-Adresse ein DNS IN A RR
  • fuer eine IPv6-Adresse ein DNS IN AAAA RR
  • fuer alles uebrige ein DNS IN TXT RR

Beispiele:

wget -O /dev/null http://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )
wget -O /dev/null http://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )\;ip=127.0.0.1
wget -O /dev/null http://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )\;ip=offline

Der '\' vor dem Semikolon ist notwendig, damit die Shell dieses nicht als Meta-Character interpretiert

Der Dienst selbst ist nicht besonders gesichert, er kann mit SSL verwendet werden:

Beispiele:

wget -O /dev/null --no-check-certificate https://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )
wget -O /dev/null --no-check-certificate https://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )\;ip=127.0.0.1
wget -O /dev/null --no-check-certificate https://dyn.example.com/dyn?digest=$( echo -n HOSTNAME:AUTH | md5sum | awk '{print $1}' )\;ip=offline

Implementierung

angelegt:

// dynamic zone "dyn.example.com" w/ nsupdate & dyn

include "/etc/bind/dyn-key.key";

acl "update-dyn" {
    key dyn-key;
};

zone "dyn.example.com" {
      type master;
      file "/etc/bind/dyn.example.com";
      allow-update { update-dyn; };
      allow-transfer { xfer-allowed; };
};
// "dyn.example.com" END
rndc reconfig
rndc reload

HOST=dyn
KEYNAME=$HOST-key

dnssec-keygen -a hmac-md5 -b 256 -n host $HOST
awk '/^Key: / { k = $2; exit }
END {
    print "key \"'"$KEYNAME"'\" {";
    print "\talgorithm hmac-md5;";
    print "\tsecret \"" k "\";";
    print "};";

}' K$HOST.+*+*.private > $KEYNAME.key
rm K$HOST.+*+*.{key,private}

chmod g+w /etc/bind

/etc/bind/example.com.

dyn     IN      A       192.0.2.42
dyn     IN      AAAA    2001:db8::42
dyn.v4  IN      A       192.0.2.42
dyn.v6  IN      AAAA    2001:db8::42
dyn     IN      NS      ns1.example.com.
dyn     IN      NS      ns2.example.com.
rndc reload example.com

wget http://www.fischglas.de/software/dyn/dyn -O /var/www/dyn.example.com/htdocs/dyn
chmod 755 /var/www/dyn.example.com/htdocs/dyn

DOMAIN=example.com

mkdir /etc/dyn
cat > /etc/dyn/dyn.cfg << EOF
DNS.Host: 127.0.0.1
DNS.Key: (secret aus /etc/bind/dyn-key.key )
DNS.Key.Name: dyn-key
Authfile: /etc/dyn/dyn.$DOMAIN.auth
NSUpdate: /usr/bin/nsupdate
Debug: 0
EOF

cat >> /etc/dyn/dyn.$DOMAIN.auth << EOF
test.dyn.$DOMAIN:$(apg -n 1)
EOF

# fuer nsupdate:
aptitude install dnsutils 

apache config (aktuell)

/etc/apache2/sites-available/dyn.example.com.conf

        ScriptAlias /dyn /var/www/dyn.exaple.com/htdocs/dyn

apache mod_rewrite config (aktuell)

Dies ist nur erforderlich, falls man einen vorgeschalteten Proxy mit Apache betreibt, und der eigentliche Web-Service auf web01.example.com laeuft.

/etc/apache2/sites-available/proxy.example.com

	# forward ip address to "dyn" service if none given
	RewriteCond %{HTTP_HOST} '^dyn(|.v4|.v6]).example.com$'
	RewriteCond %{REQUEST_URI} ^/dyn$
	RewriteCond %{QUERY_STRING} ^digest=[0-9a-f]{32}$
	RewriteRule ^/dyn$ http://web01.v6.example.com/dyn?%{QUERY_STRING}&ip=%{REMOTE_ADDR} [P,L]
	
	# redirect "/dyn" to web01.v6 = dyn.example.com
	RewriteCond %{HTTP_HOST} '^dyn(|.v4|.v6]).example.com$'
	RewriteCond %{REQUEST_URI} ^/dyn$
	RewriteRule ^/dyn$ http://web01.v6.example.com/dyn?%{QUERY_STRING} [P,L]
	
	# forward ip address to "dyn" service if none given (legacy)
	RewriteCond %{HTTP_HOST} '^example.com$'
	RewriteCond %{REQUEST_URI} ^/dyn$
	RewriteCond %{QUERY_STRING} ^digest=[0-9a-f]{32}$
	RewriteRule ^/dyn$ http://web01.v6.example.com/dyn?%{QUERY_STRING}&ip=%{REMOTE_ADDR} [P,L]
	
	# redirect "/dyn" to web01.v6 = dyn.example.com (legacy)
	RewriteCond %{HTTP_HOST} '^example.com$'
	RewriteCond %{REQUEST_URI} '^/dyn$'
	RewriteRule ^/dyn(|\?.*)$ http://web01.v6.example.com/dyn$1 [P,L]

service apache2 reload

lighttpd config (Stand 2011-10)

/etc/lighttpd/20-example.com.conf

        cgi.assign = ( 
               ...
               "/dyn" => "",
               ...

/etc/init.d/lighttpd reload

project/dynamicdns.txt · Last modified: 2017/06/04 14:05 by 95.208.69.26