This article will help you to set up DNS (Domain Name System) on Linux/Unix based system. DNS is mainly used for resolves host-names, which means it can easily bind IP addresses into a fully qualified domain name (FQDN) like www.linuxteck.com or www.google.com to Ip addresses like 166.62.27.62 / 172.217.166.110. It is one of the basements of the internet. When you look for a domain name in a browser, it sends a question over the net to take a look at the domain with its corresponding IP address. Once identified, it uses the IP address to retrieve the website’s information. This whole technique takes simply milliseconds. The DNS term is used by many names, like name server, domain name system and nameserver.
Here we are going to see the Master/Slave DNS concepts. Master DNS server is also known as the Primary DNS Server. In Linux, we will be using popular software to install DNS named BIND. It stands for ( Berkely Internet Name Domain ) It implements DNS Service/Protocol used to translate the Domain Name to IP address and IP address into Domain Name.
Slave DNS Server is also known as a Secondary DNS Server, which will act as a Backup server or a Load Balancer of the Main DNS Server i.e,(Master). It will fetch all the DNS zone records from the Master DNS Server. The Slave server is a typical copy of the Master DNS Server. The main advantage of using Slave Server is that when the Master server goes down due to some reason or unavailable then it can provide redundancy. This means it will accept all the queries from the end users. And the user may not know whether his request is going through the Master or Slave DNS. They will get the output.
This step by step guide will help you to setup Master-Slave DNS Server CENTOS/RHEL 7.6
My Lab Setup :
For the Lab setup, I am using 3 machines in total. 2 for server setup (Master-&-Slave) and 1 for a client to connect the DNS server
BIND Packages :
DNS Port :
Step 1 : Installing BIND9 on CentOS 7.6
In Terminal you can use either the direct root or sudo to execute the commands.
#:- prompt shows that you can execute the command with root privileges or used by sudo command
$:- prompt shows that you can execute the command as a regular user (non-privileged user)
Make sure you have configured the hostname and IP address to your machines. To cross verify execute the below command
Master DNS Server
Slave DNS Server
Client-Machine
Let us move forward and Install the BIND packages on Master-Slave (CentOS 7.6)
# yum install bind bind-utils -y
Once your BIND applications are installed, you need to start the service and enable it to begin automatically after each reboot, so that you don’t have to start manually each time.
# systemctl enable named
# systemctl start named
# systemctl status named
Use the below command to check the version of BIND running on your server
# /usr/sbin/named -v
BIND 9.9.4-RedHat-9.9.4-73.el7_6 (Extended Support Version)
Step 2 : BIND Server Configurations
It’s a time to edit the main configuration file of the DNS server is called ‘named.conf’ . It will be located under ‘/etc/’ directory.
#vi /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; 192.168.0.100; }; ### Master DNS IP ##
// listen-on-v6 port 53 { ::1; }
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
recursing-file “/var/named/data/named.recursing”;
secroots-file “/var/named/data/named.secroots”;
allow-query { localhost; 192.168.0.0/24; }; ### IP Range ###
allow-transfer { localhost; 192.168.0.101; }; ### Slave DNS IP ###
recursion no;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file “/etc/named.iscdlv.key”;
managed-keys-directory “/var/named/dynamic”;
pid-file “/run/named/named.pid”;
session-keyfile “/run/named/session.key”;
};
logging {
channel default_debug {
file “data/named.run”;
severity dynamic;
};
};
# New entries added for forward zone and reverser zone #
zone “.” IN {
type hint;
file “named.ca”;
};
zone “linuxteck.com” IN {
type master;
file “forward.linuxteck”;
allow-update { none; };
};
zone “0.168.192.in-addr.arpa” IN {
type master;
file “reverse.linuxteck”;
allow-update { none; };
};
include “/etc/named.rfc1912.zones”;
include “/etc/named.root.key”;
The followings are the short explanation of the entries added/highlighted in the ‘/etc/named.conf’ file to setup Master:
Note: save and close the file using ‘:wq!’ .If you have missed any semicolon or braces in the ‘etc/named.conf’ file an error message will be popup during the startup of bind service.
Step 3 : Creating BIND Zones
Now we have to build our zones file (forward and reverse )as we declared in named.conf above. The default location of the zone lookup files is placed in ‘/var/named’ directory.
Note: The easiest way to create the two zone files can be taken a copy from the sample file of the default location of the zone.
# cd /var/named/
# cp named.localhost forward.linuxteck
# cp named.localhost reverse.linuxteck
Make sure, both of the zone files (forward.linuxteck and reverse.linuxteck) are to be kept under /var/named/ directory. First, edit the forward.linuxteck zone file.
# vi /var/named/forward.linuxteck
Before editing the forward.linuxteck zone file let us have a look on the sample zone file
After defined the required entires into the forward.linuxteck zone file
$TTL 86400
@ IN SOA masterdns.linuxteck.com. root.linuxteck.com. (
2011071001 ; serial
3600 ; refresh
1800 ; retry
604800 ; expire
86400 ) ; minimum
@ IN NS masterdns.linuxteck.com. ;Our Name Server
@ IN NS slavedns.linuxteck.com.
@ IN A 192.168.0.100 ;Name Server to IP resolve
@ IN A 192.168.0.101
masterdns IN A 192.168.0.100
slavedns IN A 192.168.0.101 ;Hosts
lt001 IN A 192.168.0.200 ;Client
Note: save and close the file using ‘:wq!’
Special keywords for Zone Files used above :
- A – A record point host names. Also, we use (www, ftp, mail) to one or more IP addresses.
- NS – Name Server, specify the servers which are providing DNS services for that domain name.
Next create a new zone file for the reverse zone under ‘/var/named/’ directory, to create a reverse pointer to the above forward zone entries.
$TTL 86400
@ IN SOA masterdns.linuxteck.com. root.linuxteck.com. (
2011071001 ; serial
3600 ; refresh
1800 ; retry
604800 ; expire
86400 ) ; minimum
@ IN NS masterdns.linuxteck.com.
@ IN NS slavedns.linuxteck.com. ; Name Server’s
@ IN PTR linuxteck.com.
masterdns IN A 192.168.0.100 ; Record (IP) points to hostname
slavedns IN A 192.168.0.101
100 IN PTR masterdns.linuxteck.com.
101 IN PTR slavedns.linuxteck.com. ; Hosts
200 IN PTR lt001. ;Client
Note: save and close the file using ‘:wq!’
That’s it, we have successfully configured our BIND Server. All we need it to start the DNS services, but before starting the service we must check a few more things.
Step 4 : SELinux
Just for additional information. Today, most Linux systems are imposing SELinux — a far-reaching protection enhancement that modifications the persona of machine protection then again requires that we deal with some more complexity in managing our systems.
The machines running with SELinux, all strategies and files are labeled in a way that represents security-relevant information. This information is referred to as the SELinux context. There are 4 phases and every phase of the security context is separated by means of a colon (:)”SELinux user, SELinux role, the type, multilevel safety or MLS”. This rule will complete “Allow access, Prevent get entry to or Denied” which will guard your server more than the regular way. For any newly created files will be set the permit get entry to else it will prevent writing/executing to the file.
For files, this is viewed the use of the ls -Z command:
cd /var/named/
# ls -Z
The result of the newly created files is highlighted above which shows the wrong SELinux context, so, to change the security context. There are more than one instructions for managing the SELinux context for files, such as “chcon, semanage fcontext, and restorecon”.
Here I use ‘chcon ‘
# chown named:named -R /var/named ; restorecon -rv /var/named
# chcon system_u:object_r:named_zone_t:s0 /var/named/forward.linuxteck
# chcon system_u:object_r:named_zone_t:s0 /var/named/reverse.linuxteck
Now we have modified the security context of (forward.linuxteck & reverse.linuxteck) file, which is the right one.
Now, restart the BIND Services
# systemctl restart named
Step 5 : Firewall Configuration
We want to permit (TCP & UDP port 53) in firewall rule to use DNS port
#firewall-cmd –permanent –add-port=53/tcp
# firewall-cmd –permanent –add-port=53/udp
Reload the firewall service
# firewall-cmd –reload
If you want to know more about firewalld service, have a look at this article on 15 basic useful firewall-cmd commands in Linux.
Step 6 : Test my bind configuration for any syntax errors
Run command as follows:
# named-checkconf /etc/named.conf
If there is ‘NO OUTPUT’, then the configuration file is treated as valid.
Similarly test the Forward &Reverse zone files as well.
Forward :
# named-checkzone linuxteck.com /var/named/forward.linuxteck
Output :
If you see “OK” as above, the forward zone file is properly configured.
Reverse:
# named-checkzone linuxteck.com /var/named/reverse.linuxteck
Output :
If you see “OK” as above, the reverse zone file is also properly configured.
Step 7 : Add DNS Server details in your interface config file
Now we need to add our DNS IP into the network interface
# vi /etc/sysconfig/network-scripts/ifcfg-enp1s0
Add the DNS IP as highlighted below :
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp1s0
UUID=11b2bf56-a0d8-4282-bf6f-d59be143f8e9
DEVICE=enp1s0
ONBOOT=yes
IPADDR=192.168.0.100
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.100
IPV6_PRIVACY=no
Note : save and close the file using ‘:wq!’
Step 8 : Add DNS name servers address into /etc/resolv.conf
# vi /etc/resolv.conf
Add the name server ip address:
nameserver 192.168.0.100
Restart network service
# systemctl restart network
Step 9 : Test DNS Server with ‘dig & nslookup’
# dig masterdns.linuxteck.com
# dig -x 192.168.0.100
# nslookup masterdns.linuxteck.com
Finally our Primary (Master) DNS Server is ready!. Now we can cross ahead to configure our Secondary (Slave)DNS Server
Step 10 : Slave Server setup
The BIND Package and the Installation part of the Slave DNS Server is same as of Master. To configure the Slave DNS Server, it need to edit /etc/named.conf’ and start the Bind service , then the zone files (forward and reverse) transfer automatically.
Install bind packages using the following command:
# yum install bind bind-utils -y
Step 11 : Edit slave bind configuration file /etc/named.conf :
# vi /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; 192.168.0.101; }; ##Slave Server IP
// listen-on-v6 port 53 { ::1; };
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
recursing-file “/var/named/data/named.recursing”;
secroots-file “/var/named/data/named.secroots”;
allow-query { localhost; 192.168.0.0/24; }; ##Add the network address
recursion no;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file “/etc/named.iscdlv.key”;
managed-keys-directory “/var/named/dynamic”;
pid-file “/run/named/named.pid”;
session-keyfile “/run/named/session.key”;};
logging {
channel default_debug {
file “data/named.run”;
severity dynamic;
};
};
zone “.” IN {
type hint;
file “named.ca”;
};
## Add two zone files ###
zone “linuxteck.com” IN {
type slave;
file “slaves/linuxteck.fwd.zone”;
masters { 192.168.0.100; };
};
zone “0.168.192.in-addr.arpa” IN {
type slave;
file “slaves/linuxteck.rev.zone”;
masters { 192.168.0.100; };
};include “/etc/named.rfc1912.zones”;
include “/etc/named.root.key”;
As you can see, the configuration is pretty comparable in assessment with the master. The slave’s configuration also carries the same zones as on the master and they are configured as type slave. Zone files don’t want to be created because they must be replicated from the master.
Note: save and exit the file using ‘:wq!’ .If you have missed any semicolon or brasses in the ‘etc/named.conf’ file an error message will be popup all through the startup of bind service.
Step 12 : start the bind service and enable it for the next reboot :
# systemctl enable named
# systemctl start named
If all goes well, the slave have replicated the zone records from the master and created it’s zone files to ‘/var/named/slaves/’ in Slave DNS server.
# ls -l /var/named/slaves/
linuxteck.fwd.zone
linuxteck.rev.zone
Step 13 : Add DNS Server details in the slave interface config file
# vi /etc/sysconfig/network-scripts/ifcfg-enp1s0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp1s0
UUID=15f2bf56-a0d8-4286-bf8f-d59be258f8p9
DEVICE=enp1s0
ONBOOT=yes
IPADDR=192.168.0.102
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.100
DNS2=192.168.0.102
IPV6_PRIVACY=no
Note : save and close the file using ‘:wq!’
Step 14 : Add DNS name servers address into /etc/resolv.conf
Add the name server (Master & Slave)IP address:
# vi /etc/resolv.conf
nameserver 192.168.0.100
nameserver 192.168.0.101
Note : save and close the file using ‘:wq!’
Step 15 : Firewall Configuration
# firewall-cmd –permanent –add-port=53/tcp
# firewall-cmd –permanent –add-port=53/udp
Reload the Firewall service :
# firewall-cmd –reload
Step 16 : SELinux
Do the following command to security context of Selinux:
# chgrp named -R /var/named
# chown -v root:named /etc/named.conf
# restorecon -rv /var/named
# restorecon /etc/named.conf
That’s it ! for the SLAVE configuration.
Step 17 : Setup DNS configuration to the client
Edit your client /etc/resolve.conf file and add the IP address of both the Master and Slave DNS server.
# vi /etc/resolv.conf
nameserver 192.168.0.100
nameserver 192.168.0.101
Now we can test our forward and reverse look using “dig and nslookup” as below :
# nslookup lt001.linuxteck.com
# nslookup 192.168.0.200
The setup of Master and Slave DNS server has configured successfully , I believe this article will help those who are looking to setup the same at your end. Drop me your feedback/comment.
Thank you!!