DNS与Bind基本配置实现

DNS

DNS是一个用来把名称解析为IP地址的协议,它是标准TCP/IP协议簇的一部分,是几个能提供名称解析功能的协议中的一个,其他的协议包括NIS和LDAP。
DNS与这些协议的不同之处在于它只做名称解析这一件事,NIS和LDAP还能做其他解析操作,例如对网络用户和组账户的解析。

DNS也是名称解析的行业标准,被因特网上绝大多数系统所采用。
DNS客户端配置非常简单,如linux只需要在本地名为/etc/resolv.conf的文件里指定要使用的DNS服务器的地址即可:

[root@worker-03 ~]#cat/etc/resolv.conf
nameserver 172.16.21.2

ICANN

全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织。它的总部在美国加州。

它原来是美国商务部下面的一个非盈利机构。2016年,美国政府宣布,ICANN 不再隶属于商务部,成为一个自我管理的独立机构。

ICANN 负责管理全世界域名系统的运作。它的一项主要工作,就是规定顶级域名(top level domain,简写为 TLD)。

顶级域名有1000多个,ICANN 自己不会去管理这些顶级域名,每个顶级域名下面都有许多批发商。

ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来说,.cn域名的托管商就是中国互联网络信息中心(CNNIC),它决定了.cn域名的各种政策。

目前,世界最大的顶级域名托管商是美国的 Verisign 公司。

根域名及根服务器

由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.example.com被写成www.example.com.,即最后还会多出一个点。这个点就是根域名。

DNS 域名解析服务采用了类似目录树的层次结构来记录域名与 IP 地址之间的对应关系,从而形成了一个分布式的数据库系统
在这里插入图片描述

理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。

比如,要访问www.example.com,就必须先询问 ICANN 的根域名列表,它会告诉我.com域名由 Verisign 托管,必须去找 Verisign,它会告诉我example.com服务器在哪里。

DNS 根域名服务器

保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。

由于早期的 DNS 查询结果是一个512字节的 UDP 数据包。这个包最多可以容纳13个服务器的地址,因此就规定全世界有13个根域名服务器,编号从a.root-servers.net一直到m.root-servers.net。分布在世界各地,其管理单位、具体的地理位置,以及 IP 地址如表

名称管理单位地理位置IP 地址
AINTERNIC.NET美国弗吉尼亚州198.41.0.4
B美国信息科学研究所美国加利福尼亚州128.9.0.107
CPSINet 公司美国弗吉尼亚州192.33.4.12
D马里兰大学美国马里兰州128.8.10.90
E美国航空航天管理局美国加利福尼亚州192.203.230.10
F因特网软件联盟美国加利福尼亚州192.5.5.241
G美国国防部网络信息中心美国弗吉尼亚州192.112.36.4
H美国陆军研究所美国马里兰州128.63.2.53
IAutonomica 公司瑞典斯德哥尔摩192.36.148.17
JVeriSign 公司美国弗吉尼亚州192.58.128.30
KRIPE NCC英国伦敦193.0.14.129
LIANA美国弗吉尼亚州199.7.83.42
MWIDE Project日本东京202.12.27.33
  • 注:DNS服务器会保存根服务器的信息,Bind系统默认保存在/var/named/named.ca
[root@worker-03 ~]#  cat /var/named/named.ca 

; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;.                              IN      NS

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

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

;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE  rcvd: 811

美国军方控制的:

  • U.S. DOD Network Information Center(G根)
  • U.S. Army Research Lab(H根)

企业控制的:

  • Verisign (A根、J根)
  • Cogent Communications(C根)
  • Netnod(I根)

高校控制的:

  • USC(B根)
  • University of Maryland(D根)

政府组织控制的:

  • NASA Ames Research Center(E根)

其他组织控制的:

  • Internet Systems Consortium, Inc.(F根)
  • RIPE NCC(G根)
  • ICANN(L根)
  • 日本WIDE组织(K根)

这13台根域名服务器由12个组织独立运营。其中,Verisign 公司管理两台根域名服务器:A 和 J。每家公司为了保证根域名服务器的可用性,会部署多个节点,比如单单 Verisign 一家公司就部署了104台根域名服务器(2016年1月数据)。

所以,根域名服务器其实不止13台。据统计,截止2021年12月,全世界共有 1478 台根域名服务器。可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。

DNS根区

根域名列表的正式名称是 DNS 根区(DNS root zone),ICANN 官网可以查看这个根区文件

该文件保存所有顶级域名的托管信息,所以非常大,超过2MB。

举例来说,顶级域名.com可以查到13个域名服务器。

com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.

在这里插入图片描述

DNS查询

DNS 域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。

  • 递归查询,是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。
  • 迭代查询,DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果

在一般情况下,当用户向配置指定的 DNS 服务器发起对某个域名的查询请求(这里以www.cisco.com为例),其查询流程大致如图

在这里插入图片描述

Bind

BIND 9

现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早由伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Internet Systems Consortium)编写和维护。BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows),BIND服务的名称称之named。DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)。

Bind-chroot

BIND服务器通常从因特网可直接访问。只要有一个通过因特网可以直接访问的系统,安全就成了一个大问题。这些安全问题包括有人破坏了服务器上的数据(有时称为数据投毒)和黑客控制了暴露的服务器进程,允许被劫持的服务器未经授权访问其他系统文件。

named进程在处理传人的DN查询时与网连接起交互。任何时候,只要一个进程是通过网络可访问的,那么这个进程就有可能受到动击。在这种攻击中,远程系统上的用户控制本地服务器上的进程。一旦这个用户有了提制权,他们就可以访问本地系统,包括查看或修改文件。

当被劫持的进程是以非root身份运行时,虽然危害是有限的。但是,像/etc/passwd这样
的系统核心文件。系统上的每个用户,包括named用户,都能查看/etc/passwd文件的内容,因为每个用户都有这个文件的读取权限。

chroot jail的目的是限制对系统文件的访问。named进程被放入jail,在那里它只能看到和BIND相关的配置。这是通过将BIND的配置文件放到特定的子目录中并启动named进程实现,这样文件系统的根看起来就是前面提到的子目录(chroot代表 change root,就好像是更改这个进程的文件系统根路径)。

bind-chroot本质上是使用chroot方式给bind软件换了个“根”,这“根”在/var/named/chroot下,把yum安装的bind-chroot在/etc下的产生的配置文件硬链接到/var/named/chroot/etc下。配置起来就跟BIND9没什么区别。
yum查看bind-chroot的info

[root@worker-03 ~]# yum info bind-chroot
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.nju.edu.cn
 * centos-sclo-rh: mirrors.nju.edu.cn
 * centos-sclo-sclo: mirrors.nju.edu.cn
 * epel: mirror.sjtu.edu.cn
 * extras: mirrors.nju.edu.cn
 * updates: mirrors.nju.edu.cn
Installed Packages
Name        : bind-chroot
Arch        : x86_64
Epoch       : 32
Version     : 9.11.4
Release     : 26.P2.el7_9.8
Size        : 4.7 k
Repo        : installed
From repo   : updates
Summary     : A chroot runtime environment for the ISC BIND DNS server, named(8)
URL         : http://www.isc.org/products/BIND/
License     : MPLv2.0
Description : This package contains a tree of files which can be used as a
            : chroot(2) jail for the named(8) program from the BIND package.
            : Based on the code from Jan "Yenya" Kasprzak <kas@fi.muni.cz>

可以看到此安装包是为Bind安装包加了chroot 的jail。

Bind(Bind-chroot)安装

在CentOS 7下可以用yum直接安装

[root@worker-03 ~]# yum install bind-chroot
Loaded plugins: langpacks
base-openlogic                                                                                                                                                   | 3.1 kB  00:00:00     
extras-openlogic                                                                                                                                                 | 2.5 kB  00:00:00     
updates-openlogic                                                                                                                                                | 2.6 kB  00:00:00     
base                                                                                                                                                             | 3.6 kB  00:00:00     
extras                                                                                                                                                           | 2.9 kB  00:00:00     
openlogic                                                                                                                                                        | 2.9 kB  00:00:00     
updates                                                                                                                                                          | 2.9 kB  00:00:00     
updates-openlogic/7/x86_64/primary_db                                                                                                                            |  13 MB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package bind-chroot.x86_64 32:9.11.4-26.P2.el7_9.8 will be installed
--> Processing Dependency: bind(x86-64) = 32:9.11.4-26.P2.el7_9.8 for package: 32:bind-chroot-9.11.4-26.P2.el7_9.8.x86_64
--> Running transaction check
---> Package bind.x86_64 32:9.11.4-26.P2.el7_9.8 will be installed
--> Processing Dependency: python-ply for package: 32:bind-9.11.4-26.P2.el7_9.8.x86_64
--> Running transaction check
---> Package python-ply.noarch 0:3.4-11.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================================
 Package                                  Arch                                Version                                              Repository                                      Size
========================================================================================================================================================================================
Installing:
 bind-chroot                              x86_64                              32:9.11.4-26.P2.el7_9.8                              updates-openlogic                               93 k
Installing for dependencies:
 bind                                     x86_64                              32:9.11.4-26.P2.el7_9.8                              updates-openlogic                              2.3 M
 python-ply                               noarch                              3.4-11.el7                                           base-openlogic                                 123 k

Transaction Summary
========================================================================================================================================================================================
Install  1 Package (+2 Dependent packages)

Total download size: 2.5 M
Installed size: 5.9 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): bind-chroot-9.11.4-26.P2.el7_9.8.x86_64.rpm                                                                                                               |  93 kB  00:00:00     
(2/3): python-ply-3.4-11.el7.noarch.rpm                                                                                                                          | 123 kB  00:00:00     
(3/3): bind-9.11.4-26.P2.el7_9.8.x86_64.rpm                                                                                                                      | 2.3 MB  00:00:00     
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                   3.2 MB/s | 2.5 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : python-ply-3.4-11.el7.noarch                                                                                                                                         1/3 
  Installing : 32:bind-9.11.4-26.P2.el7_9.8.x86_64                                                                                                                                  2/3 
/var/tmp/rpm-tmp.Tw26pc: line 90:  2937 Done                    /bin/echo -e "$semanage_import"
      2938 Killed                  | /usr/sbin/semanage import -S "${_policytype}"
  Installing : 32:bind-chroot-9.11.4-26.P2.el7_9.8.x86_64                                                                                                                           3/3 
  Verifying  : 32:bind-9.11.4-26.P2.el7_9.8.x86_64                                                                                                                                  1/3 
  Verifying  : python-ply-3.4-11.el7.noarch                                                                                                                                         2/3 
  Verifying  : 32:bind-chroot-9.11.4-26.P2.el7_9.8.x86_64                                                                                                                           3/3 

Installed:
  bind-chroot.x86_64 32:9.11.4-26.P2.el7_9.8                                                                                                                                            

Dependency Installed:
  bind.x86_64 32:9.11.4-26.P2.el7_9.8                                                           python-ply.noarch 0:3.4-11.el7                                                          

Complete!

注意:

========================================================================================================================================================================================
 Package                                  Arch                                Version                                              Repository                                      Size
========================================================================================================================================================================================
Installing:
 bind-chroot                              x86_64                              32:9.11.4-26.P2.el7_9.8                              updates-openlogic                               93 k
Installing for dependencies:
 bind                                     x86_64                              32:9.11.4-26.P2.el7_9.8                              updates-openlogic                              2.3 M
 python-ply                               noarch                              3.4-11.el7                                           base-openlogic                                 123 k

Transaction Summary
========================================================================================================================================================================================
Install  1 Package (+2 Dependent packages)

安装了bind,bind-chroot和python-ply

启动服务:

systemctl start named

Bind配置

Bind的基础配置工作是配置主配置文件和区域文件,其关系如下:
在这里插入图片描述

主要配置文件named.conf

Bind服务器的主要配置文件/etc/named.conf,默认如下:

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

options {
        listen-on port 53 { 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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        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";
        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";
全局配置options
options {                # 全局配置段
        ...
};

options 的参数设置会影响整个 BIND9 DNS环境的配置,具体各部分常用到的配置参数如下:

  • listen-on: 用于配置监听的端口以及IPv4地址,默认的监听端口为:53;
  • listen-on-v6:用于监听 IPv6 地址以及端口;
  • directory: 用于指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/nemed
  • dump-file:选项用来设置域名缓存数据库文件的位置,可以自己定义。
    默认的存储文件为:cache_dump.db;
  • statistics-file:选项用来设置状态统计文件的位置,可以自己定义,默认/var/named/data/named_stats.txt;
  • memstatistics-file :选项用来设置服务器输出的内存使用统计信息。默认保存在 /var/named/data/named_mem_stats.txt;
  • allow-query:选项用来设置允许DNS查询的客户端地址,默认值为localhost, 可以设置为某个网段、任意地址、具体的某台主机三种情况。
    例如,要修改为任意地址,就在括号内的加入 any,也可以引用之前创建的 acl 内的所有地址;
  • recursion:用于设置递归查询,一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出查询请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。此选项有yes和no两个值。这个选项用于设置 Failover 非常有用;
    系统的解释如下:
  • 如果您正在构建一个权威性DNS服务器,不要启用递归。
  • 如果您正在构建一个递归(缓存)DNS服务器,您需要启用递归。
  • 如果您的递归DNS服务器有一个公网IP地址,您必须启用访问控制,以限制对您的合法用户的查询。 如果不这样做,将导致您的服务器成为大规模DNS放大攻击的一部分。 在您的网络中实现BCP38将大大减少此类攻击
  • dnssec-enable: 选项用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
  • dnssec-validation:选项用来设置是否启用DNSSEC确认,默认值为yes,可以选择 auto。
  • bindkeys-file : 用来设置内置信任的密钥文件,其默认值为 /etc/named.root.key;
  • managed-keys-directory: 选项用于指定目录中的文件存储位置,跟踪管理 DNSSEC 密钥;

未在默认named.conf中的重要参数:

  • forward:用于设置DNS转发的工作方式,有两种选择

  • forward first 设置优先使用forwarders DNS服务器做域名解析,如果查询不到再使用本地DNS服务器做域名解析。

  • forward only设置只使用forwarders DNS服务器做域名解析,如果查询不到则返回DNS客户端查询失败。

    options {
    forwarders { 8.8.8.8; 8.8.4.4; 233.5.5.5;233.6.6.6};
    };
    
  • forwarders:DNS转发器。
    用于设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址。可以设置 8.8.8.8 和 8.8.4.4 (谷歌的免费DNS服务器的网络地址);233.5.5.5 和 233.6.6.6 (阿里云的免费DNS地址)。
    当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发都设置的DNS转发器,由DNS转发器完成转发操作。因此这台转发器的缓存中就记录了丰富的域名信息。因此如果遇到非本域的查询,转发器的缓存就可以做到查询,从而减少了向外部的查询流量。
    在BIND8.2以后引入了一个新的特性:转发区(forward zone),它允许把DNS配置成只有查找特定域名的时候才使用转发器( BIND 9从9.1.0才开始有转发区功能 )
    例如,你可以使你的服务器将所有对 etaon.cn 结尾的域名查询都转发给 etaon.cn 的两台名字服务器:
    zone “etaon.cn” {
    type forward;
    forwarders { 3.203.8.8; 3.203.8.2; };
    };

  • rrset-order:
    在 BIND 9 提供的负载均衡策略建立在一个名称(域名 - Name)使用多个资源记录 ( Records ) 的情况下,其实现的轮询机制并不是传统的负载均衡服务器实现的轮询机制 - 即追踪和记录每一次应答的资源顺序;
    BIND 9 实现了一个类似 List 的数据结构,将所有的资源记录填入到 一个顺序表中,这个填入的次序随机,或者根据设定的参数随机;

格式:

[class class_name] [type type_name] [name “domain_name”] order ordering

如果参数没有被赋值,那么默认的赋值为: class: ANY type: ANY Name: *
参数:

  • fixed : 根据 zone 文件定义资源记录的顺序按照顺序逐个进行解析;
  • random: 根据 zone 文件资源记录随机返回解析记录;
  • cyclic: 创建一个循环,循环输出资源记录;
  • none: 完全随机的资源返回形式;
logging

logging 部分的配置为DNS解析服务器提供了日志记录的功能,DNS服务器上的所有日志记录被存储到了指定的文件中。其通用的配置文件为:

logging {
      category <string> { <channel_name_string>; ... };
      channel <string> {
              buffered <boolean>;
              file <quoted_string> [ versions ( unlimited | <integer> ) ]
                  [ size <size> ] [ suffix ( increment | timestamp ) ];
              null;
              print-category <boolean>;
              print-severity <boolean>;
              print-time ( iso8601 | iso8601-utc | local | <boolean> );
              severity <log_severity>;
              stderr;
              syslog [ <syslog_facility> ];
      };
};

从上边的通用配置格式可以看出来,logging 模块分为两个部分,categorychannel。category 用来区分不同的事件产生的类别或者场景,比如:客户端请求-client request、配置文件解析处理-Configuration file parsing and processing
channel的作用是指定输出的方式、日志格式的选项和事件的严重性,每一个channel 可以指定一个 category 来指定记录的事件类型。

默认named.conf

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

file: 将日志输出流通过通道直接输出给文件

severity:用来承担定义日志严重级别的定义角色,相当于 syslog - priorities
比如说定义了日志的严重级别为 Debug,那么会输出日志事件 Debug 以上的错误到文件中。
一般常用的严重等级: debug[level]noticewarningdynamic

Zone 的引导配置
zone "." IN {
        type hint;
        file "named.ca";
};

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

常用的参数配置如下:

  • file :用于指出域名与IP地址解析的数据库配置区域文件;
  • allow-transfer: 这个地方的配置是用来给出 Failover 或者递归查询DNS服务器的IP地址,如果之前在 options 里配置的allow-transfer如果设置成了参数 yes, 那么需要在这里指出递归查询服务器的IP地址;
  • type: 用于指定当前DNS解析服务器的位置,有三个选项
  • master:表示定义的是主域名服务器
  • slave :表示定义的是辅助域名服务器
  • hint:表示是互联网中根域名服务器

在默认里指定了根域”.”使用named.ca文件,在此文件中已经记录了13个根域服务器地址。

另外使用了/etc/named.rfc1912.zones:

// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

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

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

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

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

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

~

/etc/named.rfc1912.zones的内容格式和named.conf中zone引导配置一致,用于不同域的配置并指定区域文件。如果不用/etc/named.rfc1912.zones,也可以直接在named.conf中写zone引导。

我们可以看到整个基础配置的配置链:
在这里插入图片描述
其中,/var/named/named.ca由系统提供,我们需要配置主配置文件和其他区域文件。

区域文件Zone File

区域文件用于记录主机名到IP地址的转换以及该域的其他信息,使用Bind的标准安装,区域文件会存放在/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
~
规则
  • 注释以分号(;)开始,直到行尾结束。
  • 每一行就是一条记录,大多数情况下,一行的结束就是一条记录的结束。在某些情况下,一条记录可以跨多行(如SOA)。
  • 每条记录是由空格或制表符tab分隔的字段组成,这些字段定义了名称生存时间、记录类别、记录类型和记录数据。
  • @符号在区域文件里有特殊含义,它代表当前来源,就是指当前域。
    因此,在 etaon.com域的正向查找区域文件中,@符号的意思是 etaon.com.(注意结尾的那个点,在区域文件中是必需的)。
    通过使用$ORIGIN设置可以修改@字符的含义(例如,$ORIGIN example.com.即把@改成example.com.)。
  • 每个区域文件都应该以$TTL开始,用于设置默认的生存时间(TTL)。
字段说明
name(名称)与此记录关联的域名
ttl记录的生存时间。这也是缓存名称服务器(或像浏览器这样的客户端程序)判断该记录有效的最大时间。这个时间到期后,客户端会从本地缓存中丢弃该记录。注意这个字段可以省略,如果在记录中省略了,则使用区域文件的默认TTL值,该值由$TTL指令定义(例如,$TTL 1D)
record class(记录类别)这是一个预定义值,通常设为IN(表示Internet)。虽然还有一些可用的类别,但通常都使用IN这个类别
record type(记录类型)记录的类型
record data(记录数据)记录的数据随记录的类型的不同而不同。可以是单个值,也可以是值的集合,这取决于记录类型

注意:无论何时在区域文件中使用FQDN,结尾的点(.)字符很重要。相对域名不需要结尾的点字符,因为相对域名会追加上$ORIGIN的值。

常见区域记录类型

SOA记录

SOA(Start of Authority)记录类型用于定义域的权威信息(可以将其视为域的操作说明)。如

;默认的named.localhost的SOA
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

圆括号()允许将数据分散到多行,并为每个数据值提供注释。
虽然这是为了方便阅读,但不是必需的。也可以使用单行格式的记录:

@ IN SOA  ns.etaon.com.  root.etaon.com. 0 1D 1H 1W 3H

在name字段中,提供整个域的名称。

  • @字符表示当前城名,它由/etc/named.conf文件中的区域条目决定。
    通常,如果ttl字段被省略了则使用区域文件的默认值。
  • 记录类别通常使用IN
  • 记录类型为SOA。
  • 记录的数据字段包含7个值

- 名称服务器:主名称服务器的域名。例如,ns.etaon.com

- 本域的DNS管理员的电子邮件地址:这里不是使用@来分隔用户名和域名,而是使用 “.”字符。例如,root.etaon.com,相当于root@etaon.com

- 序号:如果有从服务器,这个数字很重要,因为这个值用于确定是否应该启动区域传输。从服务器会定期查询主服务器,以确定此序号是否有更新。
例如,假设当前序号为100,并在主服务器上修改了区域文件,那么执行修改的管理员应该将此序号的值至少增加1(例如101)。然后从服务器才能知道区域文件有了更改,并通过一个名为区域传输的过程向主服务器获取这些更改。
序号的值限制为最多10位数。这样可以使用这么一种格式,这种格式总是递增的。
同时,序号又可以表示区域文件的最后修改时间,这种格式是:YEARmonthDAYrev。
YEAR是4位数字的年份,month是2位数字的月份,DAY是2位数字的天数,而rev是文件在当天的版本号。
例如,区域文件在2017年1月31号的第一次修改,序号可能是2017013100,这种格式允许每天最多更新区域文件100次,直到9999年12月31日。

-刷新频率:从服务器多久查询一次主服务器,以判断序号是否变更。这就是刷新频率的用途。通常,默认1D表示从服务器每隔24小时向主服务器发起一次查询。但在区域文件变更很频繁的域中,可以使用如1H或6H的值,让从服务器每隔1小时或6小时就查询一次

- 重试间隔:这个值是从服务器再次向主服务器发起查询的等待时间。例如,假如刷新频率设置为1D,当从服务器向主服务查询更新时,若主服务器没有响应,就会使用重试间隔。1H会使从
服务器等待1小时,然后才会再次向主服务器发起查询请求

- 过期时间:如果主服务器一直不能访问,过期时间用来指定从服务器何时不再响应DNS客户端的查询请求。主服务器这么长时间都没有响应,DNS条目可能不再有效。过期时间通常设置为1周或2周

- 最小值:最小值用于设定否定的DNS响应的缓存时间。如果域更新频繁,可设置小一些的值(也许是1小时或更小),如果域很少更新,可以设置大一些的值(但可能不会大于1天)

A记录

A记录(也称为地址记录)用于定义域名到IP地址的转换,典型示例如下所示:

www   IN   A   138.29.16.101

第一个字段是域名(例如www),此例中,域是相对形式,相对于$ORIGIN定义的默认域,当然也可以用完整域名形式:

www.etaon.com. IN  A  138.29.16.101

A表示这行是一条A记录,138.29.16.101是域名www.etaon.com.所关联 的IP地址。
注意,A记录仅存在于正向查找区域文件中。

别名记录cname
在某些情况下,域中的一台主机不止一个角色,因此应该使用多个域名来访问。
例如,etaon.com域中的Web服务器通常也是FTP服务器,因此,这一个主机既可以使用www.etaon.com访问,也可以使用ftp.etaon.com访问。
但是,每个IP址应该只有一条A记录。因此,为了要把多个域名转换为同一个IP地址,使用别名记录。
别名记录(也称为cname)像是一个昵称,通常就像下面所示的第二条记录:

www.etaon.com.   IN   A   138.29.16.101
ftp   IN   CNAME   www

像这样的条目,域名ftp.etaon.com会被转换为域名 www.etaon. com,后者又进一步被转换为IP地址138.29.16.101。

NS记录

每个域可以有一个或多个名称服务器,这些可以由NS记录(也称为域名服务器记录)定义。
首选(或主)名称服务器在SOA记录中指定,但还是需要一条NS记录。此外,还需要用NS记录定义其他(辅助或从)名称服务器。
要定义名称服务器,如下所示:

 @   IN   NS   ns.sample.com.
     IN   NS   ns2.sample.com.

所有的名称服务器都需要有相应的NS记录,即使是主名称服务器也要有相应的NS记录。
NS记录的数据是域名的形式,不是IP地址,因此需要为每个域名服务器创建一条A记录,这一点很重要。
注意,NS示例中的@字符可能已经被彻底移除了。如果省略了第一个字段,则假定它是$ORIGIN的值。

邮件交换记录

假设要给info@etaon.com发送一封电子邮件,发送域的MTA(Mai Tamea Agent,邮件传输代理)需要知道 onecoursesource.com域中哪台主机负责处理电子邮件,MTA通过向域名服务器查询邮件交换(MX)记录来获得这个信息。

域的MX记录通常如下所示:

@   IN   MX   10  mail1.etaon.com
@   IN   MX   20  mai12.etaon.com

10和20这些数字代表优先级,数字越小,优先级越大。
如果一台邮件服务器的优先级是10,另一台是20,邮件发送域的MTA会先尝试把邮件发送给优先级是10的服务器,如果这台服务器没有响应,则会发送给优先级为20的服务器。可能永远不会使用到第二台邮件服务器,因为大多数邮件服务器都是7*24可用的。
更常见的是为每台邮件服务器设置相同的优先级,以达到负载均衡的效果。在这种情况下,邮件服务器的利用率大致相同(“大致”是因为缓存DNS服务器会使负载稍微失衡)。
只有一个MX记录的情况也很常见,因为许多中小型公司不需要多个邮件服务器来处理传入的电子邮件。

指针记录

前面描述的A记录用于正向查找区域文件中把域名转换为IP地址,指针(PTR)记录则用于反向查找区域文件中把IP地址转换为域名。
下面是典型的PTR记录的示例:

101.16.29.138.in-addr.arpa.   IN  PTR  www.etaon.com.

重要:PTR记录中的IP地址格式是实际IP地址的逆序形式再加上in-addr.arpa.

例如,101.16.29.138.in-addr.arpa.表示IP地址是138.29.16.101
在大多数情况下,不需要指定完整的IP地址,因为$ORIGIN被设置为当前的反向查找网络域(例如,16.29.138.in-addr)。如果是这样,只需提供IP地址中的主机地址:

101 IN PTR www.etaon.com.

LAB

实验拓扑

在这里插入图片描述
$ORIGIN linuxdns.com

配置链

在这里插入图片描述

配置主配置文件named.conf

//   /etc/named.conf 
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        `allow-query     { any; };`

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        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";
        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";

配置/etc/named.rfc1912.zones

// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

zone "linuxdns.com" IN {
        type master;
        file "linuxdns.com.zone";
        allow-update { none; };
};
zone "21.16.172.in-addr.arpa" IN {
        type master;
        file "172.16.21.arpa";
};

配置/var/named/linuxdns.com.zone

$TTL 1D
@       IN SOA   ns.linuxdns.com. root.linuxdns.com (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

; Nameservers:
               IN      NS      ns1.linuxdns.com.

; Address records:
mysql          IN      A       172.16.21.9
ns1            IN      A       172.16.21.13

配置/var/named/172.16.21.arpa

采用简单写法

$TTL 1D
@       IN SOA  ns.linuxdns.com. root.linuxdns.com (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

; Nameservers:
@    IN      NS      ns1.linuxdns.com.

; Address records:
13   IN      PTR     ns1
9    IN      PTR     mysql

重启服务:

systemctl restart named-chroot

测试

在MySQL.linuxdns.com上查询

linuxdns.com :

[root@Alma ~]# nslookup ns1.linuxdns.com
Server:         172.16.21.13
Address:        172.16.21.13#53

Name:   ns1.linuxdns.com
Address: 172.16.21.13

[root@Alma ~]# nslookup mysql.linuxdns.com
Server:         172.16.21.13
Address:        172.16.21.13#53

Name:   mysql.linuxdns.com
Address: 172.16.21.9

Internet :

[root@Alma ~]# nslookup www.topgoer.com
Server:         172.16.21.13
Address:        172.16.21.13#53

Non-authoritative answer:
Name:   www.topgoer.com
Address: 122.114.11.160

Tcpdump该查询的过程

02:50:34.392509 IP 172.16.21.9.49358 > ns1.domain: 11953+ A? www.topgoer.com. (33)
02:50:34.394149 IP ns1.41109 > 192.52.178.30.domain: 44424 [1au] A? www.topgoer.com. (44)
02:50:34.570135 IP 192.52.178.30.domain > ns1.41109: 44424- 0/6/23 (1017)
02:50:34.570967 IP ns1.9483 > 106.11.141.115.domain: 53380 [1au] A? www.topgoer.com. (44)
02:50:34.612167 IP 106.11.141.115.domain > ns1.9483: 53380*- 1/0/1 A 122.114.11.160 (60)
02:50:34.613586 IP ns1.51026 > l.gtld-servers.net.domain: 15348 [1au] DS? topgoer.com. (40)
02:50:34.787232 IP l.gtld-servers.net.domain > ns1.51026: 15348*- 0/6/1 (857)
02:50:34.788002 IP ns1.domain > 172.16.21.9.49358: 11953 1/2/22 A 122.114.11.160 (473)

第一步,向顶级com.ns服务器发起请求。其中,192.52.178.30为com.的顶级ns服务器k.gtld-servers.net. 位于东京,是离本地最近的。

[root@Alma ~]# nslookup 192.52.178.30
30.178.52.192.in-addr.arpa      name = k.gtld-servers.net.

Authoritative answers can be found from:
178.52.192.in-addr.arpa nameserver = a3.verisigndns.com.
178.52.192.in-addr.arpa nameserver = a2.verisigndns.com.
178.52.192.in-addr.arpa nameserver = a1.verisigndns.com.

第二步,拿到顶级服务器的信息后,查询topgoer.com,指向了106.11.141.115。只能查询到该地址是一个阿里云的IP地址。该服务器直接回答查询的A 记录为122.114.11.160

第三步,本地dns服务器再次询问l.gtld-servers.net.-位于美国弗吉尼亚州的ICANN,得到同样的A记录

第四步,本地dns服务器将A记录返回客户端172.16.21.9。

附:一些术语

  • 主机:主机通常是连接到网络的一台计算机(台式计算机、笔记本计算机、平板计算机或手机),另一种看法是主机就是可以进行通信的设备。
  • 域名:因特网上的主机使用IP地址相互寻址。人们很难记住这些数字,因此会为主机分配一个唯一的名称,当这个名称在一个授权DNS服务器上注册后,名称就被视为“域名”。
  • 顶级域名:域名在结构上以树状形式呈现,就像文件在虚拟文件系统结构中一段,DNS结构的最顶层简单地称为“点”,并用“.”来表示。直接位于“”下面的发是顶级域。最初的顶级域名有.com、.org、.net、.int、.edu、.gov和.mil,近年来还增加了许多其他的顶级域。
  • FQDN:完全限定域名(Fully Qualified Domain Name,FQDN)是指从DNS结构顶部开始的主机域名。例如,“www.etaon.com.”就是一个FQDN,注意FQDN最后结尾的“.”符号,它是顶级以上的域名。当用户提供域名时,通常会省略此字符,因为大多数情况下,“.”符号被认为是FQDN的最后一个字符。但是,如果要管理DNS服务器,则应该习惯于加上“.”符号,因为在某些DNS
    务器配置文件中将需要它。
  • 子域:子域是较大域的组成部分,例如,假设你想用3个域来按照功能分类管理公司的主机,可以将这些域称为sales、eng和support。如果公司的域名是“etaon.com.”,则这3个子域的名称分别是“sales.etaon.com.””eng.etaon.com.”和“support.etaon.com.”。
  • 名称服务器:名称服务器是响应DNS客户端请求的系统。名称服务器提供从IP地址到域名的转换(有时是相反的,即域名到IP地址的转换)。请注意,名称服务器要么在本地存储有此信息的副本(称为区域文件),要么是将从其他名称服务器获取的信息临时存储在内存中,抑或将查询请求转发给具有该信息的其他服务器。
  • 权威名称服务器:权威名称服务器是根据系统本地存储的信息(原始主记录)返目结果的服务器。
  • 区域文件:用来存储IP地址到域名转换信息(即DNS记录)的文件的名称。此文件还包含用来定义域自身所需的信息。
  • 记录:在区域文件中,记录是为区域定义单个信息块的一个条目,例如将一个地址转换为域名的数据。
  • 缓存名称服务器:缓存名称服务器是基于从另一个名称服务器(如权威名称服务器)获得的信息返回结果的服务器。缓存名称服务器的主要优点是它可以加速IP地址到域名的解析,因为它会把查询结果缓存起来,并能够直接使用此缓存中的信息响应后续的请求。
  • TTL:存储在缓存名称服务器中的数据通常不会永久存储。提供数据的名称服务器还为缓存名称服务器提供了该数据的TTL值,又叫作生存时间(Time To Live)。
    缓存名称服务器将信息存储在内存中直到TTL周期结束。通常这段时间是24小时,但这取决于权威名称服务器中的记录更新的频率。
  • DNS转发器:一种DNS服务器,用于从内部网络接收DNS查询并将其发送到外部DNS服务器。
  • 正向查找:把域名转换为IP地址的过程,大多数DNS服务器都提供这种功能。
  • 反向查找:把IP地址转换为域名的过程,虽然许多DNS服务器提供此功能,但它不如正向查找常见。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值