Tiny DNS server using RPi
2015-03-11
3 minutes read

I’ve got numerous headless and virtualised machines up and running at my home. Accessing them by IP address is cumbersome (I tend to remember words better than numbers) and editing your /etc/hosts file on each and every machine is also not very convenient in this case. Sure, there are solutions like mDNS/Bonjour but this also involves installing a mDNS responder on each machine and does not work great when using multiple aliases for a single machine. Instead, I just want to have a single place where I can maintain my hostnames and be able to access them across the network from every machine running a local name server. In a small environment like at my home, running a name server does not need much resources and as such a Raspberry Pi is sufficiently equipped for this task.

As distribution for my RPi, I settled for Arch Linux, even though I prefer Debian on my other servers. It appears to be very lightweight and doesn’t install lots of cruft that I do not use anyways. Following the installation instructions provides you directly with a bare minimum installation from where you can go on and install the essential missing packages (I added: vim, screen, wpa_supplicant, dnsutils and dnsmasq). Once done, we need to assign it a static IP address (the only one you should remember ;)) for which I used the default systemd-networkd service and changes the /etc/systemd/network file to something like:

[Match]
Name=eth0

[Network]
DNS=8.8.4.4
Address=10.0.1.3/24
Gateway=10.0.1.1

(Note: I use the public DNS server from Google as upstream name server, but you can use the one from your own ISP if you do not trust Google).

Next stop is the actual DNS server. I’m only interested in running a forwarding name server with the authority over a couple of hostnames. As such, running and maintaining a BIND installation is a bit of overkill for my situation. Instead, I went for Dnsmasq, which is small and easy to administer: upstream DNS servers go into /etc/resolv.conf (which is automatically maintained by systemd-networkd for you) and the hostnames go into /etc/hosts. The only thing we need is configure it a bit: create /etc/dnsmasq.d/ and create a file names dns.conf with the following content:

# DNS configuration
port=53

expand-host
domain=mydomain.com
local=/mydomain.com/

This is all there is to it! After restarting dnsmasq with systemctl restart dnsmasq, your nameserver is up and running and able to respond to all names mentioned in your /etc/hosts (you might want to replace the mydomain.com with your own domain). To test it, ask it a question like:

$ dig @localhost www.raspberrypi.org⏎

; <<>> DiG 9.9.2-P2 <<>> @localhost www.raspberrypi.org
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53177
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.raspberrypi.org. IN A

;; ANSWER SECTION:
www.raspberrypi.org. 178 IN CNAME lb.raspberrypi.org.
lb.raspberrypi.org. 178 IN A 93.93.130.39
lb.raspberrypi.org. 178 IN A 93.93.130.214
lb.raspberrypi.org. 178 IN A 93.93.128.211
lb.raspberrypi.org. 178 IN A 93.93.128.230

;; AUTHORITY SECTION:
raspberrypi.org. 1268 IN NS ns1.mythic-beasts.com.
raspberrypi.org. 1268 IN NS ns2.mythic-beasts.com.

;; Query time: 31 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Mar 11 14:02:31 2015
;; MSG SIZE rcvd: 182

All left to do is update all of your other machines to make use of this DNS server.


Back to posts