龙之介大人

DNS服务原理与搭建自己的DNS服务器
1. DNS服务原理DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器...
扫描右侧二维码阅读全文
21
2019/11

DNS服务原理与搭建自己的DNS服务器

1. DNS服务原理

DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。 DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,你在上网时输入的网址,是通过域名解析系统解析找到了相对应的IP地址,这样才能上网。其实,域名的最终指向是IP。通常情况下我们之用到了DNS服务器的正向解析功能,而DNS还有方向解析功能,就是把IP地址解析成主机名。

  • DNS:中文名叫做域名服务或者域名服务器, 属于应用层协议, 为C/S架构, 使用TCP/UDP的53号端口.
[root@localhost ~]# cat /etc/services | grep "^domain\b"
domain          53/tcp                          # name-domain server
domain          53/udp

DNS相关知识

  • DNS:Domain Name Service,域名解析服务
  • 监听端口:udp/53,tcp/53
  • 应用程序:bind
  • 根域:.
  • 一级域:

    • 组织域:.com, .org, .net, .mil, .edu, .gov, .info, .cc, .me, .tv
    • 国家域:.cn, .us, .uk, .jp, .tw, .hk, .iq, .ir
    • 反向域:.in-addr.arpa
  • 域的划分

根域下来就是顶级域或者叫一级域,

有两种划分方式,一种互联网刚兴起时的按照行业性质划分的com.,net.等,一种是按国家划分的如cn.,jp.,等。

每个域都会有域名服务器,也叫权威域名服务器。

Baidu.com就是一个顶级域名,而www.baidu.com却不是顶级域名,他是在baidu.com 这个域里的一叫做www的主机。

一级域之后还有二级域,三级域,只要我买了一个顶级域,并且我搭建了自己BIND服务器(或者其他软件搭建的)注册到互联网中,那么我就可以随意在前面多加几个域了(当然长度是有限制的)。

比如a.www.baidu.com,在这个网址中,www.baidu.com变成了一个二级域而不是一台主机,主机名是a。

DNS树状结构图

解析方式

  • 正向解析:FQDN --> IP
  • 反向解析:IP --> FQDN
  • FQDN:(Fully Qualified Domain Name)全称域名
注意:正向解析是两个不同的名称空间,是两个不同的解析树;所以各需要一个解析库来分别负责本地域名的正向和反向;

DNS查询方式

递归:DNS请求被服务器接受后,如果属于此服务器管辖范围则请求上级服务器依次传递请求,并且依次传递结果给发出请求的主机。

客户端指向的服务器一定给递归服务

迭代: DNS请求被服务器接受后,如果不是自己管辖范围,让客户端访问根域服务器,然后跟域通知客户端去访问下级服务器,直到最后客户端访问管辖请求域名的服务器为止。

  • 客户端在查询DNS服务器之前会先查询本地的hosts(名称解析配置文件)文件, hosts文件中没有查询到需要的信息才会去查询DNS服务器.

host文件路径:

  • linux:/etc/host
  • windows:/%WINDOWS%/system32/dirvers/etc/host
#本地host格式
1.1.1.1     www.xxx.com
2.2.2.2     www.yyy.com
  • 一次完整的DNS查询请求经过的流程:
  1. 当你请求www.xxx.com这个域名时, 会先去查找本地hosts文件, 如果本地hosts文件中有结果, 则直接返回
  2. 如果hosts文件中没有结果, 则会请求DNS serveice, DNS service会先查找Local DNS Cache, 有结果则直接返回
  3. 如果没有结果, 就去会从根域服务器开始迭代查询
  4. 最后迭代查询有结果就直接返回给客户端

区域解析库

  • 资源记录:rr(resource record)用于此记录解析的属性

    • SOA: Start Of Authority, 起始授权记录,一个区域解析库仅能有一个SOA记录,而且必须为解析库的第一条
    • NS:Name Server,域名服务器,专用于标明当前区域的DNS服务器
    • MX: Mail eXchange, 邮件交换器,MX记录有优先级属性(0-99)
    • A:internet Address,FQDN --> IP,专用于正向解析,用于实现将FQDN解析为IP地址
    • PTR: PoinTeR,IP --> FQDN,专用于反向解析,将IP地址解析为FQDN
    • AAAA:FQDN --> IPv6,专用于正向解析,将FQDN解析为IPv6地址
    • CNAME: Canonical Name,别名记录
  • DNS服务器类型

    • 主DNS服务器:维护所负责解析的域内解析库服务器:解析库由管理维护;
    • 从DNS服务器:从主DNS服务器或其他的从DNS服务器哪里"复制"(区域传递)一份解析库;

      • 序列号:解析库的版本号,前提:主服务器解析库内 容发生变化,其序列递增;
      • 刷新时间间隔:从服务器从主服务器请求同步解析库的时间间隔
      • 重试时间间隔:从服务器从主服务器请求同步解析库失败时,再次尝试的时间间隔;
      • 过期时长:从服务器始终联系不到主服务器时,多久后放弃从服务器角度,停止提供服务器
    • 缓存服务器
  • 区域传送

    • 全量传送:传送整个解析库
    • 增量传送:传递解析库变化的那部分内容

解析库文件同步的过程,即辅助DNS服务器与主DNS服务器间的区域文件同步传输过程。

完全区域传送:传送区域的所有数据,AXFER

增量区域传送:传送区域中改变的数据,IXFER

DNS资源记录格式

资源记录定义的格式:
name     [TTL]   IN      RRType      Value

# TTL可以全局继承
# '@'可用于引用当前区域的名字
# 同一个名字可以通过多条记录定义多个不同的值,此时DNS服务器会以轮询方式响应
# 同一个值也可能有多个不同的定义名字, 通过多个不同的名字指向同一个值进行定义; 
  仅此表示通过多个不同的名字可以找到同一个主机而已
SOA(Start Of Authority)记录:
任何解析库文件的第一个记录的类型必须是SOA
# name: 区域名称,通常可以简写为'@';例如:www.baidu.com
# value: 有多部分组成
#        当前主区域的DNS服务器的FQDN, 也可以使用当前区域的名字
#        当前区域管理员的邮箱地址, 但地址中不能使用@符号, 一般用“.”代替, 例如:admin.baidu.com
#        主从服务协调属性的定义以及否定的答案的统一的TTL

#示例:
@   IN      SOA     ns.baidu.com.   uadmin.baidu.com.   (
                                    2019111101;#serial 解析库版本号,最好不要超过十位数字
                                    2H;#refresh 刷新时间
                                    10M;#retry 重试时间
                                    1W;#expire 过期时间
                                    1D;#negative answer ttl 否定答案的统一缓存时长
                                    )
  • 主从服务协调属性的定义以及否定答案的缓存时间TTL的解释:

    • serial:表示序列号,当主DNS服务器更新解析库文件时,需要把'serial'这个值增大,修改之后重载DNS服务就可以实现主从同步了。
    • refresh:表示从DNS服务器多久与主DNS服务器检查并同步一次,就是更新的意思。
    • retry:如果上面在从DNS服务器更新时连接主DNS服务器失败时,定义多久之后重新尝试连接一次。一般这个值应当小于上面'refresh'的值。
    • expire:如果在从DNS服务器重新尝试连接失败时,定义多久之后失效,并且从DNS服务器关闭DNS服务。这时需要系统管理员去查看故障并恢复服务。
    • negative answer ttl:表示否定答案在DNS客户端上的缓存时间。
H:表示小时,M表示分钟,W:表示星期,D:表示天;
NS(Name Server)记录:
# name:当前区域的名字
# value:当前区域的某DNS服务器的名字(FQDN),例如ns1.baidu.com
#       如果有多台NS服务器,每一个都必须有对应的NS记录;
#       对于正向解析文件来讲,每一个NS的FQDN都应该有有个A记录  

@   IN      NS      ns1.baidu.com.
相邻两个资源记录的name相同时,后续可省略
对NS记录而言,任何一个NS记录后面的服务器名字,都应该在后续有一个A记录
MX(Mail eXchange)记录:
# name:区域名称
# value:当前区域的某邮件服务器(smtp服务器的)FQDN;
#       一个区域,MX记录可以有很多个;但是每个记录的value之前应该有一个数字(0-99)表示此服务器的优先级
#       但是每个记录的value之前应该有一个数字(0-99)表示此服务器的优先级
#       数字越小优先级越高;

@   IN      MX  10      mail1.baidu.com.
@   IN      MX  20      mail2.baidu.com.

为什么要为每个MX记录设置优先级呢?这是因为如果在一个区域内有多台邮件交换器,那么当别人发送邮件过来时应该由谁接收才好?所以,优先级的好处就在这里,优先级越高的邮件交换器负责接收即可,这里而其他邮件交换器则起到冗余作用。在MX记录中,邮件交换器的优先级范围是0-99,且数字越小优先级越高。

注意:对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录;
A(Internet Address)记录:
# name:某个主机的FQDN,例如www.baidu.con
# value:主机名对应主机的IP地址

www.baidu.com.   IN      A       1.1.1.1
www.baidu.com.   IN      A       1.1.1.2

mail1.baidu.com.  IN      A       1.1.1.3
mail2.baidu.com.  IN      A       1.1.1.3

#注意:
*.baidu.com.    IN      A       1.1.1.4
baidu.com.    IN      A       1.1.1.4
#避免用户写错名称时给错误答案,可通过泛域名进行解析至某特定域名;
AAAA记录:
# name:FQDN
# value:IPv6
PTR(PoinTeR)记录:
# name:IP,有特定格式,把IP地址反过来写,1.2.3.4要写作4.3.2.1;
#      而有特定后缀:in-addr.arpa.,所以完整写法为:4.3.2.1.in-addra.arpa.
# value:FQDN

#例如:
4.3.2.1.in-addr.arpa.   IN      PTR     www.baidu.com
#简写成:
4   IN      PTR     www.baidu.com.
注意:网络地址及后缀可省略;主机地址依然需要反写;
CNAME(Canonical Name)格式:
# name:别的FQDN
# value:正工名字的FQDN

web.baidu.com.  IN      CNAME   www.baidu.com.

DNS解析答案

当DNS客户端向DNS服务器发出解析请求时,不管是否能够查询到想要的结果,都会返回一个解析答案。根据是否能够查询到想要的结果,可分为肯定答案和否定答案;根据解析答案是否由直接负责的DNS服务器返回,可分为权威答案和非权威答案。

  • 根据是否能够查询到想要的结果:
  1. 肯定答案:存在查询的键(key),并且存在与其查询键对应的值(value)。
  2. 否定答案:不存在查询的键(key),因此,自然不存在与其查询键(value)对应的值。
  • 根据解析答案是否由直接负责的DNS服务器返回:
  1. 权威答案:由直接负责的DNS服务器返回的答案。
  2. 非权威答案:不是由直接负责的DNS服务器返回的答案。这种情况下一般是由其他DNS服务器直接返回缓存的解析结果。

DNS and Bind

我们说DNS是一种协议,而对于每一种协议的实现都需要程序员开发出遵循这种协议规范的软件程序来实现,这里要介绍的BIND就是DNS协议的一种开源实现。据统计,使用bind作为DNS服务器软件的DNS服务器大约占所有DNS服务器的九成。BIND全称为Berkeley Internet Name Domain,因为当今互联网上的通信几乎都必须借助于DNS服务器来解析主机名,得到通信对方的IP地址,而在DNS服务器上最常用的软件就是bind,所以,bind这款软件几乎可以说是当今互联网上常用的软件了。

目前bind由ISC.org(Internet Systems Consortium,互联网系统协会)负责开发与维护。

学习bind这款软件之前,务必掌握以下基本概念:

dns:协议
bind:dns协议的一种开源实现
named:bind程序运行起来后的进程名

子域授权方式

子域授权:每个域的名称服务器,都是通过其上级名称服务器在解析库进行授权;

  • 类似根域授权tld:
.com.    IN       NS      ns1.com.
.com.    IN       NS         ns2.com.
ns1.com.     IN         A     2.2.2.1
ns2.com.     IN         A     2.2.2.2
  • baidu.com.在.com的名称服务器上,解析库中添加资源记录;
baidu.com.    IN      NS      ns1.baidu.com
baidu.com.    IN      NS      ns2.baidu.com
baidu.com.    IN      NS      ns3.baidu.com

ns1.baidu.com     IN    A    3.3.3.1
ns2.baidu.com     IN    A    3.3.3.2
ns3.baidu.com     IN    A    3.3.3.3
glue record:粘合记录
  • 域名注册商: 新网, 万网, godaddy...

DNS 服务搭建

BIND的安装配置:

dns服务, 程序包名:bind, 程序名:named
程序包
bind    #提供dns server程序,以及几个常用的测试工具。
bind-libs   #提供bind和bind-utils包中的程序共同用到的库文件。
bind-utils  #bind客户端程序集,例如提供dig, nslookup, dig等工具。

bind-chroot #类似chroot,把dns服务限制在某个范围之类.
bind
  • 服务脚本:/etc/rc.d/init.d/named
  • 主配置文件:/etc/named.conf,/etc/rfc1912.zones,/etc/rndc.key
  • 解析文件:/var/named/ZONE_NAME.ZONE

    • 注意:
    1. 一台物理服务器可同时为多个区域提供解析;
    2. 必须要有根区域文件;named.ca
    3. 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库;
rndc: remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1来连接named进程;提供辅助性的管理功能;监听端口:953/tcp
  • 要点:

(1)一台DNS服务器可同时为多个区域提供解析。

(2)DNS服务器必须要有根区域解析库文件:named.ca.

(3)DNS服务器还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库,这两个文件分别如下:

①正向解析库文件:/var/named/named.localhost

②反向解析库文件:/var/named/named.loopback

  • 查看named.localhost文件:
[root@localhost ~]# cat /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
  • 查看named.loopback文件:
[root@localhost ~]# cat /var/named/named.loopback 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.      <--这条记录
rndc命令管理dns服务器

我们知道,DNS服务默认的监听端口是53,当我们在主机上启动DNS服务之后,用netstat查看监听端口,显示如下:

[root@localhost ~]# netstat -tunlp | grep named
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      1387/named          
tcp        0      0 192.168.1.120:53        0.0.0.0:*               LISTEN      1387/named          
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1387/named          
tcp6       0      0 ::1:953                 :::*                    LISTEN      1387/named          
tcp6       0      0 ::1:53                  :::*                    LISTEN      1387/named          
udp        0      0 192.168.1.120:53        0.0.0.0:*                           1387/named          
udp        0      0 127.0.0.1:53            0.0.0.0:*                           1387/named          
udp6       0      0 ::1:53                  :::*                                1387/named   
上面结果显示,除了能够看到53号端口之外,还能看到953端口,那是namd在953端口多启动了一个服务,这就是rndc了。

这个rndc的全称是Remote Name Domain Controller,它可以帮助用户更方便地管理DNS服务器,包括可以检查DNS服务器的状态与统计信息、重载配置文件及zone或单独重载某个区域而不需要重新启动整个DNS服务,还有查看已存在DNS缓存当中的资料等。

rndc服务默认监听在tcp的953端口,且默认监听于127.0.0.1地址,因此默认仅允许本地使用。

  • rndc的常见用法:

    • rndc reload:在不重新启动DNS服务的情况下,重新加载配置文件及zone.
    • rndc reload zone:重新加载指定的zone.
    • rndc status:查看当前DNS服务器的状态。
    • rndc stats:将当前系统的DNS统计数据记录下来,默认会将数据存储为一个文件:/var/named/data/named_stats.txt.
    • rndc dumpdb:将当前DNS高速缓存中的数据记录下来,与stats类似,默认会将数据存储为一个文件:/var/named/data/cache_dump.db.、
    • rndc flush:清空当前DNS服务器上的所有缓存。
bind的配置文件
#安装bind
[root@localhost ~]# yum install -y bind

#查看bind安装目录
[root@localhost ~]# rpm -ql bind


#默认区域解析文件
[root@localhost ~]# cd /var/named/
[root@localhost named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves

#named.ca 默认全球DNS服务器地址,YUM安装会自动生成
#named.localhost 本地回环文件
#named.loopback 
  • 主配置文件:/etc/named.conf

    • 全局配置:option {}
    • 日志配置:logging{}
  • 区域配置配置文件:/etc/rfc1912.zones

    • 区域配置:本机能够为哪些zone进行解析,就要定义哪些zone;例如:zone "ZONE_NAME" IN {}
默认CentOS会默认配置回环地址
  • 至于options内的比较重要的子参数简单叙述如下:

listen-on port 53 { any; };

监听在当前主机上的哪个网络接口。默认是监听在localhost,也就是只有本机才能够查询,这显然是不符合现实需要的,因此可以改为any,表示可以监听多个网络接口,any之后要加上分号才算结束。只要监听在能够与外网主机进行通信的网络接口上,就可以为外网主机提供解析服务,当前前提是别人知道自己主机的IP地址。这里也可以监听在指定的网络接口上,可以监听多个接口,每个地址后面都需要加上分号。

directory "/var/named";

这里的意思是如果在/etc/named.conf(包括被包含进来的配置文件)中定义了正反解区域解析库文件的文件名时,该文件名默认应该存放于哪个目录下,默认是存放在/var/named/目录下。需要注意的是,如果安装了bind-chroot程序包,则这些区域解析库文件最终会被主动链接到/var/named/chroot/var/named/这个目录。

*dump-file、statistics-file、memstatistics-file

与named这个服务有关的许多统计信息,如果想要输出为文件的话,默认的文件名就由这三项指定。

allow-query { any; };

这是针对DNS客户端的设置,表示谁可以向我的DNS服务提出查询请求的意思。默认设置为localhost,表示仅允许本地查询,这里修改为any,表示对所有的用户开放(当然,防火墙必须放行才行)。

allow-transfer { none; };

当架设主-从DNS服务器时,允许哪台从DNS服务器向我的这台DNS服务器转发区域解析库文件的数据。

recursion yes;

是否允许为DNS客户端做递归查询。默认为yes.

bind服务器的启动
[root@localhost named]# systemctl start named
[root@localhost named]# ss -luntp | grep ':53'
udp    UNCONN     0      0      127.0.0.1:53                    *:*                   users:(("named",pid=2594,fd=512))
udp    UNCONN     0      0         [::1]:53                 [::]:*                   users:(("named",pid=2594,fd=513))
tcp    LISTEN     0      10     127.0.0.1:53                    *:*                   users:(("named",pid=2594,fd=21))
tcp    LISTEN     0      10        [::1]:53                 [::]:*                   users:(("named",pid=2594,fd=22))
  • 默认配置是不进行地址的解析,回环地址默认是缓存服务器!在配置named.conf文件时候建议复制一份.
注意:任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的IP地址上;
编辑name.d配置文件
#复制配置文件
[root@localhost ~]# cp -v /etc/named.conf{,.bak}
‘/etc/named.conf’ -> ‘/etc/named.conf.bak’

#配置文件简介
options {
        listen-on port 53 { 10.10.1.109; 127.0.0.1; };   <--监听端口,也可写为 { 127.0.0.1; 192.168.139.46; }
        listen-on-v6 port 53 { ::1; };      <--对ip6支持
        directory       "/var/named";       <--域文件存储目录
        dump-file       "/var/named/data/cache_dump.db";    <--dump cach的目录directory
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };     <--指定允许进行查询的主机,当然是要所有的电脑都可以查啦
        recursion yes;      <--是否递归查询

        //dnssec-enable yes;  <--dnssec建议关闭
        //dnssec-validation yes;

        /* Path to ISC DLV key */
        //bindkeys-file "/etc/named.root.key";

        //managed-keys-directory "/var/named/dynamic";

        //pid-file "/run/named/named.pid";  <--存着named的pid
        session-keyfile "/run/named/session.key";
logging {   <--指定服务器日志记录的内容和日志信息来源
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

#注释后重启后一台缓存DNS服务器就配置好了
[root@localhost ~]# systemctl restart named.service 
[root@localhost ~]# ss -luntp | grep ":53"
udp    UNCONN     0      0      10.10.1.109:53                    *:*                   users:(("named",pid=5921,fd=513))
udp    UNCONN     0      0      127.0.0.1:53                    *:*                   users:(("named",pid=5921,fd=512))
udp    UNCONN     0      0         [::1]:53                 [::]:*                   users:(("named",pid=5921,fd=514))
tcp    LISTEN     0      10     10.10.1.109:53                    *:*                   users:(("named",pid=5921,fd=22))
tcp    LISTEN     0      10     127.0.0.1:53                    *:*                   users:(("named",pid=5921,fd=21))
tcp    LISTEN     0      10        [::1]:53                 [::]:*                   users:(("named",pid=5921,fd=23))
  • 建议测试时关闭dnssec;
主正向解析DNS服务器的配置
1. 主DNS名称服务器:
    (1) 在主配置文件中定义区域
    zone "ZONE_NAME" IN {
        type {master|slave|hint|forward};
        file "ZONE_NAME.zone";
    };
(2) 定义区域解析库文件
    出现的内容:
        宏定义;
        资源记录;


#主服务器就需要编辑named.rfc1912.zones
[root@localhost ~]# vim /etc/named.rfc1912.zones 
zone "itcom.com" IN {
        type master;
        file "itcom.com.zone"
}
#添加需要解析的区域名,由于是我们要做主DNS解析 则type是master, file的默认工作目录是/var/name/
#所以文件路径可以省略不写,直接写域名的zone文件名  统称区域名加上.zone即可

#添加区域解析库文件
[root@localhost ~]# vim /var/named/itcom.com.zone
$TTL 1D
$ORIGIN itcom.com.

@       IN      SOA     ns1.itcom.com.  admin.itcom.com (
                        2019112201
                        1H
                        5M
                        7D
                        1D)

        IN      NS      ns1
        IN      NS      ns2
        IN      MX 10   mx1
        IN      MX 20   mx2
ns1     IN      A       10.10.1.1
ns2     IN      A       10.10.1.2
mx1     IN      A       10.10.1.3
mx2     IN      A       10.10.1.4
www     IN      A       10.10.1.5
ftp     IN      CNAME   www


#检查配置文件语法是否正确
[root@localhost ~]# named-checkconf  #没有消息是最好的消息,报错会提示报错问题

#检查区域配置文件是否有语法错误
[root@localhost ~]# named-checkzone "itcom.com" /var/named/itcom.com.zone 
zone itcom.com/IN: loaded serial 2019112201
OK
#指定检查区域名和区域文件,错误会提示相关错误信息

#修改文件权限
[root@localhost ~]# ps -aux | grep  named <--默认运行的永不是named
named     5921  0.0  2.8 168804 58064 ?        Ssl  11:53   0:00 /usr/sbin/named -u named -c /etc/named.conf
root     12915  0.0  0.0 112712   964 pts/0    R+   22:49   0:00 grep --color=auto named
[root@localhost ~]# ll /etc/named.conf <--默认的用户权限是root 群组是named  权限值是640
-rw-r----- 1 root named 1819 Nov 21 11:53 /etc/named.conf
[root@localhost ~]# id named  <--默认named用户权限
uid=25(named) gid=25(named) groups=25(named)

[root@localhost ~]# chmod  640 /var/named/itcom.com.zone  <--修改区域解析文件的权限
[root@localhost ~]# chown :named /var/named/itcom.com.zone <--修改区域解析文件的用户组
[root@localhost ~]# ll /var/named/itcom.com.zone 
-rw-r----- 1 root named 272 Nov 21 22:43 /var/named/itcom.com.zone


#重启named服务
[root@localhost ~]# systemctl restart named.service 

#查看named的状态
[root@localhost ~]# rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-9.P2.el7 (Extended Support Version) <id:7107deb>
running on localhost.localdomain: Linux x86_64 3.10.0-1062.4.3.el7.x86_64 #1 SMP Wed Nov 13 23:58:53 UTC 2019
boot time: Thu, 21 Nov 2019 14:54:05 GMT
last configured: Thu, 21 Nov 2019 14:54:05 GMT
configuration file: /etc/named.conf
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 104 (97 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 3/150
server is up and running
到此主服务器的正向解析就配置完成了!

DNS转发服务器的配置

在缓存服务器的基础上进行转发服务器的配置,但缓存DNS服务器没有专门负责解析哪一个或哪些区域,在接收到用户的查询请求时,首先查看本地是否有缓存,如果没有缓存则从根区域开始迭代查询。那有没有办法不向根区域服务器查询,而直接把查询请求发给其他指定的DNS服务器,然后让这个指定的DNS服务器帮我们查询并返回查询结果,接着本地主机再将查询结果返回给用户呢?这就需要用到forwarding功能了。但需要注意的是,被指定转发的服务器必须允许为当前服务器做递归查询。

转发功能分为区域转发和全局转发两种。

  • 区域转发:

功能:仅转发对某特定区域的解析请求
配置方式:配置区域段(zone),如下:

zone "ZONE_NAME" IN {
    type forward;
    forward {first|only};
    forwarders {SERVER_IP};
};
# first:首先转发。当转发器不回应时,自行去迭代查询。
# only:只转发给指定的转发器。
注意:forwarders后面的's'不能漏掉。
  • 全局转发:

功能:针对凡本地没有通过zone定义的区域查询请求,通通转发给某转发器。在这种情况下连根域的解析库文件都不需要了。

配置方式:配置全局段(options),如下:

options {
    ... ...
    forward {first|only};
    forwarders {SERVER_IP};
    ... ...
};

以用户访问www.baidu.com为例,当全局转发时,配置有forwarding的DNS服务器的查询方式示意图如下:

区域转发则仅转发特定区域的解析请求,如果用户请求解析这些特定区域时,整个查询方式和全局转发时一样;如果用户请求解析的不是这些特定区域时,则转发过程几乎和前面使用缓存DNS服务器进行查询相同。

总的来说,具有forwarding功能的DNS服务器就是把原本自己要去从根开始迭代查询的这个任务交给了其他DNS服务器去处理。

这里在原来配置好的缓存DNS服务器上定义转发:

[root@localhost ~]# vim /etc/named.conf
在全局配置段进行配置。
options {
    listen-on port 53 { any; };
    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     { any; };
    allow-transfer  { none; };
    recursion yes;
    forward only;    //定义只转发。
    forwarders { 223.5.5.5; 226.6.6.6; };
    //这两个地址是阿里云提供的公共DNS服务器,先用223.5.5.5,再用223.6.6.6.
};

为了方便测试,排除是本地DNS服务器自己从根域开始迭代查询的可能性,因此这里注释掉根域的相关配置,使其失效:

#zone "." IN {
#   type hint;
#   file "named.ca";
#};

配置好之后重载named服务:

[root@localhost ~]# rndc reload
server reload successful

将配置/etc/resolv.conf中配置的DNS服务器指向注释掉,排除是该配置文件中指向的DNS服务器查询的可能性:

[root@localhost ~]# vim /etc/resolv.conf
# Generated by NetworkManager
#nameserver 114.114.114.114
  • 测试结果:
[root@www ~]# dig -t A www.redhat.com @127.0.0.1

; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7 <<>> -t A www.redhat.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12858
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 13, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.redhat.com.            IN    A

;; ANSWER SECTION:
www.redhat.com.        30    IN    CNAME    ds-www.redhat.com.edgekey.net.
ds-www.redhat.com.edgekey.net. 30 IN    CNAME    ds-www.redhat.com.edgekey.net.globalredir.akadns.net.
ds-www.redhat.com.edgekey.net.globalredir.akadns.net. 30 IN CNAME e3396.ca2.s.tl88.net.
e3396.ca2.s.tl88.net.    30    IN    A    119.145.144.215

;; AUTHORITY SECTION:
.            514752    IN    NS    l.root-servers.net.
.            514752    IN    NS    b.root-servers.net.
.            514752    IN    NS    h.root-servers.net.
.            514752    IN    NS    i.root-servers.net.
.            514752    IN    NS    m.root-servers.net.
.            514752    IN    NS    k.root-servers.net.
.            514752    IN    NS    c.root-servers.net.
.            514752    IN    NS    e.root-servers.net.
.            514752    IN    NS    f.root-servers.net.
.            514752    IN    NS    d.root-servers.net.
.            514752    IN    NS    g.root-servers.net.
.            514752    IN    NS    a.root-servers.net.
.            514752    IN    NS    j.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.    514752    IN    A    198.41.0.4
a.root-servers.net.    514752    IN    AAAA    2001:503:ba3e::2:30
b.root-servers.net.    514752    IN    A    192.228.79.201
b.root-servers.net.    514752    IN    AAAA    2001:500:84::b
c.root-servers.net.    514752    IN    A    192.33.4.12
c.root-servers.net.    514752    IN    AAAA    2001:500:2::c
d.root-servers.net.    514752    IN    A    199.7.91.13
d.root-servers.net.    514752    IN    AAAA    2001:500:2d::d
e.root-servers.net.    514752    IN    A    192.203.230.10
e.root-servers.net.    514752    IN    AAAA    2001:500:a8::e
f.root-servers.net.    514752    IN    A    192.5.5.241
f.root-servers.net.    514752    IN    AAAA    2001:500:2f::f
g.root-servers.net.    514752    IN    A    192.112.36.4
g.root-servers.net.    514752    IN    AAAA    2001:500:12::d0d
h.root-servers.net.    514752    IN    A    198.97.190.53
h.root-servers.net.    514752    IN    AAAA    2001:500:1::53
i.root-servers.net.    514752    IN    A    192.36.148.17
i.root-servers.net.    514752    IN    AAAA    2001:7fe::53
j.root-servers.net.    514752    IN    A    192.58.128.30
j.root-servers.net.    514752    IN    AAAA    2001:503:c27::2:30
k.root-servers.net.    514752    IN    A    193.0.14.129
k.root-servers.net.    514752    IN    AAAA    2001:7fd::1
l.root-servers.net.    514752    IN    A    199.7.83.42
l.root-servers.net.    514752    IN    AAAA    2001:500:9f::42
m.root-servers.net.    514752    IN    A    202.12.27.33
m.root-servers.net.    514752    IN    AAAA    2001:dc3::35

;; Query time: 786 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 四 3月 30 22:13:39 CST 2017
;; MSG SIZE  rcvd: 976
  • forwarders的好处和问题分析

关于forwarders的使用是好是坏,有两种意见:

①利用forwarders可以提高查询效率。

这种观点认为,因为当很多DNS服务器都使用forwarders时,那个被设置为forwarders的DNS转发器,会因为积累了大量的缓存,因此查询效率会大大提高。

②利用forwarders反而会降低整体查询效率。

这种观点则认为,当被设置为forwarders的DNS转发器业务繁忙时,如果有其他的DNS服务器还向它要查询数据,这时候反而会导致查询速度减慢,这种情况下双方都会受到影响。

测试配置的DNS服务器

  • 测试命令:dig
#1.查询配置的DNS服务器
[root@localhost ~]# dig -t A "www.itcom.com" @10.10.1.109

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -t A www.itcom.com @10.10.1.109
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40853
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.itcom.com.                 IN      A

;; ANSWER SECTION:
www.itcom.com.          86400   IN      A       10.10.1.5  <--查询的结果是我们本机的服务器结果

;; AUTHORITY SECTION:
itcom.com.              86400   IN      NS      ns1.itcom.com.
itcom.com.              86400   IN      NS      ns2.itcom.com.

;; ADDITIONAL SECTION:
ns1.itcom.com.          86400   IN      A       10.10.1.1
ns2.itcom.com.          86400   IN      A       10.10.1.2

;; Query time: 0 msec
;; SERVER: 10.10.1.109#53(10.10.1.109)
;; WHEN: Thu Nov 21 23:00:19 CST 2019
;; MSG SIZE  rcvd: 126

#2.如果我们定义了两个以上的www记录解析结果会如何呢?
[root@localhost ~]# vim /var/named/itcom.com.zone 
$TTL 1D
$ORIGIN itcom.com.

@       IN      SOA     ns1.itcom.com.  admin.itcom.com (
                        2019112201
                        1H
                        5M
                        7D
                        1D)

        IN      NS      ns1
        IN      NS      ns2
        IN      MX 10   mx1
        IN      MX 20   mx2
ns1     IN      A       10.10.1.1
ns2     IN      A       10.10.1.2
mx1     IN      A       10.10.1.3
mx2     IN      A       10.10.1.4
www     IN      A       10.10.1.5
www     IN      A       10.10.1.6
ftp     IN      CNAME   www


#注意我们改完了配置库不会立即生效,如果要立即生效的话我们不用重启服务,只需要我们重载服务就行
[root@localhost ~]# systemctl reload named.service 
[root@localhost ~]# rndc reload <--这种reload也行
server reload successful

#3.现在我们在解析测试一下
[root@localhost ~]# dig -t A "www.itcom.com" @10.10.1.109

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -t A www.itcom.com @10.10.1.109
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38053
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.itcom.com.                 IN      A

;; ANSWER SECTION:
www.itcom.com.          86400   IN      A       10.10.1.6
www.itcom.com.          86400   IN      A       10.10.1.5

;; AUTHORITY SECTION:
itcom.com.              86400   IN      NS      ns1.itcom.com.
itcom.com.              86400   IN      NS      ns2.itcom.com.

;; ADDITIONAL SECTION:
ns1.itcom.com.          86400   IN      A       10.10.1.1
ns2.itcom.com.          86400   IN      A       10.10.1.2

;; Query time: 0 msec
;; SERVER: 10.10.1.109#53(10.10.1.109)
;; WHEN: Thu Nov 21 23:05:51 CST 2019
;; MSG SIZE  rcvd: 142
注意:如果我们dig测试没有@本机进行解析的话会交给/etc/resolv.conf文件里的nameserver地址解析,

解析命令的详细使用方式:

  • dig命令:
# dig [-t type] name [@SERVER] [query options]
#  dig用于测试dns系统,因此,不会查询hosts文件进行解析;

#   查询选项:
#       +[no]trace:跟踪解析过程
#       +[no]recurse:进行递归解析

#例:trace查询百度
[root@localhost ~]# dig -t A "www.baidu.com" +trace @8.8.8.8

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -t A www.baidu.com +trace @8.8.8.8
;; global options: +cmd
.                       119     IN      NS      j.root-servers.net.
.                       119     IN      NS      b.root-servers.net.
.                       119     IN      NS      l.root-servers.net.
.                       119     IN      NS      d.root-servers.net.
.                       119     IN      NS      a.root-servers.net.
.                       119     IN      NS      e.root-servers.net.
.                       119     IN      NS      f.root-servers.net.
.                       119     IN      NS      g.root-servers.net.
.                       119     IN      NS      h.root-servers.net.
.                       119     IN      NS      i.root-servers.net.
.                       119     IN      NS      m.root-servers.net.
.                       119     IN      NS      k.root-servers.net.
.                       119     IN      NS      c.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 39 ms

www.baidu.com.          15      IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       15      IN      A       14.215.177.39
www.a.shifen.com.       15      IN      A       14.215.177.38
;; Received 90 bytes from 202.12.27.33#53(m.root-servers.net) in 29 ms


#例:recurse查询百度
[root@localhost ~]# dig -t A "www.baidu.com" +recurse @8.8.8.8

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -t A www.baidu.com +recurse @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34458
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.baidu.com.                 IN      A

;; ANSWER SECTION:
www.baidu.com.          76      IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       76      IN      A       14.215.177.38
www.a.shifen.com.       76      IN      A       14.215.177.39

;; Query time: 31 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Nov 21 23:23:17 CST 2019
;; MSG SIZE  rcvd: 90
注意:flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3这行中的flags:后面的值aa: 表示权威答案
  • host命令:
# host [-t type] name [SERVER]

#查询本地itcom的A记录
[root@localhost ~]# host -t A www.itcom.com  10.10.1.109     
Using domain server:
Name: 10.10.1.109
Address: 10.10.1.109#53
Aliases: 

www.itcom.com has address 10.10.1.6
www.itcom.com has address 10.10.1.5
#查询 NS MX 等方法相同
最后修改:2019 年 11 月 23 日 05 : 19 PM

发表评论