I am starting to step outside of the Microsoft realm and into the Linux world. Imagine me balancing on my right leg which is in the Microsoft bucket, slowly and cautiously testing the water in the Linux bucket with my bare left foot. Is the water too cold or is it too hot? Hmm, interestingly, the water seems to be quite pleasant.
Recently I migrated core functionality from my home Windows 2000 Server to a new host running ESXi 4.0 with three Ubuntu Server 9.10 VMs. If you want to see a simple diagram on my set up, view my article on Linux Backup Shell Script. One of the core functionality that I migrated was my internal DNS services. Hence the title of this article, DNS Server with Bind9.
bind9
I am impressed, once again, with Linux and the services residing within this amazing operating system. The most amazing part about Linux services is that many of them have been around as long as I have — where have I been?
Before I begin rambling too much, let’s get started on creating DNS forward and reverse zones for your local network …
First ensure you have bind9 installed by running the following command:
whereis bind
If the results is blank, such as just “bind: “, then you will need to install bind9. On Ubuntu, I would imagine the command would look like this:
sudo apt-get install bind9
Forward Zones
We need to configure your DNS forward zones, which will provide name to address resolution in your internal network. As we progress the configuration, keep in mind that your specific configuration will be slightly different than mine; adapt as needed.
For simple networks, such as mine at home, there are only a few changes that you will need to make for Forward lookup zones. The first file is /etc/bind/db.local.
/etc/bind/db.local
The changes are fairly easy because we going to use most of what is provided in the original file. Change the Start of Authority (SOA) to be the domain environment for your network. My domain is dt.local and my primary DNS server is dtsfile.dt.local. Change the SOA to reflect your choices and also change the nameserver (NS) line to be your primary DNS server.
Also, you will want to add A records for your various servers/computers on the network. For this example, I added my Asterisk server:
dtsvoip.dt.local. IN A 192.168.0.11
The next file to change, which we will also make changes for reverse DNS at the same time, is the /etc/bind/named.conf.default-zones file.
/etc/bind/named.conf.default-zones
The line for the primary zone, which references the /etc/bind/db.local file must state your local domain in the quotes following the zone directive:
zone “dt.local” {
type master;
file “/etc/bind/db.local”;
};
As we have more changes in this file, leave it open and continue to the next section.
Reverse Lookup Zones
As you probably know, a reverse lookup provides a name to an IP address. In Windows you would find the name of 192.168.0.10 by typing “nslookup 192.168.0.10” from a command prompt. If you have configured reverse DNS properly, you will see output similar to this:
C:\>nslookup 192.168.0.10 Server: dtsfile.dt.local Address: 192.168.0.10
Name: dtsfile.dt.local Address: 192.168.0.10
You may be wondering why the entry appears twice. This is because the Server and the name that I am looking up is the same server. If I were to locate my Asterisk server, it would look like this:
C:\>nslookup 192.168.0.11 Server: dtsfile.dt.local Address: 192.168.0.10
Name: dtsvoip.dt.local Address: 192.168.0.11
On with the configuration…
/etc/bind/named.conf.default-zones
If you were paying attention in the previous section you would still have that file open. Regardless, let’s add another zone to the file that represents our reverse lookup for the IP subnet in your network. In my network I use 192.168.0.0/24 which is the same as saying 192.168.0.0 with a subnet of 255.255.255.0 (192.168.0.0 to 192.168.0.255).
Immediately after the zone directive for your domain, add the following text for your reverse lookup:
zone “0.168.192.in-addr.arpa” {
type master;
file “/etc/bind/db.0.168.192”;
};
If you’re sharp, you’ll immediately know that the file db.0.168.192 doesn’t exist. We’ll create it next. And yes, it’s backwards; in reverse DNS lookups the IP address is reversed as part of the requirements set in the RFC and obviously for functionality pointing back to the host name of the IP. Read more: http://en.wikipedia.org/wiki/Reverse_DNS_lookup
Save changes to named.conf.default-zones.
/etc/bind/db.0.168.192
Next we’ll create a new zone db file for our newly created reverse lookup. Start by copying db.0 into a new file named db.0.168.192 (or whatever your local subnet IP address is).
cp /etc/bind/db.0 /etc/bind/db.0.168.192
Just like in your db.local file, let’s change the SOA to reflect your domain and nameserver. This includes the NS line that should already exist in the file. Now let’s add pointer (PTR) records for your servers/computers on the network. I’ll use mine for examples:
10 IN PTR dtsfile.dt.local 11 IN PTR dtsvoip.dt.local
Save changes to db.0.168.192.
Forwarders
The last section, assuming you want to use this DNS server as your primary DNS on all computers, is to set up a forwarder for all names that are not a part of your network. You will need to edit /etc/bind/named.conf.options.
/etc/bind/named.conf.options
The change is really simple, uncomment the forwarders directive and modify the IP address within to be your local router or your ISP DNS servers. Mine is similar to the following:
forwarders {
192.168.0.1;
};
Local Name Resolution
The final step is to change your /etc/resolv.conf file to point your DNS server and to set the domain and search realm. This is what mine looks like:
domain dt.local search dt.local nameserver 192.168.0.1
Restart the bind9 daemon
After making all of these changes, the final is to restart the bind9 daemon. Oh, one other step is to change your computers to use this DNS server as the primary.
Configuration Files Examples
/etc/bind directory listing
/etc/bind# ls -la drwxr-sr-x 2 root bind 4096 2010-08-01 17:52 . drwxr-xr-x 141 root root 12288 2010-08-01 17:54 .. -rw-r--r-- 1 root root 237 2009-08-19 15:00 db.0 -rw-r--r-- 1 root root 271 2009-08-19 15:00 db.127 -rw-r--r-- 1 root bind 295 2010-08-01 17:22 db.0.168.192 -rw-r--r-- 1 root root 237 2009-08-19 15:00 db.255 -rw-r--r-- 1 root root 353 2009-08-19 15:00 db.empty -rw-r--r-- 1 root root 316 2010-08-01 17:14 db.local -rw-r--r-- 1 root root 2940 2009-08-19 15:00 db.root -rw-r--r-- 1 root bind 463 2009-08-19 15:00 named.conf -rw-r--r-- 1 root bind 573 2010-08-01 16:50 named.conf.default-zones -rw-r--r-- 1 root bind 165 2009-08-19 15:00 named.conf.local -rw-r--r-- 1 root bind 570 2010-07-16 11:58 named.conf.options -rw-r----- 1 bind bind 77 2010-01-30 11:50 rndc.key -rw-r--r-- 1 root root 1317 2009-08-19 15:00 zones.rfc1918
./db.0.168.192
;
; BIND reverse data file for broadcast zone
;
$TTL 604800
@ IN SOA dt.local. dtsfile.dt.local. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS dt.local.
10 IN PTR dtsfile.dt.local.
11 IN PTR dtsvoip.dt.local.
./db.local
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA dt.local. dtsfile.dt.local. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS dtsfile.dt.local.
@ IN A 127.0.0.1
@ IN AAAA ::1
dtsvoip.dt.local. IN A 192.168.0.11
./named.conf.default-zones
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
// be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912
zone "dt.local" {
type master;
file "/etc/bind/db.local";
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.0.168.192";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
./named.conf.options
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder.
forwarders {
192.168.0.1;
};
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
/etc/resolv.conf
domain dt.local search dt.local nameserver 192.168.0.1
Thank you for a great tutorial,i have followed everything and my fake domain can resolv,and everything is working well.I have one problem now on setting up a Postfix Mail server on the same machine.I followed some guides but it seems im not getting it right on how to setup a simple Mail server.Im using ubuntu 10.04 server.Could you please assist me on that Aaron?