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


26

我已连接到局域网,并且可以通过网关访问Internet。局域网中有DNS服务器,它能够从局域网中解析计算机的主机名。

我想配置systemd-resolvedsystemd-networked,以便将对本地主机名的查找请求仅定向(路由)到本地DNS服务器,并将对所有其他主机名的查找请求仅定向到另一台远程DNS服务器。

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

Answers:


28

在本地网络接口的配置文件中,我们必须使用DHCP=option指定要从DHCP服务器获取本地DNS服务器地址:

[Network]
DHCP=yes

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

[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=选项。但是,此功能仍然存在未解决的问题-请参阅系统联网的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-决心,libnss_resolve.so.2手册页systemd-resolved.service,systemd分辨

也可以看看:

参考文献:


6
您是否考虑过不使用.local此示例?当然有了avahi,这应该是为MDNS保留的,滥用它是一个很大的禁忌。对我来说,使用example.com.example会更清楚。
sourcejedi

1
@sourcejedi作为参考.local被定义为在RFC 6762专用域- 多播DNS在部分多播DNS名称。谢谢,固定。
Piotr Dobrogost '18年

不相关的注意事项:您也可以自我接受答案。
intelfx

2
我认为为本地网络接口添加配置文件的位置将很有用。不确定是对的/etc/systemd/network/*.network吗?在此处找到superuser.com/a/1365864
皮埃尔·科尔迪耶

1
我观察到,此答案的“在配置文件中...”对OP的响应“让我们假设我不知道配置文件在...的位置”没有反应。特定配置文件的位置,此答案不完整。
埃里克·塔

1

只是为了扩展@piotrDobrogost的出色答案,别忘了配置/etc/nsswitch.confsystemd-resolved用作DNS解析源。hosts针对您的特定用例,您的指令应如下所示:

/etc/nsswitch.conf

hosts:  files resolve dns

所以,如果你限制了分辨率,仅在指定的域Domains在指令/etc/systemd/resolved.conf如彼得上述资料,DNS下一步应该在指定的名称解析源顺序咨询/etc/nsswitch.conf时域中发现的Domains指令:

以下链接引用了指定解析的要求,/etc/nsswitch.conf因此systemd-resolved在名称解析过程中将被查阅:

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

我发现SystemD文档很可怕。我不得不从多个环节(包括上面Piotr的回答;-)进行理解。


当使用systemd-resolved的推荐操作模式时,其中文件的符号链接又包含systemd-resolve的 DNS存根解析器的地址,因此无需在文件中放置指令,因为DNS请求将被定向到(由于标准指令)存根解析器,它根据systemd-resolved的规则进行操作。/etc/resolve.conf/run/systemd/resolve/stub-resolv.confresolve/etc/nsswitch.confnss-dns
Piotr Dobrogost

@PiotrDobrogost如何在不使用/etc/nsswitch.conf``? In the specimen config above, / etc / hosts`的情况下控制查询DNS解析的顺序源(“ 文件 ”),将检查静态IP:名称映射,如果未找到,则将参考已解析的systemd-resolved存根。我看不到如何在不使用的情况下暂存DNS解析源/etc/nsswitch.conf。我在这里错过了一个把戏吗?
F1Linux

我并不是说/etc/nsswitch.conf不需要。我是说,当使用systemd-resolved的存根DNS解析器时,足以在行中dns列出指令hosts:(大概在file指令之后)。在那里不需要resolve指令,因为它是存根解析器,它是systemd-resolved逻辑的入口点,而不是插件模块的入口点 ……nss-resolve
Piotr Dobrogost

......换句话说,你可以达到 systemd分辨的逻辑既可以通过resolve指令➟ NSS-决心 NSS插件模块➟ systemd分辨或通过dns指令➟ NSS-DNS NSS插件模块➟ systemd分辨的 “存根DNS解析器➟ systemd-resolved
Piotr Dobrogost

@PiotrDobrogost我想我到达files然后resolve在啄/etc/nsswitch.conf从你的问题的第二部分。重新阅读它,好像您只是在谈论检查本地高速缓存中的IP:名称映射,然后如果找不到,请联系转发器。我通常将files第一个DNS解析源设置为绕过DNS,以允许我测试而不打生产主机-T
F1Linux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.