Saturday, January 04, 2003

DNS HOW-TO

DNS stands for Domain Name Service. It is a service that can keep large number of machines’ ipaddresses for huge network communication. In this article we look at what DNS is, why is it needed, its use, and how to configure it.

In Linux, the networking related services could be set up in three different ways:
1) /etc/hosts to /etc/hosts mapping based networking
2) DNS based networking
3) NIS/NIS+ based networking which in turn can take the help of DNS or /etc/hosts file

For network-based services the actual network daemon reads some file for communication.
The first file that it reads is /etc/host.conf. Over here one may generally find two lines as
Order hosts, bind, Nis
Multi on

The first line tells what would the network-related services like httpd, sendmail, nfsd, ypserv etc, which gets invoked at the time of booting from /etc/rc.d/init.d read, before doing remote communication. It also tells whether the /etc/hosts file mapping where the host entries for each machine is present on each machine or it should read a DNS implemented by BIND software or a nis/nis+ based networking which is dependent on either of the above setup.

The second line says whether one machine can have multiple IPaddresses attached with same machine name or not as a Linux platform allows a machine name to have multiple IPaddresses.

Example: Let’s say a system administrator wants to setup 3 IPaddresses with the same machine name associated with one Ethernet card with 192.192.192.0
#ifconfig eth0 192.192.192.1
#ifconfig eth0:1 192.192.192.2
#ifconfig eth0:2 192.192.192.3

Now in /etc/hosts if we write
192.192.192.1 kshounish1
192.192.192.2 kshounish1
192.192.192.3 kshounish1

That means any another machine can access the services of kshounish1 machine by writing any of the ipaddress. Remember that the order means the searching order if it’s like Order hosts, bind.
That means all the services which need to read something before getting served or get requested will first see the mapping of the hosts in /etc/hosts file. If it gets that file it would work or else it will search for the DNS through BIND software. For DNS setup it should be Order bind, hosts.

And note that once you change the order you need to start
# /etc/rc.d/init.d/network restart
This is the first step before you start configuring DNS


What is DNS?

DNS means Domain Name Service. It is actually a service that can keep large number of machines’ ipaddresses for huge network communication. Now the question arises why is this needed. Lets understand this with the help of an illustration.

Example: Let’s say kshounish1, kshounish2, kshounish3, kshounish4, and kshounish5 are the 5 machines in a network, then for communication between each machine, each machine’s /etc/hosts file should have all the five entries of the machine name. Within this small network there would be no problem if you add another machine say kshounish6 in the network. But for this too, the network administrator has to go to each machine, add the kshounish6 in /etc/hosts file and then comeback to the new comer kshounish6 machine and add all the other entries (kshounish1...kshounish5) including its own name also in /etc/hosts file.

But what if the network is setup with say 60 machines and a 61st machine has to be added? Then administrator will have to go to each machine again and write the new machine’s name at /etc/hosts/ file and again comeback and write all the 60 machines name on the 61st machine’s etc/hosts file which is a tedious and time taking job. Thus, it is better to keep a centralized server, where all the ipaddresses will stay and if a new one does enter into the network then the change will have to be done at the server and not on the client’s machine. And a better way of setting that client-server networking concept is having one master server and 3-4 slave servers for it.


DNS Setup

DNS is a concept of client server network so both sides configuration is needed.

Example:
Lets say we have 10 machines -- kshounish1 to kshounish10 with 192.192.192.1 to 192.192.192.10 -- and have decided to make kshounish1 as our DNS master server and kshounish2 as slave server and kshounish3 as another slave server and kshounish4 as slave’s slave server. Why do we need a slave server? Well, it is valuable in case of failure of the master server.

Note: Remember, to setup DNS, we need a domain name, as it understand the FQDN format (Fully Qualified Domain Name). So if we decide that our domain name will be bigleap.com. Then our machine names will be kshounish1@bigleap.com…kshounish10@bigleap.com.


Client configuration steps

1) # vi /etc/host.conf
2) replace Order hosts,bind to Order bind,hosts
3) #/etc/rc.d/init.d/network restart
4) # vi /etc/resolv.conf

press “i” and write
domain bigleap.com
nameserver 192.192.192.1(master server)
nameserver 192.192.192.2(slave of master)
nameserver 192.192.192.3(another slave)
nameserver 192.192.192.4(slave of (8)))
11) nslookup(after the master server daemon is running)

Remember that the machine which is a pure client, should not run the server daemon (“named” discussed below) but slave server can have both server and client process running in their Linux box.


DNS Server Setup

“named” description: For running a proper DNS server a daemon should run something called ‘named daemon’. It merely refers to the names of the machines rather than their ipaddresses. For this, the mapping name should be resolved by a server called ‘name server’. In order to run a `name server’, named daemon is needed. The files needed for configuring and running DNS (master and slave server) are:
1) /etc/named.conf
2) /var/named (remember its not file it’s a directory where the main database stays)
3) dnsconf utility

Before starting configuration by dnsconf utility lets see what actually the DNS server needs to get configured. It needs the following:

named configuration file (/etc/named.conf): It basically defines the parameters that point to the sources of domain database information, which can be local files or on remote servers.

Hint file (cache file)(/var/named/named.ca): It actually provides the name of root server which gets activated in case the machine name, which is to be searched, is not there in user defined zone (discussed below).

localhost file (/var/named.local): All configuration have a local domain Database for resolving address to the host name localhost.

Zone: Basically a zone that keeps the information about the domain database.

Later in named.conf file we will find that there are two predefined zones --named.local and named.ca --with database of localhost and database of root servers respectively. But zone needs another two files with Ipaddress to hostname mapping and hostname to Ipaddress mapping. The first one is called as Zone File and the second Reverse Zone File.

Zone file: The zone file defines most of the information. It is used to map host names to address, to identify the mail servers, and to provide other domain information.
Reverse Zone file: This is responsible for mapping Ipaddress to host names, which is exactly the opposite of what the zone file does.

Note that the above two files have to be user defined.

Now let us configure the master server with a proper example.

Example: Taking the above case of kshounish1.bigleap.com to kshounish10.bigleap.com, lets start with dnsconf.

#dnsconf
You will find many a option but go for the below mentioned options only for configuring master server
* domains: Which will define the zone file name as well as the domain name of the current machine by default and will affect the named.conf file. This will create a file for domain bigleap.com as /var/named/bigleap.com.
* Ipreverse mapping: It will ask options for IP reverse mapping or better still, we can say that it defines the reverse zone file name. Remember to click on add. For network name give the name as “network name”. Networkname.networkname.reverse”, for example here, 192.192.192.reverse. This will make a file called /var/named/192.192.192.reverse.

To see how it affects /etc/named.conf file, see the example below:

Now lets open /etc/named.conf
# This is the macro which defines where will the DNS related file stay.
Options {
directory “/var/named”;
};
# the line below says about the root servers or cache servers
zone “.” {
type hint;
file “named.ca”;
};

# This particular option tells about the file, which will keep hostname to Ipaddress mapping
zone “bigleap.com.”{
type master;
file “bigleap.com.”;
};

# this particular option tells about the localhost file mapping
zone “0.0.127.in-addr.arpa”{
type master;
file “named.local”;
};

# This particular option tells about the file which will keep ippaddress to #hostname mapping
zone “192.192.192.IN-ADDR.ARPA”{
type master;
file “192.192.192.reverse”;
};
Now #cd /var/named. There, we will come across four files:
1) named.ca
2) named.local
3) bigleap.com
4) 192.192.192.reverse

If we open named.ca it will show us all the names of root servers, which will work if zone file or reverse zone file fails to serve the DNS queries. Here the zone and reverse zone files are bigleap.com and 192.192.192.reverse respectively.
Lets see the zone file and reverse zone file, which is
/var/named/bigleap.com
@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011301 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com
kshounish1.bigleap.com IN A 192.192.192.1
kshounish2.bigleap.com IN A 192.192.192.2
kshounish3.bigleap.com IN A 192.192.192.3
kshounish4.bigleap.com IN A 192.192.192.4
kshounish5.bigleap.com IN A 192.192.192.5
kshounish5.bigleap.com IN A 192.192.192.6
kshounish7.bigleap.com IN A 192.192.192.7
kshounish8.bigleap.com IN A 192.192.192.8
kshounish9.bigleap.com IN A 192.192.192.9
kshounish10.bigleap.com IN A 192.192.192.10


DNS Database records

The database records used in zone file are called as standard resource records or sometimes, just “RRs”. All records have the same basic format:
Syntax Name In type data

In previous example
@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011301 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
can be described as follows

@: It means from the origin to the lastname object that is bigleap.com.

In: This stands for Internet servers

SOA: This stands for `Start Of Authority’. It marks the beginning of a zone’s data and defines the parameter that affects the entire zone. Followed by the current machine name where the DNS server is maintained. And, the administrator login, which can be used while DNS is not working.

20000011301;serial: This is the serial number--a numeric value that tells or notifies the slave server, that the database has been updated. So slave server should also update it.

3600;refresh: This is the refresh cycle in seconds. In every refresh cycle the slave server comes to master server and checks for the updated database.

1800;retry: This particular line refers to the retry cycle which in turn means that the slave server should wait before asking the master server again in case master server doesn’t respond.

1209600;expire: This is the time for slave server to respond to queries of client for the expiration time if master server fails and has to be up and not getting up. After this period slave server also fails to solve the queries of clients and sits idle.

432100;default_ttl: This refers to the default time to leave, for this domain to work for, when named is once started. Remember the user doesn’t have to play with this unless he wants that the query time from the slave server should be somewhat less or more. In case we want to change, we should change only the refresh time in both master and slave. The best way is to make it 2, which means after each 2 seconds slave server will query to master server.

And in the same way the reverse zone file also has the above things. The reverse zone file of master server that is 192.192.192.reverse may look like

@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011301 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com

1 IN PTR kshounish1.bigleap.com.
2 IN PTR kshounish2.bigleap.com.
3 IN PTR kshounish3.bigleap.com.
4 IN PTR kshounish4.bigleap.com.
5 IN PTR kshounish5.bigleap.com.
6 IN PTR kshounish6.bigleap.com.
7 IN PTR kshounish7.bigleap.com.
8 IN PTR kshounish8.bigleap.com.
9 IN PTR kshounish9.bigleap.com.
10 IN PTR kshounish10.bigleap.com.


Note: Because the network id is already determined by @ that is 192.192.192.reverse, 1. replaces the reverse.10.

So, once the master server zone file and master server reverse zone file is configured well, just start
#/etc/rc.d/init.d/named restart

Now our master server is configured. So, if any machine has its name server lookup as 192.192.192.1, we will be able to access it by a command called nslookup.


Slave server configuration
We want to configure a slave server as kshounish2.bigleap.com. of kshounish1.bigleap.com.

Slave Server setup: We go to dnsconf and configure secondaries option. It will ask for the master server. We write kshounish1.bigleap.com/ and save it

If your slave server has domain as bigleap.com. and whose master is kshounish1.bigleap.com, then the /etc/named.conf at slave server should look like:
#this is the macro which defines where will the DNS related file stay
options {
directory “/var/named”;
};
#the below line says about the root servers or cache servers
zone “.” {
type hint;
file “named.ca”;
};

# this particular option tells about the file which will keep hostname to ipaddress mapping got from master server
zone “bigleap.com.”{
type slave;
file “slave/bigleap.com.”;
masters { kshounish1.bigleap.com;};
};

# this particular option tells about the localhost file mapping
zone “0.0.127.in-addr.arpa”{
type master;
file “named.local”;
};

# this particular option tells about the file which will keep ippaddress to #hostname mapping
zone “192.192.192.IN-ADDR.ARPA”{
type slave;
file “slave/192.192.192.reverse”;
masters {kshounish1.bigleap.com}
};
If we go by dnsconf, it will create a slave under /var/named and then it will keep the files under it.
After we have done this just start the daemon

#/etc/rc.d/init.d/named restart (in kshounish2.bigleap.com.)

Similarly, for slave’s slave configuration, we can simply make another slave as kshounish4.bigleap.com saying that its master will be kshounish2.bigleap.com.

Remember
Whenever you do a new entry in zone file or reverse zone file of the master, always add 1 to the serial number and the restart daemon #/etc/rc.d/init.d/named restart.
But there is no need to restart the slave daemon.

Example:
Lets take the previous master file and updated master file and see the change in it

Normal database:
@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011301 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com
kshounish1.bigleap.com IN A 192.192.192.1
kshounish2.bigleap.com IN A 192.192.192.2
kshounish3.bigleap.com IN A 192.192.192.3
kshounish4.bigleap.com IN A 192.192.192.4
kshounish5.bigleap.com IN A 192.192.192.5
kshounish5.bigleap.com IN A 192.192.192.6
kshounish7.bigleap.com IN A 192.192.192.7
kshounish8.bigleap.com IN A 192.192.192.8
kshounish9.bigleap.com IN A 192.192.192.9
kshounish10.bigleap.com IN A 192.192.192.10


@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011301 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com

1 IN PTR kshounish1.bigleap.com.
2 IN PTR kshounish2.bigleap.com.
3 IN PTR kshounish3.bigleap.com.
4 IN PTR kshounish4.bigleap.com.
5 IN PTR kshounish5.bigleap.com.
6 IN PTR kshounish6.bigleap.com.
7 IN PTR kshounish7.bigleap.com.
8 IN PTR kshounish8.bigleap.com.
9 IN PTR kshounish9.bigleap.com.
10 IN PTR kshounish10.bigleap.com.


Updated database:

@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011302 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com
kshounish1.bigleap.com IN A 192.192.192.1
kshounish2.bigleap.com IN A 192.192.192.2
kshounish3.bigleap.com IN A 192.192.192.3
kshounish4.bigleap.com IN A 192.192.192.4
kshounish5.bigleap.com IN A 192.192.192.5
kshounish5.bigleap.com IN A 192.192.192.6
kshounish7.bigleap.com IN A 192.192.192.7
kshounish8.bigleap.com IN A 192.192.192.8
kshounish9.bigleap.com IN A 192.192.192.9
kshounish10.bigleap.com IN A 192.192.192.10
kshounish11.bigleap.com IN A 192.192.192.11

@ IN SOA kshounish2.love.com. root@kshounish2.love.com. (
2000011302 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN NS kshounish1.bigleap.com

1 IN PTR kshounish1.bigleap.com
2 IN PTR kshounish2.bigleap.com
3 IN PTR kshounish3.bigleap.com
4 IN PTR kshounish4.bigleap.com
5 IN PTR kshounish5.bigleap.com
6 IN PTR kshounish6.bigleap.com
7 IN PTR kshounish7.bigleap.com
8 IN PTR kshounish8.bigleap.com
9 IN PTR kshounish9.bigleap.com
10 IN PTR kshounish10.bigleap.com
11 IN PTR kshounish11.bigleap.com

You must have noticed that after adding the new machine we have changed the serial number from 2000011301 to 2000011302. This is done because the slave server updates its database from master. It finds that its serial number is smaller than the master server and when you change the serial number while the slave server queries for updating, its serial number changes automatically as a result of which the slave’s slave also changes.