一、配置流程
- 实现反向域名解析(IP 转名称)需要额外配置 zone 数据库,
有的服务器会通过反向解析判断发送方是否是恶意服务器,所以反向解析在某些情况下是必须的
- 我们输入一个域名访问时,是从小到大的,比如
www->sina->com,
同理,反向解析 IP 也是从小到大的,172.16.100. --> 100.16.172.in-addr.arpa.
其中多出了 in-addr 和 arpa,这是固定的格式。

这样的写法(不写最后一位 IP)是因为反向解析的不是一个 IP,是一个域。
- 例:
88.168.192.in-addr.arpa
在配置文件中有反向区域的格式 /etc/named.rfc1912.zones。
默认的反向区域配置:
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
可以在此基础上修改或者抄写一份:
zone "88.168.192.in-addr.arpa" IN {
type master;
file "192.168.88.zone"; #文件名这样表示即可
}; #当然创建的也是这个名字
区域数据库需要放在 /var/named 目录下,直接 vim 192.168.88.zone 进行编辑, 格式和 named.localhost 是差不多的。
如果记录和上一条的值是一样的就可以省略这个值。
把 IP 解析为域名的 PTR 记录,其中写的域名可以是一个不存在的。
可以只写 IP 的最后一位表示整个 IP(如果不省略就 倒着写IP.in-addr.arpa, 这里不再是一个网段了,写具体的 IP,毕竟解析的是具体的 IP,一般不会这样的,直接简写就行)。
- 反向区域文件的域名要都写全,不然自动补全的后缀是
88.168.192.in-addr.arpa. 这样的
假设我们想解析两个 IP,7 和 123:
$TTL 1D
@ IN SOA ns1.magedu.org. admin.magedu.org. (1 12H 10M 3D 1D )
NS ns1.magedu.org.
7 PTR websrv.magedu.com.
123 PTR mailsrv.magedu.com.
named-checkzone [反向IP域名] [文件名] 检查语法:
named-checkzone 88.168.192.in-addr.arpa 192.168.88.zone
named-checkzone 88.168.192.in-addr.arpa 192.168.88.zone
zone 88.168.192.in-addr.arpa/IN: loaded serial 1
OK
rndc reload 如果结果是加载失败,可能是配置文件 rfc 出错了,查看 named 的服务状态会有爆红, 定位到那一行查看具体情况即可,如果 rndc 成功了就 restart 服务。
检查能否反向解析 dig -t ptr 7.88.168.192.in-addr.arpa, -t 表示反向解析,后面跟着解析地址的类型:
;; ANSWER SECTION:
7.88.168.192.in-addr.arpa. 86400 IN PTR websrv.magedu.com.
再看 123 的:
;; ANSWER SECTION:
123.88.168.192.in-addr.arpa. 86400 IN PTR mailsrv.magedu.com.
- 按照上面那样写是很麻烦的,所以一般不用
-t来解析,用-x,dig -x IP
二、从服务器的搭建和配置
正向区域已经建立起来了,数据库(zone)也配置完成,现在需要配置保障措施: 假设服务器挂了,网站会解析失败。
由于从服务器是从主服务器同步数据的,所以基本不用手写,只需要再新搭建的从属服务器上配置 节点信息,配置信息格式如图,注意分号的写法:

从服务器配置服务:
yum -y install bind ; systemctl enable --now named
- 需要开启 DNS 的 53 端口 tcp/udp 才能使配置文件网段的其他主机通过 DNS 服务器解析地址
- 由于 os7 停止维护,需要换源才能安装
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum repolist
vim /etc/named.conf将 options 的端口和允许请求地址注释掉
named-checkconf
vim /etc/named.rfc1912.zones直接写入上图格式,配置信息如下
zone "magedu.org" IN {
type slave;
masters { 192.168.88.128; };
file "slaves/magedu.org.zone.slave";
};
注意分号的写法哦。
slave 文件内容会从主服务器复制,但是加密了不能直接看。
rndc reload
测试能否解析 dig baidu.com @192.168.88.130。
由于防火墙问题可能是不通的,开一下端口即可:
firewall-cmd --add-service=dns --permanent
firewall-cmd --reload
firewall-cmd --list-all | grep -E "53|dns"
以上就完成了从 DNS 服务的搭建
三、从属服务器的更新
- 主服务器修改任意 A 记录,然后看从服务器的 zone 数据库,并没有同步,
这是因为没有修改更大的版本号,因为从属服务器比较的是版本号
需要说明同步的推和拉,拉取之前说过了,推就是主通知从,只要一变立刻通知, 两种情况是可以同时存在的。
- 即使主动改变版本号(推)还是不变,因为主不知道从属服务器的存在,需要主动配置,
需要写入一条 NS 记录和解析 NS 的 A 记录表明从属服务器
@ IN NS ns1
@ IN NS ns2
ns1 IN A 192.168.88.128
ns2 IN A 192.168.88.130
ls /var/named/slaves -l 查看文件/目录更新时间,确认是否更新了。
或者 dig/host 查看改变的内容是否真的改变。
安全问题
- 搭建好从属服务器,重启服务第一次就能抓取主服务器的数据库,但是内容是加密的
(配置从属默认不需要主服务器确认,而且老版本来配是不会加密的)
甚至不需要配置从属就能看见 dig -t axfr magedu.org @DNSIP。
- 所以要禁止这个默认配置,在主服务器上权限控制
在 /etc/named.conf 的 options 块加入配置:
allow-transfer { 从属服务器IP; };
options {
listen-on port 53 { localhost; };
allow-query { localhost;192.168.88.0/24; };
allow-transfer { 192.168.88.130; };
rndc reload
新的问题
- 抓不到主 DNS 可以抓从属的,所以从属也要配置
allow-transfer { none; };,禁止抓取,如果有自己的从属就同理配置,
一般不会嵌套从属的,因为直接从主 DNS 从属更好
rndc reload
四、实现子域
DNS 是分层解析的,所以有父域和子域,一般来说子域和父域是分别独立管理的, 都是单独搭建的 DNS 服务器,问题在于如何创建子域的 DNS 服务器。
注意从属 DNS 服务器和子域的 DNS 服务器是有区别的。
下面来搭建 sh.magedu.org 这个子域的 DNS 服务器。
这时候需要再开一台机器来进行演示,懒得开了,直接记笔记了。
- 在父域的 DNS zone 文件添加 NS 记录和 A 记录,ns3 域名部分不再是 @,
而是子域名,可以简写,会自动补全
sh NS ns3
ns3 A IP
接下来在子域建立 DNS 服务,装库启动服务,编辑 named.conf,写入 allow-transfer。
编辑 rfc 文件,写入上海的配置:
zone "sh.magedu.org" {
type master;
file "magedu.org.zone";
};
接下来就是写 zone 文件了,由于格式是相似的,可以直接复制主 DNS 的:
scp /var/named/magedu.org.zone 子DNSIP:/var/named/sh.magedu.org.zone
scp=Secure Copy Protocol(安全复制协议)——通过 SSH 在服务器之间安全地复制文件。
接着编辑文件,修改记录,只有 ns1 的 NS 记录和 A 记录,而且 ns1 解析为子 DNS 的地址, 现在完整的名字是 www.sh.magedu.org:
$TTL 1D
@ IN SOA ns1 admin.magedu.org. (
20200530 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns1
ns1 IN A 10.0.0.28
www IN CNAME websrv
websrv IN A 10.0.0.66
rndc reload
现在一共有三个 DNS:主 DNS,从属 DNS,子域 DNS。
想要测试子域搭建是否成功,在从属 DNS dig www.sh.magedu.org。
如果是目前状态,会失败 servfail 服务失败,所以需要排错:
- 父域查看 ns 记录
dig ns3.magedu.org可以查到 IP,但是写sh就不行,
主 DNS 的 zone 文件确实配置好了,是因为子域数据库的权限有问题 640, 并且用户和组都是 root,当前 DNS 以 named 账号身份运行,zone 文件没给 named 权限, 查看 named 服务状态,可以看到一些报错,爆红

chmod 644 [文件路径]`修改权限或者修改所属组`chgrp named [路径]
systemctl restart named
dig 子域 在从属 DNS 测试子域,这时候就可以了(还不行就看防火墙是否开了端口):

范例如下:


# 7.2.3.1 在父域DNS服务器上实现主magedu.org域的主DNS服务
yum install bind -y
vim /etc/named.conf
# 注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
# 只允许从服务器进行区域传输
allow-transfer { 从服务器IP; };
dnssec-enable no;
dnssec-validation no;
vim /etc/named.rfc1912.zones
# 加上这段
zone "magedu.org" {
type master;
file "magedu.org.zone";
};
cp -p /var/named/named.localhost /var/named/magedu.org.zone
# 如果没有-p,需要改权限:chgrp named magedu.org.zone
vim /var/named/magedu.org.zone
$TTL 1D
@ IN SOA master admin.magedu.org. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS master
IN NS shanghains
master IN A 192.168.8.8
shanghains IN A 192.168.8.18
# 和主DNS配置的区别就在于加了子DNS的NS记录、A记录
websrv IN A 192.168.8.7
www IN CNAME websrv
systemctl start named # 第一次启动服务
rndc reload # 不是第一次启动服务
接着就是在子 DNS 装软件,修改配置:
# 7.2.3.2 实现子域的DNS服务器
yum install bind -y
vim /etc/named.conf
# 注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
allow-transfer { none; };
vim /etc/named.rfc1912.zones
zone "shanghai.magedu.org" {
type master;
file "shanghai.magedu.org.zone";
};
cp -p /var/named/named.localhost /var/named/shanghai.magedu.org.zone
# 如果没有-p,需要改权限:chgrp named shanghai.magedu.org.zone
# 之前复制zone的时候是连带权限复制了,这里没有复制权限,需要单独配置
$TTL 1D
@ IN SOA master admin.magedu.org. (
2019042214 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS master
master IN A 192.168.8.18
websrv IN A 192.168.8.7
www IN CNAME websrv
systemctl start named # 第一次启动服务
rndc reload # 不是第一次启动服务
至于 HTTP 服务只是顺带的:

五、实现 DNS 转发(缓存)服务器
- 如果解析一个不存在的域名,本地的 DNS 没有那就在互联网上找(先到根),
如果不期望在根找,在指定 DNS 服务器上找也是可以的
- 下图是用 processon 这个网站绘制的

- 关于分公司和总部,可能是这样的:为了安全,分公司不会独立上网,流量会先过总部,
因此,必然会用到总部的 DNS。不论是为了分担流量压力, 还是基于"既然都到总部上网,直接搭建内部的缓存不就好了"的考虑, 搭建 DNS 缓存服务器的需求就产生了
- 就像下图一样,在分公司的本地搭建缓存服务器,要上网就通过缓存转发到总部

- 以上配置很简单,只需要增加一条配置就可以,值得区分的是转发的两种逻辑,
本地没有在总部找,总部还是没有
- 没有就算了,告诉客户端没有
- 本地 DNS(缓存 DNS)自己在互联网上找
所以配置需要强调的就是转发逻辑了。
全局转发(对所有域),肯定是在缓存 DNS 上配置的:
Options { # first和only二选一
forward first|only; # first就是转发到目标服务器,没有就去互联网
forwarders { ip; }; # only就是转发到目标服务器,没有就算了
};
特定区域转发(对指定域),仅转发对特定区域的请求,比全局转发优先级高。
用的不多
zone "ZONE_NAME" IN {
# 要写上指定的域
type forward; # 类型是和之前的master/slave不同的
forward first|only;
forwarders { ip; };
};
以上就配置好了缓存 DNS。
装服务,改配置文件 + 设置转发,重启服务。
测试(需要三台机器,主 DNS、客户机、缓存 DNS)。
在客户机上指定缓存 DNS 解析百度,缓存时没有的,配置了 first,会在主 DNS 找, 没有就去网上,成功解析了就是能转发。
再次验证:停止主 DNS 的服务,rndc --help 可以找到常用选项 rndc stop 停止服务, 单是这样是不行的,缓存 DNS 可能有缓存在,再清理缓存去验证 rndc flush。
再次指定缓存 DNS 解析百度,等待一段时间返回了地址,说明去网上查了, 返回结果也可能补上一些后缀,把转发模式改为 only,这种情况就会解析失败。