如何配置 systemd-resolved 和 systemd-networkd 使用本地 DNS 服务器解析本地域,使用远程 DNS 服务器解析远程域?

如何配置 systemd-resolved 和 systemd-networkd 使用本地 DNS 服务器解析本地域,使用远程 DNS 服务器解析远程域?

我已连接到局域网,并通过网关访问互联网。本地网络中有DNS服务器,它能够解析本地网络中计算机的主机名。

我想配置systemd 解析systemd-networkd这样,对本地主机名的查找请求将专门定向(路由)到本地 DNS 服务器,而对所有其他主机名的查找请求将专门定向到另一个远程 DNS 服务器。

假设我不知道配置文件在哪里,也不知道是否应该添加更多文件并要求在答案中指定它们的路径。

答案1

在本地网络接口的配置文件(与名称模式匹配的文件/etc/systemd/network/*.network)中,我们必须指定我们要使用 DHCP 服务器获取本地 DNS 服务器地址DHCP=选项:

[Network]
DHCP=yes

或使用显式指定其地址DNS=选项:

[Network]
DNS=10.0.0.1

此外,我们需要使用(在同一部分中)指定本地域Domains=选项

Domains=domainA.example domainB.example ~example

我们指定本地域domainA.example domainB.example以获得以下行为(来自systemd-resolved.service,systemd-resolved手册页):

对以每个接口域之一结尾的主机名的查找将专门路由到匹配的接口。

这个办法hostX.domainA.example就可以解决通过我们本地的 DNS 服务器。

我们指定~example所有以 结尾的域都example将被视为仅路由域以获得以下行为(来自描述犯罪) :

具有仅路由域的 DNS 服务器只能用于指定的域。

这个办法hostY.on.the.internet就可以解决由我们的全球远程 DNS 服务器提供。

笔记

理想情况下,使用 DHCP 协议时,应该从 DHCP 服务器获取本地域名,而不是在上面的网络接口配置文件中明确指定。看UseDomains=选项。然而,此功能仍然存在悬而未决的问题 – 请参阅systemd-networkd DHCP 搜索域选项问题。

我们需要指定远程 DNS 服务器作为我们的全局、系统范围的 DNS 服务器。我们可以在/etc/systemd/resolved.conf文件中执行此操作:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

不要忘记重新加载配置并重新启动服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

警告!

上述保证仅在名称解析时适用systemd 解析- 看手册页nss-resolve,libnss_resolve.so.2systemd-resolved.service、systemd-resolved 的手册页

也可以看看:

参考:

答案2

只是为了扩展 @piotrDobrogost 的出色答案,不要忘记配置/etc/nsswitch.conf为用作systemd-resolvedDNS 解析源。对于您的特定用例,您的hosts指令应如下所示:

/etc/nsswitch.conf

hosts:  files resolve dns

因此,如果您将解析限制为仅在上述 Piotr 详细信息Domains中的指令中指定的那些域,则接下来应按照域被解析时/etc/systemd/resolved.conf指定的名称解析源的顺序查询 DNS。/etc/nsswitch.conf不是在指令中找到Domains

以下链接引用了指定的要求解决在名称解析期间会查阅/etc/nsswitch.confso :systemd-resolved

https://github.com/systemd/systemd/issues/940

我发现 SystemD 文档很糟糕。我必须从多个链接中拼凑出一个理解,包括上面 Piotr 的回答;-)

答案3

如果您这样做是因为您配置了 OpenVPN 连接,则需要使用https://github.com/jonathanio/update-systemd-resolved按照https://wiki.archlinux.org/index.php/OpenVPN#The_update-systemd-resolved_custom_script

具体来说,一旦您update-systemd-resolved在 OpenVPN 客户端配置中安装并激活了脚本,您还将添加dhcp-option DOMAIN-ROUTE yourdomain.com到相同的客户端配置中。

您应该会看到 OpenVPN 的以下输出:

<14>Apr 22 16:10:31 update-systemd-resolved: Link 'tun0' coming up
<14>Apr 22 16:10:31 update-systemd-resolved: Adding DNS Routed Domain yourdomain.com
<14>Apr 22 16:10:31 update-systemd-resolved: Adding DNS Domain yourdomain.com
<14>Apr 22 16:10:31 update-systemd-resolved: Adding IPv4 DNS Server 192.168.XYZ.XYZ
<14>Apr 22 16:10:31 update-systemd-resolved: SetLinkDNS(640 1 2 4 192 168 XYZ XYZ)
<14>Apr 22 16:10:31 update-systemd-resolved: SetLinkDomains(640 2 yourdomain.com false yourdomain.com true)

您可以使用以下命令验证 DNS 配置resolvectl status

Link 3 (wlp0s....)
      Current Scopes: DNS
DefaultRoute setting: yes
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 192.168.XYZ.XYZ
         DNS Servers: 192.168.XYZ.XYZ
          DNS Domain: ~.
                      lan
Link 640 (tun0)
      Current Scopes: DNS
DefaultRoute setting: no
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 192.168.XYZ.XYZ
         DNS Servers: 192.168.XYZ.XYZ
          DNS Domain: ~yourdomain.com

相关内容