Setting up a DNS-server on Ubuntu 16.04



If you have a “normally complex” network at home, You usually have an internet router which takes care of DNS-resolutions.

However the downside is that you wont get “local” names resolved, like a local test domain (mydomain.test) or internal names of your servers.

If you use Windows you solve part of the problem using Wins, but thats a very limited solution to a very complex problem.

Instead you should setup your own DNS server. On Ubuntu it is called BIND9 for some reason. You let this server resolve everything that it has in its cache, and forwards request to the internet router, and further on to the ISP’s dns server in turn.

The benefit is, apart from the local names/domain, that you gain a speedup if the DNS-name exists in your cache. It’s not a huge gain, but it all adds up.


sudo apt-get install bind9


If you look at the files under /etc/bind, you will see a main config file named.conf which will include named.conf.options, named.conf.local and named.conf.default-zones.

(We see here the name confusions between NAMED and BIND9)

Start by editing named.conf.options.

Inside the options block, make sure you have a block like this:

forwarders {; 

This will ensure that DNS-names that your server can’t resolve will be forwarded to the internet router.

Next step would be to edit the named.conf.local

First we define a zone (domain) mydomain.local. I choose an .local extension that doesnt exist (I believe?!) to avoid shadowing a real internet domain.

zone "mydomain.local" { 
  type master; 
  file "/etc/bind/db.mydomain.local"; 

To avoid confusion later, the file name should should have a name that corresponds to the domain name.

Next, we define the reverse lookup zone. If your network is 192.168.0.* the definition should look like this:

zone "" {
  type master;
  notify no; 
  file "/etc/bind/db.192"; 

Now it’s time to edit the files we referenced earlier.


; BIND data file for local loopback interface 
$TTL 604800 
@ IN SOA ns.mydomain.local. root.localhost. ( 
    2       ; Serial 
    604800  ; Refresh 
    86400   ; Retry 
    2419200 ; Expire 
    604800) ; Negative Cache TTL 


@ IN NS ns.mydomain.local. 
@ IN A 
@ IN AAAA ::1 

router  IN A 
dev     IN A 
macbook IN A 
imac1   IN A 
imac2   IN A 
alpha   IN A 
nas     IN A

and the reverse-lookup zone:

; BIND reverse data file for local loopback interface
$TTL 604800
@ IN SOA localhost. root.localhost. (
     1 ; Serial
     604800  ; Refresh
     86400 ; Retry
     2419200 ; Expire
     604800 ) ; Negative Cache TTL

 @ IN NS ns.mydomain.local
 1 IN PTR router.mydomain.local
 5 IN PTR dev.mydomain.local
 6 IN PTR macbook.mydomain.local
 124 IN PTR imac1.mydomain.local
 125 IN PTR imac2.mydomain.local
 199 IN PTR alpha.mydomain.local
 240 IN PTR nas.mydomain.local 

Then restart the BIND server with

service bind restart

Check /var/log/ for error messages

You can also use dmesg


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.