Setting up a Caching DNS Server in Ubuntu Server 14.04

Domain Name Service (DNS) is a Naming service that maps IP addresses and fully qualified domain names to one another. Computers that runs DNS are called name servers.

Here I have installed and configured cache server using forwarder, forward look-up and reserve look-up. In most of the place, we need a reserve lookups. Caching server will not hold any domain names, it will only work as a Pointing server. Before going in depth we need to know about DNS server and how it works.

Setup DNS Cache in Ubuntu

Setup DNS Cache in Ubuntu 14.04

What is DNS?

Here is an easy way to understand the DNS and how it works.

If we need to access in browser, the system will look for Here at the end of the .com there will be a (.) so what is this ?.

The (.) represent the namespace Root server, there are total 13 root servers globally available. While we accessing it will ask to name server as per operating system configuration. In Ubuntu, we used to configure the name-server in /etc/resolv.conf, while accessing my browser will ask to root name-servers, if the root name-server don’t have my requested domain information it will cache my requested information and forward my request to (TLD) Top Level Domain name-server, even in TLD name-server my request is not available it will be cached and forwarded to Authoritative name-server.

While the domain registration, our domain registerer will define which authoritative name-server should our domain use. So, authoritative name servers have our domain information’s, while our request reach ANS it will reply for the query that have at the same time it will be cached in Authoritative name-server and send the request back to browser. Every above steps are done within milliseconds.

Hope you got what is DNS now, and how it works. Now let us set up a Caching DNS Server in Ubuntu Server 14.04 LTS.

Step 1: Installing DNS Server

First, take a look at the my local DNS server information such as static IP address and hostname, which is used to for this article purpose.

IP Address:

To verify that the above settings are correct, we can use ‘hostnamectl‘ and ‘ifconfig‘ commands.

$ hostnamectl
$ ifconfig eth0 | grep inet
Verify System Hostname

Verify System Hostname

Next, we update the default repositories and do a system upgrade, before setting-up DNS cache server.

$ sudo apt-get update && sudo apt-get upgrade -y
Upgrade Ubuntu

Upgrade Ubuntu

Now, install the DNS Packages bind and dnsutils using the following command.

$ sudo apt-get install bind9 dnsutils -y
Install DNS Serve in Ubuntu

Install DNS Serve

Once, dns installed, move to the bind configuration directory, under /etc/bind.

$ /etc/bind/
$ ls -l
Bind Configuration in Ubuntu

Bind Configuration

Step 2: Setting DNS Cache Server

First of all, we setup and configure caching server here. Open and edit the file named.conf.options using vim editor.

$ sudo vim named.conf.options

Now, here the word ‘forwarders‘ is used to cache domain name requests. So, here we are going to use my router as the forwarder. Uncomment the // in-front of the line’s as shown in the picture.

forwarders {;
Named Configuration

Named Configuration

Save and exit the file using wq!. Now its time to start the bind server for a small testing.

$ sudo /etc/init.d/bind9 start
Start DNS Server in Ubuntu

Start DNS Server

If we need to test whether caching works, we can use dig command and check whether the cache working or not.

For example purpose, we going to dig now, at first, it will won’t be cache, so it may may take some milliseconds, once it cached it will be in lightning speed.

$ dig @

A dig command is a tool for DNS look-ups. To know more about Dig command read the below topic.

  1. 10 Useful Dig Command Examples
Query DNS Lookups

Query DNS Lookups

Here, we can see in the above image at first dig it took 1965 milliseconds for my query and shows which ipaddress is binded to

Let us try for one more dig and see the Query time.

DNS Query Time

DNS Query Time

Cool!, In the second try we got the query within 5 milliseconds. Hope you know what is caching server now. The above image shows, that total 13 root servers are caching, because millions of peoples already accessed Ubuntu official site.

Step 3: Setting Master DNS Server

Create a MASTER DNS Server, Here I’m defining the domain name as, edit the file named.conf.local using vim editor.

$ sudo vim /etc/bind/named.conf.local

Enter the DNS-Master entry as shown below.

zone "" {
        type master;
        file "/etc/bind/";
    1. zone: Hosts details in Domain


  1. type: Master DNS.
  2. file: Location to store zone information.
Create Zone in DNS

Create Zone in DNS

Create the zone file (Forward look-ups) from making a copy from db.local.

$ sudo cp db.local

Now open and edit the copied zone file using vim editor.

$ sudo vim
Copy Zone Files

Copy Zone Files

Next, add the following example entry, which I have used for tutorial purpose. I use the same for other virtual machine setups too. Modify the below entry as per your requirement.

; BIND data file for local loopback interface
$TTL    604800
@       IN      SOA (
                     2014082801         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
@       IN      NS
ns      IN      A

clt1    IN      A
ldap    IN      A
ldapc   IN      A
mail    IN      CNAME

Save and exit the file using wq!.

Create Forward DNS Zone

Create Forward DNS Zone

Finally, restart the bind DNS service using below command.

$ sudo service bind9 restart
Start DNS Service

Start DNS Service

We need to confirm, whether our above zone setup works. Let us check using dig command. Run the command as follows from localhost query.

$ dig @
Verify DNS Zone

Verify DNS Zone

Let’s ping and test the, before that we need to change the dns-server entry to localhost in our dns server machine and restart the network to get effect.

Open and edit the Network interface settings and enter the DNS entry.

$ sudo vim /etc/network/interfaces

Change the DNS entry in the interface as below.

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
Add DNS Entry in Ubuntu

Add DNS Entry

After adding entry, restart the Network using following command.

$ sudo ifdown eth0 && sudo ifup eth0

If restarting network does not take effect, We must need a restart. Now Let’s ping and check the, while its replying, we need to get the ip address what we defined for host-name clt1.

$ ping -c 3
Ping Domain

Ping Domain

Setting Reverse DNS Lookups

Again open and edit the file named.conf.local.

$ sudo vim /etc/bind/named.conf.local

Now add the following reverse dns lookup entry as shown.

zone "" {
        type master;
        notify no;
        file "/etc/bind/db.tecmintlocal192";
Create Reverse DNS

Create Reverse DNS

Save and exit the file using wq!. Now create a db.tecmintlocal192 file, as I have mentioned in the master file above for reverse look-up, copy the db.127 to db.tecmintlocal192 using following command.

$ sudo cp db.127 db.tecmintlocal192

Now, open and edit a file db.tecmintlocal192 for setup the reverse look-up.

$ sudo vim db.tecmintlocal192

Enter the following entry as below, modify the below entry as per your requirement.

; BIND reverse data file for local loopback interface
$TTL    604800
@       IN      SOA (
                        2014082802      ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
@       IN      NS      ns.
100     IN      PTR

111     IN      PTR
200     IN      PTR
211     IN      PTR
Reverse DNS Entry

Reverse DNS Entry

Restart the bind service using.

Now, verify the reserve look-up entry.

$ host

While we do a reverse look-up using an ip address as shown above, it want to reply with a name as above image shows.

Let’s do a check using dig command too.

$ dig
Reverse DNS Lookup

Reverse DNS Lookup

Here, we can see the Answer for our Query in Answer Section as domain-name has the ip address

Step 4: Setting Client Machine

Just change the ip address and dns entry in client machine to Our local dns server, if so our client machine will get assigned host-name from local DNS-server.

Let us check the host-name of our client using following series of commands.

$ ifconfig eth0 | grep inet
$ hostname	
$ dig -x
Verify Local DNS

Verify Local DNS

Understanding zone file entry in dns, This image will give you a small explanation what we have defined in zone file entry.

Understanding DNS Zone Entry

Understanding DNS Zone Entry

That’s it! in this article, we have seen how to setup a local DNS server for our office or home use.

Soon you can read about the article how to troubleshoot a DNS server using various tool and fix it. There are many tools which are use to troubleshoot the DNS servers. Read the below article to know about some troubleshooting tips.

8 Nslookup Commands for DNS Troubleshooting

If You Appreciate What We Do Here On TecMint, You Should Consider:

TecMint is the fastest growing and most trusted community site for any kind of Linux Articles, Guides and Books on the web. Millions of people visit TecMint! to search or browse the thousands of published articles available FREELY to all.

If you like what you are reading, please consider buying us a coffee ( or 2 ) as a token of appreciation.

Support Us

We are thankful for your never ending support.

Babin Lonston

I'm Working as a System Administrator for last 10 year's with 4 years experience with Linux Distributions, fall in love with text based operating systems.

Your name can also be listed here. Got a tip? Submit it here to become an TecMint author.

RedHat RHCE and RHCSA Certification Book
Linux Foundation LFCS and LFCE Certification Preparation Guide
The Complete Linux System Administrator Bundle
Become an Ethical Hacker Bonus Bundle

You may also like...

9 Responses

  1. johan says:

    ok, got some problems with this article,

    Where do the ct11 and the ldap come from? noticed they also have different ip’s? are they different servers? Do i need them to let the dns work?

    Also, in the reverse lookup zone part, where does the db.127 come from and why do i need to call the db for tecmintlocal dbtecmintlocal192? Is that 192 something you created or is it functional?

    thanks for the help.

  2. deheugden says:

    Will this tutorial work with Ubuntu 18.04 and can i use this Linux DNS as a forwarder for my active directory domain?

  3. situhuilan says:

    I want to know pdnsd root name server queries how to achieve?

  4. @ Ragu Bhat Whats the Expire value you using ?

  5. David Brown says:

    Unless you are masochistic, or have a very complex setup, use dnsmasq rather than bind. It is much simpler, much lighter in resources, and has a better security record.

  6. Ragu Bhat says:

    The local DNS cache disappears on a reboot as it was held in memory. What to do? Try installing a caching nameserver ‘pdnsd’ which writes back the cache to your local disk on a reboot, reusing the same cache after the reboot of the system.

    apt-get install pdnsd

  7. helloworld says:

    ns IN A
    delete dot

Got something to say? Join the discussion.

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.