DNS 服务

域名系统

域名系统(DNS,Domain Name System)的主要作用是将计算机主机名转换为 IP 地址。

完整主机名(FQDN,Fully Qualified Domain Name)由主机名与域名(Hostname and Domain Name)组成。例如,FQDN 为 www.hxz.ass 的域名为 hxz.ass。

在 DNS 数据库中,针对每个要解析的域(domain)称为一个区域(zone)。每个 DNS 服务器必备称为 hint 的区域,记录根服务器地址。

域名系统利用类似树状目录结构,将主机名的管理分配在不同层级的 DNS 服务器中,并进行分层管理。最顶层的 DNS 服务器叫根服务器(root),最早管理的只有 com、edu、gov、mil、org、net 这种特殊区域以及以国家为分类的第二层的主机名,这两者称为顶级域名(TLDs,Top Level Domains)。

DNS 采用分层查询流程的好处是:

  • 当主机名有修改时,只需要改动上一层 DNS 服务器记录,维护简单。
  • DNS 服务器可以将主机名解析结果缓存起来,下次查询能快速响应。
  • 可持续向下授权(子域名授权),也就是可以设置任意多级域名。

DNS 服务器使用的监听端口为 53,DNS 查询同时使用 UDP 和 TCP 数据包。

域名注册

申请合法的主机名需要进行注册,注册后可以获得两种类型的数据:

  • 一种是域名托管。设置 FQDN 对应的 A 记录,由上层 DNS 服务器来解析主机名。
  • 一种是申请区域查询权。在自己搭建的 DNS 服务器中编写 NS 记录,通过自己的 DNS 服务器来解析主机名。

域名查询流程

以向 DNS 服务器 8.8.8.8 查询域名 www.abc.edu.cn 为例,整个流程如下:

  1. 首先查询本地 /etc/hosts 文件中是否有记录,如果没有,则向 /etc/resolv.conf 中配置的 DNS 服务器 8.8.8.8 发起查询(查询顺序由 /etc/nsswitch.conf 文件配置);
  2. DNS 服务器 8.8.8.8 收到查询请求后发现没有相应的记录,会向最顶层服务器(即根服务器)查询域名;
  3. 根服务器中记录了顶级域名 .cn 服务器的地址,并将其返回给 8.8.8.8;
  4. 顶级域名 .cn 服务器回复二级域名 .edu.cn 服务器的地址给 8.8.8.8;
  5. 二级域名 .edu.cn 服务器发送 .abc.edu.cn 对应的 IP 地址给 8.8.8.8;
  6. 最后通过访问 .abc.edu.cn 服务器的 IP 地址,获得其对应的 www 服务的 IP 地址;
  7. DNS 服务器 8.8.8.8 将查询结果返回给客户端,并在自己的缓存中记录下来(一般有效时间为 24 小时)。

可以使用 digtrace 命令观察这个过程:

[root@server2 ~]$ dig +trace mail.dlut.edu.cn

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> +trace mail.dlut.edu.cn
;; global options: +cmd
.                       25330   IN      NS      m.root-servers.net.
.                       25330   IN      NS      c.root-servers.net.
.                       25330   IN      NS      a.root-servers.net.
;; Received 267 bytes from 222.246.129.80#53(222.246.129.80) in 4 ms

cn.                     172800  IN      NS      e.dns.cn.
cn.                     172800  IN      NS      f.dns.cn.
cn.                     172800  IN      NS      ns.cernet.net.
cn.                     86400   IN      DS      57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn.                     86400   IN      RRSIG   DS 8 1 86400 20211025050000 20211012040000 14748 . H7PWSfaMnU5bqTVD4anI0Gkagqbpu3jXuVX6wiGfaBpMYAU06BlzVDSk TcGqHd5qSfztQrT0ztQnWno12NhCfFzOyf64hv54quKOYWss8ilQnmgX AftgAZYD8V/v/cAbo2EKoCwLD8KAWoiUN9VGQpcLeVpb/O4mQ1xMbRbr ENxir09m6iYn+F9Y3MCTekj79c1RWKJ8Qqn+nJlj+bES2OvDNuEmSHlZ 4D/NSqz4WMI3IaaCk/WaKf6NzZHvazs8NsDVXDnqgND3opj6g0B3fQMC NVbtLO/M+FyuYNXmuk/VOettllpYUAOYaSdPZLxmqWXyTgiVbNXTH74S 1cRveA==
;; Received 707 bytes from 2001:500:2f::f#53(f.root-servers.net) in 23 ms

mail.dlut.edu.cn.       59602   IN      A       202.118.66.82
;; Received 106 bytes from 203.119.26.1#53(b.dns.cn) in 4 ms

域名查询命令

域名查询命令由 bind-utils 包提供,需要使用 yum 安装:

[root@server2 ~]$ yum install -y bind-utils

host

使用 host 命令进行正向查询。例如,查询 163.com 的 IP 地址:

[root@server2 ~]$ host 163.com
163.com has address 123.58.180.7
163.com has address 123.58.180.8
163.com mail is handled by 10 163mx02.mxmail.netease.com.

使用 -a 参数可以获取更详细的查询信息:

[root@server2 ~]$ host -a douban.com
Trying "douban.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61546
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;douban.com.                    IN      ANY

;; ANSWER SECTION:
douban.com.             180     IN      A       81.70.124.99
douban.com.             180     IN      A       140.143.177.206
douban.com.             180     IN      A       49.233.242.15

Received 76 bytes from 240e:50:5000::80#53 in 8 ms

nslookup

nslookup 命令可用于正向和反向查询,正向查询结果与 host 命令基本一致:

^C[root@server2 ~]$ nslookup 163.com
Server:         222.246.129.80
Address:        222.246.129.80#53

Non-authoritative answer:
Name:   163.com
Address: 123.58.180.7
Name:   163.com
Address: 123.58.180.8

dig

dig 命令综合了上述两个命令的功能,主要参数包括:

参数 说明
+trace 从根服务器开始追踪。
-t type 查询的数据类型,如 MX、NS、SOA 等。
-x 进行反向解析。

例如,使用默认参数查询 linux.org

[root@server2 ~]$ dig linux.org

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> linux.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30344
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;linux.org.                     IN      A

;; ANSWER SECTION:
linux.org.              300     IN      A       104.21.48.239
linux.org.              300     IN      A       172.67.157.1

;; Query time: 338 msec
;; SERVER: 222.246.129.80#53(222.246.129.80)
;; WHEN: Wed Oct 13 03:21:51 CST 2021
;; MSG SIZE  rcvd: 70

查询结果中的重要部分如下:

  • QUESTION:显示所查询的内容。
  • ANSWER:显示查询结果,数字 300 表示查询结果的缓存时间。
  • AUTHORITY:显示查询结果来源的 DNS 服务器。

whois

whois 用于查询域名所有者的信息:

[root@server2 ~]$ whois 163.com
   Domain Name: 163.COM
   Registry Domain ID: 473619_DOMAIN_COM-VRSN
   Registrar WHOIS Server: whois.markmonitor.com
   Registrar URL: http://www.markmonitor.com
   Updated Date: 2019-01-25T07:56:57Z

正解文件记录

从主机名查询到 IP 的流程称为正向解析,正解文件资源记录(RR,Resource Record)格式如下:

[domain] [ttl] IN [[RR type] [RR data]]

字段说明:

  • domain:域名记录使用 FQDN,也就是在主机名末尾加上小数点。例如 www.abc.com.
  • ttl:暂存时间(time to live),单位为秒。指其他 DNS 服务器缓存此笔记录的时间。
  • IN:固定关键词。
  • RR type:资源类型,如 A 或 NS。
  • RR data:资源内容,如 IP 地址或 NS 域名。

资源类型有下面几种:

  • A(Address)记录:记录对应 IPv4 地址。

    [root@server3 ~]$ dig -t a douban.com
    douban.com.             300     IN      A       81.70.124.99
  • AAAA 记录:记录对应 IPv6 地址。

  • NS(NameServer)记录:查询管理区域名(Zone)的服务器主机名。

    [root@server3 ~]$ dig -t ns douban.com
    douban.com.             59880   IN      NS      ns3.dnsv4.com.
  • SOA(Start Of Authority):开始验证的标志。

    [root@server3 ~]$ dig -t soa douban.com
    douban.com.             180     IN      SOA     ns3.dnsv4.com. enterprise2dnsadmin.dnspod.com. 1629873707 3600 180 1209600 180

    SOA 后面会接七个参数,按顺序分别表示:

    • 主 DNS 服务器主机名。
    • 管理员的 Email 地址。第一个点需要替换成 @ 才是实际地址。
    • 序号(Serial),代表数据库文件的版本,序号越大表示越新。
    • 更新频率(Refresh),单位为秒,需大于 2 * Retry 时间。指从服务器向主服务器检查更新的频率。
    • 失败重试时间(Retry),单位为秒。指从服务器连不上主服务器时,重试等待时间。
    • 失效时间(Expire),单位为秒,需大于 Refresh+Retry 或七天以上时间。指失败尝试总时长到这一值后停止重试。
    • 缓存时间(Minimum TTL),单位为秒。当没有设置 TTL 时,用此值代替。
  • MX(Mail eXchanger)记录:邮件服务器主机名字。

    [root@server3 ~]$ dig -t mx dlut.edu.cn 
    dlut.edu.cn.            74898   IN      MX      20 mx2.dlut.edu.cn.

    邮件服务器前面的数字代表优先级,有多台邮件服务器情况下数字越小优先级越高。

  • CNAME(Alias)记录:主机名的别名。

    [root@server3 ~]$ dig www.douban.com
    www.douban.com.         2       IN      CNAME   forward.douban.com.

    常用于单 IP 地址对应多个域名情况下,可以将域名指向别名,而别名指向目标 IP。这样当更换服务器 IP 地址时,只需要更新别名与 IP 地址对应的记录,这样可以简化管理过程并提高效率。

反解文件记录

从 IP 反解析到主机名的流程称为反解,需要直属上层 ISP 授权。使用 nslookup 进行反解查询:

[root@server2 ~]$ nslookup 123.58.180.7
7.180.58.123.in-addr.arpa.       name = 163.com.

Authoritative answers can be found from:

由于 IP 从左到右解析与域名相反,因此反解的 Zone 必须将 IP 反过来写,并在结尾加上 .in-addr.arpa. 字样。

反解区最主要的类型是 PTR(PoinTeR)记录,即查询 IP 对应的主机名。

客户端设置

客户端和 DNS 相关的配置文件主要有三个:

  • /etc/hosts:本地文件,用于设置主机名与 IP 对应关系。
  • /etc/resolv.conf:记录 DNS 服务器 IP 地址。会被 DHCP 服务器更新,可以在网卡配置文件中加入 PEERDNS=no 来禁止更新。
  • /etc/nsswitch.conf:决定 DNS 查询顺序,优先进行本地解析还是 DNS 服务器解析。

/etc/hosts 的设置格式如下,每行一个主机名和 IP 对应关系:

[root@server2 ~]$ cat /etc/hosts
207.97.227.243 www.github.com 
192.168.2.234  server1 smblinux

/etc/resolv.conf 的设置格式如下,可以设置多个 DNS 地址,一般不超过 3 个:

[root@server2 ~]$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 222.246.129.80

/etc/nsswitch.conf 的设置选项如下,files 代表本地解析,dns 代表网络 DNS 服务器解析:

[root@server2 ~]$ cat /etc/nsswitch.conf
hosts:      files dns myhostname

主从构架

为了确保 DNS 服务的持续可用性,通常会采用主从架构(Master/Slave)来搭建 DNS 服务器。

在主服务器(Master)中,所有与主机名相关的信息都需要手动进行配置,而从服务器(Slave)则直接从主服务器中拉取配置进行同步。

主从服务器之间的数据同步是基于数据库版本号进行的。每当主服务器更新数据时,数据库版本号会增加,主服务器会主动通知从服务器进行数据库更新。从服务器会定期检查主服务器的数据库版本,并根据需要进行更新。

DNS 服务器安装

搭建 DNS 服务器所需的软件名为 BIND(Berkeley Internet Name Domain)。可以使用 yum 安装:

[root@server2 ~]$ yum install -y bind

与服务器设置相关的文件和目录有:

  • /etc/named.conf:主配置文件。
  • /etc/sysconfig/named:用于控制 chroot 和其他额外参数的启动文件。
  • /var/named/:默认的数据库存放目录。
  • /var/run/named/:named 程序存放 pid 文件的目录。

缓存 DNS 服务器

最简单的高速缓存(Cache-Only)DNS 服务器只需要一个根目录的区域文件,它只具备缓存搜索结果的功能。甚至连根目录的指向也可以不需要,在上层 DNS 服务器进行转发。

配置文件 /etc/named.conf 的内容如下:

[root@server2 ~]$ vi /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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

        recursion yes;
        forward only;
        forwarders {
                222.246.129.80;
                8.8.8.8;
        };
};

配置文件选项说明如下:

  • listen-on port 53 { any; }; 设置本机监听使用的网口,可以设置多个端口。

  • directory “/var/named”; 设置正解和反解的区域文件存放目录。

  • dump-file, statistics-file, memstatistics-file 与 named 服务有关的统计信息文件路径。

  • allow-query { any; }; 设置可以使用 DNS 查询的客户端列表。

  • forward only; 设置 DNS 服务器仅进行转发,忽略区域文件设置。

  • forwarders {222.246.129.80; 8.8.8.8;}; 设置转发到的上层 DNS 服务器地址。

启动 named 服务:

[root@server2 ~]$ systemctl enable --now named
[root@server2 ~]$ netstat -ntulp |grep named
tcp        0      0 10.1.1.1:53             0.0.0.0:*           LISTEN      43486/named   
tcp        0      0 192.168.2.254:53        0.0.0.0:*           LISTEN      43486/named   
tcp        0      0 127.0.0.1:53            0.0.0.0:*           LISTEN      43486/named   
tcp        0      0 127.0.0.1:953           0.0.0.0:*           LISTEN      43486/named 

其中,953 端口是 named 的远程控制功能,称为远程名称解析服务控制功能(RNDC,Remote Name Daemon Control)。

查看 named 相关日志:

[root@server2 ~]$ tail -30 /var/log/messages | grep named
Oct 13 05:20:42 server2 named[43486]: configuring command channel from '/etc/rndc.key'
Oct 13 05:20:42 server2 named[43486]: command channel listening on 127.0.0.1#953
Oct 13 05:20:42 server2 named[43486]: configuring command channel from '/etc/rndc.key'
Oct 13 05:20:42 server2 named[43486]: command channel listening on ::1#953
Oct 13 05:20:42 server2 named[43486]: managed-keys-zone: loaded serial 0
Oct 13 05:20:42 server2 named[43486]: all zones loaded
Oct 13 05:20:42 server2 named[43486]: running

用客户端进行测试,使用 dig 指定 DNS 服务器为 192.168.2.254:

[root@server3 ~]$ dig 163.com @192.168.2.254
;; SERVER: 192.168.2.254#53(192.168.2.254)

结果显示通过 192.168.2.254 服务器解析成功,表示已经成功配置。

配置 DNS 主服务器

假设要搭建 DNS 服务器,域名规划为 hxz.ass,搭配 IP 网段为 192.168.2.0/24,需要设置的配置文件有以下几个:

  • /etc/named.conf: 主要配置文件.
  • /var/named/named.hxz.ass: 主要的区域正解文件.
  • /var/named/named.192.168.2: 主要的区域反解文件.
  • /var/named/named.ca: 由 bind 软件提供的.正解文件.

整个 DNS 测试环境规划如下:

系统与 IP 主机名与 RR 类型 说明
Linux (192.168.2.254) master.hxz.ass (NS, A)
www.hxz.ass (A)
ftp.hxz.ass (CNAME)
www.hxz.ass (MX)
DNS 设置使用 master.hxz.ass
主要名称为 www.hxz.ass
其他都是 CNAME
Linux (192.168.2.234) slave.hxz.ass (NS, A)
client.hxz.ass (A)
作为 DNS 从服务器
Win10 (192.168.2.101) win.hxz.ass (A) 工作站主机
Linux (10.1.1.2) 测试使用的客户端

主要配置文件

主要配置文件 /etc/named.conf 内容如下:

[root@server2 ~]$ vi /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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

        recursion yes;
        allow-transfer  { none; };
};

zone "." IN {
        type hint;
        file "named.ca";
};
zone "hxz.ass" IN {
        type master;
        file "named.hxz.ass";
};
zone "2.168.192.in-addr.arpa" IN {
        type master;
        file "named.192.168.2";
};

其中 allow-transfer 设置是否允许来自从 DNS 服务器对整个领域数据进行传送。

正解文件配置

正解文件设置数据行首前不可有空格符,正解配置文件 /var/named/named.hxz.ass 内容如下:

[root@server2 ~]$ vi /var/named/named.hxz.ass
$TTL    600
@               IN      SOA     master.hxz.ass. ad.www.hxz.ass(2020010101 3H 15M 1W 1D)
@               IN      NS      master.hxz.ass.
master.hxz.ass. IN      A       192.168.2.254
@               IN      MX  10  www.hxz.ass.
 
www.hxz.ass.    IN      A       192.168.2.254
ftp.hxz.ass.    IN      CNAME   www.hxz.ass.
 
slave.hxz.ass.  IN      A       192.168.2.234
client.hxz.ass. IN      A       192.168.2.234
win.hxz.ass.    IN      A       192.168.2.101

其中 @ 符号代表主配置文件中 zone 的意思。例如,正解中的 @ 代表 hxz.ass。反解中的 @ 代表 2.168.192.in-addr.arpa

开头的 $TTL 是将 TTL 设置应用到每笔 RR 记录中。

反解文件配置

反解文件仅需设置 PTR 记录,反解配置文件 /var/named/named.192.168.2 内容如下:

[root@server2 ~]$ vi /var/named/named.192.168.2
$TTL    600
@       IN      SOA     master.hxz.ass. ad.www.hxz.ass.(2020010101 3H 15M 1W 1D)
@       IN      NS      master.hxz.ass.
254     IN      PTR     master.hxz.ass.

254     IN      PTR     www.hxz.ass.
234     IN      PTR     slave.hxz.ass.
101     IN      PTR     win.hxz.ass.

由于主配置文件中已经设置了反解区域(zone),因此 IP 全名部分已经包含了 192.168.2,所以最左边的数值只需填入最后一个 IP 位,例如 234 代表 192.168.2.234

服务启动

直接启动 named 服务:

[root@server2 ~]$ systemctl enable --now named

如果需要放行防火墙,设置以下规则:

[root@server2 ~]$ iptables -A INPUT -p tcp -i ens33 --dport 53 --sport 1024:65534 -j ACCEPT
[root@server2 ~]$ iptables -A INPUT -p udp -i ens33 --dport 53 --sport 1024:65534 -j ACCEPT

客户端测试

在客户端修改 /etc/resolv.conf 文件,将 DNS 地址设为 192.168.2.254

[root@server3 ~]$ vi /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.2.254
nameserver 222.246.129.80

使用 dig 命令进行测试:

[root@server3 ~]$ dig master.hxz.ass
;; ANSWER SECTION:
master.hxz.ass.         600     IN      A       192.168.2.254
[root@server3 ~]$ dig www.hxz.ass
;; ANSWER SECTION:
www.hxz.ass.            600     IN      A       192.168.2.254
[root@server3 ~]$ dig ftp.hxz.ass
;; ANSWER SECTION:
ftp.hxz.ass.            600     IN      CNAME   www.hxz.ass.
www.hxz.ass.            600     IN      A       192.168.2.254
[root@server3 ~]$ dig win.hxz.ass
;; ANSWER SECTION:
win.hxz.ass.            600     IN      A       192.168.2.101
[root@server3 ~]$ dig -t mx hxz.ass
;; ANSWER SECTION:
hxz.ass.                600     IN      MX      10 www.hxz.ass.
[root@server3 ~]$ dig -x 192.168.2.254
;; ANSWER SECTION:
254.2.168.192.in-addr.arpa. 600 IN      PTR     master.hxz.ass.
254.2.168.192.in-addr.arpa. 600 IN      PTR     www.hxz.ass.
[root@server3 ~]$ dig -x 192.168.2.101
;; ANSWER SECTION:
101.2.168.192.in-addr.arpa. 600 IN      PTR     win.hxz.ass.

如果有从服务器,每次更新区域文件后,记得修改序列号(Serial),也就是 SOA 参数括号内的第一个数字,这样从服务器才会自动从主服务器更新数据库。

配置 DNS 从服务器

由于前面已经架设了一台主服务器 192.168.2.254,现在在 192.168.2.234 上搭建一台从服务器。

首先需要在主服务器的主要配置文件中添加 allow-transfer 选项,以允许从服务器进行同步:

[root@server2 ~]$ vi /etc/named.conf
zone "hxz.ass" IN {
        type master;
        file "named.hxz.ass";
        allow-transfer { 192.168.2.234; };
};
zone "2.168.192.in-addr.arpa" IN {
        type master;
        file "named.192.168.2";
        allow-transfer { 192.168.2.234; };
};  

然后修改主服务器中的正解和反解文件配置:

[root@server2 ~]$ vi /var/named/named.hxz.ass
@               IN      NS      slave.hxz.ass.
slave.hxz.ass.  IN      A       192.168.2.234
[root@server2 ~]$ vi /var/named/named.192.168.2
@       In      NS      slave.hxz.ass.
234     IN      PTR     slave.hxz.ass.

从服务器安装 bind

[root@server1 sss]$ yum install -y bind

从服务器主配置文件 /etc/named.conf 内容如下:

[root@server1 ~]$ vi /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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

        recursion yes;
        allow-transfer  { none; };
};

zone "." IN {
        type hint;
        file "named.ca";
};
zone "hxz.ass" IN {
        type slave;
        file "slaves/named.hxz.ass";
        masters { 192.168.2.254; };
};
zone "2.168.192.in-addr.arpa" IN {
        type slave;
        file "slaves/named.192.168.2";
        masters { 192.168.2.254; };
};

之后启动从服务器上的 DNS 服务:

[root@server1 ~]$ systemctl start named
[root@server1 ~]$ systemctl enable named

使用 dig 命令进行测试:

[root@server1 ~]$ dig master.hxz.ass @127.0.0.1
[root@server1 ~]$ dig -x 192.168.2.254 @127.0.0.1

View 功能

DNS 的 View 功能能够让不同来源(内外网)的用户获取对应 Zone 的响应。因此,在同一个 Zone 中需要进行两种不同的设置。

修改主配置文件 /etc/named.conf 内容如下:

[root@server2 ~]$ vi /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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

        recursion yes;
        allow-transfer  { none; };
};

acl lan { 10.1.1.0/24; };
acl wan { ! 10.1.1.0/24; any; };

view "lan" {
        match-clients { "lan"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "hxz.ass" IN {
                type master;
                file "named.hxz.ass-lan";
        };
};

view "wan" {
        match-clients { "wan"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };      
        zone "hxz.ass" IN {
                type master;
                file "named.hxz.ass";
                allow-transfer { 192.168.2.234; };
        };
        zone "2.168.192.in-addr.arpa" IN {
                type master;
                file "named.192.168.2";
                allow-transfer { 192.168.2.234; };
        };
};

修改内网正解区域(zone)配置文件 /var/named/master/named.hxz.ass-lan,将来自内网 10.1.1.0 地址的客户端查询 hxz.ass 的结果指向内网地址 10.1.1.1:

[root@server2 ~]$ vi /var/named/named.hxz.ass-lan
$TTL    600
@               IN      SOA     master.hxz.ass. ad.www.hxz.ass(2020010101 3H 15M 1W 1D)
@               IN      NS      master.hxz.ass.
@               IN      NS      slave.hxz.ass.
master.hxz.ass. IN      A       10.1.1.1
slave.hxz.ass.  IN      A       192.168.2.234
@               IN      MX  10  www.hxz.ass.

www.hxz.ass.    IN      A       10.1.1.1
ftp.hxz.ass.    IN      CNAME   www.hxz.ass.

slave.hxz.ass.  IN      A       192.168.2.234
client.hxz.ass. IN      A       192.168.2.234
win.hxz.ass.    IN      A       192.168.2.101

重启服务后,分别使用内网和外网进行测试:

[root@server2 ~]$ systemctl restart named
[root@server3 ~]$ dig www.hxz.ass
www.hxz.ass.            600     IN      A       10.1.1.1
[root@server1 ~]$ dig www.hxz.ass @192.168.2.254
www.hxz.ass.            600     IN      A       192.168.2.254