一、A 记录 & SOA 记录 & NS 记录
基本功能的实现介绍如何配置,这一块介绍功能。
准备建立一个主域,其下的子域都计划让 DNS 管理,还需要创建一个和主域相关的数据库, 记录域名和 IP 的对应关系(域名),该数据库叫区域数据库 (实际上是文本文件,不属于任何类型的数据库,就是文本文件,只是称作数据库而已)。
内容要按照一定的格式来写(资源记录格式):

域名 缓存时间 IN A/AAAA IP地址
- 域名最后一定要加
.,否则会自动补上域名,希望自动补就不敲.
造成错误配置:

www 86400 IN A 1.1.1.1这就是一条完整的记录
86400 是一天的时间。
该文件的第一行是起始授权记录(SOA),描述当前数据库对应的域和相关信息,如图:

- name 选项是域名比如
magedu.org.,也可以写 @ - TTL 选项,可以写数字也可以定义一个变量
$TTL 86400,以后也不用写出了 - IN 还是一样的
- 记录类型是 SOA
值:包括维护当前域的 DNS 服务器名称(自己取名,比如 ns1.magedu.org., 只要有域名都要有点,ns 表示 name server,即 DNS 服务器,清晰表示了由 ns1 来维护当前域), 如果 DNS 服务在当前机器上就一台,会有单点失败问题。
单点失败就是:这台 DNS 服务器挂了,整个网络都不能解析域名了。
- 要配套加一个 A 记录应对单点失败,解析成对应的 IP 地址

值还包括管理员邮箱,唯一注意的就是用 . 来替代 @,因为它表示域名。
值还包括版本名称(数字表示),表示更新次数,比如 20264081621, 要括起来具体年月日的具体时间(1621,下午 4 点 21 分),数据库更新后就要修改该值。
还包括主服务器,为了解决单点失败问题,而创建的备用服务器(从服务器), 和主服务器是数据一致的,同步数据的机制(肯定是自动同步的)分为推/拉, 主服务器推,从服务器拉(定时拉,根据固定的时间间隔)。
- 拉的时间跟在版本后面即可(在版本名称括号内,比如
1h,不写单位就是默认s)
间隔时间到了,从服务器就比较版本号决定是否更新数据(一致不更新,不一致会更新), 所以即使内容更新但是版本号不变,从服务器也不会更新的。
- 拉取失败会触发机制:每隔固定时间再次尝试拉取,这个值跟在拉取时间的后面就行,比如
10m十分钟 - 如果总是拉取失败,比如拉了一天都失败了,主服务器改变大,担心从服务器数据太旧了,
可以设置从服务器数据失效的时间,比如 1D,失效了就不对外提供服务了
- 假设用户访问了不存在的记录,会查一遍整个库,会消耗资源,不能让他反复查,
可以定义一个缓存有效期,存放不存在的记录,这个值可以是 12h,下次再查直接返回不存在即可
完整的 SOA 记录的例子 @ IN SOA ns1.magedu.org. admin.magedu.org. (202005291417 1h 10m 1D 12h)
再次强调 SOA 记录是 DNS 数据库/文本文件的第一条记录。
如果写的规范,如图:

ns 记录
表示特殊资源的记录类型,体现谁是当前域的服务器 (和 SOA 表示的不同,SOA 只写了主,NS 会写其所有的从属)。
格式也是基本的 5 项,区别在于值(value)的格式。
下图没有写域名后缀,会自己补全。
比如 @ IN NS ns1
- 由于不知道 ns1 和 ns1 的 IP,需要 A 记录解析成地址

以上,是区域数据库的必备格式,最少有三条记录(只有一个 DNS 服务器), SOA、NS 和一条 A 记录解析 DNS 服务器。
二、建立数据库文件(zone)
- 在主配置文件
/etc/named.conf写入了主数据库文件的存放路径/var/named - 直接 cd 进去,习惯上以域名命名比如
magedu.org.zone,用 zone 表示区域数据库,
可以不是 zone,但这样是默认习惯
- 里面有模板文件
named.localhost,他的权限是 640,属于 root 用户和 named 用户组,
可以复制来用,cp -p 这个参数可以保留旧的(-a 也可以), named 账号是安装 DNS 软件自动生成的(id named 可以查看), 他是 false 类型账号,和 nologin 类型一样,不允许直接登录,给服务使用的
systemctl status named 可以看到启动 DNS 服务是让 named 账号来运行的,其中 -u 就是用指定账户运行:
/usr/sbin/named -u named -c /etc/named.conf

ps aux | grep named查看进程也是可以看到 DNS 服务运行的账户的
说了这么多,意思是 cp /var/named 中的文件的时候,至少给 named 账户 r 的权限, named 账户在 named 组,只要给 named 组权限就行。
cp -p named.localhost magedu.org.zone,之后ll查看确保权限一致即可,如图

接下来就是修改文件了,直接 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上面,不会报错
- A 记录可以写
www,但事实上并不算真正的 A 记录
在 linux 中有客户端测试工具,用来测试名称和 IP 的解析,rpm -ql bind-utils。
其中有 /usr/bin/dig、/usr/bin/host 等测试工具,其中 host 就是要用的。
host www.magedu.com测试能否把域名解析为 IP,出现 IP 了就是 A 记录- 也可以
dig www.magedu.com显示详尽的信息,非常全,如图,
而且可以看 NS 记录,直接看 DNS 服务器

- 可以看到一个 DNS(名称)有很多个 IP,好处就是分流用户流量,服务器压力下降,提升性能
上述 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
- 这个和 CDN 服务器有关(都 CDN 了肯定是大企业)
我们可以这样模仿,如图配置 CNAME:

客户端操作
yum -y install httpdsystemctl start httpdecho www.magedu.org On 192.168.88.130 > /var/www/html/index.html
在 Apache 的默认网站根目录下创建一个测试页面。
curl 192.168.88.130返回了www.magedu.org On 192.168.88.130就成功- 同理,在另一个客户机创建网页,用自己的主机 IP,但是域名相同,
curl 的时候返回的域名会是相同的,但是 IP 不同
三、zone 文件和服务器建立连接
刚才只是创建文件、配置文件。
现在要让 DNS 服务器知道这个文件 --> 配置文件 /etc/named.conf
其中 zone 区域的默认配置,可以通过修改 zone 配置好:
zone "." IN {
type hint;
file "named.ca";
};
- 但是数据和域一多,配置文件改来改去就会出错,可以把区域和域名之间的配置单独拿出,
放在 named.conf 中 zone 区域下给出的 /etc/named.rfc1912.zones 文件中
- 所以选择
vim /etc/named.rfc1912.zones,这里面表示的内容是当前的 DNS 管理什么域名,
数据库是什么(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 是负责解析一个域,不是解析单个主机的。
named-checkconf可以检查配置文件语法named-checkzone [域名] [zone文件路径]检查区域数据库文件语法是否有误
比如下面的就爆出错误了 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. | 权威服务器声明 |
| A | ns1 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 | 简单测试 |
- 关于 zone 文件
- 目录:
/var/named/ - 权限:
640(属主root,属组named) - 复制模板:
cp -p named.localhost 你的zone文件
如何测试
在客户机 curl 一个域名,返回了页面就是成功了(前提是 zone 的 A 记录有这个)。
如果刚才配置了 CNAME 和 www 解析,就会是这样的效果:

- 正常生产中,这两个机器的页面应当做成一样的,用户看不出,用的也一样——负载均衡,
做到了多台机器提供一个服务
其实一直 ping 一个域名也是能看出来的,返回的 IP 不一样。
ping/curl 不是专门测试 DNS 的,host/dig 才是专业的, 客户端要测试软件需要安装 bind-utils:yum -y install bind-utils
host [域名]可以查到该域名的所有 IP
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
dig [域名]也可以做到- dig 返回的 flags 字段中,
aa代表从权威 DNS 服务器查到了结果,也有权威 DNS 服务器(NS 记录)
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
| 字段 | 含义 |
|---|---|
aa(Authoritative Answer) | 从权威 DNS 返回 |
qr | 查询/响应标志 |
rd | 期望递归查询 |
ra | 支持递归查询 |
- 不是权威 DNS 返回的结果是递归查询返回的
- 如果想直接找权威查询,可以
dig [域名] @[权威DNS],返回的结果肯定也包括aa,
想要测试 DNS 服务不必频繁地修改配置文件,这个语法可以直接测试(测试指定 DNS 能否成功解析域名)
nslookup在 win 上也有,直接输入后回车进入交互模式,server [DNS的IP]
表示测试 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
- 非交互方式
nslookup [域名]
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
- 测试主 DNS 服务器的搭建最好三个主机:DNS、Web 服务、客户端
配置泛域名,用户输入错误也可访问。
在 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 记录实现(DNS 记录类型),
MX 记录标明当前域的邮件服务器,进而实现邮件的转发,同样可以写入 zone 数据库里
@ IN MX [优先级] [邮件服务器名],邮件服务器名字不是 IP,
所以需要额外的 A 记录解析它 [邮件服务器名] IN A IP
优先级,数字越小,优先级越高。
示例:
@ IN MX 10 mailsrv
@ IN MX 20 mailsrv2
mailsrv IN A IP
mailsrv2 IN A IP
- 查询当前域的邮件服务器,
dig -t mx [域名]比如dig -t mx magedu.org
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.
有的公司的邮件服务是第三方的,比如腾子的。
- PTR 记录,和 A 记录相反,解析 IP 为名称
$GENERATE 1-254 HOST$ IN A 1.2.3.$这样的记录相当于生成了 254 个记录,
相当于下面这样,其中 HOST 的名字是随便改的,只是名字而已,最后的 IP 根据具体情况配置
HOST1 IN A 1.2.3.1
HOST2 IN A 1.2.3.2
...
HOST254 IN A 1.2.3.254
常用记录类型:
| 类型 | 作用 | 示例 |
|---|---|---|
| A | 域名 → IPv4 | www IN A 1.2.3.4 |
| AAAA | 域名 → IPv6 | www IN AAAA ::1 |
| CNAME | 别名 | www IN CNAME websrv |
| MX | 邮件服务器 | @ IN MX 10 mailsrv |
| NS | 权威服务器 | @ IN NS ns1 |
| PTR | IPv4 → 域名(反向) | 1 IN PTR gw.magedu.org. |
| SOA | 起始授权记录 | zone 第一条 |
* IN A 192.168.88.128 # 匹配任意前缀
@ IN A 192.168.88.128 # 匹配裸域