转贴dns的设定第五章:架设 DNS

发表于:2007-06-09来源:作者:点击数: 标签:
第五章:架设DNS 前面所介绍的伺服器服务大多是用在内部网路环境中的,不过,以现代的情况和未来的趋势来看,每个网路或多或少都需要Internet连线以及向Internet提供服务。从这一章开始,我们将为大家陆续介绍一些在Internet环境中常用到的伺服器之架设技巧

第五章:架设 DNS  

前面所介绍的伺服器服务大多是用在内部网路环境中的,不过,以现代的情况和未来的趋势来看,每个网路或多或少都需要 Internet 连线以及向 Internet 提供服务。从这一章开始,我们将为大家陆续介绍一些在 Internet 环境中常用到的伺服器之架设技 巧。就算您目前还没真的需要架设 Internet 相关的伺服器,但许多企业的 Intranet 环境中,也需要相类似的伺服器来为企业内 部网路提供服务。

前提条件

在众多 Internet 伺服器当中,有一种服务是所有服务的基础,就是 DNS 服务。DNS 可以说是一个不容易弄清楚的概念,尤其 是其运作原理。如果您看过“学习网路”中的“ DNS 协定”(我强烈建议您看看这篇文章!),相信应该有一定概念了,否 则,您在如下的阅读中可能难以理解,也浪费您的时间。

无论如何,在您进一步阅读下面文章之前,请您先确定能正确回答如下的问题:

什麽是 DNS 的授权模式?是怎样进行的?
请解释 zone 和 domain 的差别。
什麽是 DNS 正解和反解?
什麽是 DNS 的查询模式?查询过程是怎样进行的?
请解释 DNS cache 的作用和它对查询流程的影响。

如果您未能从上面的联结网页找到答案,那我再推荐您多看一篇文章:



http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html

忠告:请不必急著知道怎样设定 DNS,花点时间将 DNS 的原理弄明白非常重要,尤其是授权模式和查询模式的正确理解。在 日後的 DNS 架设和管理中,是否能正确理解这些 DNS 原理,往往是成败的关键所在!

如果您在 NT 或 Win2K 下面设定过 DNS 伺服器,相信您会觉得在 Linux 下面难多了。除了概念上要比较清楚外,另外对档案 的关联也要有清晰的追踪能力,这对於进行 debug 尤为重要。因为在 Windows 系统上面,您的所有设定都透过图形界面进 行,方便是方便,但也因为这个图形界面,限制了您的设定灵活性,同时也阻隔了您对 DNS 系统的深入了解。当您完成了这 章的学习,而且成功在 Linux 架设出复杂的 DNS 环境之後,欢迎您再回到 Win2K 上尝试做同样的事情。或许,您就会认同我 这里的观点了...

好了,闲话休提、言归正传,听百遍不如做一遍,那就让我们开始动手吧! ^_^ 

探索 NAMED

在 Linux 上面,提供 DNS 服务的套件是叫 bind, 但执行服务程式名称则是 named 。请您确定系统上装有 bind、bind-utils、 以及 caching-nameserver 这几个套件,同时用 ntsysv 确定 named 被选择为开机服务。

首先,让我们设定一个最重要的 dns 设定档,它就是 /etc/named.conf 。我将我自己的设定档案列出来,然後逐部份进行解释:

// generated by named-bootconf.pl

options {
        directory "/var/named";
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;
};


先让我们了解这个档案上面用来做注解的符号是“ // ”,而不是一般 shell script 的“#”;另外,“ /* ”与“ */ ”之间则注 解一整段文字。同时,每一个完整的设定都以“ ;”结尾,请不要少了它!(初学者经常会犯这个错误)

上面的部份是在这个档案开头的 options 设定,首先用 directory 指定了 named 的资源记录( RR - Resource Record 档案目录所 在位置为:“/var/named”;也就是说,它会到这个目录下面寻找 DNS 记录档案。所以,我们在这个档案後面部份所指定的档 案,就无需使用绝对路径了,但它们一定要放在这个目录下面。

接下来,有一段文字,如果您仔细阅读一下,它大致是说:如果您要设定的 DNS 伺服器和 client 之间是隔著火墙的话,要 将“// query-source address * port 53;”前面的注解符号“ // ”拿掉(当然,您也必须要设定好您的火墙啦)。不过,这只对早期 的版本有影响,而在 bind 8.1 之後则无需担心这个设定。

接下来再让我们看下一段句子:

//
// a caching only nameserver config
//
zone "." IN {
    type hint;
    file "named.ca";
};


透过这几行,我们为 named 定义了 DNS 系统中的根区域“ . ”(root zone) 的设定,同时它是一个 internet ( IN  的区域类别( class 。这里还指定了root zone 的伺服器种类( type  为“hint”(也只有这个 zone 会使用这样的种类)。最後,用 file 指定这 个区域记录档为:“named.ca”,也就是“/var/named/named.ca”档案。虽然 named.ca 这个档案中的‘ca’是 cache 的意思; 但如果您了解 DNS 的运作,就应该知道这个暂存档的作用,同时,为什麽我们会把 root zone 放在这里。(嗯?想想看?尤其 是查询非本机区域的时候?)

在 root zone 後面,您应该还会看到如下这两段:

zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };


这里是定义出关於本机名称的 DNS 解释:第一个 zone 是 localhost 的正解 zone,其伺服器种类是 master,记录档名称是 localhost.zone (在 /var/named 目录下面),但这个 zone 不允许客户主机(或伺服器)自行更新 DNS 的记录(当然,client 主机必须 能支援 DNS submit 功能才行)。

而第二个 zone 则是本机区域的反解 zone ,不过,这部份的解释我想留到後面的真实例子中再作说明,请您留意就是了。

上面的句子,当您安装好 caching-nameserver 套件之後就被建立起来的,相信您不用劳什麽心力。在档案最後,您或许还看到下 面这段设定:

key "key" {
    algorithm hmac-md5;
        secret "coqJswFdBMdNAItnLOpkmGgmJtclearcase/" target="_blank" >ccFsoNZZciWqxlGZBMUTOUxb0geYMFRyTT";
};


这是 bind 9.x 版本的新功能,用来进行区域转移或 DNS 更新所用的加密处理。这个我们暂时不必理会,除非您有兴趣进行这 个研究。

现在,我们暂时不要修改 named.conf 设定档,请退出它,然後转到 /var/named 目录,看看里面有些什麽东东?最起码,您会 看到如下三个档案:



named.ca 
localhost.zone 
named.local 

不知道您是否有灵感了?没错:刚才在 named.conf 里面,每一个 zone 所指定的 file 都出现在这里!先让我们看看 root zone 的 档案内容吧:

;       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  .  "
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC registration services
;       under anonymous FTP as
;           file                /domain/named.root
;           on server           FTP.RS.INTERNIC.NET
;       -OR- under Gopher at    RS.INTERNIC.NET
;           under menu          InterNIC Registration Services (NSI)
;              submenu          InterNIC Registration Archives
;           file                named.root
;
;       last update:    Aug 22, 1997
;       related version of root zone:   1997082200
;
;
; formerly NS.INTERNIC.NET
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
;
; formerly NS1.ISI.EDU
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
;
; formerly C.PSI.NET
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
;
; formerly TERP.UMD.EDU
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
;
; formerly NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
;
; formerly NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
;
; formerly NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
;
; formerly AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
;
; formerly NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
;
; temporarily housed at NSI (InterNIC)
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     198.41.0.10
;
; housed in LINX, operated by RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
;
; temporarily housed at ISI (IANA)
;
.                        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


在 /var/named 中的 RR 记录档里面的注解符号,和 /etc/named.conf 的注解符号不一样哦:在 named.conf 中是用双斜线“ // ”; 而在这里则使用 “ ;”符号。无论如何,您都不能用 “ # ”来做注解符号就是了。(好混乱哦~~~ 这就是电脑!^_^ 

在上面这个 named.ca 档案里面,您如果将所有的注解行拿掉,您会发现一共有 13 行是以‘ . ’开头的,那就是所谓的 root zone 了!然後,第二栏都是‘ 3600000 ’,这是 TTL (Time To Live) 设定,也就是在 cache 中保留的时间,以秒为单位(所以 这里是 100 小时)。其後的‘ NS ’是“Name Server”的意思,是 DNS 记录名称之一,也就是负责这个记录的 name server 是哪一台主机(这里一共由 13 台主机共同负责 root zone 的 NS 服务)。

虽然我们这里用 NS 指定了 name server 的主机名称,但对电脑系统来说,这些名称必须能解释为 IP 位址才有用(呵~~ 这个正 是 DNS 系统的功能),所以,这里分别用 13 个‘ A ’记录,也就是 Address 的意思,解释 [A-M].ROOT-SERVER.NET. 这些 主机各自的 IP 位址所在。

如果您了解 DNS 的查询模式,您会知道 DNS 伺服器在查询非自己管辖的 zone 的时候,首先会向 root 查询下一级的 zone 在 哪里,然後逐级查询下去。但问题是:当 named 刚启动的时候,在 cache 里面一片空白,它怎麽知道 root zone 的 servers 在哪 里呢?这不是一个矛盾吗?所以,就必须靠这个档案告诉 named 关於 root zone 的 servers 有哪些?以及在哪里? --- 明白了 吗?

因为这个档是以静态的方式维护的,很难保证这个档的内容永远都正确,如果 root zone 的记录发生改变了怎麽办(虽然这机会 不大)?或许,您已经在档案的开头注解那里得知,您可以在任何时候透过 ftp 或 gopher 取得这个档案的最新版本。如果您还 没读过那些注解,那就请带著字典读一下吧。如果您真的有需要更新这个 named.ca 档,那可以按如下步骤进行:

ftp FTP.RS.INTERNIC.NET 
anonymous 
your_account@your.mail.server 
cd domain 
get named.root 
bye 
cp /var/named/named.ca /var/named/named.ca.bak 
cat named.root > /var/named/named.ca

除了刚才的 named.ca 之外,第二个 zone 的记录档是 localhost.zone ,从 named.conf 中您应该知道它是 zone "localhost" 的记录 档,它的内容如下:

$TTL    86400
$ORIGIN localhost.
@1D IN SOA       @ root (
42              ; serial (d. adams)
3H              ; refresh
15M             ; retry
1W              ; expiry
1D             ; minimum

1D IN NS        @
1D IN A         127.0.0.1


内容很简单,但您是否真的了解每一行的设定意思呢?如果不清楚或不确定,那就让我们一起探讨探讨吧。

首先,第一行是一个 TTL 设定,目前是定义出这个记录档里面的各项记录的预设 TTL 值为 86400 秒(刚好是一天)。您的记录 档或许没有这行,事实上没什麽关系,您可以自己补上,否则,在启动 named 的时候会碰到一些警告,无伤大雅的;但如果您 的确在意那些警告,那就加上这行。您要知道,在记录档中宣告的所有资源记录(RR - Resource Record),都一定有一个 TTL 设定,如果没有,则使用这里预设的值。

第二行是一个 ORIGIN 设定,说明下面的记录源出何处(这里是源出 localhost. 的记录)。请您加倍留意最後的一个小数点“ .”,少了它或多了它,记录名称完全不一样!在 DNS 记录中,我们称这样以小数点结尾的名称为“ 全域名称 ”即 FQDN ( Fully Qualified Domain Name  。如果缺少了这个点会怎样呢?就会将所属的 ORIGIN ( @  附加在记录名称後面;而这 ORIGIN 就是上一个 $ORIGIN 宣告之後的名称,如果在前面找不到 $ORIGIN 宣告,那就以 /etc/named.conf 中定义的 zone 名称为基 准。以目前的例子来说,如果没有这个小数点的话,“localhost”会变成“localhost.localhost”;但如果有小数点的 话“localhost.”就只能是“localhost.”。所以,这个小点“.”非常重要,在以後设定中一定要非常留神!!(这也初学者 最常犯的错误之一)

然後,第三行,是一个 SOA 记录的设定,在这里我们看到一个特殊字符“ @ ”,它就是 ORIGIN 的意思,也就是刚侧.vPw

 cookiwu 回复于:2002-05-24 09:39:39
第五章?那前面的呢?从哪转的呀!

 sunboy 回复于:2002-05-24 09:43:12
www.study-area.org,在它的linux服务器网络设定中的第五章

 段誉 回复于:2002-05-24 09:43:16
怎么好像没完事儿啊。
 

 163 回复于:2002-10-25 02:50:21
[这个贴子最后由163在 2002/10/27 09:06am 编辑]

在网上能有这么好的地方谢谢 呀!看过了,好像有点不够精炼!下面我摘抄点:

  slave在refresh时间到达时尝试和 master 进行资料同步的动作,在 DNS 系统里称“zone transfer”(区域转移),而在技术层面则是AXFR 查询。

  在邮件系统中,只要邮件伺服器双方都知道对方的 IP 就可以进行邮件交换了。MX 记录是‘Mail eXchange’,它指定了负责该记录项(可以为domain也可以是host)的邮件伺服器名称(最好使用FQDN(Fully Qualified Domain Name)),而且该名称必须是一个 A 记录(不建议使用CNAME)。这样,当邮件伺服器要和对方的区域进行邮件传递的时候,就可以通过 MX 记录得到对方的邮件伺服器名称,而不需预先知道要和哪台邮件主机沟通。在日後,就算对方更换名称,将 DNS 记录改改就可以,完全无需知会其它邮件主机;而外面的邮件伺服器也根本无需认知到这个改变。

host [-aCdlnrTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] name [server]
dig [@server] domain [<query-type>] [<query-class>] [+<query-option>] [-<dig-option>] [%comment]
service named restart
vi /var/log/messages

  另外,我们这里所说的domain注册,在整个DNS系统中,仅属“正解”方面的注册和授权而已;而反解的授权,因为是跟据 IP 授权的,所以必须透过您的 IP 发 放机构进行。

关於 Dynamic DNS

关於动态 DNS 的应用,也可以在DHCP 分配的网路中设定 DNS 也可以应用得上。但前提条件是:您的 named 必须是 bind 9.x 或以後,以及 dhcpd 必须是 3.x 或以後的版本。然而,RedHat7.1 上面预装的 dhcpd 是 2.0p15-4 这个版 本,您必须自行升级才能使用这个非常棒的功能。

下面,我将 dhcp 服务转移到 mandrake 8.1 (其预装的 dhcpd 版本是 3.0-0.rc12.1),然後保留 named 在 rh71 上面,再透过 ddns 技术更新和维护 dhcp 所发放的 DNS 资料。我初步整理出来的步骤如下:

在 mdk 上执行如下命令,产生 dns 加密验证所需的 secret :

dnssec-keygen -a HMAC-MD5 -b 128 -n HOST DHCP_MDK

这样会在当前目录下产生两个以 Kdhcp_mdk 开头的档案,有兴趣您可以看看其中的内容。然後您将 Kdhdp_mdk*.private 中的最後一行 Key: 後面那串字串复制下来 (如:4sxutdFuNMqF1B0Q2GV1uQ==),待会要用到。

然後修改/etc/dhcpd.conf 的内容,类似如下:
ddns-update-style ad-hoc;# 这行一定要加上
subnet 192.168.100.0 netmask 255.255.255.0 {
      ......# 其中内容略,请自行填写
}
key DHCP_MDK {
       algorithm HMAC-MD5.SIG-ALG.REG.INT;# 加密演算法名称
       secret 4sxutdFuNMqF1B0Q2GV1uQ==;#
这就是上一步骤产生的 key}
zone siyongc.domain. {
       primary 192.168.100.23;# 指向 name server 所在位址
       key DHCP_MDK;# 必须和前面的 key 名称一致
}
zone 100.168.192.in-addr.arpa. {
       primary 192.168.100.23;# 同上
       key DHCP_MDK;
}

然後重新启动 dhcpd 的服务,并确定其功能正常。关於更多的设定,请 man dhcpd.conf ,搜寻 ddns 子串就可以找到。

然後转移到 rh71 上面,修改 /etc/named.conf ,在 options 前面加上如下句子:
key DHCP_MDK {// 这段应该和 dhcpd.conf 设定一致
   algorithm HMAC-MD5.SIG-ALG.REG.INT;
   secret 4sxutdFuNMqF1B0Q2GV1uQ==;
};

logging {// 这是记录设定
   channel update_debug {
       file "/var/log/update-debug.log";
       severity  debug 3;
       print-category yes;
       print-severity yes;
       print-time     yes;
   };
   channel security_info    {
       file "/var/log/named-auth.info";
       severity  info;
       print-category yes;
       print-severity yes;
       print-time     yes;
   };
   category update { update_debug; };
   category security { security_info; };
};
然後再为相应的 zone 加上 update 设定:
zone "siyongc.domain" {
   type master;
   file "siyongc.domain";
   allow-update { key DHCP_MDK; };// 名称必须和前面的 key 一致
};
zone "100.168.192.in-addr.arpa" {
   type master;
   file "192.168.100.rev";
   allow-update { key DHCP_MDK; };// 同上
};
然後建立所需的记录档:
touch /var/log/update-debug.log 
touch /var/log/named-auth.info 
chown named.named /var/log/update-debug.log 
chown named.named /var/log/named-auth.info




原文转自:http://www.ltesting.net