Differences

This shows you the differences between two versions of the page.

Link to this comparison view

en:ressources:articles:diy_dyn_dns [2013/08/22 16:49] (current)
Line 1: Line 1:
 +====== Do It Yourself Dyn Dns ======
 +
 +Dyndns does not propose its free service anymore. This is sad, because my verizon fios connection has a bad tendency to change its IP more often that I'd like. So I scripted a couple of cron jobs and worked around the problem with an automated root dns update.
 +
 +linuxwall.info DNS servers run on bind. Which mean we control the zone with a zone file on the root dns. That root DNS can be updated manually, or, as I'm going to show, with a couple of sed commands.
 +
 +
 +===== - Get the IP to the root DNS =====
 +
 +Step 1 is to have the server discover its new IP, and push it to the root DNS server. This is very simple to do in bash:
 +
 +<​code>​
 +#​!/​usr/​bin/​env bash
 +
 +cp /​root/​currentip.txt /​root/​lastip.txt
 +
 +curl -s -o /​root/​currentip.txt http://​ip.cow.org
 +
 +if [ "​$(md5sum /​root/​currentip.txt|awk '​{print $1}'​)"​ != "​$(md5sum /​root/​lastip.txt|awk '​{print $1}'​)"​ ]
 +then
 + echo "​$(hostname) IP has changed. old=$(cat /​root/​lastip.txt);​ new=$(cat /​root/​currentip.txt)"​
 + scp /​root/​currentip.txt dnsupdater@rootdns.linuxwall.info:​ips/​$(hostname).current
 +fi
 +</​code>​
 +
 +Get the new IP, and SCP it to the dns server.
 +
 +===== - Update the Root DNS =====
 +
 +Step 2 is a bit more tricky, because we need to parse the zone file with sed. Nothing tremendously difficult, but it's sed so be careful.
 +
 +<​code>​
 +#​!/​usr/​bin/​env bash
 +
 +MAILTO=notification@linuxwall.info
 +
 +somehostip=$(cat /​home/​dnsupdater/​ips/​somehost.current)
 +
 +if [ "​$(grep -E "​^somehost[[:​space:​]]+1h[[:​space:​]]+IN[[:​space:​]]+A[[:​space:​]]+$somehostip"​ /​etc/​bind/​linuxwall.info.db)"​ = ""​ ]
 +then
 + echo "​replacing somehost IP with new one"
 +
 + TMP=$(mktemp)
 +
 + sed -r "​s|somehost\t\t1h\tIN\tA\t(\b[0-9]{1,​3}\.){3}[0-9]{1,​3}\b|somehost\t\t1h\tIN\tA\t$somehostip|"​ /​etc/​bind/​linuxwall.info.db > $TMP
 +
 + sed -ri "​s|\t[0-9]{10};​numero de serie de la zone. Format : YYYYMMDDnn|\t$(date +%Y%m%d%H);​numero de serie de la zone. Format : YYYYMMDDnn|"​ $TMP
 +
 + diff /​etc/​bind/​linuxwall.info.db $TMP
 +
 + cp /​etc/​bind/​linuxwall.info.db{,​.bkp$(date +%Y%m%d%H)}
 +
 + cp $TMP /​etc/​bind/​linuxwall.info.db
 +
 + service bind9 restart
 +fi
 +</​code>​
 +
 +===== - Reload the slaves =====
 +
 +Step 3 is really straighforward,​ simply run rndc reload on all the slaves.
 +
 +<​code>​
 +#​!/​usr/​bin/​env bash
 +/​usr/​sbin/​rndc reload linuxwall.info 2>&1 1>/​dev/​null
 +</​code>​
 +
 +
 +Step 4: Profit! with a beer.
  
en/ressources/articles/diy_dyn_dns.txt ยท Last modified: 2013/08/22 16:49 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0