DNS(Domain Name System,DNS)可以实现主机域名和IP地址之间的相互转换,因此在Linux环境下构建一个可靠、高效的DNS系统是非常有用的。
域名原理简介
在DNS中,各个域分别由不同的组织管理。每个组织都可将它的域再分成一定数量的子域,并将这些子域委托给其他组织管理。域名被用做DNS数据
库中的索引,子域中任何域名都被认为是域的一部分。判断一个域是否为另一域的子域,简单方法是比较它们的域名,一般子域名以其父域名结尾。
设计域名系统的一个主要目的是让管理分散化。管理域的组织将该域划分成子域,每一个子域可以由其他组织管理意味着那些下级组织负责维护自己子域
的所有数据。他们可以改变数据,甚至可以将自己管理的子域再划分成更多的子域并重新分配,而父域中仅包含指向这些子域的指针。
实现域名查询和提供域名信息的程序被称为域名。
通常域名服务器拥有部分域名空间(称之为区Zone)的完整信息,一个域名服务器可以拥有对多个区的授权。域既包括了该层主机,又包括了子域的所有信息;
而区仅包含了一个域中除了分配出去让其它组织管理的子域以外的域名数据信息。如果一个域没有分配任何子域,则该区包含该域的所有域名数据信息。
DNS定义了PM(Primary Master)和SM(Secondary
Master)两类域名服务器。PM从配置文件中读取区域数据,这些数据对整个区域来说都是具有权威性的。SM域名服务器是从其它具有该区授权的PM域名
服务器上获得区数据,并定期查询PM域名服务器以保证区数据为最新版本。一般情况下,最好设立一台PM域名服务器和若干台SM域名服务器。这样可以分担负
载,以确保区中所有主机都有比较靠近的域名服务器方便访问。
对域名系统的访问是按照客户/服务器模式进行的,采用缓存(Caching)技术在保证数据可靠真实性的同时,又保证了较高的效率。应用程序一
般是利用解析器来实现域名解析的。解析器是一组库函数,任何需要解析域名的应用程序都会调用这组函数来完成域名解析工作。解析器是应用程序实现域名查询的
接口。
域名服务器在接收到客户的查询请求时,一般是按照递归的方式来进行的。下面用一个例子来说明什么叫递归方式查询。一个域名服务器MyDM接收到查询的查询请?...铀僖院蟮牟檠??
域名服务器有生存期(TTL)的概念,一旦生存期到了,名字服务器必须丢弃缓存数据并从权威的名字服务器中重新获取新的数据。这样可以确保域数据在整个上的一致性。
从TCP/IP协议栈的角度来看, DNS属于应用层协议,运行在传输层之上,但是它并不使用TCP提供的服务,而是使用UDP服务。
配置文件
下面主要对和域名相关的一些配置文件进行说明,以便进行下一步配置。
/etc/hosts定义了主机名和IP地址匹配信息,供本地解析器使用。本地解析器从该文件中得到主机名匹配信息。例如,zhangsan和lisi的机器没有正式域名,为了使用方便管理员可以在文件中添加内容:
192.168.2.200 zhangshan
192.168.2.201 lisi
这样,就可以使用zhangsan和lisi来实现对其机器的引用了。
/etc/nsswitch.conf指定了从哪个文件或数据库可得到不同的数据。在它的头部有该文件详细的说明,其中应该包含域名相关的内容行:
hosts: files dns
如果没有这样一行内容,则需要管理员手工加入。该行指示域名解析时首先应该查询文件内容( /etc/hosts),然后查询DNS数据库。
/etc/host.conf是解析器的配置文件,指示解析器以什么方式来解析主机名。一般可能包含如下内容:
# 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
Order选项指明的是选择服务的顺序。上面“order bind,hosts”说的是解析器库解析文件名的时候先查询域名服务器,然后再查看“/etc/hosts”文件。因为性能和安全上的原因,最好将解析器库的查找顺序设成先查域名服务器(Bind)。
有多个IP网络接口的主机被称为多穴主机(Multihomed)。例如:服务器就有多个IP地址,必须把这个选项设成on。
Nospoof选项指明不允许IP伪装。IP伪装是把自己伪装成别的计算机去欺骗其它的计算机,获得它的信任。不管对任何类型的服务器,这个选项都要设成on。
/etc/resolv.conf是解析器使用的配置文件。它指示了本地默认域名(在进行域名解析时,如果提交的域名是相对域名如www,则在
解析时解析器会自动添加默认域名然后进行解析如:),并且包含应用程序进行域名解析时需要使用的域名服务器的IP
地址信息。例如:
search linuxaid.com.cn
nameserver 208.164.186.1
nameserver 208.164.186.2
以上表明进行域名解析时按照名字服务器出现的顺序进行。
/etc/named.conf是域名服务器守护进程named的配置文件。named每次启动后,都要从该文件中读取域名配置数据。所以修改该文件及引用的数据,都需要重新启动named以刷新配置。新安装的机器该文件默认内容一般为:
options {
directory "/var/named";
};
zone "." {
type hint;
file "root.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "127.0.0";
};
该文件各部分的具体含义及详细设置在后面加以说明。
编译和安装
Bind的安装有两种方式。一种是以RPM包的方式安装,另一种是使用源程序进行编译。RPM包安装方式非常简单,只要使用命令:
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
就可以安装成功。在此不再详述。下面主要说明使用源程序进行编译这种方式。
1.的下载
下面的示例在Red Hat Linux
7.1下测试通过,需要安装者具有root权限。这里使用的Bind的版本号是8.2.2-patchlevel5。注意在真正的网络应用中(非测试学习
环境)使用Bind时一定要下载最新版本,因为以前的版本中有一些安全漏洞。Bind主页为http :
//,下载bind-contrib.tar.gz, bind-doc.tar.gz, bind-src.tar.gz。
最好在编译前和编译后都做一张系统中所有文件的列表,然后用diff命令比较它们找出其中的差别,并知道到底把软件安装在哪里。只要在编译之前
运行 find /* >dns1命令,在编译和安装完软件之后运行find/*>dns2命令,最后用d i ff dns1 dns2
>dns命令找出变化。显示如下:
[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/
我们创建了一个名为“bind”的目录,用它来处理tar文档,并转到新的“bind”目录(cd/ var/ tmp/bind),解压tar文件:
[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
2.编译配置和优化
编辑Makefile.set文件(vi /src/port/linux/Makefile.set),并加入:
'CC=egcs -D_GNU_SOURCE'
'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro
-march=pentiumpro -fomitframe-
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=:'
第一行说明使用的GCC编译器的名字是egcs。第二行是优化参数。“DESTLIB =”这一行说明Bind所需的库函数目录,“DESTING =”说明Bind的include目录在哪里。输入下面的命令:
[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
make命令把所有的源文件都编译成二进制文件,接着“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
strip命令去掉目标文件中的所有符号信息。这样二进制程序就会缩小一些,可以提高程序的性能。mkdir命令创建一个“/var/named”目录。
3.清除不必要的文件
[root@Aid /]# cd /var/tmp
[root@Aid tmp]# rm -rf bind/
这些命令删除用来编译和安装BIND/DNS的源文件。