CentOS7配置Bind双栈解析服务

1、什么是BIND?

BIND是一款开源的DNS服务器软件,包含域名查询和响应所需的所有功能。它是现今互联网上最常使用的DNS服务器软件(市场占有率的90%)。对于类UNIX系统来说,BIND已经成为事实上的标准。

BIND在发展过程中经历了3个主要的版本:BIND 4、BIND 8和BIND9,每个版本在架构上都有着显著的变化。BIND软件包括以下3个部分。

DNS服务器:这是一个名为named(name daemon)的程序。它根据DNS协议标准的规定来响应收到的查询。

DNS解析库(resolver library):解析程序通过发送请求到合适的服务器并且对服务器的响应做出合适的回应,来解析查询的域名。解析库是程序组件的集合,可以在开发其他程序时使用,以便为这些程序提供域名解析功能。

测试服务器的软件工具:包含DNS查询工具dig、host和nslookup
以及动态DNS更新工具nsupdate等。

BIND提供了对IPv6的支持,最新的BIND 9软件完全支持当前IPv6中对名字到地址和地址到名字查询的所有定义。当BIND 9运行在兼容IPv6的系统中时,它使用IPv6地址进行请求。对于转发的查询,BIND9同时支持A6和AAAA记录,而大多数操作系统所带的解析器只支持AAAA的解析查询,因为在实现上A6的解析要比A和AAAA的解析更为困难。

默认情况下,BIND 9域名服务不会监听IPv6网络接口,可以通过修改配置文件/etc/named.conf来启用对IPv6网络接口的监听,从而实现IPv6的解析服务。

options {
    listen-on-v6 { any; };
}

如果要指定服务IPv6地址,则可以修改配置文件,如下所示:

options {
    listen-on-v6 {
        2001:da8:100:1000::200;
        2001:da8:100:1000::2001;
    };
}

2、IPv6公共DNS

下一代互联网国家工程中心已正式推出IPv6公共DNS:240c::6666,同时还有一个备用DNS:240c::6644。下一代互联网国家工程中心还联合全球IPv6论坛(IPv6 Forum)启动IPv6公共DNS的全球推广计划,旨在为全球用户提供更优质的上网解析服务,并通过免费提供性能优异的公共DNS服务,为广大IPv6互联网用户打造安全、稳定、高速、智能的上网体验,助力我国《推进互联网协议第六版(IPv6)规模部署行动计划》全面落实。下一代互联网国家工程中心在北京、广州、兰州、武汉、芝加哥、弗里蒙特、伦敦、法兰克福等全球众多地区部署了递归节点,并基于IPv6 BGP任播方式部署,以使用户可以实现就近访问,从而使域名在解析到根服务器时延迟明显缩小。

此外,IPv6公共DNS将通过主动同步com/net域名、缓存热点域名等举措,最大限度地实现快速应答。在安全性方面,IPv6公共DNS支持单IP解析限速、DNSSEC安全解析验证,并通过安全限速有效拦截恶意攻击等,因此既不会出现恶意跳转,也不会出现强制性广告。下表列出了IPv6公共DNS服务器的名称和地址(主地址和备用地址)。

image-20220309102232094

3、安装配置BIND双栈解析服务

image-20220309103043360

拓扑结构如上、我们在CentOS7服务器上安装配置BIND双栈解析服务。在本实验中我们需要完成以下功能:

在CentOS 7系统下通过网络安装BIND软件;

为系统配置静态IPv4和IPv6地址,用于DNS域名服务;

配置BIND系统防火墙,配置BIND服务软件的启动方式和检查运行状态;

BIND的IPv4/IPv6的双栈解析;

DNS的配置测试。

首先我们开始安装BIND软件,我们远程到CentOS7服务器上、先看看服务器的IP地址信息:

[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.200.1  netmask 255.255.255.0  broadcast 172.16.200.255
        inet6 fe80::f6a5:eb:54d7:ee58  prefixlen 64  scopeid 0x20<link>
        ether 00:50:00:00:02:00  txqueuelen 1000  (Ethernet)
        RX packets 128  bytes 17951 (17.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 122  bytes 12396 (12.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 72  bytes 6248 (6.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 6248 (6.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]# 

从输出中可以看到,网卡eth0自动获取的IPv4地址是172.16.200.1(是真实计算机上VMware DHCP Service服务分配的地址,系统每次启动时获取的IP地址可能不一样)。为了保证后续软件能够正常安装,请确保Linux-CentOS7虚拟机可以访问互联网(比如ping www.baidu.com,看能否正常解析出域名和ping通);然后通过命令在线安装BIND软件。注意,Linux严格区分大小写,在终端下输入yum -y install bind*命令并按回车键,这个命令会让系统通过yum方式连接到外网的应用服务器来安装BIND所有相关软件,-y选项表明在安装过程中出现选择提示时全部选择“yes”。运行上述命令后,屏幕显示大量的安装信息,软件安装成功后会出现“Complete!”字样:

[root@localhost ~]# yum install bind*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
 ......
  pcre.x86_64 0:8.32-17.el7                                                          
  policycoreutils.x86_64 0:2.5-34.el7                                                
  zlib.x86_64 0:1.2.7-19.el7_9                                                       

Complete!
[root@localhost ~]# 

系统会自动联网更新和下载BIND所需要的软件包并自动安装,同时在Linux中会自动建立named用户,用于启动DNS服务进程。安装成功
后,/etc和/var/named目录下面会多出几个文件,可以通过命令ls/etc | grep named查看文件列表。ls用于查看文件列表,grep用于查找其内容包含指定范本样式的文件,可把含有范本样式的文件显示出来。具体命令如下:

[root@localhost ~]# ls /etc | grep named
named
named-chroot.files
named.conf
named.conf.bak
named.iscdlv.key
named.rfc1912.zones
named.root.key
[root@localhost ~]# 

查看/var/named/目录下的文件,显示如下:

[root@localhost ~]# ls /var/named/
chroot      data     dyndb-ldap  named.empty      named.loopback
chroot_sdb  dynamic  named.ca    named.localhost  slaves

通过命令rpm -qa | grep bind查看所有已安装的BIND相关的软件包,显示如下:

[root@localhost ~]# rpm -qa | grep bind
bind-libs-9.11.4-26.P2.el7_9.9.x86_64
bind-sdb-9.11.4-26.P2.el7_9.9.x86_64
bind-export-devel-9.11.4-26.P2.el7_9.9.x86_64
bind-utils-9.11.4-26.P2.el7_9.9.x86_64
bind-libs-lite-9.11.4-26.P2.el7_9.9.x86_64
bind-pkcs11-libs-9.11.4-26.P2.el7_9.9.x86_64
bind-export-libs-9.11.4-26.P2.el7_9.9.x86_64
bind-pkcs11-9.11.4-26.P2.el7_9.9.x86_64
bind-sdb-chroot-9.11.4-26.P2.el7_9.9.x86_64
bind-chroot-9.11.4-26.P2.el7_9.9.x86_64
bind-devel-9.11.4-26.P2.el7_9.9.x86_64
bind-license-9.11.4-26.P2.el7_9.9.noarch
bind-lite-devel-9.11.4-26.P2.el7_9.9.x86_64
bind-pkcs11-utils-9.11.4-26.P2.el7_9.9.x86_64
bind-9.11.4-26.P2.el7_9.9.x86_64
bind-dyndb-ldap-11.1-7.el7.x86_64
bind-pkcs11-devel-9.11.4-26.P2.el7_9.9.x86_64
[root@localhost ~]# 

BIND安装完成以后、我们给CentOS服务器配置一个静态IP地址。由于动态获取的IP地址不稳定,因此需要为服务器配置静态IP地址。为了方便测试和实现系统的双栈解析,接下来配置静态的IPv4地址和IPv6地址。通过cd命令进入网卡配置文件目录/etc/sysconfig/network-scripts,然后通过vim文件编辑器修改网卡的配置文件ifcfg-eth0(eth0是虚拟网卡,默认会自动关联到服务器的可用网卡上,本实验中服务器只有一块网卡,会自动关联。若服务器有多块网卡需要配置,小伙伴们可自行百度配置方法);

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33  ifdown-isdn      ifup          ifup-plip      ifup-tunnel
ifcfg-lo     ifdown-post      ifup-aliases  ifup-plusb     ifup-wireless
ifdown       ifdown-ppp       ifup-bnep     ifup-post      init.ipv6-global
ifdown-bnep  ifdown-routes    ifup-eth      ifup-ppp       network-functions
ifdown-eth   ifdown-sit       ifup-ib       ifup-routes    network-functions-ipv6
ifdown-ib    ifdown-Team      ifup-ippp     ifup-sit
ifdown-ippp  ifdown-TeamPort  ifup-ipv6     ifup-Team
ifdown-ipv6  ifdown-tunnel    ifup-isdn     ifup-TeamPort
[root@localhost network-scripts]# vi ifcfg-ens33 
[root@localhost network-scripts]# cat ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=fa15ff9e-b81c-47ec-a6a9-49741487791c
DEVICE=eth0
ONBOOT=yes
IPADDR=172.16.200.1
NETMASK=255.255.255.0
GATEWAY=172.16.200.254
IPV6ADDR=2001:da8:1005:1000::200/64
DNS1=172.16.200.1
[root@localhost network-scripts]# 

# 刚开始的时候我们就已经看到了、服务器的网卡名称是eth0;这里我们还需要把配置文件名称更新一下
[root@localhost network-scripts]# mv ifcfg-ens33 ifcfg-eth0
[root@localhost network-scripts]# ls
ifcfg-eth0   ifdown-isdn      ifup          ifup-plip      ifup-tunnel
ifcfg-lo     ifdown-post      ifup-aliases  ifup-plusb     ifup-wireless
ifdown       ifdown-ppp       ifup-bnep     ifup-post      init.ipv6-global
ifdown-bnep  ifdown-routes    ifup-eth      ifup-ppp       network-functions
ifdown-eth   ifdown-sit       ifup-ib       ifup-routes    network-functions-ipv6
ifdown-ib    ifdown-Team      ifup-ippp     ifup-sit
ifdown-ippp  ifdown-TeamPort  ifup-ipv6     ifup-Team
ifdown-ipv6  ifdown-tunnel    ifup-isdn     ifup-TeamPort
[root@localhost network-scripts]# 

然后通过systemctl start network命令重新启动网络服务(CentOS 6以前主要使用service命令来启动服务,CentOS 7以后改成systemctl命令)。通过ifconfig命令查看配置的IP信息:

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.200.1  netmask 255.255.255.0  broadcast 172.16.200.255
        inet6 fe80::6b6:f8ad:4a1f:e786  prefixlen 64  scopeid 0x20<link>
        ether 00:50:00:00:02:00  txqueuelen 1000  (Ethernet)
        RX packets 535  bytes 52177 (50.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 420  bytes 46143 (45.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 96  bytes 8288 (8.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96  bytes 8288 (8.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost network-scripts]# 

双栈地址配置完成以后、我们来启动DNS服务。输入systemctl start named.service命令启动DNS服务,输入systemctl status named.service命令查看named进程是否正常启动。DNS服务启动状态显示如下:

[root@localhost ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@localhost ~]# systemctl start named
[root@localhost ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2016-03-09 18:19:15 CST; 1s ago
  Process: 2938 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 2936 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 2941 (named)
   CGroup: /system.slice/named.service
           └─2941 /usr/sbin/named -u named -c /etc/named.conf

Mar 09 18:19:15 localhost.localdomain named[2941]: network unreachable resolving ...3
Mar 09 18:19:15 localhost.localdomain named[2941]: network unreachable resolving ...3
Mar 09 18:19:15 localhost.localdomain named[2941]: network unreachable resolving ...3
Mar 09 18:19:15 localhost.localdomain named[2941]: network unreachable resolving ...3
Mar 09 18:19:15 localhost.localdomain named[2941]: network unreachable resolving ...3
Mar 09 18:19:16 localhost.localdomain named[2941]:   validating ./DNSKEY: verify ...n
Mar 09 18:19:16 localhost.localdomain named[2941]:   validating ./DNSKEY: unable ...'
Mar 09 18:19:16 localhost.localdomain named[2941]: broken trust chain resolving '...3
Mar 09 18:19:16 localhost.localdomain named[2941]: resolver priming query complete
Mar 09 18:19:16 localhost.localdomain named[2941]: network unreachable resolving ...3
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 

通过netstat命令查询DNS的53端口监听状态可以看出,BIND域名服务启动正常,默认自动支持IPv4和IPv6:

[root@localhost ~]# netstat -lntup|grep 53
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      2941/named          
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      2941/named          
tcp6       0      0 ::1:53                  :::*                    LISTEN      2941/named          
tcp6       0      0 ::1:953                 :::*                    LISTEN      2941/named          
udp        0      0 127.0.0.1:53            0.0.0.0:*                           2941/named          
udp6       0      0 ::1:53                  :::*                                2941/named          
[root@localhost ~]# 

接下来我们修改BIND配置文件;修改named.conf,使BIND能够支持本地以外的主机域名解析;同时修改系统默认防火墙配置,对外开通DNS服务的53端口,实现IPv4和IPv6双栈域名解析服务:

[root@localhost ~]# cat /etc/named.conf
......

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; };
......     

将options中listen-on所在行的“127.0.0.1”和“::1”分别修改为“any”,将allow-query所在行的“localhost”也改为“any”,意思是接受其他主机的访问和查询,如下:

[root@localhost ~]# cat /etc/named.conf
......

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        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; };
......

修改后保存配置,并通过systemctl restart named.service命令重新启动BIND服务。然后通过firewall-cmd命令在系统防火墙开放DNS服务,并重新启动防火墙服务:

[root@localhost ~]# systemctl restart named
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-service=dns
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# 

通过firewall-cmd命令查看系统防火墙已经开放的服务,确认防火墙已经开放DNS服务:

[root@localhost ~]# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client dns ssh
[root@localhost ~]# 

通过iptables命令查看DNS端口的开放情况,确保53端口对外开放:

[root@localhost ~]# iptables -L -n | grep 53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53 ctstate NEW
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53 ctstate NEW
[root@localhost ~]# 

然后我们开始测试BIND域名解析服务;在CentOS 7服务器上通过命令测试BIND服务器是否可以正常提供解析域名服务,为此可以通过nslookup命令来验证。在命令提示符下输入nslookup后按回车键,在“>”提示符后输入server 172.18.1.140来指定IP地址为172.18.1.140的服务器作为IPv4域名解析服务器,然后随便输入一个外网域名,比如www.baidu.com,然后按回车键,系统就能正常解析该网站的IP地址了,执行和显示如下:

[root@localhost network-scripts]# nslookup
> server 172.16.200.1
Default server: 172.16.200.1
Address: 172.16.200.1#53
> www.baidu.com
Server:         172.16.200.1
Address:        172.16.200.1#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 36.152.44.95
Name:   www.a.shifen.com
Address: 36.152.44.96
> exit

[root@localhost network-scripts]# 

通过测试结果可以看出,本地的BIND服务器可以实现对外域的IPv4地址的解析。同样也可以设置本机的IPv6地址作为域名解析地址,执行和显示如下:

[root@localhost network-scripts]# nslookup
> server 2001:da8:1005:1000::200
Default server: 2001:da8:1005:1000::200
Address: 2001:da8:1005:1000::200#53
> www.baidu.com
Server:         2001:da8:1005:1000::200
Address:        2001:da8:1005:1000::200#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 36.152.44.95
Name:   www.a.shifen.com
Address: 36.152.44.96
> exit

[root@localhost network-scripts]# 

测试结束后,在“>”提示符下输入exit退出域名解析测试。由于该环境并不支持IPv6,BIND服务器只是监听IPv6接口的查询,所以真正对外通信使用的仍然是IPv4。

我们在Windows 10下可通过nslookup命令来远程测试该服务器是否可以提供外网域名解析服务。WIN10计算机默认会获得172.16.200.0/24网段的IPv4地址,并可以访问互联网。我们在“命令行提示符”窗口输入nslookup并按回车键,然后在“>”提示符后输入server 172.16.200.1命令并按回车键以指定IP地址为172.16.200.1的这台服务器作为IPv4域名解析服务器,然后随便输入一个外网域名并按回车键,测试结果如下:

Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>ipconfig

Windows IP 配置


以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::d57c:b6c:cf69:cec6%4
   IPv4 地址 . . . . . . . . . . . . : 172.16.200.2
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 172.16.200.254

隧道适配器 isatap.{54BEB64E-22A2-4C4A-B00B-E3E45DB8F292}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

隧道适配器 Teredo Tunneling Pseudo-Interface:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2001:0:348b:fb58:14bf:f500:8735:3f99
   本地链接 IPv6 地址. . . . . . . . : fe80::14bf:f500:8735:3f99%2
   默认网关. . . . . . . . . . . . . : ::

C:\Users\Administrator>nslookup
默认服务器:  dns02.hb.chinamobile.com
Address:  211.137.58.20

> server 172.16.200.1
默认服务器:  [172.16.200.1]
Address:  172.16.200.1

> www.baidu.com
服务器:  [172.16.200.1]
Address:  172.16.200.1

非权威应答:
名称:    www.a.shifen.com
Addresses:  36.152.44.95
          36.152.44.96
Aliases:  www.baidu.com

>

注:感兴趣的读者可以手动配置Win10的IPv4地址,并且不配置网关,以测试域名解析是否正常。经测试发现也可以成功解析,原因是Win10向DNS服务器询问域名对应的IP地址时,DNS服务器访问互联网,并在查询到域名后再回复Win10计算机,因此Win10计算机可以正常解析出域名,由于没有配置网关,因此虽可以解析出域名,但网络是不通的。

4、BIND配置IPv6资源记录

IPv6中的AAAA记录和IPv4的A记录相似,需要在BIND的各个区中进行配置。它在一个单独的记录中设定了全部地址,例如:

$ORIGIN test.com.
IPv6 3600 IN AAAA 2001:da8:1005:1000::100

IPv6域名解析的反向解析记录和IPv4的一样,是PTR,但地址表示形式有两种。一种是用“.”分隔的半字节十六进制数字格式(Nibble
Format),低位地址在前,高位地址在后。半字节十六进制数字格式与AAAA对应,是对IPv4的简单扩展。另一种是二进制串(Bitstring)格式,以“[”开头,十六进制地址(无分隔符,高位在前,低位在后)居中,地址后加“]”。二进制串格式与A6记录对应,地址也像A6一样,可以分成多级地址链来表示。

我们继续在前面的实验基础上完成以下功能:

配置IPv6域名正向解析;

配置IPv6主机反向地址解析;

测试DNS的本地域配置。

安装配置和测试步骤如下。

4.1、配置IPv6域名正向解析

首先我们需要配置IPv6域名正向解析,我们通过VI编辑器编辑BIND默认的配置文件named.conf,添加一个区并监理测试域名test.com,配置文件如下:

[root@localhost ~]# cat /etc/named.conf
......
zone "." IN {
        type hint;
        file "named.ca";
};

zone "test.com." IN {
        type master;
        file "test.com.zone";

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

[root@localhost ~]# 

建立区域文件,在BIND目录下建立test.com区域文件,并授予named用户相应的权限,最后编辑test.com.zone正向解析文件,具体执行如下:

[root@localhost ~]# cd /var/named/
[root@localhost named]# ls
chroot      data     dyndb-ldap  named.empty      named.loopback
chroot_sdb  dynamic  named.ca    named.localhost  slaves
[root@localhost named]# cp named.localhost test.com.zone
[root@localhost named]# chgrp named test.com.zone 
[root@localhost named]# chmod 640 test.com.zone 

把里面默认的配置按下面的内容进行修改,其中AAAA记录是IPv6域名解析记录:

[root@localhost named]# pwd
/var/named
[root@localhost named]# 
[root@localhost named]# cat test.com.zone 
$TTL 1D
@       IN SOA  ns.test.com     dns.test.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H      ; minimum
)
        NS      ns.test.com.
ns      A       172.16.200.1
ns      AAAA    2001:da8:1005:1000::200
dns     CNAME   ns
www     A       172.16.200.2
www     AAAA    2001:da8:1005:1000::80
[root@localhost named]# 

配置完成以后我们通过named-checkconf命令检查区域配置的语法是否正确:

[root@localhost named]# named-checkconf /etc/named.conf

使用named-checkzone命令进行区域文件有效性检查和转换,需要指定区域名称和区域文件名称,显示如下:

[root@localhost named]# named-checkzone "test.com." /var/named/test.com.zone 
zone test.com/IN: loaded serial 0
OK
[root@localhost named]# 

接下来我们重启BIND服务

[root@localhost named]# systemctl restart named

我们通过dig命令测试本地域名解析是否正常;dig命令最典型的用法就是查询单个主机的信息,其默认的输出信息比较丰富,大概可以分为5个部分:

第一部分显示dig命令的版本和输入的参数;

第二部分显示服务返回的一些技术详情,比较重要的是status;

如果status的值为NOERROR,则说明本次查询成功结束;

第三部分的QUESTION SECTION显示我们要查询的域名;

第四部分的ANSWER SECTION是查询到的结果;

第五部分则是本次查询的一些统计信息,比如用了多长时间、查询了哪个DNS服务器、在什么时间进行的查询等。

使用dig命令在2001:da8:1005:1000::200服务器上查询www.test.com域名,显示如下:

[root@localhost ~]# dig www.test.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> www.test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16068
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

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

;; ANSWER SECTION:
www.test.com.           86400   IN      A       172.16.200.2

;; AUTHORITY SECTION:
test.com.               86400   IN      NS      ns.test.com.

;; ADDITIONAL SECTION:
ns.test.com.            86400   IN      A       172.16.200.1
ns.test.com.            86400   IN      AAAA    2001:da8:1005:1000::200

;; Query time: 1 msec
;; SERVER: 172.16.200.1#53(172.16.200.1)
;; WHEN: Wed Mar 09 23:35:15 CST 2016
;; MSG SIZE  rcvd: 118

[root@localhost ~]#

从上面的输出可以看出,在BIND DNS服务器2001:da8:1005:1000::200上查到www.test.com的IPv4解析指向172.16.200.2。如果要查询IPv6解析记录,则可以用命令dig AAAA www.test.com @2001:da8:1005:1000::200,显示如下:

[root@localhost ~]# dig AAAA www.test.com @2001:da8:1005:1000::200

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> AAAA www.test.com @2001:da8:1005:1000::200
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41919
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

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

;; ANSWER SECTION:
www.test.com.           86400   IN      AAAA    2001:da8:1005:1000::80

;; AUTHORITY SECTION:
test.com.               86400   IN      NS      ns.test.com.

;; ADDITIONAL SECTION:
ns.test.com.            86400   IN      AAAA    2001:da8:1005:1000::200
ns.test.com.            86400   IN      A       172.16.200.1

;; Query time: 1 msec
;; SERVER: 2001:da8:1005:1000::200#53(2001:da8:1005:1000::200)
;; WHEN: Wed Mar 09 23:37:13 CST 2016
;; MSG SIZE  rcvd: 130

[root@localhost ~]# 

从上面的输出中可以看到A和AAAA记录都解析正常。

4.2、配置IPv6域名反向解析

首先我们需要添加反向解析域,通过vi编辑器编辑配置named.conf,在里面添加一个区(zone),建立域名test.com的反向解析。named.conf部分内容显示如下:

[root@localhost named]# cat /etc/named.conf
......
zone "." IN {
        type hint;
        file "named.ca";
};

zone "test.com." IN {
        type master;
        file "test.com.zone";

};
zone "0.0.0.1.5.0.0.1.8.a.d.0.1.0.0.2.ip6.arpa" {
        type master;
        file "2001:da8:1005:1000.ptr";
};


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

[root@localhost named]# 

新建反向解析文件,通过vi编辑器建立反向地址解析文件,内容如下:

[root@localhost named]# cat 2001\:da8\:1005\:1000.ptr 
$TTL 1D; Default TTL
@       IN      SOA     ns.test.com.     dns.test.com. (
        2022030901      ;serial
        1H              ;slave refresh interval
        15m             ;slave retry interval
        1W              ;slave copy expire time
        1H              ;NXDOMAIN cache time
)
        IN      NS      ns.test.com.
0.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.5.0.0.1.8.a.d.0.1.0.0.2.ip6.arpa.       IN      PTR      www.test.com.
[root@localhost named]# 

测试域名。通过命令systemctl restart named重启BIND服务。在Windows中使用nslookup命令来远程测试该服务器是否可以提供反向解析服务。开启拓扑图中的Win10计算机,配置IPv6地址2001:da8:1005:1000::100/64,可以ping DNS服务器的IPv6地址2001:da8: 1005:1000::200,以确认网络连接是否正常。在DOS命令行提示符窗口中通过nslookup命令测试配置好的域名解析服务,首先指定DNS服务器的地址为配置好的CentOS 7的IPv6服务地址2001:da8:1005:1000::200;然后测试www.test.com的正向解析;最后测试2001:da8:1005: 1000::80的反向解析,如下所示。

Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>ipconfig

Windows IP 配置


以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2001:da8:1005:1000::100
   本地链接 IPv6 地址. . . . . . . . : fe80::d57c:b6c:cf69:cec6%4
   IPv4 地址 . . . . . . . . . . . . : 172.16.200.2
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 172.16.200.254

隧道适配器 isatap.{54BEB64E-22A2-4C4A-B00B-E3E45DB8F292}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

C:\Users\Administrator>nslookup
默认服务器:  UnKnown
Address:  2001:da8:1005:1000::200

> server 2001:da8:1005:1000::200
默认服务器:  [2001:da8:1005:1000::200]
Address:  2001:da8:1005:1000::200

> www.test.com
服务器:  [2001:da8:1005:1000::200]
Address:  2001:da8:1005:1000::200

名称:    www.test.com
Addresses:  2001:da8:1005:1000::80
          172.16.200.2

> 2001:da8:1005:1000::80
服务器:  [2001:da8:1005:1000::200]
Address:  2001:da8:1005:1000::200

名称:    www.test.com
Address:  2001:da8:1005:1000::80

> exit

C:\Users\Administrator>

从上面的输出中我们可以看出,在输入www.test.com后,DNS服务器分别解析了IPv4和IPv6地址,然后在输入2001:da8:1005:1000::80后可以反向解析到www.test.com。

4.3、ACL与IPv6动态域名

BIND中的ACL与交换机中的ACL不一样,它是BIND安全管理的方法;把一个或多个地址归并为一个集合,使用时调用集合名称即可。BIND中ACL的语法格式如下:

acl acl_name {
ip;
net/prelen;
......
};

假设有下面这样一个示例:

acl mynet {
    172.16.0.0/16;
    10.10.10.10;
    2001:da8:1005::/48;
};

这个ACL相当于mynet中定义了172.16.0.0/16网段中的所有主机、10.10.10.10主机和2001:da8:1005::/48中的所有IPv6主机。BIND有4个内置的ACL:none:没有一个主机;any:任意主机;localhost:本机;localnet:本机的IP地址与掩码运算后得到的网络地址。

注:BIND中的ACL只能先定义后使用,因此named.conf配置文件中一般处于options的前面。

BIND 9中有一个重要的功能我们需要详细讲解一下、那就是智能DNS。BIND智能DNS的实现基础就是视图(view)。视图是BIND 9中强大的新功能,允许名称服务器根据询问者的不同有区别地回答DNS查询,当运行多种DNS设置而不需要运行多个服务器时特别有用。

每个视图定义了一个将会在用户的子集中见到的DNS名称空间。在BIND中定义并使用视图时,存在如下限制:一个BIND服务器可定义多个视图,每个视图中可定义一个或多个区域;每个视图用来匹配一组客户端;多个视图内可能需要对同一个区域进行解析,但使用的是不同的区域解析库文件。

注:一旦启用了视图,所有的区域都只能定义在视图中;仅在允许递归请求的客户端所在的视图中定义根区域;客户端请求到达时,自上而下检查每个视图所服务的客户端列表。

配置示例:

view "campus_IPv6" {
    match-clients { 2001:da8:1005::/48; };
    # 应该与内部网络匹配;只对内部用户IPv6主机提供递归服务;提供test.edu.cn zone 的完全视图;包括内部主机地址
    # 使用递归查询
    recursion yes; 
    zone "test.edu.cn" {
        type master;
        file "test.ipv6.db";
    };
};
view "external" {
    match-clients { any; };
    # 拒绝对外部用户提供递归服务;提供一个test.edu.cn zone 的受限视图;只包括公共可接入主机
    # 不使用递归查询
    recursion no; 
    zone "test.edu.cn " {
        type master;
        file "test-external.db";
    };
};

下面我们一起来配置一下BIND IPv6动态域名和智能解析。在本次实验中我们主要完成了以下功能:

BIND中的ACL地址集合配置;

为不同区域的用户建立不同的解析策略;

不同区域的测试效果。

配置步骤如下:

我们首先要配置ACL、在CentOS7虚拟机的配置文件中配置ACL地址集合。我们编辑/etc/named. conf文件,在文件最前面分别增加IPv4ACL和IPv6 ACL,添加的内容如下:

[root@localhost named]# cat /etc/named.conf
......
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

# 添加ACL
acl IPV4_USER {
        172.16.200.0/24;
};
acl IPV6_USER {
        2001:da8:1005:1000::/64;
};

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
......

配置完ACL之后我们建立域名解析。为两个区域的用户建立不同的域名解析,在IPv4区域建立test.com.1.zone,在IPv6区域建立test.com.2.zone,其他区域则使用test.com.zone配置文件。域名解析文件/var/named/test.com.1.zone的内容如下:

[root@localhost named]# cat test.com.1.zone 
$TTL 1D
@       IN SOA  ns.test.com     dns.test.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.test.com.
ns      A       172.16.200.1
ns      AAAA    2001:da8:1005:1000::200
dns     CNAME   ns
www     A       172.16.200.1
www     AAAA    2001:da8:1005:1000::81
[root@localhost named]# 

域名解析文件/var/named/test.com.2.zone的内容如下:

[root@localhost named]# cat test.com.2.zone 
$TTL 1D
@       IN SOA  ns.test.com     dns.test.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.test.com.
ns      A       172.16.200.1
ns      AAAA    2001:da8:1005:1000::200
dns     CNAME   ns
www     A       172.16.200.2
www     AAAA    2001:da8:1005:1000::82
[root@localhost named]# 

现在我们开始分区域解析,修改/etc/named.conf文件,建立ACL策略并为不同区域解析不同的地址。将原文件中所有的zone部分替换成下面的内容:

view "jiaoxue" {
    match-clients { IPV4_USER;};
    recursion yes;
    zone "." in {
        type hint;
        file "named.ca";
    };
    zone "test.com." in{
        type master;
        file "test.com.1.zone";
    };
};
view "sushe" {
    match-clients { IPV6_USER; };
    recursion yes;
    zone "." in {
        type hint;
        file "named.ca";
    };
    zone "test.com." in {
        type master;
        file "test.com.2.zone";
    };
};
view "others" {
    match-clients { any; };
    recursion no;
    zone "." in {
        type hint;
        file "named.ca";
    };
    zone "test.com." in {
        type master;
        file "test.com.zone";
    };
    zone "0.0.0.1.5.0.0.1.8.a.d.0.1.0.0.2.ip6.arpa" {
        type master;
        file "2001.da8.1005.1000.ptr";
    };
};

注:这里我们要删除/etc/named.conf文件中的下面这一行(named.rfc1912.zones文件中包含了单独的zone部分,会影响BIND服务。由于该文件是示例文件,因此不会被引用,可直接删除该行):

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

配置完成以后我们重启BIND服务,开始测试。在IPv4区域中测试,禁用Win10虚拟机的IPv6协议,取消选中“Internet协议版本6”。

image-20220312141107477

然后在命令行提示符的下面执行nslookup命令来测试。因为Win10只有IPv4地址,所以只能使用server 172.16.200.1。测试www.test.com的域名,结果如下:

Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>nslookup
默认服务器:  UnKnown
Address:  172.16.200.1

> server 172.16.200.1
默认服务器:  [172.16.200.1]
Address:  172.16.200.1

> www.test.com
服务器:  [172.16.200.1]
Address:  172.16.200.1

名称:    www.test.com
Addresses:  2001:da8:1005:1000::81
          172.16.200.1

>

注:注意,域名对应的IP地址最后是81。

IPv4区域测试正常、我们现在开始测试IPv6区域。我们禁用Win10虚拟机的IPv4协议,配置静态的
IPv6地址2001:da8: 1005:1000::100/64。然后,在命令行提示符下执行nslookup命令来测试。因为Win10只有IPv6地址,所以只能使用server2001:da8:1005:1000::200。测试www.test.com的域名,结果如下所示:

Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>nslookup
默认服务器:  UnKnown
Address:  2001:da8:1005:1000::200

> server 2001:da8:1005:1000::200
默认服务器:  [2001:da8:1005:1000::200]
Address:  2001:da8:1005:1000::200

> www.test.com
服务器:  [2001:da8:1005:1000::200]
Address:  2001:da8:1005:1000::200

名称:    www.test.com
Addresses:  2001:da8:1005:1000::82
          172.16.200.2

>

注:域名对应的IP地址最后是82。由上可知,不同的用户IP虽有同样的域名,却可以解析成不同的IP地址。

推荐文章