DNS和bind
来源:互联网 发布:时间的玫瑰 北岛 知乎 编辑:程序博客网 时间:2024/06/08 18:06
0 目录
- 目录
- DNS
- 1 访问步骤
- 2 解析机制
- 3 反向解析
- bind
- 1 几个测试工具的安装使用
- 11 dig
- 12 host
- 13 nslookup
- 2 解析库文件
- 21 SOA
- 22 NS
- 23 A和AAAA
- 24 CNAME
- 25 PTR
- 26 MX
- 27 解析库文件的几个宏
- 3 配置文件etcnamedconf
- 31 各域的解析库配置指定etcnamedrfc1912zones
- 311 forward类型定义转发
- 32 访问控制
- 31 各域的解析库配置指定etcnamedrfc1912zones
- 4 rndc
- 5 主从配置
- 51 意义及机制
- 52 如何令解析请求均衡负载
- 53 如何配置从服务器
- 54 配置及验证从服务器解析效果
- 6 创建子域
- 7 view智能解析
- 1 几个测试工具的安装使用
1 DNS
DNS,域名解析协议(Domain Name System),一种应用层协议。用于把主机名解析(转化)为IP地址。
互联网各主机之间的访问,如果都通过IP来标识,则难于记忆。为此,使用名称来标识各主机(名称须唯一),通信过程中各主机名称先依据DNS转化为主机的IP,而后正常通信1。
DNS服务器监听在53端口,传输层协议UDP用于域名解析;TCP用于区域传送(可理解为传送解析库文件)。
1.1 访问步骤
主机A根据主机名访问B,从A的角度来看,步骤为:
1、先根据本机/etc/hosts文件中的记录,查找主机B名称所对应的IP,如能查找到,则根据该IP与主机进行通信2;
2、如查找不到,则请求主机A上网络属性中配置的DNS所指向的服务器来解析;
3、服务器解析到主机B名称所对应的IP,返回给主机A;
4、每次都让服务器进行解析,效率太低。所以这个结果会缓存一段时间(主机A和DNS服务器上都有)3,无需每次都去解析。再收到相同解析请求时把返回缓存结果。
综上,从主机A根据名称访问主机B,获取到B的IP的步骤为:
本地hosts文件—->缓存结果(包括本地DNS缓存和DNS服务器上的缓存)—->由DNS服务器查询
1.2 解析机制
整个DNS服务器的架构呈倒树状,由层次划分为根、一级域4、二级域等:
根服务器位于根节点,记录了各一级域如com、org等的服务器主机名和IP的对应;
各一级域记录了各自管理的域名服务器和IP的对应;
管理具体域XXX的服务器,数据文件中记录了该域中的主机名和IP的对应5。
注意:名称分配机构不可能为每个主机取名,所以上图中的www、bbs等,是二级域名XXX的注册者自己取的名字,只是约定俗成地以www代表web服务器、bbs代表论坛等。
所以,申请域名也就是向某一级域申请二级域名,而非具体的主机名,主机名是自定义的。
用户主机要访问地址为www.XXX.com的主机6,解析步骤:
为便于说明,缓存DNS服务器记作服务器A,管理域XXX的DNS服务器记作服务器B。
1、用户的解析请求发给了A(这正是用户主机配置的网络属性中的DNS指向);
2、A当然还不知道www.XXX.com对应的IP,于是向根发请求;根看到名称最后是com,于是返回A的是com对应的服务器的IP;
3、A根据IP找到一级域com的服务器;com看到域名是XXX,于是根据记录,返回A的是服务器B的IP;
4、A根据IP找到服务器B;服务器B看到要访问的是主机www,于是根据记录,返回A的是主机www的IP;
5、A返回给用户主机www.XXX.com的地址;
6、用户主机访问www.XXX.com。
梳理上述步骤:
- 对于用户主机来说,服务器A帮它做递归查询,因为它只需执行第1步发送请求给A,第5步接收A返回的答案。
- A的第2、3、4步,进行的是迭代查询,即逐层查找到答案。
- A找到答案后,会缓存一段时间,在这段时间内,如果www.XXX.com对应的IP发生变化,则A返回给用户主机的结果是错误的。所以由A返回的结果称为非权威答案。
- A无法返回权威答案是因为它不是管理XXX这个域的服务器,如果用户主机配置的DNS指向恰好是B,且就是要访问www.XXX.com,那么它得到的就是权威答案,且B不用做迭代查询。
附带说明下现实中的服务器A和B:
- 一个接入网络的普通用户,它的计算机配置的DNS指向,就是运营商提供的缓存DNS服务器,即图中的服务器A。否则用户无法按网址名(即主机名)浏览网页等。
- 一个用户注册了域名,还要像图中那样提供一台能解析它的域名的服务器B,且B要有公网IP,否则其他用户的主机就无法解析到,这也不大现实。实际上可专门向代理商申请,由代理商提供服务器为用户的各主机名解析并收取费用7,用户只需把自己的各主机及对应的IP填写好并发给代理商(通常是利用代理商提供的web客户端)。
1.3 反向解析
由名称向IP的解析称为正向解析,由IP向名称的解析称为反向解析。
虽然它们的查询机制是类似的,但正向解析和反向解析是完全不同的两个体系,使用的是不同的数据文件。并不是直观上好像只是同一个文件,名称和IP的对应关系颠倒下而已。
负责各IP段的解析的服务器也呈倒树状,其中根不再用点号表示,而是in-addr.arpa:
以上图为例,查询IP地址1.2.3.4对应的主机名8。因为查询机制与正向的类似都是自顶而下,所以查询的实际是4.3.2.1.in-addr.arpa,由后向前逐层查询到负责3的服务器,它下面管理的有地址4对应的主机,于是可查询到该主机对应的主机名。
2 bind
标题1说明的是解析机制。在下面bind程序的操作中,主要展示涉及到的具体操作和细节。
应用层的协议,就是靠具体的应用程序实现。bind就是一种DNS实现的程序。
虽然程序名为bind,但运行的进程、配置文件名为named。
2.1 几个测试工具的安装、使用
使用yum安装bind程序和相关的测试工具。
常用的测试工具有dig、host、nslookup等。注意这3个工具的安装包是bind-utils,如果直接搜命令本身是搜不到的。
本机当前指定的DNS服务器的IP是8.8.8.8:
[root@localhost ~]% cat /etc/resolv.conf ; generated by /sbin/dhclient-scriptnameserver 8.8.8.8
2.1.1 dig
常用使用格式:dig [-t TYPE] [@SERVER] [-x IP_ADDR] FQDN
其中
-t指定查询的资源记录类型(下述);
-x为反向解析,指定要解析的IP地址;
@指定通过哪个DNS服务器解析,无该选项则使用默认。
使用dig查询www.baidu.com对应的IP:
[root@localhost ~]% dig -t A @8.8.8.8 www.baidu.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6 <<>> -t A @8.8.8.8 www.baidu.com; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55719;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;www.baidu.com. IN A;; ANSWER SECTION:www.baidu.com. 853 IN CNAME www.a.shifen.com.www.a.shifen.com. 185 IN A 115.239.210.27www.a.shifen.com. 185 IN A 115.239.211.112;; Query time: 75 msec;; SERVER: 8.8.8.8#53(8.8.8.8);; WHEN: Fri Oct 13 15:19:00 2017;; MSG SIZE rcvd: 90
除了查询,dig命令也可用于手动传送解析库文件。格式dig -t axfr DOMAIN_NAME @MASTER_SERVER_IP
,表示从服务器到主服务器拉取解析库文件。
2.1.2 host
常用格式:host [-t TYPE] FQDN [SERVER_IP]
host的结果更简单,而且也标示出了别名:
[root@localhost ~]% host www.baidu.comwww.baidu.com is an alias for www.a.shifen.com.www.a.shifen.com has address 115.239.211.112www.a.shifen.com has address 115.239.210.27
[root@localhost ~]% host -t A www.baidu.com 8.8.8.8Using domain server:Name: 8.8.8.8Address: 8.8.8.8#53Aliases: www.baidu.com is an alias for www.a.shifen.com.www.a.shifen.com has address 115.239.211.112www.a.shifen.com has address 115.239.210.27
2.1.3 nslookup
nslookup的交互式使用:
[root@localhost ~]% nslookup> server 8.8.8.8 # 指定DNS服务器Default server: 8.8.8.8Address: 8.8.8.8#53> set q=A # 指定资源记录类型 > www.baidu.com # 指定要查询的FQDNServer: 8.8.8.8Address: 8.8.8.8#53Non-authoritative answer:www.baidu.com canonical name = www.a.shifen.com.Name: www.a.shifen.comAddress: 115.239.211.112Name: www.a.shifen.comAddress: 115.239.210.27> exit
2.2 解析库文件
运行bind程序的服务器,就可以作为缓存DNS服务器了(标题1.2中的服务器A)。
如果编辑好解析库文件,则可以对某域下的主机名进行解析(相当于标题1.2中的服务器B)。解析库文件在/var/named目录下(这个位置是由配置文件定义的),一般命名为ZONE_NAME.zone。
定义的解析库文件,它们的属主都是root,属组都是named,权限都是640。所以自己新建的文件,需要手动改下权限
文件中每行是一条资源记录,分号表示注释。
资源记录格式:name [TTL] IN RR_TYPE value
其中IN是关键字,TTL为缓存时长,RR_TYPE为资源记录类型,不同类型的name和value不尽相同。
常见资源记录类型:
下面分别说明各类型。
2.2.1 SOA
一个解析库有且只有一条SOA记录,SOA记录排在第1条。
- SOA记录的name,为该文件所管理的区域(即管理的范围)名。如果是正向解析,则name为域名;反向解析,name则是IP段(反写+in-addr.arpa)。
- SOA记录的value,分为3部分:
- 区域名称
- 区域管理员的邮箱地址。其中@要用“.”代替,因为在此配置文件中,@表示域名
- 主、从DNS服务器同步解析库时,用到的序列号、各项时长、否定答案的缓存时长等(此部分要用括号括起来)。
比如,域名为“test.com.”:
test.com. IN SOA test.com. test.126.com.{ 01 ; 序列号。从服务器依据序列号的变化,判断主服务器的解析库文件是否更新,从而及时同步。初始设置时,主从序列号应一致。主服务器每次更新,注意令其递增 3H ; 刷新时长。定义从服务器隔多久到主服务器拉取解析库文件数据。此处定义的是3小时 15M ; 重试时长。定义若从服务器请求同步主服务器未被响应时,多久重试一次。显然这个时长要小于刷新时长。这里定义的是15分钟 1W ; 过期时长。定义从服务器多久未联系到主服务器时,认定主服务器已挂。这里定义的是1星期 1D ; 否定答案缓存时长。定义如果服务器未找到域名的解析记录时(即否定答案)的缓存时长,否则每次还要进行迭代查询才知道无法解析}
2.2.2 NS
NS记录用于标识一个域内的DNS服务器是谁(这样解析请求才知道找谁)。可以有多个,其中一个是主服务器。
name是区域名;
value是DNS服务器名(注意不是IP,所以该记录后还要加一条A记录,即该服务器名和其IP的对应)。
比如,域“test.com.”的DNS服务器名为“ns1.test.com”,IP为“1.1.1.1”,则记录为:
test.com. IN NS ns1.test.com.ns1.test.com. IN A 1.1.1.1
2.2.3 A和AAAA
A和AAAA记录FQDN到IP(v4、v6)的对应,name是FQDN,value是IP。它是真正将主机名转化为IP的记录。
IPv4地址是32位2进制,IPv6是128位2进制,所以正好4个A
比如,域“test.com.”内有web服务器“www.test.com.”(注意,解析库文件内最后的点号不能省略),地址是1.1.1.2:
www.test.com. IN A 1.1.1.2
注意:
- 一个主机名可以对应多个IP,效果是访问同样的主机名,会被均衡负载到不同的主机上(bind程序会轮询)
- 一主机可部署多种服务,所以也可对应多个主机名。比如1.1.1.1既提供了web服务也提供了论坛,可以同时叫做www.test.com和bbs.test.com。访问这两者其实都是访问的1.1.1.1。
2.2.4 CNAME
主机的别名记录。说是别名,其实是正式名称的意思。
name是别名,value是正式名。只有正式名才有A记录。别名和正式名不要写反,否则会报错。
比如,“www.test.com.”有别名“web.test.com.”:
www.test.com. IN CNAME web.test.com. IN CNAME aaa.test.com. # IN之前的内容如一样,紧跟的记录可省略,其他记录也一样
反向解析的name和value,都是IP段反写+in-addr.arpa。
2.2.5 PTR
IP到FQDN的对应记录。name是IP(注意是反写+in-addr.arpa),value是FQDN。
比如,IP“4.3.2.1.in-addr.arpa”,对应的主机名是“www.test.com.”:
4.3.2.1.in-addr.arpa IN PTR www.test.com.
不过PTR是反向解析,不与A记录在同一文件。
其他的如NS、CNAME也可在反向解析库文件中使用,和正向解析类似,只是A记录换为PTR记录。
2.2.6 MX
邮件交换器记录,用于标识某域内邮件交换器的IP。
例如,邮箱地址名为1096987199@qq.com,向这个邮箱发送邮件时,在域qq.com内由哪个IP的主机收邮件(即作为邮件交换器),就由MX记录定义。
name是区域名;value是邮件交换器主机名,可有多个。每个前面都要有数字(0-99)标识优先级(即便只有1个也要有,数字越小优先级越高)。因为value记录的是主机名,所以也要有对应的A记录。
比如,邮件交换器主机名是“mail.test.com.”,优先级20,IP地址1.1.1.3:
test.com. IN MX 20 mail.test.com.mail.test.com. IN A 1.1.1.3
2.2.7 解析库文件的几个宏
- $TTL
在解析库文件开头,可统一定义TTL,$TTL TIME
。这样所有资源记录的TTL都默认为此定义的TIME,不用每条资源记录都专门定义了 - @
在解析库文件中多次出现区域名(正向的是域名,反向的是反写IP段+in-addr.arpa),可使用“@”代替 - $ORIGIN
自动补全ORIGIN定义的字符串。
比如,可定义为“$ORIGIN test.com.”,这样再写“ns1.test.com.”时,可直接写作“ns1”(注意此时ns1后不能再加点号了)
2.3 配置文件/etc/named.conf
named的主配置文件/etc/named.conf,每语句以分号结尾,分3段:
全局配置段options{……}:
options { listen-on port 53 { 127.0.0.1; 192.168.0.105; }; # 指定监听的地址,默认是127.0.0.1 listen-on-v6 port 53 { ::1; }; directory "/var/named"; # 定义工作目录 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; }; # 定义访问控制,默认是只允许本机查询解析库 recursion yes; # 定义是否为其他主机进行递归查询 dnssec-enable yes; # dnssec是dns加上安全组件,本文不述。为避免映像测试结果,这两项应改为no dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic";};
日志配置段logging{……}:
logging { channel default_debug { file "data/named.run"; severity dynamic; };};
区域配置段zone{……}:
zone "." IN { type hint; file "named.ca";};
区域配置使用关键字zone,定义解析指定的域时,依据哪个解析库文件。
在主配置文件中,默认仅配置了根域的zone,依据的文件是named.ca。这样缓存DNS服务器才能找得到根。
但是其他域的解析库文件统一定义在/etc/named.rfc1912.zones。主配置文件中包含了此文件:include "/etc/named.rfc1912.zones";
/etc/named.conf的语法检查可使用命令named-checkconf。
2.3.1 各域的解析库配置指定/etc/named.rfc1912.zones
zone定义的格式:
zone "DOMAIN_NAME" IN { type {hint|master|slave|forward} # 定义解析库文件的类型 file "ZONE_FILE" # 定义解析域名DOMAIN_NAME依据哪个文件,这里可使用绝对路径或相对路径,相对路径是相对于目录/var/named acl # 访问控制语句,根据需要添加
可以看到在此文件中,已经定义了一些域,它们的file都是”named.localhost”。它们是为了保证localhost、localhost.localdomain等,解析到的地址是127.0.0.19,否则它们可被认为定义为解析的地址不是127.0.0.1。
zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; };};zone "localhost" IN { type master; file "named.localhost"; allow-update { none; };};……
文件/var/named/named.localhost内容:
$TTL 1D@ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
保证解析出来的地址就是127.0.0.1。
比如,在/etc/named.rfc1912.zones中,定义一个解析域“test.com.”的zone,依赖的文件是/var/named/test.com.zone:
zone "test.com" IN { type master; file "test.com.zone";};
而后,根据标题2.2定义解析库文件。定义完成后,zone的定义的语法检查可使用命令named-checkzone。
[root@node2 ~]% named-checkzone test.com /var/named/test.com.zone # 有OK即可zone test.com/IN: loaded serial 2OK
2.3.1.1 forward类型定义转发
hint、master、slave类型容易理解,下面说明forward类型。
转发的意义:当某服务器收到解析请求时,转发给其他服务器帮助解析。
- 如果在主配置文件设置转发,则服务器收到的所有解析请求,都转发10
这种一般用于,一缓存DNS服务器无法联网,但能和一已联网的DNS服务器通信,则都转给能联网的服务器即可。
被转发的服务器必须开启为解析请求提供递归查询(即recursion为yes)。 - 如果在指定的zone内设置转发,则服务器收到对该域的请求时,才转发
这种一般用于,已事先知道要请求的域的DNS服务器IP。
比如自建的子域,并不管理父域的其他主机,但知道父域DNS服务器的IP。则如需解析父域的其他主机,直接转给父域服务器解析即可,而无需自行从根开始逐层迭代查找。
定义格式:
type forward # 在zone中定义type是forward,如在主配置文件中,则无需此句forward {first|only} # first意为以转发服务器的响应优先,若转发给的服务器无响应,则自行迭代查询;only意为只等待转发服务器的响应,无响应也不自行查询forwarders{……} # 定义转发给哪些服务器IP,不同IP之间用分号分隔
比如,192.168.0.102和105均启动了named服务。定义把发给主机192.168.0.102的所有请求,都转发给192.168.0.105,且是only:
options { forward only; forwarders { 192.168.0.105; }; listen-on port 53 { 127.0.0.1; 192.168.0.102; };……
此时使用102解析,可解析到:
[root@node2 ~]% host -t A www.baidu.com 192.168.0.102Using domain server:Name: 192.168.0.102Address: 192.168.0.102#53Aliases: www.baidu.com is an alias for www.a.shifen.com.www.a.shifen.com has address 115.239.210.27www.a.shifen.com has address 115.239.211.112
关闭105的named服务,再用102解析:
[root@localhost ~]% service named stop # 于105主机上执行Stopping named: . [ OK ]
[root@node2 ~]% service named restart # 由于答案有缓存,所以重启服务,避免缓存答案的影响Stopping named: . [ OK ]Starting named: [ OK ][root@node2 ~]% host -t A www.baidu.com 192.168.0.102 # 再使用102查找是找不到的Using domain server:Name: 192.168.0.102Address: 192.168.0.102#53Aliases: Host www.baidu.com not found: 2(SERVFAIL)
这样就验证了,发给102主机的请求都转发至105处理了。
2.3.2 访问控制
访问控制,定义的是哪些主机(用IP指定)能否做指定操作。比如最简单的,一服务器不应该也不可能允许为所有请求做递归查询。
如何定义?
格式:COMMAND { ACL; };
若写在主配置文件,则全局生效;若写在指定的zone定义内,则仅对指定的域生效。
主机集合(即acl,访问控制列表)需要先定义,才能使用。它需要定义在主配置文件的options段之上,因为先定义才能使用。
定义格式:acl acl_name{IP_list}
。其中IP的掩码只能使用长度。
bind默认已定义了4个集合:
操作控制指令:
比如,/etc/named.conf中options段,默认的是allow-query { localhost; };
,表示仅允许本机查询。等等。
2.4 rndc
bind有个控制工具rndc(remote name domain controller),会一并安装。
虽然叫做远程控制器,但为了安全防止他人控制,反而仅监听在127.0.0.1的953端口。作为操作本机DNS服务的工具。
可看到监听于953端口的进程是named发起的:
[root@node2 ~]% netstat -tanlp | awk '/953/{print}'tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3484/named tcp 0 0 ::1:953 :::* LISTEN 3484/named
常用的用于管理DNS服务的几个子命令:
2.5 主从配置
2.5.1 意义及机制
标题1.2所列解析机制说明了解析过程,不过在实际使用中,DNS服务器(不论是缓存DNS服务器还是负责具体域的)一般都要有2个或更多。
- 避免因主DNS服务器挂了而影响一个域下的所有主机无法访问;
- 2服务器可均衡访问负载。
由此,从服务器上的解析库文件内容要与主服务器一致,从服务器要随时从主服务器同步,这个同步是单向的,只有从服务器拉取主服务器的解析库文件。
允许多个服务器级联复制,即后一个从服务器从前一个从服务器获取解析库文件。
从服务器不能直接更新其上的解析库文件,所以如果主服务器挂了,从服务器在确认主的挂了后,也会停止服务。
从服务器同步,针对的是域(zone),而不是整个服务器。比如主服务器上有10个域,从服务器可以只是其中一个域的从,其他9个不管;或者服务器A作为正向解析的主、反向的从,服务器B作为反向解析的主、正向的从。都是允许的。
2.5.2 如何令解析请求均衡负载
- 如果是对本地缓存DNS服务器的请求,则只需令本地一半主机DNS地址配置为主服务器的IP,另一半配置为从的即可;
- 如果是对互联网上负责指定域的服务器,则只需在该服务器上级DNS服务器写两条NS记录即可,bind给客户主机答案时会采取轮询方式。
2.5.3 如何配置从服务器
主从服务器时间要一致。
从服务器的解析库文件放置在/etc/named/slaves目录下。
解析库文件内容从主服务器同步,所以无需手动编写,只需给出位置,此处假设位置是/var/named/slaves/test1.com.zone。只需编辑/etc/named.rfc1912.zone中从服务器对应的zone即可:
zone "test1.com." IN { type slave; # 类型为slave file "slaves/test.com.zone"; # 指定从服务器的解析库文件 masters { 192.168.0.105; }; # 指定主服务器IP};
把从服务器的解析库文件,单独放在/var/named目录下的slave目录,而不是直接放在/var/named下,因为权限问题:
[root@node2 ~]% ls -ld /var/named/slaves/drwxrwx---. 2 named named 4096 Jul 5 17:55 /var/named/slaves/[root@node2 ~]% ls -ld /var/nameddrwxr-x---. 5 root named 4096 Oct 14 14:24 /var/named
named进程有对slave目录的写权限,但不应有/var/named目录的写权限,否则named进程被劫持则可能删除/var/named目录下所有文件。
如果有从服务器,那么解析库文件中的NS记录,必须把主和所有的从都列出,否则用户还是访问不到。
2.5.4 配置及验证从服务器解析效果
以192.168.0.105为主服务器,192.168.0.102为从服务器。域名为”hao.com.”
1、首先在105主机的/etc/named.rfc1912.zone中,添加zone及其依据的解析库文件:
zone "hao.com." IN { type master; file "hao.com.zone"; allow-update { none; };};
2、编写解析库文件/var/hao.com.zone,为验证同步效果,刷新时间定义为10秒:
$TTL 300$ORIGIN hao.com.hao.com. IN SOA hao.com. 1234.qq.com ( 01 10 3 1D 3H)@ IN NS ns1 ; masterns1 IN A 192.168.0.150 ; master@ IN NS ns2 ; slavens2 IN A 192.168.0.151 ; slavewww IN A 192.168.0.170bbs IN A 192.168.0.171
3、检查配置文件和解析库文件:
[root@localhost ~]% named-checkconf [root@localhost ~]% named-checkzone hao.com. /var/named/hao.com.zone zone hao.com/IN: loaded serial 1OK
4、在从服务器上/etc/named.rfc1912.zone添加zone,并检查配置文件:
zone "hao.com." IN { type slave; file "slaves/hao.com.zone"; masters { 192.168.0.105; };};
[root@node2 ~]% named-checkconf
5、在从服务器上创建/var/named/slaves/hao.com.zone:
[root@node2 ~]% touch /var/named/slaves/hao.com.zone
当然这个文件是空的,稍后查看同步效果。
6、可以看到10秒后,从服务器上的/var/named/slaves/hao.com.zone也有内容了,虽然格式不尽相同(记录次序不一样,自动添加了注释),不过只需验证下是否能解析到正确结果即可。在从服务器上解析www.hao.com
[root@node2 ~]% host -t A www.hao.com 192.168.0.102Using domain server:Name: 192.168.0.102Address: 192.168.0.102#53Aliases: www.hao.com has address 192.168.0.170
7、在主服务器上添加一新资源记录,www.hao.com的别名web.hao.com,而后验证从服务器是否能解析到。
在添加之前,从服务器无法解析到此名称:
[root@node2 ~]% host -t A web.hao.com 192.168.0.102Using domain server:Name: 192.168.0.102Address: 192.168.0.102#53Aliases: Host web.hao.com not found: 3(NXDOMAIN)
添加别名记录:
$TTL 300$ORIGIN hao.com.hao.com. IN SOA hao.com. 1234.qq.com ( 12 # 笔者修改了多次序列号,所以这里是12 10 3 1D 3H)@ IN NS ns1 ; masterns1 IN A 192.168.0.150 ; master@ IN NS ns2 ; slavens2 IN A 192.168.0.151 ; slavewww IN A 192.168.0.170bbs IN A 192.168.0.171web IN CNAME www
在从服务器再执行:
[root@node2 ~]% host -t A web.hao.com 192.168.0.102Using domain server:Name: 192.168.0.102Address: 192.168.0.102#53Aliases: web.hao.com is an alias for www.hao.com.www.hao.com has address 192.168.0.170
注意,若两服务器时间不同,则会出现同步很慢等异常现象。
2.6 创建子域
根据需要,二级域下还可划分子域(这里仅说正向,反向较复杂)。这样DNS主机名就会再在前端多一段出来用于标识更下一层域的主机。
所要做的也就是在父域的DNS服务器上多了NS记录,指向子域的DNS服务器11。子域服务器的配置没什么变化,只要有子域下主机对应的资源记录即可。
下面以主机192.168.0.105作为父域DNS服务器,192.168.0.102作为子域DNS服务器。域名分别为father.com和son.father.com。这里只是为了说明子域创建,所以不考虑从服务器了:
1、父域服务器192.168.0.105主机的设置:
/etc/named.rfc1912.zones上添加zone:
zone "father.com." IN { type master; file "father.com.zone"; allow-update { none; };};
编写解析库文件/var/named/father.com.zone的内容:
$TTL 30@ IN SOA father.com. 1513.126.com ( 01 10 2 1D 3H)@ IN NS ns1.father.com. # 指定192.168.0.105是域father.com.的服务器ns1.father.com. IN A 192.168.0.105son.father.com. IN NS ns1.son.father.com. # 指定192.168.0.102是域son.father.com.的服务器。这就是子域授权。有从服务器的话,再写一条NS、A记录即可ns1.son.father.com. IN A 192.168.0.102www.father.com. IN A 2.2.2.2
2、子域服务器192.168.0.102的设置:
/etc/named.rfc1912.zones上添加zone:
zone "son.father.com" IN { type master; file "son.father.com.zone"; allow-update { none; };};
编辑解析库文件/var/named/son.father.com.zone的内容:
$TTL 15@ IN SOA son.father.com. 1518.139.com ( 01 10 4 1D 3H)@ IN NS ns1.son.father.com.ns1.son.father.com. IN A 192.168.0.102www.son.father.com. IN A 1.1.1.1bbs.son.father.com. IN A 3.3.3.3
3、注意,主配置文件中相关访问控制语句要修改,否则无法访问12。而后就可以指向父域服务器,来解析子域中的主机了:
[root@localhost ~]% host -t A www.son.father.com 192.168.0.105Using domain server:Name: 192.168.0.105Address: 192.168.0.105#53Aliases: www.son.father.com has address 1.1.1.1
能解析到www.son.father.com,说明授权成功。
实际上在互联网上注册二级域,也正是在一级域上做了授权。即添加NS记录和对应的A记录13,指向的是解析用户主机名的服务器(如上所述,这个服务器可以由代理商提供,用户只需提供给代理商解析库文件内容)。
2.7 view智能解析
不同用户访问同样的地址,有时需要根据客户端地址不同,解析出不同的地址。
比如一web服务器既有联通IP也有电信IP,则如果是电信用户访问,则应该把服务器的电信IP解析给用户;联通用户则应该把联通IP解析给用户。
在bind实现,就是要为不同的客户端IP,提供不同的解析库文件,这样解析内容就会因文件内容定义的不同而不同。
格式:
view VIEW_NAME { match-clients { CLIENT_IP; }; # 可以是定义的IP集合,或自带的集合any、local等 zone "ZONE_NAME" IN { …… }};
即把zone的定义,放在view中。view可指定不同的客户端IP。
下面仍以192.168.0.102和105为例,named服务启动在105上,域为brain.com。访问www.brain.com,如果是105,则解析到1.1.1.1;如果是102,则解析到2.2.2.2:
1、在配置文件中定义view:
view 105 { match-clients { 192.168.0.105; }; zone "brain.com." IN { type master; file "brain105.com.zone"; # 如果客户主机是192.168.0.105,则使用解析库文件brain105.com.zone };};view 102 { match-clients { 192.168.0.102; }; zone "brain.com." IN { type master; file "brain102.com.zone"; # 如果客户主机是192.168.0.102,则使用解析库文件brain102.com.zone };};
注意,当使用view时,所有的zone都要定义在某view下,包括主配置文件中的根zone(还有named.rfc1912.zone中自带的local的zone),否则会报错:
when using 'view' statements, all zones must be in views
所以根zone的定义也要写在view中,当然,可以不限制访问它的主机IP:
view hint { match-clients { any; };zone "." IN { type hint; file "named.ca";};};
注意,view可在主配置文件/etc/named.conf中定义,也可在/etc/rfc1912.zone中定义。
- 如果在/etc/named.conf中定义,则应写在根zone的前面;
- 如果在/etc/rfc1912.zone中定义,因为语句“include /etc/rfc1912.zone”已经是/etc/named.conf的最后部分,所以最好注释掉根zone的定义(如果不需要该服务器迭代查询的话,找不到根服务器也无所谓)。
这么做的目的是为了让定义的view在前,从而先生效。因为前面定义的view如果生效,后面的view就不会被用到了14。
所以如果根zone的view出现在前,则它会作为缓存DNS服务器,先去找根,而后层层迭代解析主机名。
2、定义102和105各自用到的解析库文件:
192.168.0.105的解析库文件/var/named/brain105.com.zone:
$TTL 300brain.com. IN SOA brain105.com. 123.11.com ( 01 10 5 1D 3H)brain.com. IN NS ns1.brain.com.ns1.brain.com. IN A 192.168.0.105www.brain.com. IN A 1.1.1.1fk.brain.com. IN A 4.4.4.4
192.168.0.102的解析库文件/var/named/brain102.com.zone:
$TTL 300brain.com. IN SOA brain105.com. 123.11.com ( 01 10 5 1D 3H)brain.com. IN NS ns1.brain.com.ns1.brain.com. IN A 192.168.0.105www.brain.com. IN A 2.2.2.2fk.brain.com. IN A 6.6.6.6
3、分别使用105和102主机发出解析请求,可看到解析出不同结果:
在105:
[root@localhost ~]% ip addr show | grep 192.168 inet 192.168.0.105/24 brd 192.168.0.255 scope global eth0[root@localhost ~]% host -t A www.brain.com 192.168.0.105Using domain server:Name: 192.168.0.105Address: 192.168.0.105#53Aliases: www.brain.com has address 1.1.1.1
在102:
[root@node2 ~]% ip addr show | grep 192.168 inet 192.168.0.102/24 brd 192.168.0.255 scope global eth0[root@node2 ~]% host -t A www.brain.com 192.168.0.105Using domain server:Name: 192.168.0.105Address: 192.168.0.105#53Aliases: www.brain.com has address 2.2.2.2
相同的域名www.brain.com,在同一服务器上解析,由于是不同IP发出的请求,根据view和对应解析库文件的定义,解析出不同结果。
(完)
- 注意,这里所说的主机名称,是指DNS中的主机名,比如www.google.cn,而非本地主机名hostname。本地主机名仅是主机一个标识而已,通信中用的不是这个。 ↩
- hosts文件记录了主机名和IP的对应。早期主机数量较少时,根据hosts文件的记录就可把主机名转化为IP。随着互联网的主机不断增多,靠一个文件记录的方式就不再适用,而需要专门的服务器进行解析。 ↩
- 缓存时长由DNS服务器根据主机B名称与IP变化的频度决定,缓存时长会一并发给主机A。 ↩
- 各一级域是按管理类别不同划分的,比如com是公司类的、org是非营利组织类的等。一级域名是国际组织划分的,无法自行申请。也有按国家或地区划分的一级域,如cn等。 ↩
- 各服务器的数据均记录于文件中,根服务器和一级域的文件就不在图中列出了。 ↩
- 实际上完整的主机名是”www.XXX.com.”,最后的点号代表根,只是可省略。
类似这种以点号分隔的字符串,称为完全合格域名(FQDN),只有这样的域名才能被解析。 ↩ - 代理商为了降低成本,提供的服务器会为多个域(比如10000个)提供解析。有条件的话当然还是自己弄个服务器效果好。 ↩
- 实际IP不可能这样划分,这里只是说明查询机制。 ↩
- 反向解析127.0.0.1在/etc/named.rfc1912.zones中也有类似定义,此处不赘述截取了 ↩
- 有点像根,不过根是不会为解析请求做递归查询的,只会转发给一级域 ↩
- 实际上注册域名时,顶级域就是这么做的 ↩
- 笔者在这里吃了大亏,以后一定要注意 ↩
- 一般是两条或更多,因为有从服务器。
有多条NS记录的话,bind程序会自动均衡访问负载。就是让不同服务器轮询地解析用户请求。 ↩ - 笔者开始犯的错误就是没有注释掉主配置文件中的根zone,该主机又正好可联网,于是它迭代查询www.brain.com对应的IP,也能查询到,因为互联网上确实有这个域名。但这样就不会采用笔者主机上定义的解析库文件了。 ↩
- DNS和BIND
- DNS和bind
- Bind DNS
- DNS BIND之nsupdate介绍和使用
- DNS BIND之bind-chroot
- DNS BIND之bind-utils
- 在windowns xp上安装和配置BIND dns服务器
- BIND+Mysql实现DNS轮询泛解析和IP视图
- DNS/BIND in Debian
- Pro DNS and BIND
- DNS BIND的配置
- DNS (bind)实战详解
- bind主辅dns设置
- DNS & Bind (一)
- DNS & Bind (二)
- dns and bind
- DNS域名服务 BIND (下)
- 快速配置BIND【DNS】
- 栈 (stack)
- 10-10 arguments存储实参、解决js获取CSS属性值兼容性、object对象、for语句遍历对象内容、数组中的方法
- 迷宫问题(poj-3984)
- HYSBZ2160-拉拉队排练
- 数据结构--数据抽象
- DNS和bind
- C# 数据类型
- Easyui datagrid在线编辑时没有提供带时分秒的datetimebox控件,需要自己扩展
- SQLserver数据类型介绍
- pg_ctl 加载启动参数文件一种不太常见的写法
- linux的命令操作
- Numpy库学习(三)numpy的随机函数,统计函数和梯度函数
- codeforces 191A Dynasty Puzzles(简单DP)
- poj2751||51nod1205-贪心&经典问题&双机调度-Saving Endeavour