个人工具

Quick HOWTO : Ch18 : Configuring DNS/zh

来自Ubuntu中文

跳转至: 导航, 搜索

目录

介绍

域名系统(DNS)用于把网页地址(www.linuxhomenetworking.com)转换成IP地址(65.115.71.34)。这一步很重要,因为网页服务器的IP地址被作为传输路径工作于英特网,而并非该网页服务器的名字。这里将说明如何配置DNS服务,以帮助你的网页能被网络浏览

介绍DNS

在深入DNS之前,你需要了解一些基本的概念,以便深入理解其余内容

DNS域

每个人都有姓氏和名字或别名。在DNS世界里也一样:一个网页姓氏可以抽象的表示为一个域名。例如:域名linuxhomenetworking.com有它自己的子域www.linuxhomenetworking.comt和mail.linuxhomenetworking.com,分别代表了网页和邮件服务。

BIND

BIND是Berkeley Internet Name Domain project的缩写,是维护运行在Linux系统下DNS相关软件的组织。BIND程序很著名,这个守护程序用于远端电脑的DNS查询服务。

DNS客户端

DNS客户端不保存DNS信息,它总是从DNS服务器获取信息。DNS客户端唯一的配置文件是/etc/resolv.conf,它定义了DNS服务器的IP地址。你不需要配置其它文件。不久,你将对/etc/resolv.conf很熟悉。

权威DNS服务器

权威DNS服务器提供最终的DNS域名信息,比如服务名、网页名等。这些信息与你的域名一起组成了完整的路径。

DNS服务器如何找出你的网页信息

有13个根权威DNS服务器,所有DNS服务器从它们开始查询。这些根权威DNS服务器包含所有的权威DNS服务器,即所有的主要域.com,.net等。这一层的服务器保存了所有DNS服务器网站系统管理员标记过的子域记录。 举例,当你注册你的域my-site.com,你即在指向权威DNS服务器的管理.com的DNS服务器上插入了你的域名记录。(更多信息在下面的如何注册你网址)。

何时使用DNS缓冲名称服务器

大部分DNS服务器并不直接询问权威服务器,而是根据行为来询问缓冲DNS服务器。这些服务器通过一个叫作“递归”的程序,即循环的从根、主域、子域权威服务器获取信息,以获得它所要求的信息。最频繁的查询请求信息被保存到缓冲中,以减少查询的开支。

假如你想向全球发布你的网站www.my-site.com,那么一个普通的DNS服务器即是你所需要的。建立一个缓冲DNS服务器相当的简单;还有,你的ISP提供给你的静态或动态IP地址是否可用。

当你建立缓冲DNS服务器后,你必须配置一台处于本地网络的电脑作为它们的DNS服务器。假如你的本地网络电脑通过DHCP来获取它们的IP地址,那么你需要配置DHCP服务器,让其获取你那新的DNS服务器的IP地址,以便DHCP服务器能把DNS服务器通知给电脑客户端。目前应用在家庭网络的路由器/防火墙设备通常都具有缓冲DNS和DHCP服务器的功能,独立的DNS服务器是不必要的。

你能在第八章"配置DHCP服务器"找到配置DHCP服务器的步骤。


何时使用静态DNS服务器

假如你的ISP提供给你一个固定的或静态IP地址,并且你想要管理你自己的主页,那么一个固定的权威DNS服务器就以这种方式运行。缓冲DNS名字服务器只被用来参考,固定的名称服务器被当作你网页域名的权威信息来使用。

何时使用动态DNS服务器

若你的ISP提供给你路由器/防火墙的IP地址是DHCP的,那你就要参考第19章的“动态DNS”。这里,我假设你是使用静态IP地址。

如何获得你自己的域

不论你是使用静态或动态DNS,你都需要注册一个域名。

动态DNS提供商通常提供给你的是它们自己网站的子域,比如my-site.dnsprovider.com,就是你在它们网站上注册的你的域名。

如果你选择创建自己特有的域名,比如my-site.com,你需要以公司的形式在静态DNS注册代理上作登记,才会为你的域名把你的登记记录指向特定的权威DNS。著名的域名注册代理有VeriSign, Register Free, 和Yahoo。

如果你的域名要使用动态DNS服务,那么你需要把你的注册记录指向到你的动态DNS供应商的DNS服务器上。(有关域注册的更多详细信息将在下面章节给出。)

DNS解析的基本DNS测试

如你所知,DNS解析映像主机域名全称(FQDN),比如把www.linuxhomenetworking.com映像成为IP地址。这就是所谓的前查找。反过来就是:反查找,DNS把IP地址转换成主机域名全称。

许多不同的网站可以映像为一个IP地址,但是反过来不行;一个IP地址只能映像为一个主机域名全称(FQDN)。这意味着前查找和反查找入口通常不是匹配的。充当反查找DNS入口通常是维护你网站的ISP的责任,所以反查找就很容易的解析ISP的域名。这一点对小网站而言并不是重要的因素,但对一些电子商务应用而言就需要与入口匹配才能正常的运行。你可以要求你的ISP做一些针对性的DNS修改就能实现这些。

你可以使用一些命令来做那些查找。比如,Linux使用host命令,但Windows使用nslookup。

Host命令

host命令接受带主机域名全称或IP地址的参数。要进行前向查找,使用如下命令行:

[root@bigboy tmp]# host www.linuxhomenetworking.com
www.linuxhomenetworking.com has address 65.115.71.34
[root@bigboy tmp]#

要进行反向查找

[root@bigboy tmp]# host 65.115.71.34
34.71.115.65.in-addr.arpa domain name pointer 65-115-71-34.myisp.net.
[root@bigboy tmp]#

如你所见,前向查找和反向查找结果不匹配。反向查找结果与ISP匹配。

nslookup命令

nslookup命令给Windows电脑提示类似的功能。要进行前向查找,使用:

C:\> nslookup www.linuxhomenetworking.com
Server:  192-168-1-200.my-site.com
Address:  192.168.1.200

Non-authoritative answer:
Name:    www.linuxhomenetworking.com
Address:  65.115.71.34

C:\>

要进行反向查找

C:\> nslookup 65.115.71.34
Server:  192-168-1-200.my-site.com
Address:  192.168.1.200

Name:    65-115-71-34.my-isp.com
Address:  65.115.71.34

C:\>

下载安装BIND包

大部分RedHat和Fedora Linux软件产品都有安装包的形式。当寻找文件时,记住BIND安装包的名字通常是以"bind"开头,并紧跟着版本号,类似bind-9.2.2.P3-9.i386.rpm。(更多信息有关下载RPM安装包,请看第六章“安装Linux软件”。)

注:除有另外说明外,本章配置都针对Redhat/Fedora发行版本。如果你使用Debian/Ubuntu,请不用担心,将会有相对的声明。

如何使用BIND

建立你的DNS服务器是比较容易的事,但对于不对的Linux发行版本会稍有些不同。

Redhat / Fedora

你可以使用chkconfig命令进行BIND配置

[root@bigboy tmp]# chkconfig named on

开始,停止,重启BIND,使用:

[root@bigboy tmp]# /etc/init.d/named start
[root@bigboy tmp]# /etc/init.d/named stop
[root@bigboy tmp]# /etc/init.d/named restart

记得每次更改配置文件时都要重启BIND程序,以便更改起效。

Debian / Ubuntu

你可以使用sysv-rc-conf命令进行BIND配置

[root@bigboy tmp]# sysv-rc-conf bind on

开始,停止,重启BIND,使用:

[root@bigboy tmp]# /etc/init.d/bind start
[root@bigboy tmp]# /etc/init.d/bind stop
[root@bigboy tmp]# /etc/init.d/bind restart

虽然启动脚本和安装软件包的名字是bind,但运行时的守护程序名与Redhat/Fedora类似。同样记得每次更改配置文件时都要重启BIND程序,以便更改起效。

/etc/resolv.conf文件

DNS客户端(服务器不运行BIND)使用/etc/resolv.conf文件设置DNS服务器和他们隶属的域名。这个文件通常有两列:第一列是一个关键词,第二列是一个数值,由逗号分隔开。请看表18.1,关键词列表。

表18.1/etc/resolv.conf中的关键词

关键词
Nameserver 你的名称服务器的IP地址。一个“nameserver”关键词只能有一个条目。如有不只一个nameserver,你就需要写多行。
Domain 默认使用本地域名。若服务器是bigboy.my-web-site.org,条目即是bigboy.my-web-site.org
Search 若你只给令一个服务器提交了名称而没有域,你客户端上的DNS会把这个列表上的域自动添加上,并逐一查询去获取远端服务的IP地址。这是一种简便省时的功能,以方便你在只根据服务名省略域的方法。列表中的域必须由空格分隔。

参照一份客户端的配置样本,该客户端的服务主域是my-site.com,也是my-site.net和my-site.org的域成员。二个名称服务器,192.168.1.100和192.168.1.102,提供DNS名称解析:

search my-site.com my-site.net my-site.org
nameserver 192.168.1.100
nameserver 192.168.1.102

查找列出的第一个域是主域,上面所示为my-site.com。因此,在/etc/resolv.conf列出域和查找条目是多余的。

重要文件位置

接下来你将会看到,BIND配置文件的位置因Linux发行版本而不同。

RedHat / Fedora

RedHat / Fedora BIND通常是随普通用户运行的程序命名。

有时BIND也可以使用Linux chroot功能安装,以使不仅可以由用户命名,还可以限定文件名称。安装时,命名被假定为目录/var/named/chroot就是root或/目录。因此,通常在/etc目录中的命名文件实际上是在/var/named/chroot/etc目录中,而/var/named其实是在/var/named/chroot/var/named这个位置。

chroot功能的优点是,假如有黑客通过BIND侵入你的系统时,这个黑客侵入你系统其它位置的行为只能被限定在chroot目录。这种安全保护方式就是出名的chroot监牢。

你可以使用这个命令来查看你是否有chroot功能的RPM安装包,命令将返回RPM包的名称。

[root@bigboy tmp]# rpm -q bind-chroot
bind-chroot-9.2.3-13
[root@bigboy tmp]#

可能会对位置不清楚:普通的BIND安装到通常的位置,而具有chroot功能的 BIND RPM包安装到到chroot位置。可惜的事,chroot版本有些文件是空的。在开始Fedora BIND之前,复制配置到chroot位置:

[root@bigboy tmp]# cp -f /etc/named.conf /var/named/chroot/etc/
[root@bigboy tmp]# cp -f /etc/rndc.* /var/named/chroot/etc/

在看下一步配置名字服务器之前,准确理解文件位置是很重要的。表格18.2列出图示

表18.2Fedora和Redhat DNS文件位置的不同之处

文件 作用 BIND chroot位置 普通BIDN位置
named.conf 为用于网页域的区域文件提供名称。 /var/named/chroot/etc /etc
rndc.key

rndc.conf

为于名称权威服务器的文件 /var/named/chroot/etc /etc
区域文件 链接你域中的所有的IP地址到它们相关的服务器 /var/named/chroot/var/named /var/named

注:Fedora Core默认安装BIND chroot。RedHat 9 及更早版本不是。

Debian / Ubuntu

Debian / Ubuntu,所有配置文件,基本的named.conf文件以及所有在/etc/bind目录中的DNS区域文件。

和Redhat/Fedora不同,这些配置文件中有关的其它文件必须包含完整路径。这个被命名的守护程序不会自动的被定位在/etc/bind目录中。

配置你的名字服务器

在这一节里,假定你的ISP分配给你的子网地址是97.158.253.24,子网掩码是255.255.255.248 (/29).

配置resolv.conf

你需要为DNS服务器配置/etc/resolv.conf文件,以使所有的DNS查询都响应为localhost,

nameserver 127.0.0.1

建立一个named.conf基本配置

/etc/named.conf文件包含主要的DNS配置,并告诉BIND配置文件的位置,以及有你每个域的区域文件。这个文件通常有二块:

  • 前向区域文件定义了用于映像域到IP地址的文件列表。
  • 反向区域文件定义了用于映像IP地址到域的文件列表。

有些BIND的版本可能会有一个/etc/amed.conf文件,用于配置缓冲名字服务器;这些缓冲名字服务器可以通过增加正确的区域文件来转换到权威名字服务器。Please proceed to the next section if this is the case with your version of BIND.

另一种情况是named.conf配置文件可能找不到。有些版本的Linux默认安装BIND作为缓冲名字服务器,使用/etc/named.caching-nameserver.conf作为配置文件。这种情况下,若/etc/named.conf配置文件正确无误,BIND成为权威名字服务器。

幸运的是,BIND有你需要的所有基本文件的样本。表格18.3详细解释了这些名字和用途。

表格18.3BIND主要配置文件

文件 描述
/etc/named.conf 主要配置文件,列出了你所有域的区域文件位置
/etc/named.root.hints 一个描述named.root文件位置文件
/var/named/named.root 13个根权威DNS服务器的列表。

创建这些文件到正确位置以及配置都不是很难。这里你需要做的:

1. 第一是把这些文件放到正确的位置。接下来的例子,我们假设一个chroot版本的BIND,并在/etc目录增加适当的链接。

[root@bigboy tmp]# locate named.conf
/etc/dbus-1/system.d/named.conf
/usr/share/doc/bind-9.3.3/sample/etc/named.conf
[root@bigboy tmp]# cp /usr/share/doc/bind-9.3.3/sample/etc/named.conf \
   /var/named/chroot/etc 
[root@bigboy tmp]# ln -s /var/named/chroot/etc/named.conf /etc/named.conf
[root@bigboy tmp]# locate named.root.hints
/usr/share/doc/bind-9.3.3/sample/etc/named.root.hints
[root@bigboy tmp]# cp /usr/share/doc/bind-9.3.3/sample/etc/named.root.hints \
   /var/named/chroot/etc 
[root@bigboy tmp]# ln -s /var/named/chroot/etc/named.root.hints /etc/named.root.hints
[root@bigboy tmp]# locate named.root
/usr/share/doc/bind-9.3.3/sample/etc/named.root.hints
/usr/share/doc/bind-9.3.3/sample/var/named/named.root
[root@bigboy tmp]# 
[root@bigboy tmp]# cp /usr/share/doc/bind-9.3.3/sample/var/named/named.root \
   /var/named/chroot/var/named/named.root
[root@bigboy tmp]# 

2. 虽然这超出了本书的范围,还是可以为你的域创建一个管理员和多个从属权威名字服务器。你可以配置你的管理员当更新从设备时使用一个安全认证密钥,以保证更新的安全性。下一步需要你为你的named.conf文件产生一个密钥,可以使用dns-keygen或dnskeygen命令。

[root@bigboy tmp]# /usr/sbin/dns-keygen
u8yNvOLHovDstA8lFHRvQl0XnjlxL1q1JCP5OaDHw4sgssgzRxKNkB7kKbON
[root@bigboy tmp]#

编辑你的/etc/named.conf文件,然后增加你的安全密钥到ddns_key。虽然这不是必须的,仅作为一个练习以配置你DNS服务器named.conf文件以支持BIND查看。下面将讨论。

配置named.conf中的BIND查看

我们的样本情景假设DNS查询来自英特网,区域文件将返回信息关联到外部的97.158.253.26网页服务器地址。那在你的本地网络电脑上需要知道些什么呢?需要知道DNS网页服务器的真实IP地址,192.168.1.100,因为当你本地网络的电脑试图连接到外部97.158.253.26时,NAT在这里不起作用别担心。BIND可以通过它的查看功能判断出来,查看功能允许你在查询某些子网时使用预先定义好的区域文件。这表明它能使用一套区域文件处理来自英特网的查询,另一套处理来自本地局域网的查询。这里总结下它是如何实现的:

1. 如果你的DNS服务器也作为缓冲DNS服务器,那么你同样需要一个查看功能。有一类查看功能在Fedora的named.conf样本文件中被预先定义为localhost_resolver,等下再解释。

2. 把你区域声明写到/etc/named.conf文件中的另两个查看段的其中一个。第一段叫作内部的,列出用在你内部网络的区域文件。第二个查看叫外部的,列出了用于英特网用户的区域文件。

举例来说:你可以参考一个my-site.zone的区域文件,用于给英特网用户查询相关97.158.253.X网络的。这个/etc/named.conf条目应插到外部段中。你还可以参考一个叫my-site-home.zone的区域文件,用于给本地用户查询192.168.1.0的网络。这个条目应被插到内部段中。创建my-site-home.zone文件是很容易的:从my-site.zone文件复制过来,替换掉相关的97.158.253.X以及相关的192.168.1.X。

3. 你还需要告知DNS服务器哪些地址是内部,哪些是外部的。要这样做,你首先要定义内部和外部的网络的访问控制列表(ACLs),然后按照这些列表把各自的查看段找到与其相匹配的客户状态。有一些建好的ACLs可以节省你的时间:

  • localhost: 表示DNS服务器本身
  • localnets: 表示直接连接到DNS服务器的任何网络
  • any: 自定义。

让我们仔细检查BIND的查看功能,通过我用于本地区域的/etc/named.conf文件中的一些样本配置片断。所有下面这些状态,都被插入到文件的选项和控制段后面。我选择了通用名字用于内部,为查看功能设定了可信任的hosts(本地的,非英特网或公共用户),为外部查看功能设定了英特网客户,他们可以任意命名。

首先我们先谈谈我们应该如何为每个查看提供区域文件。

named.conf中的区域文件参照

本节我们将建立前区域,通过参照my-web-site.org域,在named.conf文件中设置条目。

在我们例子中,区域文件命名为my-site.zone,虽然没有明确的规定,my-site.zone默认位置在chroot配置时应是放到/var/named/chroot/var/named目录中,或者在普通配置时放到/var/named位置。Debian / Ubuntu,需要使用完成的文件路径。用如下代码:

zone “my-web-site.org” {

  type master;
  notify no;
  allow-query { any; };
  file “my-site.zone”;

};

另外,你可以在named.conf文件中增加有关其它你维护的网页域名条目。这有里一个another-site.com的例子,使用名为another-site.zone区域文件。

zone “another-site.com” {

  type master;
  notify no;
  allow-query { any; };
  file “another-site.zone”;

};

注:allow-query指令定义了允许在任何区域查询你DNS服务器信息的网络。比如:要限制只能查询你的192.168.1.0网络,你要修改为:

allow-query { 192.168.1.0/24; };

接着,你要格式化条目,以处理用于你IP地址的反查询。大部分情况下,你的ISP为你的公网IP地址处理反向区域条目,但你需要使用192.168.1.0/24地址为你的家用本地网络建立反向区域条目。这一点对你网络中的Windows客户并不重要,但对一些需要有效前向和反向条目才能正常运行的Linux应用而言是重要的。

mysite.com的前向域查询程序从右到左扫描主机域名全称,以获取更多有关权威服务器的准确信息以备使用。反向查询类似从左到右扫描IP地址,以获取更多有关地址的准确信息。

这两种方法的共同点是都搜索更加准确的信息,但不同点是前向查询从右到左扫描,而反向查询是从左到右扫描。这个不同点从反向区域的区域声明格式可以看出,在主域为in-addr.arpa的/etc/named.conf文件中。这个规则很重要,要记住,不然其它配置将无效。这个反向区域为named.conf定义,使用一个用于192.168.1.0/24网络,名为192-168-1.zone的反向区域文件。

zone “1.168.192.in-addr.arpa” {
  type master;
  notify no;
  file “192-168-1.zone”;
};

你的耐心等下就会有回报。是时候谈谈查看了!继续!

缓冲名字服务器localhost_resolver查看

localhost_resolver查看用于你的缓冲DNS服务器域,像这样:

view "localhost_resolver"
{
/* This view sets up named to be a localhost resolver 
* ( caching only nameserver ). If all you want is a 
* caching-only nameserver, then you need only define this view:
*/
       match-clients           { localhost; };
       match-destinations      { localhost; };
       recursion yes;

       /* these are zones that contain definitions for all the localhost
        * names and addresses, as recommended in RFC1912 - these names should
        * ONLY be served to localhost clients:
        */
       include "/etc/named.rfc1912.zones";

       /*
        *  Include zonefiles for internal zones
        */
       include "/var/named/zones/internal/internal_zones.conf";
};

缓冲名字服务器的配置有几点细节需要注意:

1. 确定这一段只在/etc/named.rfc1912.zones文件中提及到。其它的说明如named.root.hints,在启动守护程序时会引起错误。

2. 如果你只把你的服务器作为缓冲DNS服务器,那把named.conf中的其它查看功能都删掉,并重新启动守护程序。

[root@bigboy tmp]# /etc/init.d/named restart

3. 使你网络中的所有其它机器都指定到缓冲DNS服务器,并作为首要DNS服务器。

4. 记得在你DNS服务器的所有DNS查询都来自localhost。如果你的服务器也作为你域的权威服务器,那你要为服务器的DNS查询在这一段中包含你的域的区域文件的说明。样,从内部或外部访问控制列表中的客户端查询可以正常工作,但是从服务器自身域的查询将失败。这个例子中,我们包括了一个到internal_zones.conf区域文件的说明,等下我们将访问。如果你的服务器不作为你域的权威服务器,这一行可以删除。

注:如果你有像这样的一个localhost只查看,要确定你没有在你其它查看中涉及到localhost,不然某一查看将抢占其它查看的查询。这将导致不可预料的结果。

内部查看

这个例子中,我有一个192.168.17.0 /24网络的访问控制列表,叫作safe-subnet,来说明在更加复杂的环境下应用访问控制列表。在访问控制列表被定义好过后,在内部查看的match-clients声明中插入参考到safe-subnet。这样,本地网络(192.168.1.0 /24),其它可信任的网络(192.168.17.0),和localhost可在内部查看中从区域文件获得DNS数据。

// ACL statement

acl “safe-subnet” { 192.168.17.0/24; };

view “internal” { // What the home network will see

  match-clients      { localnets; localhost; safe-subnet; };
  match-destinations { localnets; localhost; safe-subnet; };

  recursion yes;

  // all views must contain the root hints zone:
  include "/etc/named.root.hints";

  // These are your "authoritative" internal zones, and would probably
  // also be included in the "localhost_resolver" view above :

  /*
  *  Include zonefiles for internal zones
  */
  include "/var/named/zones/internal/internal_zones.conf";

};


你可能会有这样的问题,“区域文件定义在哪里?”。别担心,有一个内含的声明提及到一个名为internal_zones.conf的文件,它包含了那些区域文件,如下:

// File internal_zones.conf

zone "1.168.192.in-addr.arpa" IN {
  type master;
  file "/var/named/zones/internal/192.168.1.zone";
  allow-update { none; };
};

zone "my-web-site.org" IN {
  type master;
  file "/var/named/zones/internal/my-web-site.org.zone";
  allow-update { none; };
};

我接着在下一节外部查看中会讨论如何处理从非可信任网络客户端来的查询。

外部查看

你也可以建立一个外部查看,用来对你的网络以外的客户端的DNS查询,比如说英特网。这个例子中,外部查询从在/var/named/zones/external目录中的区域文件那里获得结果。

view “external” { // What the Internet will see

  /* This view will contain zones you want to serve only to "external"
   * clients that have addresses that are not on your directly attached 
   * LAN interface subnets:
   */

  match-clients      { any; };
  match-destinations { any; };

  recursion no;
  // you'd probably want to deny recursion to external clients, so you don't
  // end up providing free DNS service to all takers

  // all views must contain the root hints zone:
  include "/etc/named.root.hints";

  // These are your "authoritative" external zones, and would probably
  // contain entries for just your web and mail servers:

  zone "253.158.97.in-addr.arpa" IN {
     type master;
     file "/var/named/zones/external/97.158.253.zone";
     allow-update { none; };
  };
 
  zone "my-web-site.org" IN {
     type master;
     file "/var/named/zones/external/my-web-site.org.zone";
     allow-update { none; };
  };
};

注意,反向区域文件为公网网络地址提供结果,当然,前向区域文件只响应有权限的网络地址。

注:在外部查看中,你可能会像这样冒险的在内部查看中使用感叹号(!)来去除网络。小心,外部查看最好是使用“any;",因感叹号(!)在有些版本BIND中查询申名为“external"情况下是无效的。

; !!!CAUTION !!!

match-clients      { !localnets; !localhost; !safe-subnet; };
match-destinations { !localnets; !localhost; !safe-subnet; };

这些查看清楚的阐明了它们的作用。我们用过的本地网络样本不需要访问控制列表声明,因已经有高效的localnets和localhost内建访问控制列表。这个网络样本在match-clients中不需要safe-subnet段,因它在配置中只有一个子网。

查看不只是用于NAT。若你运行一个网络数据中心,你可以建立你的DNS服务器作为一个缓冲服务器服务用于你所有的网络,并为你的客户提供权威响应。查看是非常有用的。

配置区域文件

当配置DNS区域文件时,你需要清楚一些东西:

  • 在所有区域文件中,你可以在任意行的末尾插入冒号,然后加上你的批注。
  • 默认情况下,你的区域文件放置在/var/named或/var/named/chroot/var/named 或 /etc/bind目录下,依据你的Linux发行版本。
  • 每个区域文件包含一些记录(SOA, NS, MX, A, 和 CNAME),用来管理BIND的不同区域。

更近一步的观察在区域文件里的这些条目。

生存时间值

区域文件里第一个条目是区域生存时间值(TTL)。缓冲DNS服务器缓冲着从权威DNS服务器来的查询响应。权威服务器不仅提供DNS回应,而且也提供生存时间信息,即它有效的周期。

TTL的作用是起到降低权威DNS服务器需要回应的查询数。如果TTL设成三天,那缓冲服务器使用保存着的响应三天,才会做重新查询。

$TTL 3D

BIND能识别多种时间相关的值的后缀。D表示天,W表示星期,H表示小时。没有后缀时,BIND就认为是秒。

DNS资源记录

在区域文件中的其它记录,大多是BIND资源记录。他们定义了DNS信息的性质,并呈现给DNS客户查询使用。他们都有这样的通用格式:

Name    Class    Type    Data

有不同类型的记录如:邮件(MX),前向查找(A),反向查找(PTR),别名(CNAME)和全部的区域定义,起始权威(SOA)。数据部分根据记录类型来制定格式,或可以由一些特定的值组成。类似的,名字也建立在这个规则之上。

SOA记录

第一个资源记录是起始权威记录,它包含了有关域的管理员和控制信息。这个格式:

Name Class Type Name-Server Email-Address Serial-No Refresh Retry Expiry Minimum-TTL

记录可能很长,有时超过你的屏幕。按照格式,你可以插入新行,只需在开头和结尾插入圆括号,这会提示BIND有部分的记录将跨越多行。你也可以在每一行的尾部分别增加批注,这样做时需用分号分开。这里有一个例子:

@       IN      SOA     ns1.my-site.com. hostmaster.my-site.com. (
                      2004100801      ; serial #
                      4H              ; refresh
                      1H              ; retry
                      1W              ; expiry
                      1D )            ; minimum

表格18.4解释了在记录中每一块的含义。

表格18.4SOA记录格式

字段 描述
Name 区域的根名。“@”标号是为那个特殊的数据库文件指向在/etc/named.conf文件的当前区域的简单记号。
Class 有很多不同的DNS类型。家庭/本地类型被使用到为BIND定义IP地址和映像信息时,IN或英特类型将被限制。
Type DNS资源记录的类型。例子中,这是一个SOA资源记录。其它类型的记录也存在,等下我会提到。
Name-server 你的主名字服务器的全称。要紧跟一个句点。
Email-address 名字服务器管理员的电子邮件地址。在电子邮件地址中的@必须用一个句点来代替。电子邮件地址一定要以句点结尾。
Serial-no 当前配置的序列号。你可以使用日期格式YYYYMMDD加一个递增的计数到最后。这将允许你每天使用序列号来做多次修改,而序列号可以反应出日期和修改的次数。
Refresh 通知从DNS服务器多久查询主DNS服务器。从服务器一般很少用在家庭/本地网络环境中。
Retry 当从服务器连接主服务器失败时的重试间隔。从服务器一般很少用在家庭/本地网络环境中。
Expiry 从服务器重连从服务器的时间计数,直到它的数据过期。以后将直接指向根服务器。从服务器一般很少用在家庭/本地网络环境中。
Minimum-TTL 当远端客户查询不存在子域的时间计数。你的DNS服务器将向缓冲的远端客户回应无域或NXDOMAINlL。这个值定义了这个回应在你的DNS的缓冲持续时间。

在例子中,基本名字服务器被定义为ns1.my-site.com,联系e-mail地址为[email protected]。序列号是2004100801,刷新,重试,到期,及最小值分别为4小时,1小时,1星期和1天。

NS,MX,A和CNAME记录

和SOA记录一样,每条NS,MX,A,PTR和CNAME记录都占一行,类似的格式。表格18.5描绘出了他们的描述方式

表格18.5NS,MX,A,PTR和CNAME记录格式

记录类型 名字字段 类型字段2 符号字段 数据字段
NS 通常空着1 IN NS 名字服务器的IP地址或CNAME
MX 用于邮件的域。通常和区域文件本身的域一样。 IN MX 邮件服务器DNS的名字
A 一个服务器在域里的名字 IN A 服务器的地址
CNAME 服务器的别名 IN CNAME 服务器的“一个”记录名字
PTR IP地址的最后一节 IN PTR 服务器全称
  1. 如果一个DNS资源记录的检索关键字是空白的,它重新使用先前记录的检索关键字。
  2. 对大多数本地网络方案,类型基本上是IN或Internet。你要注意到这一点,IN是默认类型,BIND会将记录记为这一类型,除非有其它规定。

如果你没有在SOA,NS,A或CNAME记录的主机名后面输入周期,BIND将自动给主机名加上区域文件的域名。所以,BIND把一个www的记录处理为www.my-site.com。这一点在大多数情况下能被接受,但如果你忘了在给my-site.com的MX记录末尾输入周期,BIND就把my-site.com加到结尾,那么你将发现你的邮件服务器只能接受来自域为my-site.com.mysite.com的邮件。

TXT记录

还有一些较少用到的DNS TXT记录,被用来配置附加信息。该记录的数据段通常具有“name=value"的格式,"name"是数据类型的名字,"value"是名字的值,如这个例子。

my-web-site.org. TXT "v=spf1 -all"

TXT记录通过使用Sender Policy Framework (SPF)方法逐渐的被用来协助抵抗SPAM。SPF TXT记录被系统用来接收邮件,通过询问域DNS邮件是哪个(发件人),然后判断邮件的邮件起始IP地址(源)是否经发件者域授权的。

更多TXT记录使用说明超过了本书的范围,但你至少应该知道,TXT记录最多可有255字节长,这个特点经常被用作分布式拒绝攻击(DDoS)。“简单的DNS安全”章节解释了如何配置你的DNS服务器,以防止出现这样的事故。

前向区域文件样本

现在你知道了一个区域文件的关键元素,是时候尝试一个可运行的域例子my-site.com。

;
; Zone file for my-site.com
;
; The full zone file
;
$TTL 3D
@       IN      SOA     ns1.my-site.com. hostmaster.my-site.com. (
                      200211152       ; serial#
                      3600            ; refresh, seconds
                      3600            ; retry, seconds
                      3600            ; expire, seconds
                      3600 )          ; minimum, seconds

               NS      www             ; Inet Address of nameserver
my-site.com.    MX      10 mail         ; Primary Mail Exchanger
 
localhost       A       127.0.0.1
bigboy          A       97.158.253.26
mail            CNAME   bigboy
ns1             CNAME   bigboy
www             CNAME   bigboy

注意这个例子的几点:

  • 服务器ns1.my-site.com是my-site.com的名字服务器。在公司环境下,可能需要一个独立的名字服务器。主名字服务器通常叫作ns1,次名字服务器叫ns2。
  • 最小生存时间值(TTL)是三天,因此远端DNS缓冲服务器将保存从你区域查询到的DNS信息,直到三天以后才会更新它们的缓冲。
  • my-site.com的MX记录指向名为mail.my-site.com的服务器。
  • ns1和邮件实际上是网页服务器www的CNAME或别名。因此这里你需要一个名字服务器、邮件服务器和网页服务器在同一台机器的例子。如果他们是不同的机器,那你将不得不为每一台都设一个A记录条目。
www                 A          97.158.253.26
mail                A          97.158.253.134
ns                  A          97.158.253.125

那每次你编辑你的区域文件时都需要增加你的序列号。当DNS设为冗余配置时,从DNS服务器定时轮循主服务器,以便更新区域文件信息,并使用序列号判断主服务器上的数据是否有被更新。增加序列号失败,而区域文件内容却被修改,将导致你的从服务器数据过时。

反向区域文件样本

现在你需要确定你能在你的本地网络电脑上做主机查询,并能获得正确的IP地址。若你在你的网络上运行一个邮件服务器的话,这一点是非常重要的,因为发邮件通常传递邮件只通过主机,而主机的IP地址由DNS解析。NFS被用于网络基本文件访问,也需要有效的反向查询能力。

这里有一个192.168.1.x网络区域文件的例子。在第一列的所有条目表示网络IP地址的最后一个,因此IP地址192.168.1.100指向名为bigboy.my-site.com。

注意前向和反向区域文件之间的主要区别,反向区域文件只有PTR和NS记录。PTR记录没有CNAME别名。

;
; Filename: 192-168-1.zone
;
; Zone file for 192.168.1.x
;
$TTL 3D
@       IN        SOA        www.my-site.com.  hostmaster.my-site.com. (
                           200303301          ; serial number
                           8H                 ; refresh, seconds
                           2H                 ; retry, seconds
                           4W                 ; expire, seconds
                           1D )               ; minimum, seconds

                 NS         www                ; Nameserver Address

100                PTR        bigboy.my-site.com.
103                PTR        smallfry.my-site.com.
102                PTR        ochorios.my-site.com.
105                PTR        reggae.my-site.com.

32                 PTR        dhcp-192-168-1-32.my-site.com.
33                 PTR        dhcp-192-168-1-33.my-site.com.
34                 PTR        dhcp-192-168-1-34.my-site.com.
35                 PTR        dhcp-192-168-1-35.my-site.com.
36                 PTR        dhcp-192-168-1-36.my-site.com.

我包含了192.168.1.32到192.168.1.36的条目,那些是DHCP服务器的内容。若没有这几行的话,通过DHCP获取IP地址的电脑将不能进行SMTP邮件传递。

你还可能想为你的本地区域创建一个用于公网NAT IP地址的反向区域文件。可惜的是,ISP通常不会为少于256IP地址Class C的任何人开放这个功能。大多数家庭DSL网站都没有资格。

载入你的新配置文件

确定你的配置文件在正确的位置,区域文件的序列号更新过。若一切都准备好,重启BIND命名的守护程序,使配置启效。

[root@bigboy tmp]# /etc/init.d/named restart

看一下你的/var/log/messages文件的尾部,确定没有错误提示。

确定你的/etc/hosts文件已更新

第三章“Linux网络”,解释了如何正确配置你的/etc/hosts文件。一些程序,如sendmail,需要一个正确的配置文件/etc/hosts,即使DNS已正确配置。

配置你的防火墙

网络样本假设BIND名字服务器和Apache网页服务器软件运行在同一台机器上,并有路由/防火墙的保护。服务器的实际IP地址是192.168.1.100,是一个私有IP地址。你需要为英特网用户使用NAT使其通过名为97.158.253.26的公网IP地址进入服务器。若你的防火墙是Linux配置,你可能需要考虑看一下第14章“Linux防火墙使用iptables”,描述了如何进行网络地址转换以及允许DNS穿越你的名字服务器。

确定你的域注册

记得为my-site.com或任何其它,编辑你的域注册,这样至少有一个名字服务器会是你的这个新的名字服务器(这里就是97.158.253.26)。域注册,像VeriSign和RegisterFree,通常提供一个网页接口去协助你管理你的域。

一旦你使用登录帐号和密码录登录进入,你需要进行二个步骤:

1)为IP地址97.158.253.26创建一个新的名字服务器记录条目,以映像到ns.my-site.com 或 www.my-site.com或任何你的名字服务器的名字。(这个屏幕提示你需要服务器IP地址和名字。)
2)指定ns.my-site.com处理你的域。这个屏幕提示你只需服务器名字。
有时,每个域的登记需要至少两个已注册名字服务器。若你只有一个,那么你可以用同样的IP地址创建第二个名字服务器记录条目,但要取不同的名字,或者你使用IP别名为你的网页服务器设第二个IP地址,在你的防火墙创建第二个NAT条目,接着并用新的IP地址和不同的名字创建第二个名字服务器记录条目。

通常需要花三至四天的时间,来把你的更新的DNS信息传递到全球13个根名字服务器。你因此要等待大约这么多时间,直到开始注意人们点击你的新网站。

你可以使用troubleshooting段,来测试那些他们在你网站上的能得到的特定的DNS服务信息。你很可能想要测试你的新DNS服务器,哪些需要更新,以增加一些流行功能,哪些已经过时。

BIND问题与解决

BIND troubleshooting通常很容易

守护程序把详细状态信息更新到/var/log/messages文件,它很方便的把你可疑的错误配置记录下网络问题的普通可修复错误还是可以执行的。接下来连同处理方法一起讨论。

配置问题与解决步骤

经常检查你的/var/logs/message文件,控制输出文件的错误记录。这里有一些你可能会遇到的例子:

  • 守护程序使用一个未编辑过的named.conf文件样本版本启动,引起不寻常的错误出现在屏幕上。。由于并不存在的区域文件样本引起的错误。由于在localhost_resolver段同时存在named.rfc1912.zones和named.root文件引起有关重定义的错误。
[root@bigboy tmp]# service named restart
Starting named: 
Error in named configuration:
/etc/named.rfc1912.zones:10: zone '.': already exists previous definition: /etc/named.root.hints:12
zone localdomain/IN: loaded serial 42
zone localhost/IN: loaded serial 42
zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 1997022700
zone 255.in-addr.arpa/IN: loaded serial 42
zone 0.in-addr.arpa/IN: loaded serial 42
zone my.internal.zone/IN: loading master file my.internal.zone.db: file not found
internal/my.internal.zone/IN: file not found
zone my.ddns.internal.zone/IN: loading master file slaves/my.ddns.internal.zone.db: file not found
internal/my.ddns.internal.zone/IN: file not found
zone my.external.zone/IN: loading master file my.external.zone.db: file not found
external/my.external.zone/IN: file not found
[FAILED]
[root@bigboy tmp]#

  • named.conf文件存在未定义的安全密钥ddns_key。使用dns-keygen 或 dnskeygen命令创建一个正确的条目。
Feb 25 20:38:49 bigboy named[4593]: /etc/named.conf:99: configuring key 'ddns_key': bad base64 encoding
Feb 25 20:38:49 bigboy named[4593]: loading configuration: bad base64 encoding
  • named.conf中提到的named.root.hints文件没有在/etc或chroot的/etc目录里。
[root@bigboy tmp]# service named start
Starting named: 
Error in named configuration:
/etc/named.conf:58: open: /etc/named.root.hints: file not found
[FAILED]
[root@bigboy tmp]#


  • named.root.hints提到的named.root文件不存在。
Feb 25 21:33:41 bigboy named[5007]: could not configure root hints from 'named.root': file not found
Feb 25 21:33:41 bigboy named[5007]: loading configuration: file not found
Feb 25 21:33:41 bigboy named[5007]: exiting (due to fatal error)
  • 你使用chroot版本的BIND,但是rndc.key文件位置在/etc目录而不是在/var/named/chroot/etc/目录。拷贝文件到正确的位置,然后重启来解决这个问题。
[root@bigboy tmp]# service named restart
Stopping named: rndc: connect failed: connection refused
[  OK  ]
Starting named: [  OK  ]
[root@bigboy tmp]#
  • named.conf文件提到的区域文件不存在。这个例子即有错误提示到控制屏幕,也有错误提示到/var/log/messages文件。
[root@bigboy tmp]# service named start
Starting named: 
Error in named configuration:
zone localdomain/IN: loaded serial 42
zone localhost/IN: loaded serial 42
zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 1997022700
zone 255.in-addr.arpa/IN: loaded serial 42
zone 0.in-addr.arpa/IN: loaded serial 42
zone 2.168.192.in-addr.arpa/IN: loaded serial 2006052301
zone my-web-site.org/IN: loaded serial 2006052302
zone my-web-site.com/IN: loading master file /var/named/zones/internal/my-web-site.com.zone: file not found
internal/my-web-site.com/IN: file not found
zone 1.168.192.in-addr.arpa/IN: loaded serial 2006052301
zone my-web-site.org/IN: loaded serial 2006052302
[FAILED]
[root@bigboy tmp]#
Feb 26 01:47:10 smallfry named: zone my-web-site.com/IN: loading master file /var/named/zones/internal/my-web-site.com.zone: file not found
Feb 26 01:47:10 smallfry named: internal/my-web-site.com/IN: file not found
  • 这是一个会发生在Fedora早期版本中的隐蔽错误。BIND看起来像启动正常,但是没有任何区域文件被装载。这个情况应该是使用了chroot版本BIND,且named.conf文件在/etc目录里,而不是在/var/named/chroot/etc/目录里。拷贝文件到正确的位置,然后重启来解决这个问题。删除/etc并创建一个从/etc到/var/named/chroot/etc/named.conf的链接,以保证你能使用正确的文件。
Nov  9 17:35:41 bigboy named[1157]: starting BIND 9.2.3 -u named -t /var/named/chroot
Nov  9 17:35:41 bigboy named[1157]: using 1 CPU
Nov  9 17:35:41 bigboy named[1157]: loading configuration from ‘/etc/named.conf’
Nov  9 17:35:41 bigboy named[1157]: listening on IPv4 interface lo, 127.0.0.1#53
Nov  9 17:35:41 bigboy named[1157]: listening on IPv4 interface eth0, 10.41.32.71#53
Nov  9 17:35:41 bigboy named[1157]: command channel listening on 127.0.0.1#953
Nov  9 17:35:41 bigboy named[1157]: command channel listening on ::1#953
Nov  9 17:35:41 bigboy named[1157]: running
  • 如果在屏幕或/var/log/messages都没有错误提示,且当你登录进你新的名字服务器使用host命令查询时,你的域不能正常工作,那么这个问题可能是由于你忘了在named.conf为域增加区域文件条目;那应属于一个你的区域文件的设置错误;或者是你忘了更新你的区域文件序列号。

这不是一份完整的配置错误清单,但它含盖了一些新配置的常见错误。

网络问题与解决步骤

一旦配置解决问题完成,你还需要继续下面的问题解决步骤:

1)决断你的DNS服务器通过DNS UDP/TCP端口53是否可入。无法连接可能是由于防火墙对你的DNS服务器的不正确设置、许可证,NAT,或者端口前向规则。失败也可能是由于程序停止了。测试最好即要从你的内网,也要从英特网。

有关TELNET的问题解决在第4章涉及到“简单的网络问题解决”。

2)Linux状态信息记录到文件/var/log/messages。使用它来保证你启动BIND时你的区域文件被装载。检查你的/etc/named.conf文件,如果这样失败。(Linux记录在第5章涉及到“通过syslog解决Linux问题”。)

Feb 21 09:13:13 bigboy named: named startup succeeded
Feb 21 09:13:13 bigboy named[12026]: loading configuration from '/etc/named.conf'
Feb 21 09:13:13 bigboy named[12026]: no IPv6 interfaces found
Feb 21 09:13:13 bigboy named[12026]: listening on IPv4 interface lo, 127.0.0.1#53
Feb 21 09:13:13 bigboy named[12026]: listening on IPv4 interface wlan0, 192.168.1.100#53
Feb 21 09:13:13 bigboy named[12026]: listening on IPv4 interface eth0, 172.16.1.100#53
Feb 21 09:13:14 bigboy named[12026]: command channel listening on 127.0.0.1#953
Feb 21 09:13:14 bigboy named[12026]: zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
Feb 21 09:13:14 bigboy named[12026]: zone 1.16.172.in-addr.arpa/IN: loaded serial 51
Feb 21 09:13:14 bigboy named[12026]: zone 1.168.192.in-addr.arpa/IN: loaded serial 51
Feb 21 09:13:14 bigboy named[12026]: zone simiya.com/IN: loaded serial 2004021401
Feb 21 09:13:14 bigboy named[12026]: zone localhost/IN: loaded serial 42
Feb 21 09:13:14 bigboy named[12026]: zone simiya.com/IN: loaded serial 200301114
Feb 21 09:13:14 bigboy named[12026]: running

3)前向和反向查询都使用host(nslookup在Windows)命令,确保区域文件配置正确。

如果失败了,尝试:

  • 即检查修改过的文件中的你的最新序列号,也要检查文件中的每个记录是否有错误。
  • 确定没有防火墙会阻止DNS通过TCP和/或UDP端口53在你的服务器和DNS服务器之间穿越。
  • 使用dig命令判断你的域名字服务器是否配置正确。

这里有一个向DNS服务器ns1.my-site.com查询www.linuxhomenetworking.com IP地址的例子。(你也可以用它的IP地址替换掉名字服务器的名字。)

[root@bigboy tmp]# host www.linuxhomenetworking.com ns1.my-site.com
Using domain server:
Name: ns1.my-site.com
Address: 192.168.1.100#53
Aliases:

www.linuxhomenetworking.com has address 65.115.71.34

[root@bigboy tmp]#

这里有一个向你默认DNS服务器查询www.linuxhomenetworking.com IP地址的例子。你能看到,要查询的指定DNS服务器的名字被放到了最后。在这个例子中的失败不仅是由于在你BIND配置或域注册的一个错误,而且还因在你DNS客户端的DNS服务器条目,在你Linux /etc/resolv.conf文件或Windows TCP/IP中的NIC属性的一个错误。

[root@bigboy tmp]# host www.linuxhomenetworking.com
www.linuxhomenetworking.com has address 65.115.71.34
[root@bigboy tmp]#

4)你也可以使用dig命令判断在英特网著名DNS服务器上是否有收到有关你区域的有效更新。(记得如果你打算为你的域改变DNS服务器,它要花四天的时间传送到英特网。)

命令的格式是:

dig <domain-name> <name-server> soa

名字服务器是可选的。如果你指定了一个名字服务器,那些dig向指定名字服务器询问,而不是Linux默认的名字服务器。有时同时向你的名字服务器和著名的名字服务器如ns1.yahoo.com查询是较好的方法,这样可以确保你的DNS记录能够正确传递。dig命令只能工作在有主机域名全称(FQDN)机器上,因为它不依赖/etc/resolv.conf文件。

这个命令使用本地DNS服务器来查询。它返回SOA记录信息和在权威段中的域DNS服务器的地址。

[root@bigboy tmp]# dig linuxhomenetworking.com SOA
...
...
;; AUTHORITY SECTION:
linuxhomenetworking.com. 3600   IN      NS      ns1.myisp.net.
linuxhomenetworking.com. 3600   IN      NS      ns2.myisp.net.

;; ADDITIONAL SECTION:
ns1.myisp.net.      3600    IN      A       65.115.70.68
ns2.myisp.net.      3600    IN      A       65.115.70.69
...
...
[root@bigboy tmp]#

这里有一个正确的dig例子,使用DNS服务器ns1.yahoo.com来查询。向前面的一样,它返回区域的SOA记录。

[root@bigboy tmp]# dig ns1.yahoo.com linuxhomenetworking.com SOA
...
...
;; AUTHORITY SECTION:
linuxhomenetworking.com. 3600   IN      NS      ns2.myisp.net.
linuxhomenetworking.com. 3600   IN      NS      ns1.myisp.net.

;; ADDITIONAL SECTION:
ns1.myisp.net.      3600    IN      A       65.115.70.68
ns2.myisp.net.      3600    IN      A       65.115.70.69
...
...
[root@bigboy tmp]#

有时的SOA dig会失败。这个命令使用DNS服务器ns1.yahoo.com来查询。这个例子中权威段不知道这个域,而指向在VeriSign的整个.com域的名字服务器。

[root@bigboy tmp]# dig  ns1.yahoo.com linuxhomeqnetworking.com SOA
...
...
;; QUESTION SECTION:
;linuxhomeqnetworking.com.      IN      SOA
;; AUTHORITY SECTION:
com.                    0       IN      SOA     a.gtld-servers.net. nstld.verisign-grs.com.  1077341254 1800 900 604800 900
...
...
[root@bigboy tmp]#

可能导致失败的原因包括:

  • 印刷错误。这种情况下,命令行中输入入了拼写错误的“linuxhomeqnetworking.com”。
  • 错误的域注册。
  • 正确的域注册,但传递域信息到网络时,存在延时。延时超过四天以上是不正常的。
  • 可能有防火墙阻碍了你的服务器与DNS服务器通过TCP和/或UDP端口53的DNS传输。

迁移你的网站到家

如果你现在使用的是外部公司来维护你的网站,并且希望能把你的服务器移到家里或是你的办公室,那么一份详细的迁移计划是很重要的。你的计划至少包括这些几步:

1. 世界上并不存在办法,能让你通知所有的DNS服务器去更新他们有关你区域文件条目的缓冲。你最好的选择是请求你现在的服务提供商,在DNS区域文件中设置my-site.com的生存时间为一个很小的值,比如一分钟。因为生存时间通常是设为几天,那所有远端DNS服务器至少要花三到五天才能识别出这个变化。一旦传播完成,它将只需花一分钟的时间参看有关你新的服务器的最终DNS配置。若有任何错误,你可以返回旧配置,恢复也只需几分钟而不是数天。
2. 在家里建立你的测试服务器。编辑/etc/hosts文件,使www.my-site.com指向它自己的IP地址,而不是www.my-site.com已进行正式运行。这个文件通常比DNS具有更高优先级,因此测试服务器将开始认为www.my-site.com由它自身维护运行。若新的网页服务器也打算作为你的新邮件服务器,你也可能想为mail.my-site.com增加一个条目。
3. 通过服务器自身来测试你服务器的基本功能。这应该包括邮件,网页等等。
4. 从远端客户测试服务器。虽然DNS还没有更新,你还是可以用www.my-site.com测试服务器。只需在你网页浏览的Linux电脑上编辑你的/etc/hosts文件,把www.my-site.com映像到你新的服务器IP地址。在Windows下,文件就是C:\WINDOWS\system32\drivers\etc\hosts。若新的网页服务器也打算作为你的新邮件服务器,你也可能想为mail.my-site.com增加一个条目。你的客户端通常在检查DNS之前先查询这些文件,因此你可以使用它们来预定义一些DNS查询,只限于本地客户范围。
5. 一旦测试完成,协同你的网页提供商来为www.my-site.com更新你的域注册的DNS记录,以指向你新的网页服务器。因生存时间先前被设成一分钟,你将在数分钟内看到迁移的结果。  :6. 一旦完成,你可以把生存时间设回到原来的值,以帮助点击你DNS服务器时降低DNS查询拥塞。
7. 修改你的/etc/hosts文件,删除之前测试用的条目。
8. 你可能还想接管你自己的DNS。编辑你的my-site.com DNS条目,如VeriSign, RegisterFree或任何你为你新的DNS服务器购买的域。

记住,你不需在家维护DNS或邮件,这可以交给你的服务提供商。你若想更全面的维护管理你的服务器,你也可以把这些服务都移到家中。

最后,若你还担心你的服务提供商不会合作,那你可以和他们说明你想在家中测试作为多重服务器时它的容错性能。当你来回的尝试几次后,你就可以决定是否改变。

考虑为DNS设置DHCP

若你的网络有一个DHCP服务器,你要让它作为DNS服务器为你的Linux设备分配IP地址,以便DHCP客户端能使用。若你的Linux设备是DHCP服务器,那么你可能需要参考第8章“[1]配置DHCP服务器”。

简单的DNS安全

DNS可能会透露很多关于你域的性能。为了安全起见,你应小心的隐藏一些信息。

区域传输保护

host命令一次作一个DNS查询,但dig命令功能要强大的多。当使用了正确的参数,它可能下载你域区域文件的整个内容。

举个例子,AFXR区域传输参数是用来获取my-site.com区域文件内容的。

[root@smallfry tmp]# dig my-site.com AXFR
; <<>> DiG 9.2.3 <<>> my-site.com AXFR
;; global options:  printcmd
my-site.com.            3600    IN      SOA     www.my-site.com. hostmaster.my-site.com. 2004110701  3600 3600 3600 3600
my-site.com.            3600    IN      NS      ns1.my-site.com.
my-site.com.            3600    IN      MX      10 mail.my-site.com.
192-168-1-96.my-site.com. 3600  IN      A       192.168.1.96
192-168-1-97.my-site.com. 3600  IN      A       192.168.1.97
192-168-1-98.my-site.com. 3600  IN      A       192.168.1.98
bigboy.my-site.com.     3600    IN      A       192.168.1.100
gateway.my-site.com.    3600    IN      A       192.168.1.1
localhost.my-site.com.  3600    IN      A       127.0.0.1
mail.my-site.com.       3600    IN      CNAME   www.my-site.com.
ns1.my-site.com.        3600    IN      CNAME   www.my-site.com.
ntp.my-site.com.        3600    IN      CNAME   www.my-site.com.
smallfry.my-site.com.   3600    IN      A       192.168.1.102
www.my-site.com.        3600    IN      A       192.168.1.100
my-site.com.            3600    IN      SOA     www.my-site.com. hostmaster.my-site.com. 2004110701  3600 3600 3600 3600
;; Query time: 16 msec
;; SERVER: 192.168.1.100#53(192.168.1.100)
;; WHEN: Sun Nov 14 20:21:07 2004
;; XFR size: 16 records
[root@smallfry tmp]#

这可能初看起来不像是一个很重要的安全隐患,但事实上它是。任何人都可以使用这个命令来获取所有你服务器的IP地址,并从名字获取服务器的类型,然后发起网络攻击。

在一个没有主从服务器的简单的家庭网络,区域传输应该被禁止。你可以这样做,在你的named.conf文件的全局参数段设置允许传输方向。

options {
  allow-transfer {none;};
};

一旦设置好,你的区域传输测试将失败。

[root@smallfry tmp]# dig my-site.com AXFR
...
...
; <<>> DiG 9.2.3 <<>> my-site.com AXFR
;; global options:  printcmd
; Transfer failed.
[root@smallfry tmp]#


有选择的禁止递归

若递归查询全局都允许,那你的缓冲DNS服务器可能会无意中参与到一个DDoS攻击。

举例来说,从政治,宗教,竞争或其它有恶意的原因,你的网页都有可能会成为攻击的目标。首先,黑客通过子域侵入权威DNS服务器,比如my-web-site.org,并为子域增加一个很大的TXT记录。黑客然后发送成千上万的查询TXT记录的请求到无安全保护的缓冲DNS服务器,但那是一个陷阱。这些查询请求使用了一个非法的源IP地址,即你网页的DNS服务器的IP地址。这些查询请求很小,但是回应却因TXT信息而很大,这样你的DNS服务器很快就回这些回应而不堪重负。没有DNS,你网站也就瘫痪。作为缓冲DNS服务器的管理员,可能没注意到这些额外的请求负载,但是当有成千上万的不完善配置服务器攻击你的网站也是致命的。

可递归方向设置到你named.conf文件的参数段,能被用来严格控制哪些递归查询是被允许的。在这个例子中,有一个访问控制列表也被用来限制本地和192.168.1.0/24网络的查询。

acl "recursive_subnets" {	
      192.168.1.0/24;
      localhost;
};

options {
        allow-recursion { "recursive_subnets"; };
};

注:这不是限制服务器上区域文件定义的前向和反向查询。服务器会回应所有my-web-site.org,只要它有那个域,但它不会回应其它域比如google.com的请求。

名字转换安全

你的my-site.com域将可能有一个www和一个邮件子域,且它们应该是显然易见的。对外部用户,你可能想调整你的DNS查看,以使你的MySQL数据库服务器名字中没有字母“DB”或“SQL”,或你的防火墙在名字没有里没有“FW”。这点对公司而比较好的,但是对于英特网,这些名字暴露给黑客侵入的快捷方便的类型定义。网站安全涉及到任何那些协助保护网站正常运作的方法,这只是你可能使用的众多方法中的一种。

结论

DNS管理是任何网站建设的重点部分。幸运的是,虽然它可能有一些复杂,DNS修改通常还是比较少的,因为服务器的IP地址一般都是固定或静态的。这一点通常不是问题。若服务器的IP地址频繁的改变的情况下,管理DNS将十分困难。动态DNS因此被用来解决这个难点,详细说明在第19章“动态DNS”。