Rocky 10:用 routing domain 做 split DNS,只让一个域走内网解析器
Rocky Linux 10.2 Server 组虚拟机,systemd-resolved-257-23.el10_2.1.rocky.0.1(该包不在 Server 组默认集合里,从安装介质补装)。
实验:让 *.lab.test 走内网解析器(192.168.2.241),其余域名保持默认路径。截图:public/evidence/resolved/rocky-split.png。
两条命令就够
Section titled “两条命令就够”sudo resolvectl dns ens18 192.168.2.241sudo resolvectl domain ens18 '~lab.test'~ 前缀是关键:它把 lab.test 声明为 routing domain(路由域),表示「只有这个域名的查询才交给这台 DNS」。
不加 ~ 时,lab.test 只是 search domain(搜索域),用于补全短名,不会改变查询的走向。
怎么证明它真的走过去了
Section titled “怎么证明它真的走过去了”$ resolvectl query web.lab.testweb.lab.test: 192.168.2.241 -- link: ens18-- Information acquired via protocol DNS in 1.0ms.-- link: ens18 就是证据:这条结果来自 ens18 上配置的链路级 DNS。
$ resolvectl status ens18 DNS Servers: 192.168.2.241 DNS Domain: ~lab.test域外的名字不会过去
Section titled “域外的名字不会过去”$ resolvectl query example.comexample.com: resolve call failed: Could not resolve 'example.com', server or network returned error: REFUSED (Not Ready)实验网没有可用上游,所以域外名字失败——这恰好证明了 split 生效:example.com 没有被送到 192.168.2.241,否则内网 dnsmasq 会按通配记录返回它自己的地址(一个典型的「解析污染」误判)。
真实环境里这一侧会配公共上游,同一台机器上两套域名各走各路。
持久化:交给 NetworkManager
Section titled “持久化:交给 NetworkManager”resolvectl 的改动是运行时的,重启或 nmcli con up 后会被覆盖。持久化要写进连接配置:
sudo nmcli connection modify lab-static ipv4.dns 192.168.2.241sudo nmcli connection modify lab-static ipv4.dns-search '~lab.test'sudo nmcli connection up lab-staticresolvectl status ens18 | grep -E 'DNS Servers|DNS Domain'检查点:DNS Domain 里要能看到带 ~ 的那一项。
- 忘了
~:域名只是搜索后缀,查询仍走默认 DNS; - 只改
/etc/resolv.conf:resolved 不读它(它自己写这个文件),配置无效; - 改完看
resolvectl query成功就以为持久:nmcli con up之后会打回原形; - 用
dig验证 split:dig直连指定服务器,绕过 resolved 的选路,看到的是另一回事。
练习:观察 ~ 的有无差别
Section titled “练习:观察 ~ 的有无差别”sudo resolvectl domain ens18 'lab.test' # 去掉 ~resolvectl query web.lab.testsudo resolvectl domain ens18 '~lab.test' # 加回 ~resolvectl query web.lab.testresolvectl status ens18 | grep 'DNS Domain'检查:
- 带
~时结果是-- link: ens18; - 不带
~时,DNS Domain显示为lab.test(无~),查询不再指定这条链路; resolvectl status的Current DNS Server与预期一致;- 恢复
~后行为回到 split 状态。
常见问题
能配多个 routing domain 吗?
能,resolvectl domain 支持一次写多个,例如 `~lab.test ~corp.internal`。
和 /etc/hosts 谁优先?
resolved 默认会先查 hosts(取决于 nsswitch.conf 的 hosts 行),比 DNS 更早命中。
为什么 dig 查不到 split 效果?
dig 直接向指定服务器发包,不经过 resolved 的路由选择;用 resolvectl query 才是验证 split 的正确工具。
- resolved 基础:/systemd-resolved/
- dnsmasq 服务端:/dnsmasq-lab/
- NetworkManager:/network-basics/