DNS Zone
DNS 被划分为多个不同的 Zone。这些 Zone(区域)在 DNS 命名空间中以不同方式进行管理。DNS Zone 是 DNS 命名空间的一部分,由特定组织或管理员进行管理。DNS Zone 是一个管理空间,可以实现对权威名称服务器等 DNS 组件的精细控制。域名空间是一个分层的树状结构,DNS 根域位于其顶部。DNS 区域从树中的一个域开始,可以向下扩展到子域中,以便一个组织可以管理多个子域。一个 DNS Zone 包含了该子域中所有 DNS 记录。每个 DNS Zone 由一个(组) DNS 服务器负责管理,该服务器被称为主 DNS 服务器或权威 DNS 服务器。DNS Zone 可以包含各种类型的记录,如:A、MX、CNAME、NS、TXT 等。
一种常见的误区是将 DNS Zone 与域名或单一 DNS 服务器相混淆。实际上,DNS Zone 可以包含多个子域,并且多个 Zone 可以存在于同一服务器上。DNS Zone 并不一定要分离,而必须严格使用 Zone 来分配控制权。
一个 DNS Zone 主要包含以下内容:
- 区域文件:存储区域信息的文本文件,包括所有的 DNS 记录。
- SOA 记录:Start of Authority 记录,定义了区域的权威 DNS 服务器和其他管理信息。
- NS 记录:Name Server 记录,定义了负责该区域的 DNS 服务器。
- 其他记录:如 A 记录、AAAA 记录、MX 记录等,分别定义了主机名到 IP 地址的映射、邮件服务器等。
AXFR 和 IXFR
因为在主从 DNS Zone 同步过程中,会用到 AXFR、IXFR 两种方式,所以这里简单介绍一下两者之间的区别。
AXFR(全区域传输,Full Zone Transfer) 和 IXFR(增量区域传输,Incremental Zone Transfer) 是两种用于 DNS 服务器之间同步 Zone 数据的方法。
AXFR
AXFR 用于在主 DNS 服务器和从 DNS 服务器之间进行全区域传输。它将整个 DNS 区域文件从主服务器传输到从服务器。这种方法适用于以下情况:
- 初次设置从服务器时。
- 区域文件发生了大的变化,需要完全重新传输。
优点:
- 简单易用。
- 确保从服务器与主服务器的数据完全一致。
缺点:
- 数据传输量大,效率低。
- 对带宽和服务器性能有较高的要求。
IXFR
IXFR 用于在主 DNS 服务器和从 DNS 服务器之间进行增量区域传输。它只传输自上次同步以来发生变化的记录。这种方法适用于以下情况:
- 区域文件发生了小的变化。
- 需要频繁同步区域数据。
优点:
- 数据传输量小,效率高。
- 对带宽和服务器性能要求较低。
缺点:
- 实现较为复杂。
- 需要主服务器和从服务器都支持 IXFR。
资源类型(Resource Record,RR)
常用 DNS 资源类型参考:Rocky Linux 9 从入门到精通007 — DNS 管理(理论篇),这里我们主要讲的是怎么在 DNS 服务器上添加各种类型的 DNS 解析记录,它们的格式是怎样的。
以解析 www.rockylinux.lan 域名为例:
[root@client-001 ~]# dig @192.168.1.1 api.rockylinux.lan
...(略)
;; QUESTION SECTION:
;api.rockylinux.lan. IN A
;; ANSWER SECTION:
api.rockylinux.lan. 3600 IN A 192.168.4.1
...(略)
返回记录的格式如下:
[domain] [ttl] IN [[RR type] [RR data]]
[查询的域名] [缓存时间(秒)] IN [[资源类型] [资源数据]]
结论:返回一条 api.rockylinux.lan 域名的 A 记录,IP 地址为 192.168.4.1,且缓存有效期为 3600 秒。
# 常用 DNS 服务器管理的记录类型,假设 zone 为 domain
[domain] IN [[RR type] [RR data]]
domain. IN SOA 管理 domain 的 7 个参数(下文详细说明)
domain. IN NS 管理这个 Zone 的 DNS 服务器主机名称
# 管理 DNS 标准规范内的所有正向解析记录
[domain] IN [[RR type] [RR data]]
hostname. IN A hostname. 的 IPv4 的 IP 位址
hostname. IN AAAA hostname. 的 IPv6 的 IP 位址
domain. IN MX 接收 domain. 邮件服务器主机名
hostname. IN CNAME hostname. 别名类型
hostname. IN TXT 一串代表 hostname. 的解释资料,主要用于域名归属权验证、邮件服务等
# 管理 DNS 标准规范内的所有反向解析记录
[domain] IN [[RR type] [RR data]]
hostname. IN PTR 代表 hostname. 這個領域的指向主機名稱,通常 hostname. 是 IP 的領域!
Zone 配置
在配置 Zone 的过程中,会用到三个插件:file 、transfer、secondary。
- File 插件:主要用于 Zone 配置文件加载管理,
reload如果 SOA 版本号发生变化,则执行区域重新加载的间隔。默认值为1分钟。当值为0时,表示不扫描更改并重新加载。例如:reload 30s每 30 秒检查一次区域文件,并在 SOA 版本号发生变化时重新加载区域。 - Transfer 插件:主要用于将对应的 Zone 配置同步至指定的 DNS 服务器从节点。Transfer 会回答完整区域传输 (AXFR) 请求和增量区域传输 (IXFR) 请求,如果 Zone 发生变化时,则会使用 AXFR 请求。
- Secondary 插件:主要用于 DNS 服务器从节点,您可以通过 AXFR 从另一台 DNS 服务器同步 Zone 信息。同步到的 Zone 信息并不会保存至文件(因为这违反了 RFC。这与 Bind DNS 是不同的,Bind DNS 从节点接收到的 Zone 文件会存放在
/var/named/slaves/目录)。这就意味着重启从节点 DNS 服务,将导致从节点 DNS 缓存数据丢失,需要从主节点重新检索所有 Zone 信息。如果主节点 CoreDNS 启动后未响应从节点 AXFR 请求,则 AXFR 将每10秒无限期重试一次。此插件仅支持 AXFR。
主节点配置
[root@coredns-001 ~]# cat > /etc/coredns/Corefile << \EOF
.:53 {
log # 启用日志记录
loop # 防止 DNS 查询在多个 DNS 服务器之间循环,导致无限查询循环。如果检测到循环,CoreDNS 会中止查询。
errors # 启用错误日志记录
reload 30s # 通过 reload 插件实现热加载功能,确保在不重启 CoreDNS 服务的情况下,动态应用新的配置,每隔 30 秒重载一次 Corefile 配置文件。
cache 300s # 配置 DNS 查询的缓存时间为 300 秒,减少重复查询,提高响应速度和性能。
ready 0.0.0.0:8181 # 在指定地址和端口上提供 readiness(就绪)探针。
health 0.0.0.0:8080 # 在指定地址和端口上提供健康检查(health check)。
prometheus 0.0.0.0:9253 # 在指定地址和端口上启用 Prometheus metrics。
loadbalance round_robin # 使用轮询模式进行负载均衡。
hosts /etc/coredns/hosts { # hosts 解析插件
fallthrough # 当在 hosts 解析中没有获取到解析信息,将 DNS 查询传给其它插件。
}
forward . 223.6.6.6 114.114.114.119 # DNS 转发
}
# 域名转发器配置有两种写:多个域名指向同一个转发器或单个域名指向一个转发器
google.com facebook.com youtube.com:53 {
forward . 8.8.8.8 4.4.4.4
log
errors
}
cloudflare.com:53 {
forward . 1.1.1.1 1.0.0.1
log
errors
}
rockylinux.lan { # 定义 Zone
file /etc/coredns/zones/db.rockylinux.lan # 指定 Zone 配置文件路径
reload 30s # 默认每分钟检测一次,这里设置为 30 秒。
transfer { # 配置 Zone 传输参数
to 192.168.1.2 # 使用 Transfer 插件,允许 IP 地址 192.168.1.2 请求该区域的传输,可以使用 * 表示所有允许所有IP。
}
log
errors
}
EOF
创建 /etc/coredns/zones/db.rockylinux.lan Zone 文件,写入以下配置。
[root@coredns-001 ~]# vi /etc/coredns/zones/db.rockylinux.lan
$ORIGIN rockylinux.lan. # 指定该区域文件的根域名,这里根域名是rockylinux.lan.。
$TTL 3600 # 设置默认的生存时间(Time To Live),单位为秒,这里设置为 3600 秒(1小时)。
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070806 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum TTL
)
IN NS ns1.rockylinux.lan. # 定义 DNS 服务器信息
IN NS ns2.rockylinux.lan.
ns1 IN A 192.168.1.1 # A 记录定义主机名映射到IPv4地址
ns2 IN A 192.168.1.2
api IN A 192.168.4.1
bbs IN A 192.168.4.2
相关配置参数说明:
$ORIGIN rockylinux.lan.指定该区域文件的根域名,这里根域名是rockylinux.lan.。$TTL 3600设置默认的生存时间(Time To Live),单位为秒,这里设置为 3600 秒(1 小时)。IN NS ns1.rockylinux.lan.定义 DNS 服务器信息 NS 记录信息。ns1 IN A 192.168.1.1定义 DNS 服务器 A 记录信息。
区域起始授权记录(Start of Authority, SOA)定义:
@表示当前 Zone 区域(这里是rockylinux.lan.)。IN是 Internet 缩写,表示互联网类记录。SOA是 start of authority 缩写,表示起始授权记录。ns1.rockylinux.lan.是主 DNS 服务器的完全限定域名(FQDN)即hostname.domain,这里定义了主 DNS 服务器的名称。admin.rockylinux.lan.是负责该域的管理员邮箱地址,通常会将@替换成.,实际邮箱地址为:[email protected]。.在域名的后面都带有一个.,即根区域 (root zone)。2024070806是序列号,用于标识区域文件的版本号,每次更新配置文件都需要手动新增序列号,采用递增模式,常用格式为:YYYYMMDDNN(年/月/日/版本号)。3600是刷新时间,从 DNS 服务器多久检查主 DNS 服务器是否有更新(单位为秒)。1800是重试时间,如果从 DNS 服务器尝试连接主 DNS 服务器刷新失败,等待多长时间再试(单位为秒)。1209600是过期时间,从 DNS 服务器在多长时间内如果仍连接主 DNS 服务器刷新失败,则停止提供该区域的查询请求(单位为秒),1209600秒(即14天)。3600在新的 DNS 标准中,Minimum TTL字段实际上被更准确地称为 Negative TTL ,意思是这个域名的负面缓存时间(Negative Caching TTL)。具体来说,当一个 DNS 查询没有找到对应的资源记录(例如,一个查询结果是 NXDOMAIN,表示该域名不存在时),这个负面结果会被缓存一段时间,Negative TTL就是指缓存该负面结果的时间。3600表示在 DNS 查询没有找到对应的资源记录时,负面缓存的时间是 3600 秒,或者 1 个小时。在这段时间内,重复的查询将直接返回缓存的负面结果,而不会再次查询 DNS 服务器以减少查询数量和负载。
从节点配置
[ root@coredns-002 ~]# cat > /etc/coredns/Corefile << \EOF
.:53 {
log # 启用日志记录
loop # 防止 DNS 查询在多个 DNS 服务器之间循环,导致无限查询循环。如果检测到循环,CoreDNS 会中止查询。
errors # 启用错误日志记录
reload 30s # 通过 reload 插件实现热加载功能,确保在不重启 CoreDNS 服务的情况下,动态应用新的配置,每隔 30 秒重载一次 Corefile 配置文件。
cache 300s # 配置 DNS 查询的缓存时间为 300 秒,减少重复查询,提高响应速度和性能。
ready 0.0.0.0:8181 # 在指定地址和端口上提供 readiness(就绪)探针。
health 0.0.0.0:8080 # 在指定地址和端口上提供健康检查(health check)。
prometheus 0.0.0.0:9253 # 在指定地址和端口上启用 Prometheus metrics。
loadbalance round_robin # 使用轮询模式进行负载均衡。
hosts /etc/coredns/hosts { # hosts 解析插件
fallthrough # 当在 hosts 解析中没有获取到解析信息,将 DNS 查询传给其它插件。
}
forward . 223.6.6.6 114.114.114.119 # DNS 转发
}
# 域名转发器配置有两种写:多个域名指向同一个转发器或单个域名指向一个转发器
google.com facebook.com youtube.com:53 {
forward . 8.8.8.8 4.4.4.4
log
errors
}
cloudflare.com:53 {
forward . 1.1.1.1 1.0.0.1
log
errors
}
rockylinux.lan {
secondary { # 配置 CoreDNS 从节点通过 CoreDNS 主节点获取 Zone 信息
transfer from 192.168.1.1
}
log
errors
}
EOF
因为从节点从主节点获取 Zone 信息进行缓存,所以不需要单独创建 /etc/coredns/zones/db.rockylinux.lan Zone 文件。
同步日志分析
# 从节点加载 file 和 transfer 插件,从 192.168.1.1:53 获取 rockylinux.lan. 域名解析信息
[ root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 10:39:18 coredns-002 coredns[70454]: [INFO] plugin/file: Transferred: rockylinux.lan. from 192.168.1.1:53
Jul 06 10:39:18 coredns-002 coredns[70454]: [INFO] plugin/reload: Running configuration SHA512 = 28df1ab9d25e0097ef029b70833f8a0b813ff725b403f670d50fa35db4fe4c886823abe0b5dd30e3bc50001a6413a6e99a5d894d5c884310ade59e8ca3ff76a5
Jul 06 10:39:18 coredns-002 coredns[70454]: CoreDNS-1.11.1
Jul 06 10:39:18 coredns-002 coredns[70454]: linux/amd64, go1.20.7, ae2bbc2
Jul 06 10:39:18 coredns-002 coredns[70454]: [INFO] 127.0.0.1:54650 - 30450 "HINFO IN 7224310776447306507.2800529421944665293. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.056535844s
# 日志提示:no SOA serial increase seen,表示 SOA 序列号没有增加
Jul 06 11:40:12 coredns-002 coredns[70454]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: checking transfer
Jul 06 11:40:12 coredns-002 coredns[70454]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: no SOA serial increase seen
Jul 06 11:40:12 coredns-002 coredns[70454]: [INFO] 192.168.1.1:50125 - 4150 "SOA IN rockylinux.lan. udp 23 false 512" NOERROR qr,aa 23 0.001562511s
# 主节点收到来自从节点 192.168.1.2:39903 的全量同步 AXFR IN rockylinux.lan.,然后传输 7 条 "rockylinux.lan." zone 解析至 192.168.1.2
[ root@coredns-001 ~]# journalctl -f -u coredns
Jul 06 11:55:38 coredns-001 coredns[48334]: dnspod.cn.:53
Jul 06 11:55:38 coredns-001 coredns[48334]: google.com.:53
Jul 06 11:55:38 coredns-001 coredns[48334]: [INFO] plugin/reload: Running configuration SHA512 = d1e553a42d43b078880792d8e926213f7ecb746f66d52c8e7771e884939b28e8ca6b440494d54903411c8603d9d00a7c7bd67d66b36f5547f4f73fd66df868df
Jul 06 11:55:38 coredns-001 coredns[48334]: CoreDNS-1.11.1
Jul 06 11:55:38 coredns-001 coredns[48334]: linux/amd64, go1.20.7, ae2bbc2
Jul 06 11:55:38 coredns-001 coredns[48334]: [INFO] 127.0.0.1:48032 - 62952 "HINFO IN 1531057859276754869.1660629368487333884. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.028053413s
Jul 06 11:55:58 coredns-001 coredns[48334]: [INFO] plugin/transfer: Outgoing transfer of 7 records of zone "rockylinux.lan." to 192.168.1.2 for 2023101001 SOA serial
Jul 06 11:55:58 coredns-001 coredns[48334]: [INFO] 192.168.1.2:39903 - 45242 "AXFR IN rockylinux.lan. tcp 46 false 65535" NOERROR qr,aa 276 0.000159113s
Jul 06 10:39:18 coredns-001 coredns[48334]: [INFO] plugin/transfer: Outgoing transfer of 7 records of zone "rockylinux.lan." to 192.168.1.2 for 2023101001 SOA serial
Jul 06 10:39:18 coredns-001 coredns[48334]: [INFO] 192.168.1.2:41166 - 9770 "AXFR IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa 276 0.000191601s
从节点每隔 3600 秒,从主节点检查一次 Zone 是否有更新,从下面日志可以看出来。
# 正常 60 分钟刷新一次记录
[ root@coredns-001 ~]# journalctl -f -u coredns
Jul 07 00:21:51 coredns-001 coredns[50639]: [INFO] 192.168.1.2:38408 - 38200 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000088481s
Jul 07 01:21:51 coredns-001 coredns[50639]: [INFO] 192.168.1.2:39886 - 34570 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000068928s
Jul 07 02:21:53 coredns-001 coredns[50639]: [INFO] 192.168.1.2:46862 - 63239 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000073979s
Jul 07 03:21:54 coredns-001 coredns[50639]: [INFO] 192.168.1.2:53118 - 63992 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000073954s
Jul 07 04:21:58 coredns-001 coredns[50639]: [INFO] 192.168.1.2:36872 - 57791 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000074768s
Jul 07 05:21:58 coredns-001 coredns[50639]: [INFO] 192.168.1.2:45108 - 14369 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000073153s
Jul 07 06:22:01 coredns-001 coredns[50639]: [INFO] 192.168.1.2:48812 - 17290 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000079517s
Jul 07 07:22:05 coredns-001 coredns[50639]: [INFO] 192.168.1.2:51040 - 1930 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.00008624s
Jul 07 08:22:08 coredns-001 coredns[50639]: [INFO] 192.168.1.2:59006 - 49063 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000085275s
Jul 07 09:22:09 coredns-001 coredns[50639]: [INFO] 192.168.1.2:47852 - 63280 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000073539s
客户端测试验证
我们在客户端节点上对从节点 192.168.1.2 进行测试验证,如果主从节点之间 Zone 同步正常,解析应该都是正常的,测试主要包括:SOA、NS、A 记录三项。
# SOA
[root@client-001 ~]# dig @192.168.1.2 +short -t soa rockylinux.lan
ns1.rockylinux.lan. admin.rockylinux.lan. 2024070811 3600 1800 1209600 3600
# NS
[root@client-001 ~]# dig @192.168.1.2 +short -t ns rockylinux.lan
ns1.rockylinux.lan.
ns2.rockylinux.lan.
# A 记录
[root@client-001 ~]# dig @192.168.1.2 +short -t A ns1.rockylinux.lan
192.168.1.1
[root@client-001 ~]# dig @192.168.1.2 +short -t A ns2.rockylinux.lan
192.168.1.2
# 不指定类型,默认为 A 记录
[root@client-001 ~]# dig @192.168.1.2 +short api.rockylinux.lan
192.168.4.1
# 无记录无返回
[root@client-001 ~]# dig @192.168.1.2 +short erp.rockylinux.lan
从以上的解析结果来看,与配置是符合的,说明整个 Zone 的主从同步、配置都正确。
A 解析配置
通过新增一条 A 记录解析,来看看 file 与 transfer 插件是怎么工作的。
新增主节点对应 Zone A 记录,并修改对应 Serial 序列号(递增),file 插件默认每隔 1 分钟(通过 reload 30s 可以修改检查间隔时间)检测一次 Zone 文件,发现 Serial 发生变化,进行 reload 重载。
[root@coredns-001 ~]# vi /etc/coredns/zones/db.rockylinux.lan
zones/db.rockylinux.lan
$ORIGIN rockylinux.lan.
$TTL 3600
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070812 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum TTL
)
IN NS ns1.rockylinux.lan.
IN NS ns2.rockylinux.lan.
ns1 IN A 192.168.1.1
ns2 IN A 192.168.1.2
api IN A 192.168.4.1
bbs IN A 192.168.4.2
www IN A 192.168.4.3
主节点重载配置,并通过 transfer 插件发送通知给从节点 192.168.1.2,告诉从节点 rockylinux.lan. 区域已更新。并通过 transfer 插件将区域 rockylinux.lan. 的 9 条记录传输给 192.168.1.2,来自 2024070813 SOA 序列。
[root@coredns-001 ~]# journalctl -f -u coredns
Jul 07 13:58:12 coredns-001 coredns[18992]: [INFO] plugin/file: Successfully reloaded zone "rockylinux.lan." in "/etc/coredns/zones/db.rockylinux.lan" with 2024070813 SOA serial
Jul 07 13:58:12 coredns-001 coredns[18992]: [DEBUG] plugin/transfer: Sent notifies for zone "rockylinux.lan." to [192.168.1.2:53]
Jul 07 13:58:12 coredns-001 coredns[18992]: [INFO] 192.168.1.2:40408 - 56020 "SOA IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa,rd 140 0.000171803s
Jul 07 13:58:12 coredns-001 coredns[18992]: [INFO] plugin/transfer: Outgoing transfer of 9 records of zone "rockylinux.lan." to 192.168.1.2 for 2024070813 SOA serial
Jul 07 13:58:12 coredns-001 coredns[18992]: [INFO] 192.168.1.2:40420 - 61509 "AXFR IN rockylinux.lan. tcp 23 false 65535" NOERROR qr,aa 326 0.000270139s
从节点接收来自主节点的检查传输,并接收来自主节点的区域解析记录。
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 07 13:58:12 coredns-002 coredns[70454]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: checking transfer
Jul 07 13:58:12 coredns-002 coredns[70454]: [INFO] plugin/file: Transferred: rockylinux.lan. from 192.168.1.1:53
Jul 07 13:58:12 coredns-002 coredns[70454]: [INFO] 192.168.1.1:56725 - 41742 "SOA IN rockylinux.lan. udp 23 false 512" NOERROR qr,aa 23 0.003683529s
这样整个 Zone 配置的修改、主从同步就完成了。
2024070806 ; Serial 序列号,用于标识 Zone 文件的版本号,每次更新 Zone 配置文件都需要手动递增序列号,不能够递减或不变,不然从节点会出现提示 no SOA serial increase seen (未见 SOA 序列增加),这会造成对应的 Zone 信息不进行同步。日志提示信息如下:
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 07 14:25:38 coredns-002 coredns[71107]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: checking transfer
Jul 07 14:25:39 coredns-002 coredns[71107]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: no SOA serial increase seen # 提示未见 SOA 序列增加
Jul 07 14:25:39 coredns-002 coredns[71107]: [INFO] 192.168.1.1:33305 - 8718 "SOA IN rockylinux.lan. udp 23 false 512" NOERROR qr,aa 23 0.002455066
相关问题
对于在主从配置中可能遇到的问题,这里进行逐一模拟测试。
问题 1: 当从节点未配置 secondary transfer 时,客户端使用 dig @192.168.1.2 www.rockylinux.lan 向从节点发起解析请求报错失败。
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 10:45:35 coredns-002 coredns[70491]: [INFO] plugin/reload: Running configuration SHA512 = f7470ac941ea0ea86ca8deab8fe7ccd41287d42921eb9a14e33e7ae49a43c8b962c8388f722755d6b87143d0e533f9bf4950fdb89585eac4fecf04db55bc4815
Jul 06 10:45:35 coredns-002 coredns[70491]: CoreDNS-1.11.1
Jul 06 10:45:35 coredns-002 coredns[70491]: linux/amd64, go1.20.7, ae2bbc2
Jul 06 10:45:35 coredns-002 coredns[70491]: [INFO] 127.0.0.1:52671 - 23362 "HINFO IN 7922272221597764658.1687375292300872708. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.052270381s
Jul 06 10:45:48 coredns-002 coredns[70491]: [INFO] 192.168.3.1:60963 - 53966 "A IN www.rockylinux.lan. udp 38 false 4096" - - 0 0.000030487s
Jul 06 10:45:48 coredns-002 coredns[70491]: [ERROR] plugin/errors: 2 www.rockylinux.lan. A: plugin/log: no next plugin found # 日志插件报错:没有找到下一个插件
问题 2: 如果主节点未允许从节点获取对应 DNS 信息,主从节点报错如下,主节点每隔 10 秒会收到一次从节点的数据同步请求,但因为主节点未同意同步请求,所以从节点会一直报错(需要主节点授权才能够进行同步)。
如果主节点在 CoreDNS 启动后未响应从节点
AXFR请求,则 AXFR 将每10秒无限期重试一次。
# 从节点报错
[ root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 10:48:35 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 250ms: dns: bad xfr rcode: 5
Jul 06 10:48:35 coredns-002 coredns[70519]: [INFO] 127.0.0.1:36547 - 33341 "HINFO IN 4337624491717460988.5395608071141374664. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.044680153s
Jul 06 10:48:35 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer `rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 10:48:35 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 500ms: dns: bad xfr rcode: 5
Jul 06 10:48:36 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer `rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 10:48:36 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 1s: dns: bad xfr rcode: 5
Jul 06 10:48:37 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer `rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 10:48:37 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 2s: dns: bad xfr rcode: 5
Jul 06 10:48:39 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer `rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 10:48:39 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 4s: dns: bad xfr rcode: 5
# 主节点日志信息
[ root@coredns-001 ~]# journalctl -f -u coredns
Jul 06 11:04:01 coredns-001 coredns[49245]: [INFO] 192.168.1.2:41376 - 11570 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000031969s
Jul 06 11:04:11 coredns-001 coredns[49245]: [INFO] 192.168.1.2:52688 - 41025 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000025179s
Jul 06 11:04:21 coredns-001 coredns[49245]: [INFO] 192.168.1.2:45092 - 47631 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000031782s
Jul 06 11:04:31 coredns-001 coredns[49245]: [INFO] 192.168.1.2:58606 - 15979 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000030286s
Jul 06 11:04:41 coredns-001 coredns[49245]: [INFO] 192.168.1.2:49094 - 30691 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000029329s
Jul 06 11:04:51 coredns-001 coredns[49245]: [INFO] 192.168.1.2:42878 - 31457 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.000023352s
问题 3: 如果禁用主节点的 transfer 同步,不重启从节点 CoreDNS 服务,原有从节点 Zone 缓存在缓存周期内都有效,从节点都可以正常提供解析服务。重启从节点 CoreDNS 服务缓存失效。
# 未重启从节点 CoreDNS 服务之前,客户端向从节点发起 www.rockylinux.lan 域名解析成功
[ root@client-001 ~]# dig @192.168.1.2 www.rockylinux.lan
; <<>> DiG 9.10.6 <<>> @192.168.1.2 www.rockylinux.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: NOERROR, id: 48693
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.rockylinux.lan. IN A
;; ANSWER SECTION:
www.rockylinux.lan. 3600 IN A 192.168.4.3 # 解析 IP
;; AUTHORITY SECTION:
rockylinux.lan. 3600 IN NS ns1.rockylinux.lan.
rockylinux.lan. 3600 IN NS ns2.rockylinux.lan.
;; Query time: 0 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Mon Jul 06 11:45:08 CST 2024
;; MSG SIZE rcvd: 121
# 注释主节点 transfer 配置
[root@coredns-001 ~]# cat > /etc/coredns/Corefile << \EOF
...(略)
rockylinux.lan { # 定义 Zone
file /etc/coredns/zones/db.rockylinux.lan # 指定 Zone 配置文件路径
reload 30s # 默认每分钟检测一次,这里设置为 30 秒。
# transfer { # 配置 Zone 传输参数
# to 192.168.1.2 # 使用 Transfer 插件,允许 IP 地址 192.168.1.2 请求该区域的传输,可以使用 * 表示所有允许所有IP。
# }
log
errors
}
EOF
# 重启主从节点 CoreDNS 服务,再进行验证
[root@coredns-001 ~]# systemctl restart coredns
[root@coredns-002 ~]# systemctl restart coredns
# 客户端向从节点发起 www.rockylinux.lan 域名解析失败
[root@coredns-client]# dig @192.168.1.2 www.rockylinux.lan
; <<>> DiG 9.10.6 <<>> @192.168.1.2 www.rockylinux.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: SERVFAIL, id: 30120
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.rockylinux.lan. IN A
;; Query time: 0 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Mon Jul 06 11:49:26 CST 2024
;; MSG SIZE rcvd: 39
# 从节点日志信息
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 11:24:01 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 10s: dns: bad xfr rcode: 5
Jul 06 11:24:11 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer 'rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 11:24:11 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 10s: dns: bad xfr rcode: 5
Jul 06 11:24:21 coredns-002 coredns[70519]: [ERROR] plugin/file: Failed to transfer 'rockylinux.lan.' from "192.168.1.1:53": dns: bad xfr rcode: 5
Jul 06 11:24:21 coredns-002 coredns[70519]: [WARNING] plugin/secondary: All 'rockylinux.lan.' masters failed to transfer, retrying in 10s: dns: bad xfr rcode: 5
Jul 06 11:24:27 coredns-002 coredns[70519]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: checking transfer
Jul 06 11:24:27 coredns-002 coredns[70519]: [INFO] plugin/file: Transferred: rockylinux.lan. from 192.168.1.1:53
Jul 06 11:24:27 coredns-002 coredns[70519]: [INFO] 192.168.1.1:2025 - 15024 "SOA IN rockylinux.lan. udp 23 false 512" NOERROR qr,aa 23 0.002196474s
Jul 06 11:24:31 coredns-002 coredns[70519]: [INFO] plugin/file: Transferred: rockylinux.lan. from 192.168.1.1:53
Jul 06 11:37:21 coredns-002 coredns[70519]: [INFO] 192.168.3.1:60284 - 31550 "A IN www.rockylinux.lan. udp 39 false 4096" NXDOMAIN qr,aa,rd 89 0.000522904s # 客户端获取解析失败
Jul 06 11:37:32 coredns-002 coredns[70519]: [INFO] 192.168.3.1:58631 - 51032 "A IN www.rockylinux.lan. udp 39 false 4096" NXDOMAIN qr,aa,rd 89 0.000236739s
# 客户端从主节点获取 www.rockylinux.lan 域名解析成功
[ root@client-001 ~]# dig @192.168.1.1 www.rockylinux.lan
; <<>> DiG 9.10.6 <<>> @192.168.1.1 www.rockylinux.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: NOERROR, id: 48693
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.rockylinux.lan. IN A
;; ANSWER SECTION:
www.rockylinux.lan. 3600 IN A 192.168.4.3 # 解析 IP
;; AUTHORITY SECTION:
rockylinux.lan. 3600 IN NS ns1.rockylinux.lan.
rockylinux.lan. 3600 IN NS ns2.rockylinux.lan.
;; Query time: 0 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Mon Jul 06 11:45:08 CST 2024
;; MSG SIZE rcvd: 121
# 主节点日志信息
[root@coredns-001 ~]# journalctl -f -u coredns
Jul 06 11:45:03 coredns-001 coredns[49368]: [INFO] 192.168.1.2:58434 - 11766 "AXFR IN rockylinux.lan. tcp 23 false 65535" - - 0 0.00002099s
Jul 06 11:45:08 coredns-001 coredns[49368]: [INFO] 192.168.3.1:51356 - 48693 "A IN www.rockylinux.lan. udp 39 false 4096" NOERROR qr,aa,rd 110 0.000100119s # 客户端获取解析成功
MX 解析配置
除了前面配置的 A 解析记录外,CoreDNS 还支持其他标准的 DNS 解析配置,如 MX、AAAA、TXT 和 CNAME 等。具体配置和使用方法请参考 Rocky Linux 9 从入门到精通007 — DNS管理(理论篇)。
在这里,我们仅简单演示 MX 记录的配置方法。后续将在邮件系统部署章节中详细讲解与邮箱相关的解析配置。
服务器端配置
[root@coredns-001 ~]# vi /etc/coredns/zones/db.rockylinux.lan
$ORIGIN rockylinux.lan.
$TTL 3600
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070814 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum TTL
)
IN NS ns1.rockylinux.lan.
IN NS ns2.rockylinux.lan.
# 邮件服务器 MX 记录
@ IN MX 10 mail.rockylinux.lan.
ns1 IN A 192.168.1.1
ns2 IN A 192.168.1.2
api IN A 192.168.4.1
bbs IN A 192.168.4.2
www IN A 192.168.4.3
# 邮件服务器 A 记录
mail IN A 192.168.4.4
客户端测试验证
# 返回值太多,直接使用 +short 验证
[root@client-001 ~]# dig @192.168.1.2 -t MX rockylinux.lan +short
10 mail.rockylinux.lan.
[root@client-001 ~]# dig @192.168.1.2 -t A mail.rockylinux.lan +short
192.168.4.4
其它记录类型
服务器端配置
[root@coredns-001 ~]# vi /etc/coredns/zones/db.rockylinux.lan
$ORIGIN rockylinux.lan.
$TTL 3600
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070814 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum TTL
)
IN NS ns1.rockylinux.lan.
IN NS ns2.rockylinux.lan.
# 邮件服务器 MX 记录
@ IN MX 10 mail.rockylinux.lan.
ns1 IN A 192.168.1.1
ns2 IN A 192.168.1.2
api IN A 192.168.4.1
bbs IN A 192.168.4.2
www IN A 192.168.4.3
# 邮件服务器 A 记录
mail IN A 192.168.4.4
# 添加 AAAA 解析
ipv6host IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
# 添加 TXT 解析
txt-test IN TXT "This is a test TXT record"
# 添加 CNAME 解析
alias IN CNAME www.rockylinux.lan.
客户端测试验证
[root@client-001 ~]# dig @192.168.1.2 -t TXT txt-test.rockylinux.lan +short
"This is a test TXT record"
[root@client-001 ~]# dig @192.168.1.2 -t AAAA ipv6host.rockylinux.lan +short
2001:db8:85a3::8a2e:370:7334
[root@client-001 ~]# dig @192.168.1.2 -t CNAME alias.rockylinux.lan +short
www.rockylinux.lan.
子域名解析配置
子域名解析:简而言之,是指二级、三级、四级等多个级别的域名解析配置。在前面的配置示例中,我们一直使用的是二级域名。实际上,三级、四级域名的配置方式与二级域名是相同的。
服务器端配置
[root@coredns-001 ~]# cat /etc/coredns/zones/db.rockylinux.lan
$ORIGIN rockylinux.lan.
$TTL 3600
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070817 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum TTL
)
IN NS ns1.rockylinux.lan.
IN NS ns2.rockylinux.lan.
@ IN MX 10 mail.rockylinux.lan.
ns1 IN A 192.168.1.1
ns2 IN A 192.168.1.2
# 二级域名
api IN A 192.168.4.1
bbs IN A 192.168.4.2
www IN A 192.168.4.3
mail IN A 192.168.4.4
# 新增三级域名配置
crm.api IN A 192.168.4.5
plm.api IN A 192.168.4.6
...(略)
客户端测试验证
[root@client-001 ~]# dig @192.168.1.2 -t A crm.api.rockylinux.lan +short
192.168.4.5
[root@client-001 ~]# dig @192.168.1.2 -t A plm.api.rockylinux.lan +short
192.168.4.6
子域名转发配置
*.web.rockylinux.lan 域名转移到 192.168.1.3 上进行解析,该怎么办呢?这时我们需要学会举一反三来解决问题。服务器端配置
在主从 DNS 服务器上同时添加以下配置:
注:web.rockylinux.lan 解析优先级大于 rockylinux.lan。
[root@coredns-001 ~]# vi /etc/coredns/Corefile
...(略)
rockylinux.lan:53 {
file /etc/coredns/zones/db.rockylinux.lan
transfer {
to 192.168.1.2
}
log
errors
}
# 新增配置
web.rockylinux.lan:53 {
forward . 192.168.1.3
log
errors
}
客户端测试验证
当客户端请求 1.web.rockylinux.lan 的 A 记录解析时,可能无返回值。这是因为 192.168.1.3 服务器不存在。我们可以通过查看 192.168.1.1 和 192.168.1.2 上的 CoreDNS 日志来验证这一点。
[root@client-001 ~]# dig @192.168.1.2 -t A 1.web.rockylinux.lan
; <<>> DiG 9.16.23-RH <<>> @192.168.1.2 -t A 1.web.rockylinux.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: SERVFAIL, id: 19788
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 50cf56504be2787c (echoed)
;; QUESTION SECTION:
;1.web.rockylinux.lan. IN A
;; Query time: 1014 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Wed Jul 06 20:45:04 CST 2024
;; MSG SIZE rcvd: 61
服务器端日志报错,请求 192.168.1.3 服务器解析超时。
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 20:45:04 coredns-002 coredns[179153]: [INFO] 192.168.1.3:33722 - 19788 "A IN 1.web.rockylinux.lan. udp 61 false 4096" - - 0 6.004607807s
Jul 06 20:45:04 coredns-002 coredns[179153]: [ERROR] plugin/errors: 2 1.web.rockylinux.lan. A: read udp 192.168.1.2:49357->192.168.1.3:53: i/o timeout
Jul 06 20:45:07 coredns-002 coredns[179153]: [INFO] 192.168.1.3:33722 - 19788 "A IN 1.web.rockylinux.lan. udp 61 false 4096" - - 0 4.002480382s
Jul 06 20:45:07 coredns-002 coredns[179153]: [ERROR] plugin/errors: 2 1.web.rockylinux.lan. A: read udp 192.168.1.2:36637->192.168.1.3:53: i/o timeout
通过以上设置,*.web.rockylinux.lan 域名管辖权就由 192.168.1.3 服务器接管了。
反向解析
前面介绍的 A、AAAA、MX、TXT 和 CNAME 等记录类型都属于正向解析。接下来我们将学习反向解析。
在设置反向解析区域(Zone)时,需要特别注意以下几点:
- IP 地址信息需要倒序书写。
- 反向解析区域必须以
.in-addr.arpa结尾。
例如,对于 192.168.{1,2,3,4}.0/24 子网,反向解析区域的设置如下:
- 1.168.192.in-addr.arpa.
- 2.168.192.in-addr.arpa.
- 3.168.192.in-addr.arpa.
- 4.168.192.in-addr.arpa.
服务器端配置
这里以 192.168.4.0/24 网段为例。
CoreDNS-001 主节点配置如下:
# 前面配置保持不变,追加以下配置
[root@coredns-001 ~]# cat >> /etc/coredns/Corefile << \EOF
4.168.192.in-addr.arpa:53 {
file /etc/coredns/zones/db.4.168.192.in-addr.arpa
transfer {
to 192.168.1.2
}
log
errors
}
EOF
Zone 文件配置如下:
新建 Zone 配置文件,并进行以下设置,具体各参数意思,请参阅上文。
[root@coredns-001 ~]# vi /etc/coredns/zones/db.4.168.192.in-addr.arpa
$ORIGIN 4.168.192.in-addr.arpa.
$TTL 3600
@ IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. (
2024070818 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
3600 ; Minimum
)
IN NS ns1.rockylinux.lan.
IN NS ns2.rockylinux.lan.
1 IN PTR api.rockylinux.lan.
2 IN PTR bbs.rockylinux.lan.
3 IN PTR www.rockylinux.lan.
CoreDNS-002 从节点配置如下:
# 前面配置保持不变,追加以下配置
[root@coredns-002 ~]# cat >> /etc/coredns/Corefile << \EOF
4.168.192.in-addr.arpa:53 {
secondary {
transfer from 192.168.1.1
}
log
errors
}
EOF
查看主从节点日志,确保 Zone 已经全区域传输(AXFR)。
# 主节点
[root@coredns-001 ~]# journalctl -f -u coredns
Jul 06 19:38:53 coredns-001 coredns[78272]: [INFO] plugin/transfer: Outgoing transfer of 7 records of zone "4.168.192.in-addr.arpa." to 192.168.1.2 for 2024070818 SOA serial
Jul 06 19:38:53 coredns-001 coredns[78272]: [INFO] 192.168.1.2:44830 - 57333 "AXFR IN 4.168.192.in-addr.arpa. tcp 40 false 65535" NOERROR qr,aa 508 0.000154719s
# 从节点
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 19:38:53 coredns-002 coredns[179019]: [INFO] plugin/file: Notify from 192.168.1.1 for 4.168.192.in-addr.arpa.: checking transfer
Jul 06 19:38:53 coredns-002 coredns[179019]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: checking transfer
Jul 06 19:38:53 coredns-002 coredns[179019]: [INFO] plugin/file: Notify from 192.168.1.1 for rockylinux.lan.: no SOA serial increase seen
客户端测试验证
# SOA 类型解析
[root@client-001 ~]# dig @192.168.1.2 -t soa 4.168.192.in-addr.arpa
; <<>> DiG 9.16.23-RH <<>> @192.168.1.2 -t soa 4.168.192.in-addr.arpa
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: NOERROR, id: 61150
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: cc46d83c5cac4623 (echoed)
;; QUESTION SECTION:
;4.168.192.in-addr.arpa. IN SOA
;; ANSWER SECTION:
4.168.192.in-addr.arpa. 3600 IN SOA ns1.rockylinux.lan. admin.rockylinux.lan. 2024070818 3600 1800 1209600 3600 # 返回值
;; AUTHORITY SECTION:
4.168.192.in-addr.arpa. 3600 IN NS ns1.rockylinux.lan.
4.168.192.in-addr.arpa. 3600 IN NS ns2.rockylinux.lan.
;; Query time: 1 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Wed Jul 06 19:39:15 CST 2024
;; MSG SIZE rcvd: 267
[root@client-001 ~]# dig @192.168.1.2 +short -t soa 4.168.192.in-addr.arpa
ns1.rockylinux.lan. admin.rockylinux.lan. 2024070818 3600 1800 1209600 3600
# IP 反向解析
[root@client-001 ~]# dig @192.168.1.2 -x 192.168.4.1
; <<>> DiG 9.16.23-RH <<>> @192.168.1.2 -x 192.168.4.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- \opcode: QUERY, status: NOERROR, id: 19665
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 85bd638ae8972b63 (echoed)
;; QUESTION SECTION:
;1.4.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
1.4.168.192.in-addr.arpa. 3600 IN PTR api.rockylinux.lan.
;; AUTHORITY SECTION:
4.168.192.in-addr.arpa. 3600 IN NS ns1.rockylinux.lan.
4.168.192.in-addr.arpa. 3600 IN NS ns2.rockylinux.lan.
;; Query time: 3 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Wed Jul 06 19:39:41 CST 2024
;; MSG SIZE rcvd: 229
[root@client-001 ~]# dig @192.168.1.2 -x 192.168.4.1 +short
api.rockylinux.lan.
[root@client-001 ~]# dig @192.168.1.2 -x 192.168.4.2 +short
bbs.rockylinux.lan.
[root@client-001 ~]# dig @192.168.1.2 -x 192.168.4.3 +short
www.rockylinux.lan.
服务器端日志输出:
[root@coredns-002 ~]# journalctl -f -u coredns
Jul 06 19:39:15 coredns-002 coredns[179019]: [INFO] 192.168.3.1:34981 - 61150 "SOA IN 4.168.192.in-addr.arpa. udp 63 false 4096" NOERROR qr,aa,rd 244 0.000248924s
Jul 06 19:39:37 coredns-002 coredns[179019]: [INFO] 192.168.3.1:52719 - 37784 "SOA IN 4.168.192.in-addr.arpa. udp 63 false 4096" NOERROR qr,aa,rd 244 0.000234013s
Jul 06 19:39:41 coredns-002 coredns[179019]: [INFO] 192.168.3.1:32861 - 19665 "PTR IN 1.4.168.192.in-addr.arpa. udp 65 false 4096" NOERROR qr,aa,rd 206 0.000424799s
Jul 06 19:39:52 coredns-002 coredns[179019]: [INFO] 192.168.3.1:33214 - 1589 "PTR IN 1.4.168.192.in-addr.arpa. udp 65 false 4096" NOERROR qr,aa,rd 206 0.000258263s
Jul 06 19:39:56 coredns-002 coredns[179019]: [INFO] 192.168.3.1:47115 - 29185 "PTR IN 2.4.168.192.in-addr.arpa. udp 65 false 4096" NOERROR qr,aa,rd 206 0.000434592s
Jul 06 19:40:00 coredns-002 coredns[179019]: [INFO] 192.168.3.1:58926 - 48963 "PTR IN 3.4.168.192.in-addr.arpa. udp 65 false 4096" NOERROR qr,aa,rd 206 0.000254077s
客户端配置
前面我们已经完成了 Zone 的正向解析(如 A、AAAA、MX 等)和反向解析配置的讲解。以下部分为客户端 DNS 配置说明。
客户端 DNS 配置
使用以下命令设置 DNS 服务器和 DNS 搜索域:
# 设置 DNS 服务器及 DNS 搜索域
[root@client-001 ~]# nmcli connection modify ens18 ipv4.dns 192.168.1.1,192.168.1.2 ipv4.dns-search rockylinux.lan
# 重启网络服务,配置生效
[root@client-001 ~]# systemctl restart NetworkManager
# 确保配置已经生效
[root@client-001 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search rockylinux.lan
nameserver 192.168.1.1
nameserver 192.168.1.2
在开始测试并验证配置前,先简单讲解反向解析的工作流程。
当您输入短主机名例如 api 时,DNS 系统应能够找到对应的 FQDN(如 api.rockylinux.lan)并解析为 192.168.4.1 的 IP 地址。为此,系统将使用 dns1 和 dns2 这两个 DNS 服务器来查询 rockylinux.lan 域的 IP 地址。
反向解析测试
使用 ping 命令测试反向解析:
# 测试短主机名的反向解析
[root@client-001 ~]# ping -c 2 api
PING api.rockylinux.lan (192.168.4.1) 56(84) bytes of data.
64 bytes from api.rockylinux.lan (192.168.4.1): icmp_seq=1 ttl=254 time=0.304 ms
64 bytes from api.rockylinux.lan (192.168.4.1): icmp_seq=2 ttl=254 time=0.373 ms
--- api.rockylinux.lan ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.304/0.338/0.373/0.034 ms
# 测试 FQDN 的反向解析
[root@client-001 ~]# ping -c 2 api.rockylinux.lan
PING api.rockylinux.lan (192.168.4.1) 56(84) bytes of data.
64 bytes from api.rockylinux.lan (192.168.4.1): icmp_seq=1 ttl=254 time=0.203 ms
64 bytes from api.rockylinux.lan (192.168.4.1): icmp_seq=2 ttl=254 time=0.366 ms
--- api.rockylinux.lan ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.203/0.284/0.366/0.081 ms
通过以上测试,您会发现即使使用短主机名,系统仍能找到对应的 FQDN。这是因为 /etc/resolv.conf 中的 search 设置起了作用。然而,像 dig 这样的工具不能使用短主机名,必须输入完整的 FQDN。不过,ping、curl 等命令是可以使用短主机名的。此外,ssh 命令也是可以的,我们可以通过 ssh api 连接服务器。这种方式简化了日常操作,非常实用。
正向解析测试
使用 ping 命令测试正向解析:
[root@client-001 ~]# ping -c 2 192.168.4.1
PING 192.168.4.1 (192.168.4.1) 56(84) bytes of data.
64 bytes from 192.168.4.1: icmp_seq=1 ttl=254 time=0.755 ms
64 bytes from 192.168.4.1: icmp_seq=2 ttl=254 time=0.440 ms
--- 192.168.4.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1059ms
rtt min/avg/max/mdev = 0.440/0.597/0.755/0.157 ms
参考文献
[1] transfer
[2] Zone file
[3] secondary










