简介
希望通过本文,一个Linux新手能快速的架设一个DNS服务器,本文的内容都是基于REdhat6.2发布,但是其他的版本和发布原理是一样的。
通常意义上的DNS服务器有两个层面上的含义:对于一个win98客户机的用户来讲,DNS服务器就是在tcpip设置中指定的服务器,其是能完成自己的域名解析请求的服务器;对于一个网络管理员来讲,DNS服务器不仅仅意味着能应答局域网用户的解析请求,实现客户机的域名解析的服务器,还是能向互联网提供自己网络域名解析信息的服务器。
对于实现客户解析请求应答的情况来讲,工作原理如下图所示:
对于向互联网提供自己网络域名解析信息情况来讲,工作原理如下图所示:
但在Linux服务器下,这两种应用需求是由一个服务器软件—bind实现的。也就是使用该软件可以同时满足第一种和第二种的需求,区别仅仅在于配置文件的设置不同。
软件安装
首先,Redhat6.2是自带的dns服务器是8.2.2-P5版本的,这个版本有Bug,可能导致攻击者得到系统的root账号,因此对于系统为2.2系列的内核,一定要升级到BIND 8.2.3,而对于运行2.4版本内核的系统可以选择升级到BIND 9.1.1rc3。下面的讨论都是针对BIND 8.2.3。
从http://www.isc.org下载BIND的源代码到Linux服务器的/usr/src目录下,然后解压缩,编译及安装:
[root@dns src]# tar xvfz bind-src.tar.gz
[root@dns src]# make all;make install
这时候,/usr/sbin目录下就应该有一个名字为named的可执行文件,可以通过下面的命令察看bind的版本号:
[lix@dns src]$ /usr/sbin/named -v
named 8.2.3-REL Fri Feb 16 15:21:51 CST 2001
ideal@dns:/usr/src/src/bin/named
可以看到,现在named的版本为8.2.3,已经是升级过的版本了。
启动运行
启动DNS服务器可以通过ndc(name daemon control program)命令,只要按照上面的步骤安装了BIND软件包,在/usr/sbin目录下就会有这个命令。该命令是专门用来启动dns服务器的程序。使用如下命令来启动named:
[root@dns src]# ndc start
new pid is 16064
要停止named服务器:
[root@dns src]# ndc stop
DNS服务器进程named启动以后,可以通过下面的命令来察看named存在的信息:
[root@dns src]# ps ax|grep named
16064 ? S 0:00 /usr/sbin/named
若你仅仅是希望为局域网上的用户提供访问互联网时进行域名解析的功能,那么现在你已经完成了这个工作!你只需要将客户机的dns服务器设置为该DNS服务器的IP地址即可,安装以后的缺省配置就可以满足这样的需要。
例如你在家中组建了一个小小的局域网,你是用Linux拨号作为网关,你同时希望小局域网中的98客户机能上网,你可以在Linux网关上按照上面的步骤安装域名服务器,并且将98的DNS服务器配置指向该Linux网关,就可以实现域名解析。
但如果你的需求不仅仅是这些,而是为单位维护有一个局域网并且有一个或多个自己的域名,你希望你的DNS服务器不但能为局域网用户提供访问互联网时提供域名解析服务,并且该DNS服务器维护有你的域名的权威信息,为来自互联网上的服务请求应答你的域名信息。这时候你就需要进一步对DNS服务器进行配置。
配置
本节假设局域网拥有两个域名:linuxaid.com.cn和linuxaid.net.cn,并且局域网由两个C类网组成:172.18.0.0/24和172.18.1.0/24,并且假设域名服务器的IP地址为172.18.0.4。
还需要说明的是/etc/resvole.conf文件,该文件的内容相当于win98下的tcpip的配置信息,包含本机使用的DNS服务器及域信息,例如:
domain linuxaid.com.cn.
domain linuxaid.net.cn.
nameserver 172.18.0.4
对于DNS服务器来说namedserver后面的IP就设置为本机的IP地址。
DNS服务器的主配置文件为/etc/named.conf,并且你还需要创建若干包含域名与IP匹配信息的数据文件。对于本文假设的网络情况,named.conf的内容应该如下所示:
options {
directory '/var/named';
};
zone '.' {
type hint;
file 'named.ca';
}
zone '0.0.127.in-addr.arpa'{
type master;
file 'named.local';
};
zone 'linuxaid.com.cn'{
type master;
file 'linuxaid.com.cn.db';
};
zone 'linuxaid.net.cn'{
type master;
file 'linuxaid.com.cn.db';
};
zone '0.18.172.in-addr.arpa'{
type master;
file '172.18.0.db';
};
zone '1.18.172.in-addr.arpa'{
type master;
file '172.18.1.db';
};
文件的第一部分option指定域数据文件都存放在/var/named目录下,一般不需要修改。
zone '.'定义了根域信息,也就是当域名服务器的收到域名查询请求时,发现客户希望查询的域名不是本地域名时,它就会查询该域文件named.ca中定义的根域名服务器,直到最终得到自己希望查询的域名。
zone '0.0.127.in-addr.arpa'定义了本地回路的反向域解析信息,一般不需要修改。所谓反向解析是指从IP到域名的匹配信息,也就是提供从IP地址到域名的查询所需的数据。
zone 'linuxaid.com.cn'部分定义了域linuxaid.com.cn的相关信息。指定对应该域的数据文件为 /var/named/linuxaid.com.cn.db,master部分的意思是该服务器是该域的主DNS服务器(相对于secondary DNS服务器而言)。
zone 'linuxaid.net.cn'的含义和linuxaid.com.cn是一样的,区别仅仅在于定义的是linuxaid.net.cn这个域。
zone '0.18.172.in-addr.arpa'定义的是172.18.0这个域的反向解析信息。
zone '1.18.172.in-addr.arpa'定义的是172.18.1这个域的反向解析信息。
其中linuxaid.com.cn.db、linuxaid.net.cn.db、172.18.0.db、172.18.1.db都是不存在的,需要在/var/named目录下手工创建。
我们首先看看linuxaid.com.cn.db的内容:
@
IN
SOA
ns.linuxaid.com.cn.
root.linuxaid.com.cn. (
2000080701 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; default_ttl
)
@
IN
NS
ns.linuxaid.com.cn.
@
IN
MX
10 mail.linuxaid.com.cn.
@
IN
A
172.18.0.1
localhost
IN
A
127.0.0.1
www
IN
A
172.18.0.1
IN
A
172.18.0.2
ns
IN
A
172.18.0.4
linuxaid.net.cn.db的内容:
@
IN
SOA
ns.linuxaid.net.cn.
root.linuxaid.net.cn. (
2000080701 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; default_ttl
)
@
IN
NS
ns.linuxaid.net.cn.
@
IN
MX
10 mail.linuxaid.net.cn.
@
IN
A
172.18.0.1
localhost
IN
A
127.0.0.1
www
IN
A
172.18.1.1
IN
A
172.18.1.2
ns
IN
A
172.18.1.4
对于不同的实际情况来说,只需要替换linuxaid.com.cn为自己的域名及将IP地址修改为实际的IP地址。这里A记录表示转换主机名到地址。
其中要特别加以说明的是MX记录,其定义了当发送邮件给user@linuxaid.com.cn时,如何得到真正处理邮件的服务器的域名呢?当发送邮件给地址user@linuxaid.com.cn时,远程邮件发送服务器将首先对linuxaid.com.cn进行MX类型的解析请求,将得到域名mail.linuxaid.com.cn,进而通过查询然后远程邮件发送者将会跟mail.linuxaid.com.cn联系。
172.18.0.db内容应该是和linuxaid.com.cn.db的内容相互对应:
@
IN
SOA
ns.linuxaid.com.cn. root.linuxaid.com.cn. (
2000080501 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; default_ttl
)
@
IN
NS
ns.linuxaid.com.cn.
;
;
SERVER SECTION
;
1
IN
PTR
www.linuxaid.com.cn.
2
IN
PTR
mail.linuxaid.com.cn.
4
IN
PTR
ns.linuxaid.com.cn.
172.18.1.db内容应该是和linuxaid.net.cn.db的内容相互对应:
@
IN
SOA
ns.linuxaid.net.cn. root.linuxaid.net.cn. (
2000080501 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; default_ttl
)
@
IN
NS
ns.linuxaid.net.cn.
;
;
SERVER SECTION
;
1
IN
PTR
www.linuxaid.net.cn.
2
IN
PTR
mail.linuxaid.net.cn.
4
IN
PTR
ns.linuxaid.net.cn.
这些文件设置完毕以后,使用命令ndc restart重新启动named进程。就可以进行测试了:
[root@aid named]# nslookup
Default Server: ns.linuxaid.com.cn
Address: 172.18.0.4
>
这时你可以测试任何在数据文件中配置的域名-IP匹配信息,如:
>www
Server:
ns.linuxaid.com.cn
Address: 172.18.0.4
Name: www.linuxaid.com.cn
Address: 172.18.0.1
>172.18.0.1
Server:
ns.linuxaid.com.cn
Address: 172.18.0.4
Name: www.linuxaid.com.cn
Address: 172.18.0.1
若这些测试均通过则表示你已经成功的假设了一台DNS服务器。只要将win98机器的tcpip设置中的DNS服务器指定为172.18.0.4,然后ping www.linuxaid.com.cn,就应该可以实现解析为你在数据文件linuxaid.com.cn.db中定义的IP地址。
但是,你如何通知互联网用户在需要访问linuxaid.com.cn和linuxaid.net.cn域的信息时到你的dns服务器来询问呢?互联网中所有机器的DNS服务器都指向你的DNS服务器是不现实的。只有通过在你注册域名的服务商处注册你的DNS服务器 (ns.linuxaid.com.cn,172.18.0.4),则互联网用户才可以查询到linuxaid.com.cn和 linuxaid.net.cn域是由172.18.0.4这台服务器负责解析的,通过访问该服务器能得到www.linuxaid.com.cn等本地域名信息。
FAQ
1、如何实现对子域划分呢?
例如,我希望为公司的网络中心划分一个名为nic.linuxaid.com.cn的子域,由网络中心它们自己维护的域名服务器的来解析nic.linuxaid.com.cn这个域的信息。则需要修改linuxaid.com.cn.db,添加如下内容:
nic IN NS dns.nic.linuxaid.com.cn.
dns.nic.linuxaid.com.cn. IN A 172.18.0.3
172.18.0.3这台机器是由网络中心负责维护的,只需要在其上配置运行域名服务器,区别仅仅在于它负责的是nic.linuxaid.com.cn这个域的解析。
2、若我多个域名指向同一个IP,我能否使用别名机制,使得当我替换该Ip时仅仅需要修改一处?
只需要CNAME记录就可以了实现,例如www.linuxaid.com.cn、serv1.linuxaid.com.cn、ideal.linuxaid.com.cn这三个域名指向同一它服务器,则可以在linuxaid.com.cn.db中作如下设置:
serv1
IN
A
172.18.0.5
www
CNAME
serv1
ideal
CNAME
serv1