====== Privately owned dyndns server (sort of) and Mikrotik ======
If you constantly connect to your home network (as I do), you have, on occasion, experienced that frustrating moment when the dynamic dns service is down for whatever reason. Let’s assume that you are a person who likes to have more controll over the services you use, and have setup your private DNS server on a cheap VPS like DigitalOcean. If so, you’re at the right place.
For this to work, we will need a smarter router that can fetch http data – Mikrotik in my case, and a private DNS server on the public network hosting your domain and under your control. If you can’t access the shell, then you can’t complete this tutorial.
**Note that this isn’t very secure and I will be modifying the process to get a secure solution**
===== Setup =====
Setup a web server on your DNS server
Create a php update page
Setup Mikrotik schetuler that runs every few minutes
/tool fetch keep-result=no mode=http url="http://www.my-dns-servers-web-server.com/mikrotik/deviceupdate.php?hash=ae2b1fca515949e5d54fb22b8ed95575"
Create a shell script called dyndns.sh to update the DNS zone
#!/bin/bash
newip=$(cat /var/www/ip/doma.ip)
md5old=$(cat /var/www/ip/doma.md5)
md5new=$(md5sum /var/www/ip/doma.ip | awk '{print $1}')
if test "$md5old" = "$md5new"
then
echo "$(date) - No change" >> /var/log/dyndns
else
sed -i "s/\t.*\t; Serial$/\t$(date +%Y%m%d)00\t; Serial/" myfqdn.eu.zone
sed -i "s/^doma\t.*/doma\t\t300\tIN\tA\t$newip/" myfqdn.eu.zone
rndc reload myfqdn.eu
md5sum /var/www/ipeu/doma.ip | awk '{print $1}' > /var/www/ipeu/doma.md5
echo "$(date) - Updated IP $newip" >> /var/log/dyndns
fi
Create a cron job to run every few minutes. Run crontab -e and type
*/5 * * * * /scripts/dyndns.sh
===== How it works =====
- The router tries to access the specific web page on the web server that is located on the DNS server.
- Web server reads the IP from the router and if the hash is ok, it writes the IP into two files in the same folder
- One file for history purposes (with date and everything)
- One file with IP address only
- Cron runs a script that calculates the MD5 hash from the file containing only the IP address and compares it to the MD5 hash from before the change. If the two are different – it updates the zone file by replacing the one record and saves the new hash to a file for future comparison (so we don’t update and reload the zone all the time
- Zone is reloaded and propagated.