首页  /  DNS 服务  /  正文

DNS 从服务器、子域与转发

DNS 服务 2026-10-01📖 13 分钟👁 —
🔧 运维进阶 · 常用服务搭建第 6 / 8 页12345678📖 完整导航 →

一、配置流程

有的服务器会通过反向解析判断发送方是否是恶意服务器,所以反向解析在某些情况下是必须的

同理,反向解析 IP 也是从小到大的,172.16.100. --> 100.16.172.in-addr.arpa.

其中多出了 in-addr 和 arpa,这是固定的格式。

域名层次图上手写标注的反向解析层级顺序

这样的写法(不写最后一位 IP)是因为反向解析的不是一个 IP,是一个域。

在配置文件中有反向区域的格式 /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.

二、从服务器的搭建和配置

正向区域已经建立起来了,数据库(zone)也配置完成,现在需要配置保障措施: 假设服务器挂了,网站会解析失败。

由于从服务器是从主服务器同步数据的,所以基本不用手写,只需要再新搭建的从属服务器上配置 节点信息,配置信息格式如图,注意分号的写法:

从服务器 zone 配置的格式,type slave 加 masters 再加 file

从服务器配置服务:

  1. yum -y install bind ; systemctl enable --now named
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
  1. vim /etc/named.conf 将 options 的端口和允许请求地址注释掉
  1. vim /etc/named.rfc1912.zones 直接写入上图格式,配置信息如下
zone "magedu.org" IN {
        type slave;
        masters { 192.168.88.128; };
        file "slaves/magedu.org.zone.slave";
};

注意分号的写法哦。

slave 文件内容会从主服务器复制,但是加密了不能直接看。

  1. 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 服务的搭建


三、从属服务器的更新

这是因为没有修改更大的版本号,因为从属服务器比较的是版本号

需要说明同步的推和拉,拉取之前说过了,推就是主通知从,只要一变立刻通知, 两种情况是可以同时存在的。

需要写入一条 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 从属更好


四、实现子域

DNS 是分层解析的,所以有父域和子域,一般来说子域和父域是分别独立管理的, 都是单独搭建的 DNS 服务器,问题在于如何创建子域的 DNS 服务器。

注意从属 DNS 服务器和子域的 DNS 服务器是有区别的。

下面来搭建 sh.magedu.org 这个子域的 DNS 服务器。

这时候需要再开一台机器来进行演示,懒得开了,直接记笔记了。

而是子域名,可以简写,会自动补全

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 服务失败,所以需要排错:

  1. 父域查看 ns 记录 dig ns3.magedu.org 可以查到 IP,但是写 sh 就不行,

主 DNS 的 zone 文件确实配置好了,是因为子域数据库的权限有问题 640, 并且用户和组都是 root,当前 DNS 以 named 账号身份运行,zone 文件没给 named 权限, 查看 named 服务状态,可以看到一些报错,爆红

named 服务状态里 sh.magedu.org.zone 加载失败的报错
chmod 644 [文件路径]`修改权限或者修改所属组`chgrp named [路径]
systemctl restart named

dig 子域 在从属 DNS 测试子域,这时候就可以了(还不行就看防火墙是否开了端口):

dig 出 www.sh.magedu.org 的 CNAME 和 A 记录

范例如下:

父子域实验的拓扑,client、父域 DNS、子域 DNS 和两台 web
子域实验的环境要求,五台主机
# 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 服务只是顺带的:

在子域的 web 服务器上装 httpd 并写测试首页

五、实现 DNS 转发(缓存)服务器

如果不期望在根找,在指定 DNS 服务器上找也是可以的

DNS 转发的示意图,根、指定服务器、转发、DNS

因此,必然会用到总部的 DNS。不论是为了分担流量压力, 还是基于"既然都到总部上网,直接搭建内部的缓存不就好了"的考虑, 搭建 DNS 缓存服务器的需求就产生了

北京和上海各有一台 DNS,互相转发查询

本地没有在总部找,总部还是没有

  1. 没有就算了,告诉客户端没有
  2. 本地 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,这种情况就会解析失败。