作者:王剑 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 接收到查询 www.linuxaid.com.cn 的查询请求。它首先询问本地存储的根域名服务器列表中的任何一个根域名服务器,负责 cn 域的名字服务器有哪些。前面曾经说过,上级域名服务器有指向下级子域名服务器的指针。所以根名字服务器就会返回负责 cn 域数据信息的名字服务器的列表。 MyDM 会缓冲这些数据继续查询其中的一个,询问负责 linuxaid 子域的域名服务器有哪些。得到信息后再递归查询,直到找到 www.linuxaid.com.cn 的 IP 信息。查询中得到的所有域名服务器信息都会被缓存起来,以加速以后的查询。 域名服务器有生存期 (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,则在解析时解析器会自动添加默认域名然后进行解析如:www.linuxaid.com.cn),并且包含应用程序进行域名解析时需要使用的域名服务器的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://www.isc.org/,下载 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 的源文件。
[1] [2] 下一页
(出处:http://www.sheup.com)