07Linux域名服务器
第7章Linux 域名服务器D N S 是Domain Name System的缩写,其功能是实现主机域名和主机I P 地址之间的相互转换,本章主要介绍如何在L i n u x 环境下构建一个安全可靠
第7章Linux 域名服务器
D N S 是Domain Name System的缩写,其功能是实现主机域名和主机I P 地址之间的相互转换,本章主要介绍如何在L i n u x 环境下构建一个安全可靠、高效的D N S 系统。
7.1 域名原理简介
I n t e r n e t 的域名系统是一个树状层式( h i e r a r c h y ) 结构的分布式数据库。所谓树状层式结构是指整个域名系统是按照分层的原则进行分配和管理的,从最高的I n t e r n e t 管理机构分配的顶级域名开始,逐级向下展开,形成一个倒置的树状结构(如图7 -1所示) ;而所谓分布式数据库则是指拥有自己的域名的各个组织只需管理自己的数据,各组织之间的域名数据通过根域相互联系。其中根域名用" . " 来表示。
图7 -1
域名树中的每一个节点都表示一个域,每个域可再进一步划分成子域,依次类推,形成一个分层的倒置树结构。每个域都有一个标签( L A B E L ) ,每个标签最多可包含6 3个字符,若任何两个域属于同一个父域,则它们不能同名,否则会产生二义性。将从根域开始到一个域所经过的所有节点的标签用" . " 连接起来就形成该域的域名(domain name),例如" l i n u x a i d . c o m . c n . " 。一个域的域名标识了其在整个域名树中的位置,以顶级域名结尾的域名被称为绝对域名( A b s o u l t e Domain Name),不以顶级域名被称之为相对域名。
域名数据库的数据是按照域名来进行组织的,所以要根据域名解析对应的I P 地址是很容易的,如果需要从I P 地址反向解析域名就需要对域名树进行穷尽搜索,从而效率非常低下,为了
解决这个问题,就产生了以地址为索引的域名空间。这部分名字空间被称为i n -a d d r . a r p a 域。i n -a d d r . a r p a 域中的节点以反向D o t e d -o c t e t (将3 2b i t I P 地址表示为由" . " 分隔开的四个8 b i t 的十进制形式的方法) 形式来组织,例如w w w . l i n u x a i d . c o m . c n 对应的I P 地址为2 0 2 . 9 9 . 11 . 1 2 0,则相应的i n -a d d r . a r p a 子域为11 . 99. 202. i n -a d d r . a r p a 。
在D N S 中,各个域分别由不同的组织进行管理。每个组织都可以将它的域再分成一定数量的子域并将这些子域委托给其他组织进行管理。域名被用做D N S 数据库中的索引,子域中任何域名被认为是域的一部分。判断一个域是否为另一域的子域的简单方法是比较它们的域名,子域名以其父域名结尾。
设计域名系统的一个主要目的是让管理分散化。管理域的组织将该域划分成子域,每一个子域可以由其他组织管理(例如l i n u x a i d 网站具有对l i n u x a i d . c o m . c n 域的管理权,其可以将一个子域d e v e l o p . l i n u x a i d . c o m . c n 分配给开发部管理) ,这意味着那些下级组织负责维护自己的子域的所有数据. 他们可以自由地改变数据,甚至可以将自己管理的子域再划分成更多的子域并再分配,而父域中仅包含指向这些子域的指针。
实现域名查询和提供域名信息的程序被称为域名服务器(name server),通常域名服务器拥有部分域名空间(称之为区z o n e ) 的完整信息,一个域名服务器可以拥有对多个区的授权。
区与域的关系:域既包括了该层主机又包括了其子域的所有信息;而区仅仅包含了一个域中除了分配出去让其他组织管理的子域以外的所有域名数据信息。如果一个域没有分配任何子域,则该区包含该域的所有域名数据信息。例如:以l i n u x a i d . c o m . c n 后缀结尾的所有域名都属于l i n u x a i d . c o m . c n 域,如果d e v e l o p . l i n u x a i d . c o m . c n 被分配给开发部管理,则l i n u x a i d . c o m . c n 区就不包含以d e v e l o p . l i n u x a i d . c o m . c n 后缀结尾的域名信息,这些数据是属于d e v e l o p . l i n u x a i d . c o m . c n 区的。
D N S 定义了两类域名服务器:primary Master 和secondary Master。主域名服务器从配置文件中读取区域数据,这些数据对整个区域来说都是具有权威性的。而S M 域名服务器是从其他的具有该区授权的P M 域名服务器上获得区数据,S M 域名服务器一般会定期查询P M 域名服务器以保证区数据为最新版本。一般情况下,最好设立一台P M 域名服务器和若干台S M 域名服务器,这样可以分担负载。以确保区中所有主机都有比较靠近的域名服务器,方便访问。
对域名系统的访问是按照客户/服务器的模式进行的,采用了缓存( c a c h i n g ) 技术,实现了在保证数据可靠真实性的同时,又保证了较高的效率。应用程序(如:t e l n e t 、f t p 、浏览器及p i n g 等等) 一般是利用解析器来实现域名解析的,解析器是一组库函数,任何需要解析域名的应用程序都会调用这组函数,来完成域名解析工作。解析器是应用程序实现域名查询的接口。
域名服务器在接收到客户的查询请求时,一般是按照递归的方式来进行的。我们以一个例子来说明什么叫递归方式查询。一个域名服务器M y D M 接收到查询w w w . l i n u x a i d . c o m . c n 的查询请求,它首先询问本地存储的根域名服务器的列表中的任何一个根域名服务器,负责c n 域的名字服务器有哪些,我们前面说过,上级域名服务器有指向下级子域名服务器的指针。所以根名字服务器就返回负责c n 域数据信息的名字服务器的列表,M y D M 就会缓冲这些数据,继续查询其中的一个,询问负责l i n x u a i d 的子域的域名服务器有哪些,得到以后再递归查询,直到找到w w w . l i n u x a i d . c o m . c n 的I P 信息,在查询中得到的所有域名服务器信息都会被缓存起来以加速以
后的查询。域名服务器中有生存期( T T L ) 的概念,其含义是一个允许名字服务器对域名数据缓存的时间长度的值,一旦生存期到了,名字服务器必须丢弃缓存数据并从权威的名字服务器中重新获取新的数据。这样可以确保域数据在整个网络上的一致性。
从T C P /I P 协议栈的角度来看,D N S 属于应用层协议,运行在传输层之上,但是它并不使用T C P 提供的服务,而是使用U D P 服务。
7.2 和域名相关的若干配置文件
这一节主要对和域名相关的一些配置文件进行说明,以便进行下一步配置。
/etc/hosts
该文件定义主机名和I P 地址匹配信息,这个文件的信息供本地解析器使用,本地解析器从该文件中得到主机名匹配信息。这个文件主要是方便本地应用的。例如,z h a n g s a n 和l i s i 的机器没有正式域名,为了使用方便,管理员可以在文件中添加内容:
192.168.2.200
192.168.2.201zhangshan lisi
这样,就可以使用z h a n g s a n 和l i s i 来实现对其机器的引用了。
/etc/nsswitch.conf
该文件指定了从哪个文件或数据库,从什么地方得到不同的数据,在该文件的头部有该文件详细的说明,其中应该包含域名相关的内容行:
hosts: files dns
如果没有这样一行内容,则需要管理员手工加入。该行指示域名解析时首先应该查询文件内容( /e t c /h o s t s ) ,然后查询D N S 数据库。
/ e t c /h o s t . c o n f
/ e t c /h o s t . c o n f 文件是解析器的配置文件,指示解析器以什么方式来解析主机名(是使用域名服务还是本地h o s t s 文件) 。一般可能包含如下内容:
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
o r d e r 选项指明的是选择服务的顺序。上面“order bind, hosts”说的是解析器库解析文件名的时候先查询域名服务器,然后再查看“/ e t c /h o s t s ”文件。因为性能和安全上的原因,最好将解析器库的查找顺序设成先查域名服务器(b i n d )。当然也要先安装了D N S /B I N D 软件,否则这样配置根本没有任何作用。
m u l t i 选项决定在“/ e t c /h o s t s ”文件中出现的主机能不能有多个I P 地址(多个网络界面)。具有多个I P 网络接口的主机被称为多穴主机(m u l t i h o m e d )。例如:网关服务器就有多个I P 地址,必须把这个选项设成O N 。
,n o s p o o f 选项指明不允许I P 伪装。I P 伪装是把自己伪装成别的计算机去欺骗其他的计算机,获得它的信任。不管对任何类型的服务器,这个选项都要设成O N 。
/etc/resolv.conf
该文件是解析器使用的配置文件,其指示了本地默认域名(在进行域名解析时,如果提交的域名是相对域名如w w w,则在解析时解析器会自动添加默认域名然后进行解析如:
w w w . l i n u x a i d . c o m . c n ) ;并且包含应用程序进行域名解析时需要使用的域名服务器的I P 地址信息。例如:
search linuxaid.com.cn
nameserver 208.164.186.1
nameserver 208.164.186.2
当进行域名解析时,是按照名字服务器出现的顺序进行解析的。
/etc/named.conf
该文件是域名服务器守护进程n a m e d 的配置文件,每次n a m e d 启动以后,都要从该文件中读取域名配置数据,所以每次修改该文件及文件内引用到的数据,都需要重新启动n a m e d ,以刷新配置。新安装的机器该文件默认内容一般为:
options {
directory "/var/named";
};
zone "." {
type hint;
file "root.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "127.0.0";
};
该文件各部分的具体含义及详细设置在后面加以说明。
7.3 编译和安装
B i n d 的安装有两种方式,一种是以R P M 包的方式安装,这种方式非常简单,只要使用命令:rpm -Uhv bind-8.2.2-p5-9.i386.rpm
rpm -Uhv bind-devel-8.2.2-p5-9.i386.rpm
rpm -Uhv cache-nameserver-6.2-2.noarch.rpm
就可以安装成功,因此这里就不加以详述;另外一种方式是使用源程序进行编译,下面主要说明这种方式。
7.3.1 软件的下载
本节的示例在RedHat Linux 6.1下测试通过,需要安装者具有r o o t 权限;这里使用的b i n d 的版本号是8 . 2. 2-p a t c h l e v e l 5。注意在真正的网络应用中(非测试学习环境) 使用b i n d 时一定要自己下载
最新版本,因为以前的版本中都有一些安全漏洞。b i n d 主页:h t t p ://w w w . i s c . o r g /。下载:b i n d -c o n t r i b . t a r .gz, bind-doc.tar.gz, bind-src.tar. g z 。最好在编译前和编译后都做一张系统中所有文件的列表,然后用d i f f 命令去比较它们,找出其中的差别并知道到底把软件安装在哪里。只要简单地在编译之前运行一下命令“find /* >dns1”,在编译和安装完软件之后运行命令“find /* > dns2”,最后用命令“d i f f dns1 dns2 > dns”找出变化。
把软件包(t a r . g z )解压缩:
[root@Aid /]# mkdir /var/tmp/bind
[root@Aid /]# cp bind-contrib.tar.gz /var/tmp/bind/
[root@Aid /]# cp bind-doc.tar.gz /var/tmp/bind/
[root@Aid /]# cp bind-src.tar.gz /var/tmp/bind/
我们创建了一个名为“b i n d”的目录,用来处理t a r文档,转到新的“b i n d”目录(c d/ v a r /t m p /b i n d ),解压t a r 文件:
[root@Aid bind]# tar xzpf bind-contrib.tar.gz
[root@Aid bind]# tar xzpf bind-doc.tar.gz
[root@Aid bind]# tar xzpf bind-src.tar.gz
7.3.2 编译配置和优化
编辑“M a k e f i l e . s e t ”文件(vi /src/port/linux/Makefile.set),并加入:
'CC=egcs -D_GNU_SOURCE'
'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro
-march=pentiumpro -fomit-
frame-pointer -fno-exceptions'
'DESTBIN=/usr/bin'
'DESTSBIN=/usr/sbin'
'DESTEXEC=/usr/sbin'
'DESTMAN=/usr/man'
'DESTHELP=/usr/lib'
'DESTETC=/etc'
'DESTRUN=/var/run'
'DESTLIB=/usr/lib/bind/lib'
'DESTINC=/usr/lib/bind/include'
'LEX=flex -8 -I'
'YACC=yacc -d'
'SYSLIBS=-lfl'
'INSTALL=install'
'MANDIR=man'
'MANROFF=cat'
'CATEXT=$$N'
'PS=ps -p'
'AR=ar crus'
'RANLIB=:'
第一行说明我们用的g c c 编译器的名字是e g c s ,第二行是优化参数。“D E S T L I B =”这一行说
,明b i n d 所需的库函数目录,“D E S T I N G =”说明b i n d 的i n c l u d e 目录在哪里。
输入下面的命令:
[root@Aid bind]# make -C src
[root@Aid bind]# make clean all -C src SUBDIRS=../doc/man
[root@Aid bind]# make install -C src
[root@Aid bind]# make install -C src SUBDIRS=../doc/man
m a k e 命令把所有的源文件都编译成二进制文件,接着“make install”把二进制文件和相关的配置文件安装到相应的目录中。
[root@Aid bind]# strip /usr/bin/addr
[root@Aid bind]# strip /usr/bin/dig
[root@Aid bind]# strip /usr/bin/dnsquery
[root@Aid bind]# strip /usr/bin/host
[root@Aid bind]# strip /usr/bin/nslookup
[root@Aid bind]# strip /usr/bin/nsupdate
[root@Aid bind]# strip /usr/bin/mkservdb
[root@Aid bind]# strip /usr/sbin/named
[root@Aid bind]# strip /usr/sbin/named-xfer
[root@Aid bind]# strip /usr/sbin/ndc
[root@Aid bind]# strip /usr/sbin/dnskeygen
[root@Aid bind]# strip /usr/sbin/irpd
[root@Aid bind]# mkdir /var/named
s t r i p 命令去掉目标文件中的所有符号信息。这样二进制程序就会小一些,可以提高程序的性能。m k d i r 命令创建一个“/ v a r /n a m e d ”目录。
7.3.3 清除不必要的文件
[root@Aid /]# cd /var/tmp
[root@Aid tmp]# rm -rf bind/
这些命令删除用来编译和安装B I N D /D N S 的源文件。
在下面的部分,我们都是用如图7 -2所示的网络拓扑结构来模拟一个实际应用来设置D N S 。
Caching DNS
208.164.186.3主DNS 208.164.186.1辅DNS
208.164.186.2
内部网
192.168.1.0/24
图7 -2
,后面所有的例子都以该拓扑为基础。域名服务器一共有三种类型:caching only域名服务器,主域名服务器和辅助域名服务器。这三种不同类型的域名服务器分别应用于不同的场合。下面我们就分别讨论三种域名服务器的应用场合和如何配置。
7.4 如何设置一个caching only域名服务器
7.4.1 设置
所谓caching only域名服务器是指一个服务器运行有n a m e d 进程,但是并不对任何域(区) 的域名信息具有授权,也就是并不向外提供本域的域名匹配信息,不负责I n t e r n e t 上对本组织域名解析的应答;而只是负责本地网客户端对外部域名的解析请求,收到客户端(如w i n 98) 的查询请求以后,就从根域名服务器开始进行域名查询,直到最终收到应答,然后将查询结果返回给客户,并且缓冲查询中得到的各种域名信息,以供以后查询使用。
本节讨论caching only域名服务器的配置,同时讨论如何对域名服务器进行测试。
一般来说,一个caching only域名服务器的n a m e d . c o n f 的内容为:
options {
directory "/var/named";
};
zone "." {
type hint;
file "root.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file " 127.0.0";
};
o p t i o n 部分的d i r e c t o r y 指示指定了后面引用的各种文件都位于/ v a r /n a m e d 目录之下。区" . " 是指根区,其类型为h i n t ,h i n t 区用来指定根域的服务器,其中根域名服务器信息位于r o o t . c a 文件中,其内容一般如下所示,而且在文件的注释部分还说明了如何得到该文件最新版本的信息:
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers(e.g. reference this
; file in the "cache .
; servers).
; This file is made available by InterNIC registration services under
; anonymous FTP on server FTP.RS.INTERNIC.NET
; last update: Aug 22, 1997
; related version of root zone: 1997082200
;
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
. 3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
. 3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
. 3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
. 3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
. 3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
. 3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10
. 3600000 NS K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
. 3600000 NS L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12
;
; housed in Japan, operated by WIDE
;
. 3600000 NS M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
; End of File
n a m e d . c o n f 的最后一部分定义了本地回路接口的反向解析区,其类型为m a s t e r ,是说明本机对于该区的信息是权威的,并且是该区的Primary Master域名服务器。其区数据定义在文件/ v a r /n a m e d /127. 0. 0中:
@ IN SOA ns.linux.bogus. hostmaster.linux.bogus. (
1 ; Serial
8H ; Refresh
2H ; Retry
1W ; Expire
1D) ; Minimum TTL
NS ns.linuxaid.com.cn.
1 PTR localhost.
该文件的含义在后面将加以详细说明。
7.4.2 启动测试
下面就可以启动这个已经设置好的caching only域名服务器了。在l i n u x 中提供了一个启动或停止n a m e d 的工具—ndc(Name Daemon Control Program)。启动n a m e d 的命令为:ndc start;停止n a m e d 的命令为:ndc stop;重新启动n a m e d 的命令为:ndc restart。使用命令ndc start启动
n a m e d :
root@ns root]# /usr/sbin/ndc start
new pid is 601则表示名字服务器已经启动。在启动名字服务器时,使用tail -f /var/log/message输出如下内容:
Aug 27 10:03:17 ns named[600]: starting. named 8.2.2-P5 Mon Feb 28 10:17:53 ESdAug 27 10:03:17 ns named[600]: hint zone "" (IN) loaded (serial 0)
A u g 27 10:03:17 n s n a m e d [600]: Z o n e " l i n u x a i d . c o m . c n " (f i l e l i n u x a i d . c o m . c n ) : N o d e f a d
Aug 27 10:03:17 ns named[600]: master zone "linuxaid.com.cn" (IN) loaded (serial 2)
Aug 27 10:03:17 ns named[600]: Zone "0.0.127.in-addr.arpa" (file named.local): d
Aug 27 10:03:17 ns named[600]: master zone "0.0.127.in-addr.arpa" (IN) loaded ()
Aug 27 10:03:17 ns named[600]: Zone "11.99.202.in-addr.arpa" (file 114.12.210)d
Aug 27 10:03:17 ns named[600]: master zone "11.99.202..in-addr.arpa" (IN) loade)
Aug 27 10:03:17 ns named[600]: listening on [127.0.0.1].53 (lo)
Aug 27 10:03:17 ns named[600]: listening on [202.99.11.120].53 (eth0)
Aug 27 10:03:17 ns named[600]: Forwarding source address is [0.0.0.0].1029
Aug 27 10:03:17 ns named[601]: Ready to answer queries.
则说明名字服务器已经顺利启动,等待查询请求的到来。另外l i n u x 还提供了一个域名查询工具—n s l o o k u p ,可以用来检测名字服务器运行是否正常。
[root@ns root]$ nslookup
Default Server: ns.plagh.com.cn
Address: 210.12.114.130
> www.linuxaid.com.cn
Server: localhost
Address: 127.0.0.1
Name: www.linuxaid.com.cn
Address: 202.11.99.120
> www.linuxaid.com.cn
Server: localhost
Address: 127.0.0.1
Non-authoritative answer:
Name: www.linuxaid.com.cn
Address: 202.11.99.120
从上面的输出可以看到域名查询工作正常,注意到第二次查询w w w . l i n u x a i d . c o m . c n 时输出了Non-authoritative answer的信息,这说明第二次查询同一个域名时,n a m e d 并没有真正到I n t e r n e t 上查询,而是使用了第一次查询结果的缓冲,所以其回答是非权威的。
7.4.3 域名查询转发
在大型的I S P 或者组织的网络中,可能会出现分级的查询转发D N S 服务器的情况,这主要是用来减轻内部网络和D N S 服务器的负载而设置的;所谓的查询转发指当某个域名服务器A 接收到域名查询请求以后,不是到根域名服务器开始而是在本地没有对需要查询的域名缓冲的情况下,
将查询请求转发给另外一个域名服务器B ,另外B 域名服务器也许在缓冲内有需要查询域名的缓冲,若有,则返回给A ,若没有,则可能再将查询请求转发给更上层的一个域名服务器,或者直接到根域名服务器处开始查起,这样多个D N S 服务器就形成了一个分层的查询转发链,从而可以有效地减轻网络负载。
要设立域名查询转发,假设上级的D N S 服务器I P 地址分别为1 0. 0. 0. 1和1 0. 1. 0. 1;在本地的n a m d . c o n f 配置文件的o p t i o n 部分,添加如下内容:
forward first;
forwarders {
10.0.0.1;
10.1.0.1;
};
下面利用这个caching only域名服务器来说明域名查询的工作原理:
$ nslookup
Default Server: localhost
Address: 127.0.0.1
首先询问一个根域名服务器:
> server c.root-servers.net.
Default Server: c.root-servers.net
Address: 192.33.4.12
然后设定查询类型为NS(name server)类型,然后查询e d u 域,其中e d u . 后面的点很重要,指示了这里查询的是根域下的e d u 域的信息,而不是我们自己域下的e d u 域的信息:
> set q=ns
> edu.
edu nameserver = A.ROOT-SERVERS.NET
edu nameserver = H.ROOT-SERVERS.NET
edu nameserver = B.ROOT-SERVERS.NET
edu nameserver = C.ROOT-SERVERS.NET
edu nameserver = D.ROOT-SERVERS.NET
edu nameserver = E.ROOT-SERVERS.NET
edu nameserver = I.ROOT-SERVERS.NET
edu nameserver = F.ROOT-SERVERS.NET
edu nameserver = G.ROOT-SERVERS.NET
A.ROOT-SERVERS.NET internet address = 198.41.0.4
H.ROOT-SERVERS.NET internet address = 128.63.2.53
B.ROOT-SERVERS.NET internet address = 128.9.0.107
C.ROOT-SERVERS.NET internet address = 192.33.4.12
D.ROOT-SERVERS.NET internet address = 128.8.10.90
E.ROOT-SERVERS.NET internet address = 192.203.230.10
I.ROOT-SERVERS.NET internet address = 192.36.148.17
F.ROOT-SERVERS.NET internet address = 192.5.5.241
G.ROOT-SERVERS.NET internet address = 192.112.36.4
这里列出了所有服务E D U 域的R O O T - S E R V E R S . N E T . 域的服务器的列表。下面再查询m i t . e d u . 域: