DNS entries for local development using dnsmasq

Sometimes it's handy to have local DNS entries, for example when you're working on a copy of a site on your local machine - perhaps via a VM, vagrant, lxc or docker. A simple way of doing this is to add entries to your hosts file e.g.:

# local site   dev.mcdruid.co.uk

It can be a bit of pain though having to set one - or sometimes more - of these up for every new site you work on.

dnsmasq is a really useful utility for DNS and DHCP. It may well be what's providing DHCP on your router - it is on mine, which runs OpenWrt.

You can use dnsmasq to set up a wildcard DNS entry for a fake top level domain which you use for local development. For example:

# Wildcard DNS entries

That would mean dnsmasq will return A records for all domains ending in .devel pointing them at localhost:

$ dig +noall +answer example.devel
example.devel.              0       IN      A
$dig +noall +answer foo.example.devel
foo.example.devel.          0       IN      A

...which can be very handy. You can use different IPs (perhaps for a VM's network interface), and it's also possible to configure CNAME and other types of records.

You could put these entries straight into the dnsmasq config file (typically in /etc/dnsmasq.conf) - for example on your router if dnsmasq is running there and you have access to that file. You can also run dnsmasq locally.

On debian / ubuntu desktops, you'll probably find that dnsmasq is already running - and there's a handy dnsmasq.d directory into which you can drop config files which will get picked up. For example on xenial / 16.04 you can see dnsmasq running:

$ ps aux | grep dnsmasq
nobody   25133  0.0  0.0  52880  4304 ?        S    Nov02   0:02 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address= --cache-size=0 --conf-file=/dev/null --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

...and that there's a /etc/NetworkManager/dnsmasq.d directory which dnsmasq will check for config files. You can put a file called e.g. custom.conf in there. You may need to restart NetworkManager for the new config to be picked up.

Other versions may have the directory in different places - e.g. on precise / 12.04 it seems to be just plain /etc/dnsmasq.d

No more littering your hosts file with entries for every local site!