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