首页  /  DNS 服务  /  正文

主 DNS 区域的实现

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

一、A 记录 & SOA 记录 & NS 记录

基本功能的实现介绍如何配置,这一块介绍功能。

准备建立一个主域,其下的子域都计划让 DNS 管理,还需要创建一个和主域相关的数据库, 记录域名和 IP 的对应关系(域名),该数据库叫区域数据库 (实际上是文本文件,不属于任何类型的数据库,就是文本文件,只是称作数据库而已)。

内容要按照一定的格式来写(资源记录格式):

资源记录的格式,name、TTL、IN、rr_type、value
域名      缓存时间  IN  A/AAAA     IP地址

造成错误配置:

域名不加点,被自动补成 www.magedu.org.magedu.org.

86400 是一天的时间。

该文件的第一行是起始授权记录(SOA),描述当前数据库对应的域和相关信息,如图:

SOA 记录开头的写法

值:包括维护当前域的 DNS 服务器名称(自己取名,比如 ns1.magedu.org., 只要有域名都要有点,ns 表示 name server,即 DNS 服务器,清晰表示了由 ns1 来维护当前域), 如果 DNS 服务在当前机器上就一台,会有单点失败问题。

单点失败就是:这台 DNS 服务器挂了,整个网络都不能解析域名了。

SOA 里的 ns1.magedu.org. 要配一条对应的 A 记录

值还包括管理员邮箱,唯一注意的就是用 . 来替代 @,因为它表示域名。

值还包括版本名称(数字表示),表示更新次数,比如 20264081621, 要括起来具体年月日的具体时间(1621,下午 4 点 21 分),数据库更新后就要修改该值。

还包括主服务器,为了解决单点失败问题,而创建的备用服务器(从服务器), 和主服务器是数据一致的,同步数据的机制(肯定是自动同步的)分为推/拉, 主服务器推,从服务器拉(定时拉,根据固定的时间间隔)。

间隔时间到了,从服务器就比较版本号决定是否更新数据(一致不更新,不一致会更新), 所以即使内容更新但是版本号不变,从服务器也不会更新的。

可以设置从服务器数据失效的时间,比如 1D,失效了就不对外提供服务了

可以定义一个缓存有效期,存放不存在的记录,这个值可以是 12h,下次再查直接返回不存在即可

完整的 SOA 记录的例子 @ IN SOA ns1.magedu.org. admin.magedu.org. (202005291417 1h 10m 1D 12h)

再次强调 SOA 记录是 DNS 数据库/文本文件的第一条记录。

如果写的规范,如图:

规范的 SOA 记录,后面用注释标出序列号、刷新、重试、过期、否定 TTL

ns 记录

表示特殊资源的记录类型,体现谁是当前域的服务器 (和 SOA 表示的不同,SOA 只写了主,NS 会写其所有的从属)。

格式也是基本的 5 项,区别在于值(value)的格式。

下图没有写域名后缀,会自己补全。

比如 @ IN NS ns1

NS 记录,以及解析 ns1、ns2 的 A 记录

以上,是区域数据库的必备格式,最少有三条记录(只有一个 DNS 服务器), SOA、NS 和一条 A 记录解析 DNS 服务器。


二、建立数据库文件(zone)

可以不是 zone,但这样是默认习惯

可以复制来用,cp -p 这个参数可以保留旧的(-a 也可以), named 账号是安装 DNS 软件自动生成的(id named 可以查看), 他是 false 类型账号,和 nologin 类型一样,不允许直接登录,给服务使用的

systemctl status named 可以看到启动 DNS 服务是让 named 账号来运行的,其中 -u 就是用指定账户运行:

/usr/sbin/named -u named -c /etc/named.conf
systemctl status named,进程是用 -u named 跑的

说了这么多,意思是 cp /var/named 中的文件的时候,至少给 named 账户 r 的权限, named 账户在 named 组,只要给 named 组权限就行。

cp -p 之后权限和属组都跟模板一致

接下来就是修改文件了,直接 vim magedu.org.zone 显示默认配置:

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1

SOA 的管理员邮箱只是摆设而已,并不是真的,属于格式要求。

SOA 记录在管理员邮箱声明了域名,后续才会自动补全域名。

配置 SOA 记录、解析主 DNS 的 A 记录、NS 记录,三个必要记录:

$TTL 1D
@       IN SOA  ns1.magedu.org. admin.magedu.org.  (
                                        20260409        ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
ns1     IN  A   192.168.88.128
@       IN  NS  ns1 #建议A记录写在NS上面,不会报错

在 linux 中有客户端测试工具,用来测试名称和 IP 的解析,rpm -ql bind-utils。

其中有 /usr/bin/dig、/usr/bin/host 等测试工具,其中 host 就是要用的。

而且可以看 NS 记录,直接看 DNS 服务器

dig 的完整输出,能看到 ANSWER 段和 AUTHORITY 段的 NS

上述 www 确实是 A 记录,但是对于大网站就不是这样了,往往叫别名记录。

比如 dig www.jd.com,经过别名来回切换,找到 IP:

;; ANSWER SECTION:
www.jd.com.             120     IN      CNAME   www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com. 60 IN      CNAME   www.jd.com.s.galileo.jcloud-cdn.com.
www.jd.com.s.galileo.jcloud-cdn.com. 60 IN CNAME wwwv6.jcloudimg.com.
wwwv6.jcloudimg.com.    60      IN      A       111.31.22.3

我们可以这样模仿,如图配置 CNAME:

CNAME 记录 www 指向 websrv,websrv 有两个 A 记录

客户端操作

在 Apache 的默认网站根目录下创建一个测试页面。

curl 的时候返回的域名会是相同的,但是 IP 不同


三、zone 文件和服务器建立连接

刚才只是创建文件、配置文件。

现在要让 DNS 服务器知道这个文件 --> 配置文件 /etc/named.conf

其中 zone 区域的默认配置,可以通过修改 zone 配置好:

zone "." IN {
        type hint;
        file "named.ca";
};

放在 named.conf 中 zone 区域下给出的 /etc/named.rfc1912.zones 文件中

数据库是什么(zone 文件),格式照着给出的例子写,或者在其基础上修改即可, 比如给出了这个例子

zone "localhost.localdomain" IN {
        type master; #表示主DNS服务器
        file "named.localhost";
        allow-update { none; };
};

可以修改为:

zone "magedu.org" IN {
        type master; #表示主DNS服务器
        file "magedu.org.zone"; #不需要写路径
};

如果 magedu.org 写为 www.magedu.org 就不是域名了,是主机名, DNS 是负责解析一个域,不是解析单个主机的。

比如下面的就爆出错误了 QwQ

named-checkzone magedu.org /var/named/magedu.org.zone
dns_rdata_fromtext: /var/named/magedu.org.zone:2: near '202604091906': out of range#值太大了
zone magedu.org/IN: loading from master file /var/named/magedu.org.zone failed: out of range
zone magedu.org/IN: not loaded due to errors.

配置正确是这样的输出:

named-checkzone magedu.org /var/named/magedu.org.zone
zone magedu.org/IN: loaded serial 20260409
OK

最后 rndc reload。

至此,DNS 服务就配好了。

必备三个记录:

类型示例说明
SOA@ IN SOA ns1.magedu.org. admin.magedu.org. (序列号 刷新 重试 过期 最小TTL)起始授权记录
NS@ IN NS ns1.magedu.org.权威服务器声明
Ans1 IN A 192.168.88.128权威服务器的 IP

常用检测命令:

命令作用
named-checkconf检查 /etc/named.conf 语法
named-checkzone 域名 zone文件路径检查 zone 文件语法
rndc reload重载配置(不中断服务)
dig @DNS_IP 域名测试 DNS 解析
host 域名 DNS_IP简单测试

如何测试

在客户机 curl 一个域名,返回了页面就是成功了(前提是 zone 的 A 记录有这个)。

如果刚才配置了 CNAME 和 www 解析,就会是这样的效果:

curl 同一个域名,两次返回的页面来自不同 IP

做到了多台机器提供一个服务

其实一直 ping 一个域名也是能看出来的,返回的 IP 不一样。

ping/curl 不是专门测试 DNS 的,host/dig 才是专业的, 客户端要测试软件需要安装 bind-utils:yum -y install bind-utils

bilibili.com has address 8.134.50.24
bilibili.com has address 47.103.24.173
bilibili.com has address 119.3.70.188
bilibili.com has address 139.159.241.37
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
字段含义
aa(Authoritative Answer)从权威 DNS 返回
qr查询/响应标志
rd期望递归查询
ra支持递归查询

想要测试 DNS 服务不必频繁地修改配置文件,这个语法可以直接测试(测试指定 DNS 能否成功解析域名)

表示测试 IP,接着输入 [域名] 回车,就会返回结果:

C:\Users\z1664>nslookup
默认服务器:  UnKnown
Address:  10.201.170.180

> server 13.37.58.163
默认服务器:  ec2-13-37-58-163.eu-west-3.compute.amazonaws.com
Address:  13.37.58.163

> bilibili.com
服务器:  ec2-13-37-58-163.eu-west-3.compute.amazonaws.com
Address:  13.37.58.163

名称:    bilibili.com
Addresses:  139.159.241.37
          8.134.50.24
          47.103.24.173
          119.3.70.188
C:\Users\z1664>nslookup www.baidu.com
服务器:  UnKnown
Address:  10.201.170.180

非权威应答:
名称:    www.a.shifen.com
Addresses:  2409:8c04:100a:302b:0:ff:b09a:7b06
          2409:8c04:100a:303a:0:ff:b073:4d40
          36.144.42.114
          36.144.42.93
Aliases:  www.baidu.com

配置泛域名,用户输入错误也可访问。

在 zone 区域数据库添加 A 记录后 rndc reload:

$TTL 1D
@       IN SOA  ns1.magedu.org. admin.magedu.org.  (
                                        20260409        ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
ns1     IN  A   192.168.88.128
@       IN  NS  ns1

www     IN  CNAME websrv
websrv  IN  A   192.168.88.128
websrv  IN  A   192.168.88.130

*       IN  A   192.168.88.128 #magedu.org前面是任何东西都可以
@       IN  A   192.168.88.128 #可以直接访问magedu.org

比如 admin@magedu.org 写作 admin.magedu.org

MX 记录标明当前域的邮件服务器,进而实现邮件的转发,同样可以写入 zone 数据库里

所以需要额外的 A 记录解析它 [邮件服务器名] IN A IP

优先级,数字越小,优先级越高。

示例:

@            IN  MX 10  mailsrv
@            IN  MX 20  mailsrv2
mailsrv      IN  A      IP
mailsrv2     IN  A      IP
dig -t mx bilibili.com | grep MX
;bilibili.com.                  IN      MX
bilibili.com.           554     IN      MX      15 bilibili-com.mail.protection.partner.outlook.cn.
bilibili.com.           554     IN      MX      10 mgw.bilibili.co.

有的公司的邮件服务是第三方的,比如腾子的。

相当于下面这样,其中 HOST 的名字是随便改的,只是名字而已,最后的 IP 根据具体情况配置

HOST1  IN  A  1.2.3.1
HOST2  IN  A  1.2.3.2
...
HOST254  IN  A  1.2.3.254

常用记录类型:

类型作用示例
A域名 → IPv4www IN A 1.2.3.4
AAAA域名 → IPv6www IN AAAA ::1
CNAME别名www IN CNAME websrv
MX邮件服务器@ IN MX 10 mailsrv
NS权威服务器@ IN NS ns1
PTRIPv4 → 域名(反向)1 IN PTR gw.magedu.org.
SOA起始授权记录zone 第一条
*       IN  A   192.168.88.128   # 匹配任意前缀
@       IN  A   192.168.88.128   # 匹配裸域