![如何配置 systemd-resolved 和 systemd-networkd 使用本地 DNS 服务器解析本地域,使用远程 DNS 服务器解析远程域?](https://linux22.com/image/133035/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20systemd-resolved%20%E5%92%8C%20systemd-networkd%20%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90%E6%9C%AC%E5%9C%B0%E5%9F%9F%EF%BC%8C%E4%BD%BF%E7%94%A8%E8%BF%9C%E7%A8%8B%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90%E8%BF%9C%E7%A8%8B%E5%9F%9F%EF%BC%9F.png)
我已连接到局域网,并通过网关访问互联网。本地网络中有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.2和systemd-resolved.service、systemd-resolved 的手册页。
也可以看看:
参考:
答案2
只是为了扩展 @piotrDobrogost 的出色答案,不要忘记配置/etc/nsswitch.conf
为用作systemd-resolved
DNS 解析源。对于您的特定用例,您的hosts
指令应如下所示:
/etc/nsswitch.conf
hosts: files resolve dns
因此,如果您将解析限制为仅在上述 Piotr 详细信息Domains
中的指令中指定的那些域,则接下来应按照域被解析时/etc/systemd/resolved.conf
指定的名称解析源的顺序查询 DNS。/etc/nsswitch.conf
不是在指令中找到Domains
:
以下链接引用了指定的要求解决在名称解析期间会查阅/etc/nsswitch.conf
so :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