在Linux上配置DNS的常用软件是BIND(Berkeley Internet Name Domain Service,BIND),它是一款实现DNS服务器的开放源码软件。本文详细介绍了在CentOS7上安装并配置Bind软件。
一、Bind软件介绍
BIND包最初是在 1980 年代初在加州大学伯克利分校作为研究生项目,在美国国防高级研究项目管理局 (DARPA)的资助下编写的。BIND 到 4.8.3 版本由加州大学伯克利分校的计算机系统研究小组 (CSRG) 维护,Douglas Terry、Mark Painter、David Riggle 和 Songnian Zhou 组成了最初的 BIND 项目团队。
从 4.9.3 开始的 BIND 版本由Internet软件联合会(Internet Software Consortium,ISC) 开发和维护,并由 ISC 的赞助商提供支持。
1997 年 5 月发布了BIND 版本 8 的第一个生产就绪版本。2000 年 9 月发布BIND9版本,几乎对底层 BIND 架构的所有方面进行了重大改写。2009 年~2014年期间进行开发,ISC 开始尝试使用 BIND 10 从头开始重写 BIND。其官方网站是:BIND 9 - ISC
作为开源DNS软件的代表之一,BIND以其稳定性和灵活性广泛应用于各类网络环境。与其他DNS软件相比,BIND具有较高的可靠性和广泛的支持基础,目前能够运行在几乎所有的操作系统平台之上。
二、安装DNS服务
2.1 BIND套件
BIND套件主要包括四个工具:
1、bind:提供DNS 服务器程序,以及几个常用的测试工具。 2、bind-libs:提供bind和bind-utils包中的程序共同用到的库文件。 3、bind-utils:bind客户端程序,提供host, nslookup, dig等测试工具。 4、bind-chroot:安全包,例如为Bind服务提供一个伪装的根目录(将/var/named/chroot文件夹作为Bind的根目录),以提高安全性。
2.2 安装并启动DNS服务
配置好yum源后,可以使用yum命令安装bind服务程序,并且会自动安装依赖包bind-libs。这里只是模拟实验环境,可以不安装bind-chroot,只安装bind。
[root@server ~]# yum install bind -y
Bind包安装后,会自动增加一个名为named.service的系统服务,启动后,会开启DNS的守护进程named。
[root@server ~]# systemctl start named
[root@server ~]# netstat -anutpl | grep named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 86624/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 86624/named
tcp6 0 0 ::1:53 :::* LISTEN 86624/named
tcp6 0 0 ::1:953 :::* LISTEN 86624/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 86624/named
udp6 0 0 ::1:53 :::* 86624/named
可以看到DNS服务默认在本地回环口的TCP的53端口侦听。另外TCP的953端口,是远程管理bind工具rndc(Remote Name Domain Controllor)使用的,通过这个工具可以在本地或者远程了解当前DNS服务器的运行状况,也可以对DNS服务器进行关闭、重载、刷新缓存、增加删除zone等操作。
三、认识DNS配置文件
Bind包安装后,涉及到三种类型的配置文件:主配置文件、区域配置文件、区域数据配置文件。此外,这些配置文件都提供了模板文件供参考。
[root@server ~]# rpm -qc bind #查询bind相关的配置文件
3.1 主配置文件named.conf
主配置文件,包含了整个DNS服务器的配置信息。文件路径位于/etc/named.conf
主配置文件内,“options”部分包含一些全局设置,如指定工作目录、侦听地址和端口、递归查询等;“zone”部分定义了一组DNS区域,并指定其类型和区域文件;“logging”部分定义了日志配置。主配置文件也可以通过”include“引入其他外部文件。注意:每条配置必须以分号“;“结束。
下面看一个示例文件:
//option下定义全局配置
options {
//侦听地址和端口(IPv4/6),可以监听多个接口,每个地址后面都需要加上分号
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
//DNS工作目录,若安装了bind-chroot,文件会被主动链接伪装的根目录
directory "/var/named";
//与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";
//针对DNS客户端的设置,指定哪些客户端可以向DNS服务提出查询请求
//any匹配任何地址,none不匹配任何地址,可以使用IP地址或者网段形式
allow-query { localhost; };
//指定允许接收区域传送请求的主机
allow-transfer{none;};
//是否允许为DNS客户端做递归查询,如果部署惟缓存服务器,不需要启用
recursion yes;
//用于DNS转发,当域名服务器无法解析时,将请求转发给指定的DNS服务器
forwarders{8.8.8.8;};
dnssec-enable yes;
dnssec-validation yes;
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下定义服务器日志记录的内容和日志信息来源等
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
//zone下定义区域信息,可以定义多个zone,一个zone定义一个区域
zone "." IN {//定义根区域
//区域类型:hint表示根区域,master表示主DNS服务器,slave表示辅助DNS服务器
//另外还有stub、forward等类型
type hint;
//区域配置文件名,默认存放在/var/named目录
file "named.ca";
};
//引入区域配置文件/etc/named.zones
include "/etc/named.zones";
include "/etc/named.root.key";
3.2 区域配置文件
区域配置文件中主要是对DNS区域的声明,文件名称和位置可以自定义,并在主配置文件中使用include引入区域配置文件,,如:include "/etc/named.zones";模板文件为/etc/named.rfc1912.zones
下面看一个示例文件:
//声明正向查找区,区域名example.com
zone "example.com" IN {
//区域类型:master表示主DNS服务器,slave表示辅助DNS服务器
type master;
file "example.com.zone";
//是否允许动态更新
allow-update { none; };
};
//声明反向查找区,指向192.168.200.0,以in-addr.arpa为后缀
zone "200.168.192.in-addr.arpa" IN {
type master;
file "100.200.168.192.zone";
allow-update { none; };
};
3.3 区域数据库配置文件
每个区域的数据库配置文件包含该区域的资源记录,文件需保存到主配置文件设定的工作目录中。通过编辑这些文件,可以实现自定义域名解析、反向解析等功能。
1、根区域数据库配置文件
根区域数据库配置文件是/var/named/named.ca,此文件非常重要,它包含了13台根服务器的域名和IP地址信息。利用此文件,DNS服务器可以找到根DNS服务器,当BIND无法在其他地方找到顶级域名的解析记录时,会查询该文件中的根服务器信息。文件主要内容如下图:
2、正向解析区数据库配置文件
正向解析区数据库配置文件可以实现域名到IP地址的映射,定义了该区内的资源记录,配置时可以从模板文件/var/named/named.localhost复制后进行修改。
资源记录定义的语法如下:
name [TTL(缓存生存期)] IN rr_type value
示例文件:
$TTL 1D
@ IN SOA example.com. root.example.com. (2024041301 1D 1H 1W 3H)
@ IN NS master.example.com.
@ IN NS slaver.example.com.
@ IN MX 10 mail.example.com.
master.example.com. IN A 192.168.200.100
slaver.example.com. IN A 192.168.200.112
mail.example.com. IN A 192.168.20.112
finace.example.com. IN A 192.168.20.113
develop.example.com. IN A 192.168.20.114
www.example.com. IN CNAME master.example.com.
ftp.example.com. IN CNAME master.example.com.
dns.example.com. IN CNAME master.example.com.
说明:
(1)第一行定义了TTL值为1天,可被后面所有资源记录全局继承。
(2)第二行定义了当前区域example.com.的SOA记录,@代表当前区域的名字,因为有特殊含义,所以后边不能用,例如root.example.com.则一个邮箱地址root@example.com.。IN表示后面的数据使用的是INTERNET标准,SOA表示资源记录类型,括号中是5个数据,分别表示serial、refresh、retry、expire、minimum的值。
serial:更新序列号。用于标示数据库的变换,可以在10位以内,如果存在辅助DNS服务器,建议每次更新完数据库,进行修改,可以使用格式yyyymmddnn表示,如2024041301,表示2024年4月13日第一次修改。
refresh:刷新时间。辅助DNS服务器根据此时间周期性的检查主DNS服务器的序列号是否改变,如果改变,则更新自己的数据库,默认为1天。
retry:重试时间。辅助DNS服务器从主DNS服务器更新数据库失败后,在此时间后重新尝试,默认为为1小时。
expire:过期时间。辅助DNS服务器在此时间内没能从主DNS服务器更新数据库,则该辅助DNS服务器上的数据库 会被认为无效,不再响应查询请求,为一周。
minimum:设置无效地址解析记录(该数据库中不存在的地址)默认缓存时间。最少缓存时间为3小时。
(3)第三行和第四行定义了当前域的两个名称服务器,即NS记录,至少定义一个。
(4)第五行定义了一条MX记录,其中10用于表示优先级,数字越小,优先级越高。
(5)第六行到第十行定义了5条A记录,用于正向解析。记录名称为FQDN名,也可以使用主机名代替。
(6)最后三行定义的是CNAME记录。
3、反向解析区配置文件
反向解析区数据库配置文件可以实现IP地址到域名的映射,主要定义了该区内的PTR记录,配置时可以从模板文件/var/named/named.loopback复制后进行修改。
示例文件:
$TTL 1D
@ IN SOA @ root.example.com. (
2024041301 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS master.example.com.
@ IN NS slaver.example.com.
111 IN PTR master.example.com.
112 IN PTR slaver.example.com.
3.4 配置文件语法检查
配置文件都配置好之后,可以使用BIND提供的语法检查命令检查语法是否正确,当没有错误后,使用systemctl命令重启named服务,或者使用rndc reload命令重载配置。
1、检查查主配置文件语法
要检测 BIND 的主配置文件named.conf文件的语法是否正确,可以使用命令named-checkconf。
例如
[root@server ~]# named-checkconf /etc/named.conf
2、检查区域数据库文件
使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称。
语法:
named-checkzone [选项] [区域名] [区域文件名]
例如
[root@server]# named-checkzone example.com /var/named/example.com.zone
zone example.com/IN: loaded serial 2024041301
OK
四、DNS测试工具
4.1 nslookup
nslookup(Name Server Lookup)是一种网络管理命令,用于从 DNS 服务器查询域名、IP 或其他 DNS 记录信息。
nslookup 有两种工作模式:交互模式和非交互模式。
1、非交互模式
在非交互模式下,针对一个主机或域名执行单次查询,格式如下。
nslookup 域名或IP地址
例如:
[root@server ~]# nslookup www.baidu.com
Server: 192.168.200.100
Address: 192.168.200.100#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 36.155.132.3
Name: www.a.shifen.com
Address: 36.155.132.76
2、交互模式
在交互模式下,用户可以向域名服务器查询各类主机、域名的信息或者显示一个域的主机列表。在命令行下输入“nslookup”回车后,就进入交互模式。
下面举例说明nslookup的用法
[root@server ~]# nslookup
> server
Default server: 192.168.200.100
Address: 192.168.200.100#53
>
> www.baidu.com
Server: 192.168.200.100
Address: 192.168.200.100#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 36.155.132.76
Name: www.a.shifen.com
Address: 36.155.132.3
>
> set type=MX
> sina.com.cn
Server: 192.168.200.100
Address: 192.168.200.100#53
Non-authoritative answer:
sina.com.cn mail exchanger = 10 freemx3.sinamail.sina.com.cn.
sina.com.cn mail exchanger = 10 freemx1.sinamail.sina.com.cn.
sina.com.cn mail exchanger = 10 freemx2.sinamail.sina.com.cn.
Authoritative answers can be found from:
. nameserver = c.root-servers.net.
. nameserver = j.root-servers.net.
. nameserver = g.root-servers.net.
. nameserver = e.root-servers.net.
. nameserver = b.root-servers.net.
. nameserver = a.root-servers.net.
. nameserver = d.root-servers.net.
. nameserver = h.root-servers.net.
. nameserver = m.root-servers.net.
. nameserver = k.root-servers.net.
. nameserver = f.root-servers.net.
. nameserver = l.root-servers.net.
. nameserver = i.root-servers.net.
> exit
4.2 host
在Linux系统中,host命令用于进行域名查询。它允许用户通过输入域名或IP地址,获取与之相关的信息。
基本语法:
host [选项] 域名或IP地址
-
-a:显示所有的查询结果,包括与域名关联的IP地址、主机名等。
-
-t:指定查询类型,如A、AAAA、CNAME、MX等。
-
-c:显示域名的相关信息,如更新时间、注册人等。
-
-v:显示详细的查询过程和结果。
例如:
#查询域名对应的 IP 地址。
host www.baidu.com
#显示执行域名查询的详细信息。
host -v www.baidu.com
#查询域名的 MX 信息。
host -t MX www.baidu.com
#显示详细的 DNS 信息。
host -a www.baidu.com
#用谷歌的 DNS(8.8.8.8)来查百度主机的 IP。
host www.baidu.com 8.8.8.8
4.3 dig
dig 是一个DNS 查询工具,它会打印出 DNS 服务器的回应,主要用来从 DNS 服务器查询主机地址信息。
下面看几个简单用法示例,关于dig的更详细的用法,请大家自行翻阅资料。
1、查询对应域名的 IP
[root@server ~]# dig www.baidu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22989
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 63 IN CNAME www.a.shifen.com.
www.a.shifen.com. 243 IN A 36.155.132.76
www.a.shifen.com. 243 IN A 36.155.132.3
;; AUTHORITY SECTION:
. 86783 IN NS m.root-servers.net.
. 86783 IN NS l.root-servers.net.
. 86783 IN NS g.root-servers.net.
. 86783 IN NS e.root-servers.net.
. 86783 IN NS i.root-servers.net.
. 86783 IN NS j.root-servers.net.
. 86783 IN NS k.root-servers.net.
. 86783 IN NS c.root-servers.net.
. 86783 IN NS a.root-servers.net.
. 86783 IN NS d.root-servers.net.
. 86783 IN NS b.root-servers.net.
. 86783 IN NS f.root-servers.net.
. 86783 IN NS h.root-servers.net.
;; Query time: 62 msec
;; SERVER: 192.168.200.100#53(192.168.200.100)
;; WHEN: 六 4月 13 22:32:59 CST 2024
;; MSG SIZE rcvd: 312
2、对目标 IP 进行反向解析查询
[root@server ~]# dig -x 192.168.200.100
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -x 192.168.200.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9800
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.200.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
100.200.168.192.in-addr.arpa. 86400 IN PTR master.example.com.
;; AUTHORITY SECTION:
200.168.192.in-addr.arpa. 86400 IN NS slaver.example.com.
200.168.192.in-addr.arpa. 86400 IN NS master.example.com.
;; ADDITIONAL SECTION:
master.example.com. 86400 IN A 192.168.200.100
slaver.example.com. 86400 IN A 192.168.200.112
;; Query time: 0 msec
;; SERVER: 192.168.200.100#53(192.168.200.100)
;; WHEN: 六 4月 13 22:36:09 CST 2024
;; MSG SIZE rcvd: 156
3、查询目标域名的 MX 记录
[root@server ~]# dig -t MX sina.com.cn
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t MX sina.com.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57476
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sina.com.cn. IN MX
;; ANSWER SECTION:
sina.com.cn. 406 IN MX 10 freemx3.sinamail.sina.com.cn.
sina.com.cn. 406 IN MX 10 freemx1.sinamail.sina.com.cn.
sina.com.cn. 406 IN MX 10 freemx2.sinamail.sina.com.cn.
;; AUTHORITY SECTION:
. 86519 IN NS b.root-servers.net.
. 86519 IN NS m.root-servers.net.
. 86519 IN NS i.root-servers.net.
. 86519 IN NS e.root-servers.net.
. 86519 IN NS c.root-servers.net.
. 86519 IN NS a.root-servers.net.
. 86519 IN NS l.root-servers.net.
. 86519 IN NS d.root-servers.net.
. 86519 IN NS f.root-servers.net.
. 86519 IN NS j.root-servers.net.
. 86519 IN NS k.root-servers.net.
. 86519 IN NS h.root-servers.net.
. 86519 IN NS g.root-servers.net.
;; Query time: 52 msec
;; SERVER: 192.168.200.100#53(192.168.200.100)
;; WHEN: 六 4月 13 22:37:23 CST 2024
;; MSG SIZE rcvd: 332
4、查询目标域名的 A 记录
[root@server ~]# dig -t a www.example.com
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t a www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6264
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 86400 IN CNAME master.example.com.
master.example.com. 86400 IN A 192.168.200.100
;; AUTHORITY SECTION:
example.com. 86400 IN NS master.example.com.
example.com. 86400 IN NS slaver.example.com.
;; ADDITIONAL SECTION:
slaver.example.com. 86400 IN A 192.168.200.112
;; Query time: 0 msec
;; SERVER: 192.168.200.100#53(192.168.200.100)
;; WHEN: 六 4月 13 22:38:16 CST 2024
;; MSG SIZE rcvd: 132