Chinaunix首页 | 论坛 | 博客
  • 博客访问: 901060
  • 博文数量: 436
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -103
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-01 09:48
个人简介

爱生活,爱IT

文章分类

全部博文(436)

文章存档

2015年(1)

2014年(2)

2013年(6)

2011年(39)

2010年(176)

2009年(30)

2008年(28)

2007年(54)

2006年(91)

2005年(9)

分类:

2007-04-18 19:50:36

我们在办室的时候,有时会去访问别的机器,如果是在windows下,我们我数时候会用机器名去访问,因为netbios/wins会帮我们来把机器名转成IP的。下面给大家介绍一种用动态DNS来解析机器名的办法。不过,不是用的w2k的DDNS,而是用的Linux.
  
  准备:一台(或两台)Linux服务器,用来做DHCP server和DNS server。也可以把它做成两台服务器。
  
  安装:服务器的安装过程,请参考其它文档,记住把 dhcp 和 bind, bind-utils 装上就行了。
  
  配置:
  
  一、DHCP的配置:
  配置DHCP server 时很简单,可以参考 /usr/share/doc/dhcp-x.xx/dhcpd.conf.sample来做。也可以先把这个文件cp 到 /etc/dhcpd.conf,然后根据自己的需要做适当修改。下面贴出我的一个/etc/dhcpd.conf,供大家参考:
  
  ddns-update-style interim;
  ignore client-updates;
  
  key DHCP_UPDATER {
  algorithm HMAC-MD5;
  secret qhB OR5yWo8BTXwk/m4ng;
  };
  
  zone bj.pnx. {
  primary 127.0.0.1;
  key DHCP_UPDATER;
  }
  
  zone 251.168.192.in-addr.arpa. {
  primary 127.0.0.1;
  key DHCP_UPDATER;
  }
  
  subnet 192.168.251.0 netmask 255.255.255.0 {
  range 192.168.251.100 192.168.251.200;
  # --- default gateway
  option routers         192.168.251.254;
  option subnet-mask       255.255.255.0;
  
  #    option nis-domain        "domain.org";
  option domain-name       "bj.pnx";
  option domain-name-servers   192.168.251.63,192.168.251.254;
  
  #    option time-offset       28800; # PRC Standard Time
  #    option ntp-servers       192.168.251.220;
  #    option netbios-name-servers   192.168.1.1;
  
  #    range dynamic-bootp 192.168.0.128 192.168.0.255;
  default-lease-time 21600;
  max-lease-time 43200;
  
  }
  
  几个要注意的地方:g
  1. "ddns-update-style"
  这个就是动态DNS的更新方式,有几个选项,我用的是interim,可以用 man dhcpd.conf找到另外的几个选项。
  
  2. "ignore client-updates"
  这个选项是不允许客户机更新DNS记录。当然,也可能允许,但会有一点问题。
  
  3. "key DHCP_UPDATER"
  这个是更新DNSKEY,是必须的。其中algorithm 后的是生成key的算法,key的生成是用 "dnssec-keygen -a HMAC-MD5 -b 128 -n USER DHCP_UPDATER"
  
  4. "zone"
  要更新的zone,如果是本机就是DNS serverprimay 就写127.0.0.1,要是其它机器是DNS server, 就写那台机器的IP
  
  别的都是一般DNS该有的了,要注意的是一定要有 range 那一行,不然就分不了IP啦。
  
  配好以后,可以启动一下试试, service dhcpd start,如果没问题,把dhcpd改成开机就启动,chkconfig --level 2345 dhcpd on
  
  二、bind(named)的配置。
  关于bind(named)配置的文章有很多了。这里只把与普通配置不同的地方写出来。
  下面给我的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.
  */
  // forwarders { 192.168.1.254; };
  // query-source address * port 53;
  };
  
  //
  // a caching only nameserver config
  //
  controls {
  inet 127.0.0.1 allow { localhost; } keys { rndckey; };
  };
  
  key DHCP_UPDATER {
  algorithm HMAC-MD5;
  secret qhB OR5yWo8BTXwk/m4ng;
  };
  
  zone "." IN {
  type hint;
  file "named.ca";
  };
  
  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; };
  };
  
  zone "1.168.192.in-addr.arpa" IN {
  type master;
  file "1.168.192.zone";
  allow-update { key DHCP_UPDATER; };
  };
  
  zone "test.com" IN {
  type master;
  file "test.com";
  allow-update { key DHCP_UPDATER; };
  };
  include "/etc/rndc.key";
  
  其中多了的是
  
  key DHCP_UPDATER {
  algorithm HMAC-MD5;
  secret qhB OR5yWo8BTXwk/m4ng;
  };
  
  这就是更新dns要用的key,必须和dhcpd.conf里的一样。
  
  还有就是每个 zone 都可以用 key update了。
  
  这样就行了。然后启动一下试试吧。
  
  你就可以ping 机器名来找你同事的机器了。
==========================================================
LINUX中的DHCP配置文件信息
1. DHCP服2. 务的配置
1.  安装DHCP的服2. 务软件包
#  mount  /dev/cdrom(插入第二张安装光盘)
#  cd  /mnt/cdrom/RedHat/RPMS
#  rpm  -ivh  dhcp-3.0pl1-23.i386.rpm
相关文件和目录:
/var/lib/dhcp目录   //存放租约文件。
/etc/dhcpd.conf      //核心配置文件, 要手工创建。
/var/lib/dhcp/dhcpd.leases //客户租约的数据库文件。
/etc/sysconfig/dhcpd  //配置DHCP的启动参数。
/etc/sysconfig/dhcrelay  //配置DHCP中继代理。
/etc/rc.d/init.d/dhcpd (/etc/init.d/dhcpd):DHCP服务的启动脚本
3.  /etc/dhcpd.conf
#  vi  /etc/dhcpd.conf
格式:
选项/参数(放在所有作用域之上的选项/参数,作用范围是整个DHCP服务器)
声明 {
选项/参数
}
说明:
(1) 声明
 subnet  网络号  netmask  子网掩码  {n ……..}
功能:定义子网 (定义作用域 )
注意:网络号必须与服务器的网络号相同,如果服务器有多块网卡时,必须为每一个网卡都建立一个相同网络号的子网,但是不用分配地址的子网可以不定义地址范围
n range 起始IP地址   终止IP地址;
功能:定义作用域范围
注意:subnet声明中至少有一个range,也可以在一个subnet中有多个range,但多个range所定义IP范围不能重复。
n   {………}nhost  主机名
功能:定义保留地址
注意:通常放在subnet声明中
 groupn {……..}
功能:定义组参数
注意:常用于包含host声明和subnet声明
 称n shared-network  名n {………..}
功能:设置DHCP服务器多个IP子网共享同一个物理网络
注意:通常用于包含多个subnet声明
(2) 参数
n ddns-update-style  (none|ad-hoc|interim) ;
功能:定义动态更新类型
注意:none  表示不支持动态更新
ad-hoc  表示特殊 更新模式
interim  表示互动更新模式
在文件中必须包含该参数,且放在第一行
n ignore  client-updates;
功能:忽略客户机更新
注意:该选项只能作为服务器选项
n default-lease-time   数字 ;
功能:指定默认地址租约
注意:可以作为服务器选项和作用域选项,默认单位为秒
n max-lease-time  数字;
功能:指定最长的地址租期
注意:可以作为服务器选项和作用域选项,默认单位为秒
 hardware n  硬件类型  硬件地址;
功能:指定硬件接口类型及硬件地址
注意:硬件类型可以取ethernet/token-ring
硬件地址为网卡地址的MAC地址
该选项只能用于host声明中
n fixed-address  ip地址;
功能:定义DHCP客户机指定的IP地址
注意:该选项只能用于host声明中
n  ;nserver-name  主机名
功能:通知DHCP客户机服务器的主机名
注意:可以作为服务器选项和作用域选项
(3) 选项
n  ”;noption  domain-name   “域名
功能:为客户机指明DNS域名
注意:可以作为服务器选项和作用域选项
n noption  domain-name-servers  ip地址[, ip地址…………];
功能:指定客户机的DNS服务器的地址
注意:可以作为服务器选项和作用域选项
n  ”;noption  host-name  “主机名
功能:为客户机指定主机名
注意:可以作为服务器选项和作用域选项
n  ip地址……….];noption  routers  ip地址[,
功能:为客户机指定默认网关
注意:可以作为服务器选项和作用域选项
n noption   netbios-name-servers  ip地址[, ip地址……..];
功能:为客户机指定WINS服务器地址
注意:可以作为服务器选项和作用域选项
n option  broadcast-address  广播地址;
功能:设置客户机的广播地址
注意:可以作为服务器选项和作用域选项
n option  subnet-mask  子网掩码;
功能:设置客户机的子网掩码
注意:可以作为服务器选项和作用域选项
n noption  nis-domain   “名 称”;(应用于LINUX客户机)
功能:定义客户机的所属NIS域的名称
注意:可以作为服务器选项和作用域选项,且只对unix/linux客户机有效
n noption  nis-servers  ip地址[, ip地址……];
功能:定义客户机的NIS域服务器的地址
注意:可以作为服务器选项和作用域选项,且只对unix/linux客户机有效
实例:设置dhcpd.conf文件,达到以下要求:
(1) 不(2) 支持dns动态更新,且忽略客户机的更新
(3) 服(4) 务器的默认地址租约时间为3600秒,(5) 最大地址租约时间为7200秒
(6) 所有作用域的客户机后缀域名(7) 为abc.com,DNS服(8) 务器地址为192.168.0.254
(9) 所有作用域的客户机默认网关地址192.168.0.1
(10) 定义作用域192.168.0.0子网,(11) 地址掩码为255.255.255.0,地址范围为192.168.0.2-----192.168.0.250
(12) 保留192.168.0.0子网中的192.168.0.8给以太网卡物理地址为00:E0:4C:70:33:65的客户机
#vi   /etc/dhcpd.conf
ddns-update-style  none;
ignore  client-updates;
default-lease-time   3600;
max-lease-time   7200;
option routers 192.168.0.1;
option domain-name “abc.com”;
option domain-name-servers  192.168.0.254;
subnet  192.168.0.0  netmask  255.255.255.0 {
range  192.168.0.2  192.168.0.250;
host  c1 {
hardware   ethernet  00:E0:4C:70:33:65;
fixed-address  192.168.0.8;
}
}
4. 设置DHCP守护进程的工作参数
#vi   /etc/sysconfig/dhcpd
DHCPDARGS=eth0(设置DHCP守护进程监听网卡接口)
5. 启动DHCP服6. 务器
#service dhcpd  start
3. DHCP客户端的配置
1. Linux客户端
(1) 设置网卡采用dhcp启动协议,(2) 自动获取ip地址信息
#vi   /etc/sysconfig/network-scripts/ifcfg-ethX(X可以0,1,2……)
修改BOOTPROTO为:
BOOTPROTO=dhcp
(3) 获取IP地址
#ifdown ethX ;ifup ethX  (X可以取0,1,2,……)
注意:linux系统的dhcp客户端使用dhclient脚本来获取IP地址信息
2. Windows客户端
(1) 右击网上邻居----属性------双击tcp/ip协议----选择“自动获动IP地址”
(2) c:\>ipconfig/release
c:\>ipconfig/renew
三、DHCP中继代理设置
1、#vi   /etc/sysconfig/dhcrelay
INTERFACES=“接口名”           //设置与DHCP服务器相连的接口名
DHCPSERVERS=“DHCP服务器IP”   //设置DHCP服务器的地址
2、#service  dhcrelay   start
 
 
*********************
这段时间一直在弄BIND,配了好久还没搞定,一些细节上的问题一直搞不清楚,在网上找资料时找到这么一篇文章,贴出来与大家分享.
有兴趣帮我看一下我的问题





原贴位置:,不过好像也是转贴的。全文超过二万字。

---------------------------------------------------------------------------------

架设 DNS

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

前提条件

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

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


什么是 DNS 的授权模式t是怎样进行的t

请解释 zone 和 domain 的差别。

什么是 DNS 正解和反解t

什么是 DNS 的查询模式t查询过程是怎样进行的t

请解释 DNS cache 的作用和它对查询流程的影响。




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



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



好了o闲话休提p言归正传o听百遍不如做一遍o那就让我们开始动手吧u

探索 NAMED

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

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

// 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;

};


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



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

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

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

// a caching only nameserver config

//

zone "." IN {

type hint;

file "named.ca";

};




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

在 root zone 后面o您应该还会看到如下这两段s
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 解释s第一个 zone 是 localhost 的正解 zoneo其服务器种类是 mastero记录文件名称是 localhost.zone (在 /var/named 目录下面)o但这个 zone 不允许客户主机(或服务器)自行更新 DNS 的记录(当然oclient 主机必须能支持 DNS submit 功能才行)。

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

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

key "key" {

algorithm hmac-md5;

secret "coqJswFdBMdNAItnLOpkmGgmJtccFsoNZZciWqxlGZBMUTOUxb0geYMFRyTT";

};

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

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

named.ca

localhost.zone

named.local



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



; 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 记录文件里面的批注符号o和 /etc/named.conf 的批注符号不一样哦s在 named.conf 中是用双斜线“ // ”r而在这里则使用 “ r”符号。无论如何o您都不能用 “ # ”来做批注符号就是了。(好混乱哦~~~ 这就是计算机u^_^ )

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



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

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

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

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 之外o第二个 zone 的记录文件是 localhost.zone o从 named.conf 中您应该知道它是 zone "localhost" 的记录文件o它的内容如下s

$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

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

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



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



然后o第三行o是一个 SOA 记录的设定o在这里我们看到一个特殊字符“ @ ”o它就是 ORIGIN 的意思o也就是刚u所定义的 $ORIGIN localhost. 内容o您可以写成 localhost. 也可以用 @ 来代替。假如这个档前面没有定义 $ORIGIN 的话o那这个 @ 的值就以 named.conf 里的 zone 为准。既然这样o当然是使用“@”啦o尤其对于像我这样的懒惰鬼来说o巴不得少打一串字o同时还能避免因打字不准所造成的失误o何乐不为t



在 @ 之后o是 TTL 的设定o这里是 1Do也就是一天的意思o如果您喜欢o可以用 86400 (秒) 来设定o如果这里的 TTL 没有设定o则参考前面的 $TTL 值o如果前面没有定义 $TTLo那就参考其后介绍的 minium ttl 设定。


Tipss事实上o您可以为每一个 RR 记录设定其自己的 TTL o只要将数字写在第二个字段o也就是‘IN’前面就可以了。

在 TTL 之后是一个 INo定义出目前的记录类型是属于 internet class 的 (奇怪o目前的 DNS 还有其它 class 吗t)。

在 IN 之后就是这行 RR 的记录类别名称o这里是 SOA o也就是“Start Of Authority”的意思o表示目前区域的授权记录开始。每一个记录文件只能有一个 SOA o不得重复o而且必须是所负责的 zone 中第一个“记录”。



紧接 SOA 后面o指定了这个区域的授权主机和管理者的信箱o这里分别是“ @ ”和“ root ”o也就是 localhost. 主机和 root 信箱。这里要注意的是sSOA 的主机名称必须能够在 DNS 系统中找到一个 A 记录 (以后会提到)r另外o我们平时使用的信箱通常是“user@host”这样的格式o但因为“@”在 DNS 记录中是个保留字符(刚才已经提过)o所以在 SOA 中就用“.”来代替了“ @ ”。目前这个信箱是 root (并没有主机地址)o也就是本机o您可以写成 “root.localhost.”但不能写成“root@localhost.”。



接下来的 SOA 设定o是被括在“( )”之间的 5 组数字o主要作为和 slave 服务器同步 DNS 数据所使用的数据s

Serials其格式通常会是“年月日+修改次序”(但也不一定如此o您自己能够记得就行)。当 slave 要进行数据同步的时候o会比较这个号码。如果发现在这里的号码比它那边的数值“大”o就进行更新o否则忽略。不过设 serial 有一个地方您要留意s不能超过 10 位数字u

Refreshs这里是是告诉 slave 要隔多久要进行数据同步(是否同步要看 Serial 的比较结果)。

Retrys如果 slave 在进行更新失败后o要隔多久再进行重试。

Expires这是记录逾期时间s当 slave 一直未能成功与 master 取得联络o那到这里就放弃 retryo同时这里的数据也将标识为过期( expired )。

Minimums这是最小预设 TTL 值o如果您在前面没有用“$TTL”来定义o就会以此值为准。

以上的数字都是以秒为单位o但您也可以用 H(小时)pD(天)pW(星期)来做单位o如s3H 和 259200 是一样的。但要值得一提的是s我在 RH6.2 版本中曾测试过使用 netconf 这工具来设定 DNS o发现只能使用“秒”来设定。否则 netconf 会自动的把英文字母删除掉o那就不是我所预期的设定值了。无论您用什么单位来设定o都要遵守下面的规则s

expire >= refresh + retry

expire >= 10 * retry

Tipss请注意sSOA 记录中这对 “ ( ) ”符号之第一个 “ (”括号一定要和 SOA 写在同一行o而不能用 Enter 断行到下一行去(有时候您在书本的范例中看到这个符号排在下一行去了o那是因为版面的关系而已)o而且其左边最好有一个空格键或 tab 建。而最后一个 “ )”括号也不能写在批注符号 “ r”的右边。



设定 DNS 的 RR 记录文件o其格式要求非常严格o我们丝毫不能掉以轻心。比方说s如果句子不是以空格键pTab 键p 或批注符号 ( ; )开头o也不在 SOA 的 “ ( ) ”之内o 则表示要定义一个“新记录项 (Entry) ”r如果句子是以空格键或 tab 键开始的话o其设定被视为上一个“记录项”的内容。所以o如果您要为“同一个记录项”定义多个记录设定o而不想重复打字o您倒可以偷懒s在接着它的后面几行用空白或 Tab 来缩排就可以了。所以o最后这两行还是关于 localhost. 的设定o因为上一个“数据项”为 “ @ ”o也就是 localhost. 。当然o您如不喜欢o这两行句子也可以这样写s



;; 修改前s

1D IN NS @

1D IN A 127.0.0.1



;; 修改后s

@1D IN NS @

@1D IN A 127.0.0.1



;; 或s

localhost.1D IN NS localhost.

localhost.1D IN A 127.0.0.1


这两行的意思是说s负责 localhost. 这个记录的 name server ( NS ) 是 localhost. 这台机器r而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 里面的 A 记录应该是最常见的记录类型之一o如果在 IPv6 版本中o地址记录名称则改为 AAAA 。

Tipss关于更多的记录名称o请参阅“学习网络”中的“DNS 协议”。



最后o让我们检查剩下的 named.local 档案吧。如果您还没忘记 /etc/named.conf 的内容的话o应知道这个档案是 zone "0.0.127.in-addr.arpa" 的‘反解’记录文件o它的内容也很简单s



$TTL 86400

@ IN SOA localhost. root.localhost. (

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

IN NS localhost.



1 IN PTR localhost.


前面的部份应该不用多解释了(如果您还不清楚o那就必须重读前面的文章)。最后一行我们看到一个“ PTR ”记录o它是“Pointer”的意思。 PTR 通常用于反记录当中o将 IP 指向主机名称(刚好和 A 记录相反)。您或许还不是很清楚这个句子为什么是这样设定的吧t或许您会这样问s您不是说 PTR 是从 IP 反查询主机名称的吗t为什么这里是 1 而不是 127.0.0.1 ?



哦o如果您有这样的问题o那证明您对 DNS 的查询模式还不是了解得很透彻o不过也不用紧张o在后面的实作例子中o您将获得更进一步的感性认识。这里o我暂时简单解释上面这行就是了s



我们知道 127.0.0.1 所对应的主机名称就是 localhost o因为这里是反向查询o所以 IP 顺序是掉过来写的o于是这个反查询 IP 就是s“ 1.0.0.127.in-addr.arpa. ”o由于我们这里的 ORIGIN ( @ ) 是“ 0.0.127.in-addr.arpa." ”o因为在记录文件中o如果名称不带小数点o则被补上 $ORIGIN 或 zone 的名称o所以这个 “ 1 ”就成了 1.0.0.127.in-addr.arpa. ”。同样道理o后面的“ localhost. ”如果漏了最后的小点的话o则会成为“ localhost.0.0.127.in-addr.arpa. ”o这显然是不对的。假如您喜欢o可以将这行句子修改成为下面的样子s



rr修改前s

1 IN PTR localhost.



rr修改后s

1.0.0.127.in-addr.arpa. IN PTR localhost.


嗯~~ DNS 的设定看起来真的蛮伤脑筋的o或许您到这里已经被搞得乱七八糟了。假如真的如此o我建议您先休息一下o然后回来重读上面的内容o直到您能理解之后o才继续下面的。否则o越往后o您的问题越像滚雪球那样越来越大o这更浪费时间啦~~~ Okay? Take it easy ...



前面所看到的设定o事实上已经足够让您的 DNS 主机跑起来了u因为它能够透过 root 查询其它 DNS 的缘故o您无须在再加设任何设定o您就可以利用这台主机为大家提供 Internet 的 DNS 查询服务。只是o这样的 DNS 主机o我们称之为 cache only name server 而已。如果您了解 DNS 的查询流程o您应该知道 DNS 的 cache 作用和它的效益。所以o就算您不打算设定自己的 domain name 服务 o我也建议您至少可以将 cache only NS 跑起来。



设定 NAMED



当您对 /etc/named.conf 档案和 /var/named 目录的设定有初步了解之后o下面o让我们用一个实际例子来看看如何设定自己的 domain name 服务吧。我个人的习惯是先将网域和主机的数据整理出来o并列成一个表格s



Domain 名称 IP 地址

rh71.siyongc.domain 192.168.100.23

acer.siyongc.domain 192.168.100.20

mdk.siyongc.domain 192.168.100.24

emilie.siyongc.domain 192.168.100.11

rh71.dmz.domain 10.0.1.131

lp64.dmz.domain 10.0.1.130

当所有的主机名称和 IP 整理出来之后o再看看我们这里需要设定哪些 domain t 从上面的数据中o我们不难发现有两个正解 zone 和两个反解 zone 需要设定o分别是s



区域名称 记录项名称

siyongc.domain emiliepacerprh71pmdk

dmz.domain lp64prh71

100.168.192.in-addr.arpa 11p20p23p24

1.0.10.in-addr.arpa 130p131

因为这些 IP 和 domain 都在内部网络使用o所以我们省却了注册这关o同时也不必担心授权的问题。但这些信息也只能在内部网络使用o无论如何是不能设定在对外的 DNS 上面的 (为什么t除了安全的考虑之外oprivate IP 的使用本来就有这样的规定o就算您真的对外散布这些 DNS 信息o在 IP 的路由上还是有问题o所以o内部的信息o只能内部使用)。



一般来说o我会先设定“反查询区域(revers zone)”o当然o这是个人习惯而已。所以o我首先在 /etc/named.conf 上面补上两个反解 zone 的设定s

zone "100.168.192.in-addr.arpa" IN {// 定义反解区域名称

type master;// 定义服务器类型

file "192.168.100.rev";// 指定记录文件名称

};// 结束区域设定



zone "1.0.10.in-addr.arpa" IN {

type master;

file "10.0.1.rev";

};


注意哦s如果您要设定外部 DNS 的反解o那就先获得 ISP 的授权才能自己设定r否则反解部份就不用自己担心了o但一定要请 ISP 帮忙。

Tipss假如您是 hinet 的固定制 ADSL 用户o可以到 hinet 的网站填写表格o请他们帮忙设定反解s






其它 ISP 的用户o请自行接洽 ISP 的客服部门。无论如何o如果没有取得授权o那就不要自己设u

这里o我们再一次碰到反解区域的识别标志s“ .in-addr.arpa ”o同时o我们解释一下上次关于本机反解还没说明的地方s如果您了解 DNS 的授权和查询过程(这章一开始的时候o我就已要求您一定要学习的)o您会知道反解查询是先从 root 开始(正解也是一样)o然后到 arpa p到 in-addr p到第一组 IP p到第二组 IP p...... 这样查询下来的。所以o在设定反区域的时候o您一定要将您的 net ID 部份反过来写o例如s我的网络为 192.168.100.0/24o它的反查询区域名则是s“100.168.192.in-addr.arpa”r假如我将 netmask 改为 16 bit o即变成 192.168.0.0/16o它的反解区域名就会变成s“168.192.in-addr.arpa”。如果您还搞不懂如何区分 Net ID 和 Host IDo请立即去看一看“学习网络”中的“IP 基础”。



同时o我将这些 zone 都设定为“主 DNS 服务器”(即smastero也有人称之为 primary dns )。

在每个 zone 的最后部份o我分别指定了它们各自的记录文件名称。它们都存放在 /var/named 这个目录下面(也就是前面 options 指定的 directory 啦)。档案的名称随您喜欢o不致做成混乱则可。



完成上面的设定之后o我们就可以到 /var/named 目录去建立相应的记录档案了。说实在o在 named.conf 里面如何定义文件名称没一定的标准o只要您能正确指定哪个记录文件给哪个 zone 使用o而且文件名称能够一致就行。首先o根据第一个 zone 的 file 设定o我要建立一个 /var/named/192.168.100.rev 档案o其内容如下s



$TTL 86400

@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (

2001111601 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

@ IN NS rh71.siyongc.domain.

@ IN NS lp64.dmz.domain.



11 IN PTR emilie.siyongc.domain.

20 IN PTR acer.siyongc.domain.

23 IN PTR rh71.siyongc.domain.

24 IN PTR mdk.siyongc.domain.

而另外一个反解设定档是 /var/named/10.0.1.rev o我们依样画葫芦就行了s



$TTL 86400

@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (

2001111601 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

@ IN NS rh71.siyongc.domain.

@ IN NS lp64.dmz.domain.



130 IN PTR lp64.dmz.domain.

131 IN PTR rh71.dmz.domain.

就这样o反解 DNS 就设定完成了u是否很简单呢t如果您回答“ Yes ”的话o那就让我们继续正解区域的设定吧。同样的o先在 /etc/named.conf 里面加上两个 zones



zone "siyongc.domain" IN {

type master;

file "siyongc.domain";

};



zone "dmz.domain" IN {

type master;

file "dmz.domain";

};


完成后o再建立 /var/named/siyongc.domain 这个档案s

$TTL 86400

$ORIGIN siyongc.domain.

@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (

2001111601 28800 14400 3600000 86400 )

IN NS rh71.siyongc.domain.

IN NS lp64.dmz.domain.

IN MX 10 rh71.siyongc.domain.

IN MX 20 lp64.dmz.domain.



;; -- default address

@ IN A 192.168.100.23



;; -- linux servers --

rh71 IN A 192.168.100.23

IN MX 0 rh71.siyongc.domain.

IN MX 10 lp64.dmz.domain.

IN HINFO "Petium II 266""Redhat 7.1"

IN TXT "The internet gateway."



mdk IN A 192.168.100.24

IN MX 0 mdk.siyongc.domain.

IN MX 10 rh71.siyongc.domain.

IN HINFO "Petium II 266 dell""Mandrak 8.0"



;; -- Windows desktops --

acer IN A 192.168.100.20

IN MX 0 mdk.siyongc.domain.

IN HINFO "Petium III 800 acer""Windows ME"



emilie IN A 192.168.100.11

IN MX 0 mdk.siyongc.domain.

IN HINFO "Petium II 300""Windows 98"



;; -- cnames --

gw IN CNAME rh71

www IN CNAME rh71

ftp IN CNAME rh71

mail IN CNAME rh71

这里o我们在正解记录文件里面看到几个新的记录类别o或许需要进一步讲解一下的s

因为我这个区域的记录分别由两台主机负责o所以我这里指定了两个 NS 记录。这里o如果您确定上一个 ORIGIN 是正确的话o那也可以偷懒s正如我上面解释过o如果名称后面不是以“.”结尾的话o它所属的 ORIGIN ( @ ) 就会自动的加在该记录名称后面r所以o您可以只写“ rh71 ”而不带小数点结尾o就会变成“rh71.siyongc.domain.”了o这个名称实际就是我所要的。不过o我建议您在设定 NS 的时候还是尽量使用 FQDN 为好。



接下来的 ‘ MX ’ 记录恐怕要花些时间解析s

MX 记录

MX 是‘Mail eXchange’的意思o它指定了负责该记录项(可以为 domain 也可以是 host )的邮件服务器名称(最好使用 FQDN )o而且该名称必须是一个 A 记录(不建议使用 CNAME )。



在邮件系统中o只要邮件服务器双方都知道对方的 IP 就可以进行邮件交换了。我们用 /etc/hosts 也可以做到名称查询的目的o但正如我们可以想象的sineternet 有那么多邮件服务器o我们不可能一一为它们建立好 IP 对应。就算o我们可以这样做o如果对方要更换邮件服务器呢t要维护这样一个对应殊非易事。既然o我们可以用 DNS 来查询主机和 IPo为什么不使用这么便利的系统呢t这也是 DNS 系统的应用原因啊~~~ 但问题是o各区域的邮件服务器名称都不一样o我们不可能知道对方的邮件服务器主机名称是什么t就算知道o如果对方以后更换名称呢t



您看o即使我们使用了 DNS 系统来进行邮件路由o也不是这么简单的事情。但是o使用 MX 记录就大大发挥了 DNS 系统的功能了s我们只要为每一个区域建立起 MX 记录o利用 DNS 查询得到的邮件服务器名称(邮件路由查询中oDNS 只是其中一种方法)o这样o当邮件服务器要和对方的区域进行邮件传递的时候o就可以通过 MX 记录得到对方的邮件服务器名称o而不需预先知道要和哪台邮件主机沟通。在日后o就算对方更换名称o将 DNS 记录改改就可以o完全无需知会其它邮件主机r而外面的邮件服务器也根本无需认知到这个改变。



这样的设计o无疑是非常灵活便利的u另外o使用 MX 还有一个功能s您可以用多个 MX 同时指定好几台邮件服务器名称o从而提供备援或平行处理服务。在我这个例子中o我就分别为‘siyongc.domain’这个区域指定了两个 MX 记录s‘rh71.siyongc.domain.’和‘lp64.dmz.domain.’。但您有没有发现它们前面都有一个数字呢t这数字有什么作用啊t



问得好u当外面的邮件服务器通过 DNS 查询到我们的邮件服务器o如果发现超过一台主机负责邮件交换的话o数值越低的就越先被查询。但有时候该主机没有响应呢t那么就由下一个数值的主机负责了。这样有一个好处就是s就算第一台邮件服务器出现故障o也不至于导致邮件交换功能瘫痪掉。我们通常会将各自的 MX 主机尽量分布在不同的位置上(例如别的城市或国家的分公司主机)o假如万一发生专线p甚至 ISP 的问题o我们还能将邮件转往下一台 MX 主机。然而o在设计上o由于账号和 client 端的设定因素o我们的邮件并非真的完全转到下一个 MX 主机接收o而是先将邮件暂时队列( queue ) 在那台机器上o当原来的 MX 主机恢复联机之后o邮件会自动的从队列主机那边送回来o这样就能避免邮件丢失或被退信。

Tipss虽然o我们通常喜欢用‘10’p‘20’p‘30’.... 这样的偏好值( preference ) 来分配 MX 记录o但只要您喜欢o用‘1’p‘2’p‘3’... 这样的顺序一样可以。不过o我建议您还是使用惯例啦。



现在很多大型邮件系统o都可以同时使用多台邮件主机来提供邮件交换服务o这时候您可以将 MX 的 preference 设为相同o然后利用 NIS 和 NFS 服务o将邮件同步到相同的账号去。您已经在前面的章节里面学会了 NIS 和 NFSo等日后学习邮件主机架设的时候o不妨玩玩看u

或许o您还发现我这里为所有主机指定了 MX 记录o有些直接指向自己(如 rh71pmdk 等)o而有些则指向别的机器(如 lp64pacer 等)。在 Linux 机器上面o各主机本身就具备邮件交换功能(除非您将之移除了)o而 Windows 则除非额外加装o否则本身是没有邮件交换功能的。这里的设定是o从外面通过 DNS 查询而寄往那些主机的邮件o都会转到 MX 上面指定的邮件服务器。这在实际的网络环境中很常见o尤其您接触过“ mail hub ”这个概念。无论如何o我建议您应该帮负责 domain 的邮件服务器本身设定一个偏好值最低的 MX 记录指向自己(但这不是硬性必须如此的)。

Tipss事实上o我当初对 MX 的理解一直存在着错误o直到有一次在新闻组上和大家讨论o才纠正过来。如果您对这个故事感兴趣的话o或是想更进一步了解 MX 的实际运作原理o请参考 << Sendmail 与 MX >> 一文。

在过去o有些人并不知道如何正确的运用 MX 记录o但相对的o他们会为 domain 名称本身设定一个 A 记录 (@ IN A 192.168.100.23 )。这样的做法虽然不是正统的o但也行之有年了。而且o在许多网站的 URL 上o这样的设定o也能让您少输入“ www. ”这四个键~~~

另外o在这个档里面o您或许还发现‘ TXT ’这样的记录类别o它是‘Text InFORMation’的意思o它实际上不牵涉任何设定o只记录一些环境说明而已r这和‘ HINFO(Host InFORMation) ’差不多o但 HINFO 一定要有两项记录(分别用引号分开)o其中第一项是关于 CPU 的讯息o第二项则是操作系统。然而oTXT 和 HINFO 这些信息仅能在一个信任的环境中提供o如果您架设的 DNS 是对外提供服务的o那么o就不要设定这些信息了。要不然o入侵者可非常感谢您哦o因为您帮他们省却了很多主机系统的探测手续~~~ 所以o这里仅做范例o供您参考而已。



而最后您所看到的‘CNAME’记录又是怎样的呢tCNAME 也是一个常见的记录类别o它是一个别名记录( Canonical Name )。当 DNS 系统在查询 CNAME 左面的名称的时候o都会转向 CNAME 右面的名称再进行查询o一直追踪到最后的 PTR 或 A 名称o成功查询后才会做出响应o否则失败。例如o在正解查询中o一个 IP 通常(当然也有例外)o只会对应一个 A 记录o但我们可以使用 CNAME 在 A 名称之上赋予该 IP 更多的名称。也就是说s所有关于‘’p‘ftp.siyongc.domain’p ‘mail.siyongc.domain’这些名称的查询o实际上都会再查询一次‘rh71.siyongc.domain.’这个记录o直到找到它的 IP 地址为止。有些朋友或许会设定多层的 CNAME 查询o例如s


C CNAME B

B CNAME A

这样的话o会一层一层的逐级 CNAME 下去... 但是o这很浪费 DNS 资源u因为每一个 CNAME 都一定会产生另外一个查询动作o如果层级越多o那就产生越多的重复查询。所以o精明的 DNS 管理员o都会尽量的减少查询次数的发生o他会将 CNAME 变成这样子s


C CNAME A

B CNAME A

这样就用心多了u



基本上o我们在正解设定上所使用到的记录大概就前面所看到的。哦o对了~~ 还有另外一个 /var/named/dmz.domain 档案也不要忘记了s

$TTL 86400

$ORIGIN dmz.domain.

@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (

2001111601 28800 14400 3600000 86400 )

IN NS rh71.siyongc.domain.

IN NS lp64.dmz.domain.

IN MX 10 rh71.dmz.domain.



;; -- linux servers --

rh71 IN A 10.0.1.131

IN MX 0 rh71.dmz.domain.

IN HINFO "Petium II 266""Redhat 7.1"

IN TXT "The internet gateway."



lp64 IN A 10.0.1.130

IN MX 0 rh71.dmz.domain.

IN HINFO "Pentium 90""Linpus 6.4"



;; -- cnames --

gw IN CNAME lp64

www IN CNAME lp64

ftp IN CNAME lp64

mail IN CNAME lp64







您看u就这样o我们的 DNS 就已经设定好了o包括反解和正解哦~~~



重新启动 named



当您以为所有设定档都设定好之后o最想做的事情莫过于要测试一下啦。但在测试之前o我们还要重新启动 named o否则o您查询出来的还是旧数据。聪明的您或许已经知道使用如下命令来重新启动DNS 服务了吧s



service named restart


然而o作为一个有经验的 DNS 管理员o在重新启动 named 服务之后o他一定会检查一个档案o就是 /var/log/messages 。因为o许多时候o当您执行 service named restart 之后您看到的都是绿色的 OK o但事实上是否真的 OK 呢t谁也不敢保证o除非您在 log 档中没发现错误信息。所以o我也强烈建议您每次重新启动 named 之后o一定一定要做如下动作s



vi /var/log/messages

然后按“G”键(大写)跳到档案末尾部份(事实上o您也可以用 tail 命令)。您或许会看到如下这样的记录s



Nov 16 14:54:10 rh71 named[2211]: starting BIND 9.1.0 -u named

Nov 16 14:54:10 rh71 named[2211]: using 1 CPU

Nov 16 14:54:10 rh71 named: named startup succeeded

Nov 16 14:54:10 rh71 named[2215]: loading configuration from '/etc/named.conf'

Nov 16 14:54:10 rh71 named[2215]: the default for the 'auth-nxdomain' option is now 'no'

Nov 16 14:54:10 rh71 named[2215]: no IPv6 interfaces found

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface lo, 127.0.0.1#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth0, 192.168.100.23#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth1, 10.0.1.1#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth2, 10.0.1.131#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet1, 172.16.233.1#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet8, 192.168.183.1#53

Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface ppp0, 211.74.244.213#53

Nov 16 14:54:10 rh71 named[2215]: running


上面虽然有 'auth-nxdomain' 和 IPV6 的提示o但那是正常的(除非您有设定相关的功能)。如果没有其它错误信息的话o那真要恭喜您了u



但有时候您或许会看到有其它错误信息的o例如s



Nov 16 15:01:49 rh71 named[2287]: loading configuration from '/etc/named.conf'

Nov 16 15:01:49 rh71 named[2287]: /etc/named.conf:41: parse error near zone

Nov 16 15:01:49 rh71 named[2287]: loading configuration: failure

Nov 16 15:01:49 rh71 named[2287]: exiting (due to fatal error)







这个错误信息明显指出了是 /etc/named.conf 的问题o而且很可能在 41 行附近。根据我个人的经验o这通常是您漏了 “ r”符号的原因而已。



如果您碰到如下信息o那是没有为所有 RR 记录项设定 TTL 而已o您可以为每一个记录项补上 TTL (在 IN 前面)o也可以在记录文件的前面用 $TTL 来设定s



Nov 16 15:04:47 rh71 named[2395]: master.c:1172: unexpected error:

Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:3: no TTL specified.

THIS ZONE WILL NO LONGER WORK IN FUTURE VERSIONS. Add a TTL.

Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:5: using

RFC 1035 TTL semantics


如果您碰到下面这样的信息o那多是因为您打字错误的关系o输入了 named 不认识的记录类别名称(例如漏了记录名称或打错了)s



Nov 16 15:07:44 rh71 named[2422]: dns_master_load: siyongc:2: unknown RR

type 'siyongc.domain.'

Nov 16 15:07:44 rh71 named[2422]: dns_zone_load: zone siyongc.domain/IN: loading

master file siyongc: unknown class/type

如下的问题o那可能是您没有定义 SOA 记录o或设定有错误s

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could

not find NS and/or SOA records

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has

0 SOA records

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no

NS records

下面的问题可能是您的 SOA 记录中多输入了一组数字o或少输入了一组数字o或数字格式有错误s



Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could not

find NS and/or SOA records

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has

0 SOA records

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no

NS records



Nov 16 15:18:24 rh71 named[2562]: dns_rdata_fromtext: siyongc:4: near eol: unexpected

end of input

Nov 16 15:18:24 rh71 named[2562]: dns_zone_load: zone siyongc.domain/IN: loading

master file siyongc: unexpected end of input



Nov 16 15:19:34 rh71 named[2640]: dns_rdata_fromtext:

siyongc:4: near '14B400':

syntax error

Nov 16 15:19:34 rh71 named[2640]: dns_zone_load: zone

siyongc.domain/IN: loading

master file siyongc: syntax error


以下问题可能是 SOA 的 “ ( ) ”符号有问题o要么是“ ( ” 给断到下一行了o要么是“ ) ”给批注掉了s



Nov 16 15:22:08 rh71 named[2669]: dns_rdata_fromtext: siyongc:3: near eol: unexpected

end of input

Nov 16 15:22:08 rh71 named[2669]: dns_zone_load: zone siyongc.domain/IN: loading

master file siyongc: unexpected end of input



Nov 16 15:22:52 rh71 named[2696]: dns_rdata_fromtext: siyongc:4:

near 'IN': extra input text

Nov 16 15:22:52 rh71 named[2696]: dns_zone_load: zone siyongc.domain/IN:

loading master file siyongc: extra input text


以下是您没有设定 NS 记录或 NS 记录设定有错误s



Nov 16 15:25:30 rh71 named[2801]: dns_zone_load: zone siyongc.domain/IN: no NS records

下面的错误可能是您设定了一个记录项超出了当前 ORIGIN 的范围o例如 localhost. 或 siyongc. (也就是错误使用 FQDN )r或是错误的使用了 $ORIGIN 设定r或是在 named.conf 中有多个 zone 在分享同一份记录文件s



Nov 16 15:31:20 rh71 named[2920]: dns_master_load: siyongc:16:

ignoring out-of-zone data


下面的错误o有可能您在设定多个 $ORIGIN 并同时尝试设定多个 SOA 时出现的错误s



Nov 16 15:28:31 rh71 named[2855]: dns_master_load: siyongc:26:

not at top of zone


许多许多问题o事实上您都可以在 /var/log/messages 中找到o当您发现这些错误信息之后o看看是关于什么记录的o然后顺藤摸瓜o留心一下档案内容o就比较容易找到错误的原因了。



有时候o您想简化您的 DNS 设定工作o您可以使用 netconf 来做。不过o根据我的经验是snetconf 未必能够完全帮您正确的设定起来。当您重新启动 named 之后o别忘了看一下 /var/log/messages o确定没有错误发生。如果您使用工具来设定 DNS 而碰到问题o这就需要您有手工设定的能力了。

设定 DNS Client



DNS 系统是一个典型的 Client/Server 架构o前面介绍的动作仅是确保 DNS 的 server 成功启动起来而已o如果您要测试它o还必须设定好 client 端才行。



不知道您会不会设定 linux 的 dns client 呢t如果忘记了要打屁屁了哦~~~ 事实上我们在第一章的“网络设定”那里就设定过了o也就是修改 /etc/resolv.conf 这个档案o将您刚设定好的 DNS 主机 IP 放在档案的前排位置o如s



nameserver192.168.100.23

nameserver168.95.1.1

nameserver139.175.10.20

domainsiyongc.domain

searchsiyongc.domain dmz.domain test.com


假如您的 client 和 server 在同一台机器上o那可以将第一个 name server 设定为 0.0.0.0 或 127.0.0.1 。



要是您使用 Windows o但不是透过 DHCP 来指定 DNS 的话o那您或许需要手工设定了s控制台 --> 网络 --> TCP/IP (-> 网络卡) --> 内容 --> DNS 组态 s


请注意s如果您修改了这里的设定o就算您的 Windows 是透过 DHCP 取得 IP 设定的话o也会以这里的设定为准。如果您想使用 DHCP 的设定o那就选择“关闭 DNS”吧。

测试 DNS



要测试我们的设定是否生效o我们可以使用的方法有很多o其中最简单的莫过于 ping 命令了。直接 ping 一下您所预期的 dns 名称就知道结果了。



不过oping 毕竟很有限o例如s您不能查询 MX 和 NS 等记录。实作上o我们最最常使用的 DNS 查询工具是 nslookup 命令。关于 nslookup o在“学习网络”的“DNS 协议”文章中有很详细的例子o这里不再重复。如果我们在测试中失败o例如 nslookup 响应说s



*** rh71.siyongc.domain can't find XXX.XXXX.XXXX:

Non-existent host/domain

这通常是反解记录没设定好的缘故o请确定 DNS 主机本身的反解有设定起来o而且可以被 DNS 追查得到。如果反解没有授权下来o那就请上游 ISP 帮忙设定。不过o我发现这个错误信息似乎在新版的 nslookup 中不会出现oanyway o请您自己留意吧。



有时候 nslookup 会停在某处一动也不动o其实它不是当掉了o而是在查询没结果之后等 time out 而已。您可以按 Ctrl + C 终止查询o再打 exit 跳出来。不过o如果您在按了 Ctrl + C 之后接着再输入一个无结果的查询o那就好可能将 nslookup 当掉。这样您可能要登录进另外一个 terminal o然后用 kill 将 PID 杀掉。同上o新版的 nslookup 没有这个困绕o但如果按 Ctrl + C 的话o则会直接跳离 nslookup 程序。



然而onslookup 似乎在以后的版本中不再维护了o取而代之的o就是 dig 命令o所以o当您在 Redhat 7.1 上输入 nslookupo您会看到如下这样的信息s



Note: nslookup is deprecated and may be removed from future releases.

Consider using the `dig' or `host' programs instead. Run nslookup with

the `-sil[ent]' option to prevent this message from appearing.

这段文字不用解释了吧t真的不知道说什么就查字典吧~~ 这里o我们不妨学习一下如何用 dig 来查询和测试 DNS 服务。



基本上odig 命令的语法如下s

dig [@server] domain [] [] [+]

[-] [%comment]



看起来蛮复杂的o恐怕要 man dig 才知道怎么使用。不过o我们平时只用它来查询 dns 数据的话o要使用到的选项也不会太多啦o如果您会得在 nslookup 中设定 type=XXX 的话o那您也可以用 dig 来查询不同的记录类别数据。例如s



# dig siyongc.domain mx



; <<>> DiG 9.1.0 <<>> siyongc.domain mx

;; global options: printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8198

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2



;; QUESTION SECTION:

;siyongc.domain. IN MX



;; ANSWER SECTION:

siyongc.domain. 86400 IN MX 20 lp64.dmz.domain.

siyongc.domain. 86400 IN MX 10 rh71.siyongc.domain.



;; AUTHORITY SECTION:

siyongc.domain. 86400 IN NS lp64.dmz.domain.

siyongc.domain. 86400 IN NS rh71.siyongc.domain.



;; ADDITIONAL SECTION:

rh71.siyongc.domain. 86400 IN A 192.168.100.23

lp64.dmz.domain. 86400 IN A 10.0.1.130



;; Query time: 8 msec

;; SERVER: 192.168.100.23#53(192.168.100.23)

;; WHEN: Fri Nov 16 21:13:18 2001

;; MSG SIZE rcvd: 138

上面是的命令是使用预设的 name server 来查询 siyongc.domain 的 mx 记录。当然o您也可以用 @ 来指定用某一台 name server 来查询其它的信息。例如o我要用 hinet 的 dns 来查询负责 com.tw 的 NS 有哪些s



# dig @168.95.1.1 com.tw ns



; <<>> DiG 9.1.0 <<>> @168.95.1.1 com.tw ns

;; global options: printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33339

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4



;; QUESTION SECTION:

;com.tw. IN NS



;; ANSWER SECTION:

com.tw. 518400 IN NS b.twnic.net.tw.

com.tw. 518400 IN NS c.twnic.net.tw.

com.tw. 518400 IN NS a.twnic.net.tw.



;; ADDITIONAL SECTION:

b.twnic.net.tw. 159497 IN A 192.72.81.200

c.twnic.net.tw. 159497 IN A 168.95.192.10

a.twnic.net.tw. 159497 IN A 163.28.1.2

a.twnic.net.tw. 159497 IN A 140.111.1.2



;; Query time: 167 msec

;; SERVER: 168.95.1.1#53(168.95.1.1)

;; WHEN: Fri Nov 16 21:17:46 2001

;; MSG SIZE rcvd: 146

除了用 nslookup 和 dig 之外o如果您只想简单的查询 dns 信息的话o那您可以用 host 命令。例如s

# host -t any siyongc.domain 0.0.0.0

Using domain server:

Name: 0.0.0.0

Address: 0.0.0.0#53

Aliases:



siyongc.domain. SOA rh71.siyongc.domain. root.rh71.siyongc.domain. 2001111601 28

800 14400 3600000 86400

siyongc.domain. name server lp64.dmz.domain.

siyongc.domain. name server rh71.siyongc.domain.

siyongc.domain. mail is handled by 10 rh71.siyongc.domain.

siyongc.domain. mail is handled by 20 lp64.dmz.domain.

siyongc.domain. has address 192.168.100.23


上面的命令就是用本机 name server 来查询 siyongc.domain 的 any 信息。至于 host 命令的格式如下s

host [-aCdlnrTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait]

name [server]



老话啦o看 man host 以了解那些参数和选项的用法吧。



您可以发现s透过 nslookup p dig p与 host 命令o事实上可以查询到许多 dns 上面的设定信息。所以o如果您的 DNS 是对外提供服务的话o请尽量尽量控制 DNS 信息量o如果您觉得没必要对外提供的o那就拿掉它。无论如何o关于内部网络的 DNS 信息o是绝对不能对外散布的。如果查询的结果未如您所预期的o您就要进行 debug 工作了。

 

error: bad owner name(check-names)

--> dns 的 RFC 中規定,名稱帶_(底線)是不允許的。
  不過,可將 check-name 取消就可以了。
  在/etc/resolv.conf 加入 options no-check-names

或是在 zone xxx {
check-names ignore;
}

 
error: PRset exists (value dependent), pre requisite not satisfied
 
 
 
 
NSUPDATE 使用:
:~# nsupdate -k /etc/Kbew-key.+157+20101.key
> server 192.168.148.18
> zone wx.ibm.com
> update add newhost.wx.ibm.com 86400 A 172.16.1.1  --增加
> update delete newhost.wx.ibm.com  A 172.16.1.1  --删除
> update add it-12.wx.ibm.com 86400 A 192.168.148.205
> update add it-13.wx.ibm.com 86400 A 192.168.148.204
> send
> quit
精典收藏:SQL Server 2008 集群+SAN集成方案:
  • 精典收藏:中小型IT机房UPS不间断电力解决方案:
  • 阅读(4716) | 评论(0) | 转发(1) |
    给主人留下些什么吧!~~