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 访问控制
    • 4 rndc
    • 5 主从配置
      • 51 意义及机制
      • 52 如何令解析请求均衡负载
      • 53 如何配置从服务器
      • 54 配置及验证从服务器解析效果
    • 6 创建子域
    • 7 view智能解析

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不尽相同。

常见资源记录类型:

类型 意义 SOA 起始授权(Start Of Authority)记录。 NS 域名服务(Name Service)记录。用于指定DNS服务器地址 A 地址(Address)记录。FQDN与IP(v4)的对应记录 AAAA 地址记录。FQDN与IP(v6)的对应记录 CNAME 正式名称(Canonical Name)记录。实际上就是别名 PTR 指针(Pointer)记录。IP与FQDN的对应记录 MX 邮件交换器(Mail eXchanger)记录。

下面分别说明各类型。

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                                          # 访问控制语句,根据需要添加
类型 意义 hint 指向根域 master 主DNS服务器 slave 从DNS服务器 forward 定义转发

可以看到在此文件中,已经定义了一些域,它们的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个集合:

集合 意义 none 没有任何主机 any 任意主机 local 本机 localnet 本机所属网络的主机

操作控制指令:

指令 意义 allow-query 允许哪些主机查询 allow-transfer 允许向哪些主机做区域传送(即传送解析库文件)。默认向所有主机都可以,不过这显然不安全。应当仅允许主服务器向从服务器传送。没有从服务器时、或是从服务器上,允许集合都应为none allow-recursion 允许为解析请求进行递归查询。显然这不应当对所有主机开放 allow-update 允许进程动态更新解析库文件的内容。有风险,一般在定义各zone时,指定允许集合为none

比如,/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服务的几个子命令:

子命令 意义 start 启动 stop 关闭 status 状态(信息较详细) reload 重载。不重启的情况下,重载配置文件(CentOS7的systemctl reload功能一样) flush 清空缓存答案。令服务器去重新迭代查找权威答案

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和对应解析库文件的定义,解析出不同结果。

(完)


  1. 注意,这里所说的主机名称,是指DNS中的主机名,比如www.google.cn,而非本地主机名hostname。本地主机名仅是主机一个标识而已,通信中用的不是这个。 ↩
  2. hosts文件记录了主机名和IP的对应。早期主机数量较少时,根据hosts文件的记录就可把主机名转化为IP。随着互联网的主机不断增多,靠一个文件记录的方式就不再适用,而需要专门的服务器进行解析。 ↩
  3. 缓存时长由DNS服务器根据主机B名称与IP变化的频度决定,缓存时长会一并发给主机A。 ↩
  4. 各一级域是按管理类别不同划分的,比如com是公司类的、org是非营利组织类的等。一级域名是国际组织划分的,无法自行申请。也有按国家或地区划分的一级域,如cn等。 ↩
  5. 各服务器的数据均记录于文件中,根服务器和一级域的文件就不在图中列出了。 ↩
  6. 实际上完整的主机名是”www.XXX.com.”,最后的点号代表根,只是可省略。
    类似这种以点号分隔的字符串,称为完全合格域名(FQDN),只有这样的域名才能被解析。 ↩
  7. 代理商为了降低成本,提供的服务器会为多个域(比如10000个)提供解析。有条件的话当然还是自己弄个服务器效果好。 ↩
  8. 实际IP不可能这样划分,这里只是说明查询机制。 ↩
  9. 反向解析127.0.0.1在/etc/named.rfc1912.zones中也有类似定义,此处不赘述截取了 ↩
  10. 有点像根,不过根是不会为解析请求做递归查询的,只会转发给一级域 ↩
  11. 实际上注册域名时,顶级域就是这么做的 ↩
  12. 笔者在这里吃了大亏,以后一定要注意 ↩
  13. 一般是两条或更多,因为有从服务器。
    有多条NS记录的话,bind程序会自动均衡访问负载。就是让不同服务器轮询地解析用户请求。 ↩
  14. 笔者开始犯的错误就是没有注释掉主配置文件中的根zone,该主机又正好可联网,于是它迭代查询www.brain.com对应的IP,也能查询到,因为互联网上确实有这个域名。但这样就不会采用笔者主机上定义的解析库文件了。 ↩
原创粉丝点击