跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    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。

    Terminal window
    sudo resolvectl dns ens18 192.168.2.241
    sudo resolvectl domain ens18 '~lab.test'

    ~ 前缀是关键:它把 lab.test 声明为 routing domain(路由域),表示「只有这个域名的查询才交给这台 DNS」。

    不加 ~ 时,lab.test 只是 search domain(搜索域),用于补全短名,不会改变查询的走向。

    $ resolvectl query web.lab.test
    web.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
    $ resolvectl query example.com
    example.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 会按通配记录返回它自己的地址(一个典型的「解析污染」误判)。

    真实环境里这一侧会配公共上游,同一台机器上两套域名各走各路。

    resolvectl 的改动是运行时的,重启或 nmcli con up 后会被覆盖。持久化要写进连接配置:

    Terminal window
    sudo nmcli connection modify lab-static ipv4.dns 192.168.2.241
    sudo nmcli connection modify lab-static ipv4.dns-search '~lab.test'
    sudo nmcli connection up lab-static
    resolvectl status ens18 | grep -E 'DNS Servers|DNS Domain'

    检查点:DNS Domain 里要能看到带 ~ 的那一项。

    • 忘了 ~:域名只是搜索后缀,查询仍走默认 DNS;
    • 只改 /etc/resolv.conf:resolved 不读它(它自己写这个文件),配置无效;
    • 改完看 resolvectl query 成功就以为持久:nmcli con up 之后会打回原形;
    • 用 dig 验证 split:dig 直连指定服务器,绕过 resolved 的选路,看到的是另一回事。
    Terminal window
    sudo resolvectl domain ens18 'lab.test' # 去掉 ~
    resolvectl query web.lab.test
    sudo resolvectl domain ens18 '~lab.test' # 加回 ~
    resolvectl query web.lab.test
    resolvectl status ens18 | grep 'DNS Domain'

    检查:

    1. 带 ~ 时结果是 -- link: ens18;
    2. 不带 ~ 时,DNS Domain 显示为 lab.test(无 ~),查询不再指定这条链路;
    3. resolvectl status 的 Current DNS Server 与预期一致;
    4. 恢复 ~ 后行为回到 split 状态。

    常见问题

    能配多个 routing domain 吗?

    能,resolvectl domain 支持一次写多个,例如 `~lab.test ~corp.internal`。

    和 /etc/hosts 谁优先?

    resolved 默认会先查 hosts(取决于 nsswitch.conf 的 hosts 行),比 DNS 更早命中。

    为什么 dig 查不到 split 效果?

    dig 直接向指定服务器发包,不经过 resolved 的路由选择;用 resolvectl query 才是验证 split 的正确工具。