![NetworkManager、systemd-resolved 和 VPN 隧道“忽略”DNS 服务器](https://linux22.com/image/943923/NetworkManager%E3%80%81systemd-resolved%20%E5%92%8C%20VPN%20%E9%9A%A7%E9%81%93%E2%80%9C%E5%BF%BD%E7%95%A5%E2%80%9DDNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
使用 Ubuntu 20.04,我使用 NetworkManager 通过 WLan 连接到互联网。然后我使用 OpenConnect 建立 VPN。我正在使用“stub resolv.conf”:/etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
并且我hosts: files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
在 中有/etc/nsswitch.conf
。
除了 VPN 的 DNS 10.233.63.202 未被使用之外,一切正常:
Link 37 (tun0)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 10.233.63.202
DNS Servers: 10.233.63.202
10.233.63.203
看着journalctl -u systemd-resolved -f,仅使用WLan链路的“当前DNS服务器”192.168.3.1:
Link 3 (wlo1)
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.3.1
DNS Servers: 192.168.3.1
10.233.63.202
10.231.76.11
DNS Domain: ~.
据我目前了解,systemd-resolved 可能不会使用 的 DNS,tun0
因为 NetworkManager 会将~.
“DNS 域”添加到wlo1
。即使我将其添加到tun0
并从中sudo resolvectl domain tun0 ~.
删除,也不会使用的 DNS 。wlo1
sudo resolvectl domain wlo1 some.search.tld
tun0
我甚至添加了其中一个 DNS tun0
,wlo1
并期望它会被使用,因为 192.168.3.1 没有答案,但事实并非如此。
只有当我更改 DNS 的顺序,wlo1
即 10.233.63.202 为“当前 DNS 服务器”时,VPN 中的主机名才会被解析。看起来好像只有“当前 DNS 服务器”wlo1
被查询过。
如果由于某种原因 OpenConnect、NetworkManager 和 systemd-resolved 不能很好地协同运行而未使用 VPN 链接的 DNS,我可以接受。
但为什么其他 DNS 未被wlo1
使用呢?事实上,到目前为止,这个 DNS 已经运行多年了。
另外,我不知道我需要多大程度担心 DNS 泄漏,如果我将 VPN DNS 添加为 WLan 链接的“当前 DNS 服务器”的话,可能会发生这种泄漏?
答案1
[Torsten,你的问题中缺少的是你想让事情如何运作。所以我将在这里概述一些可能性,然后再回来提供更完整的答案。你的设置有些奇怪,你的 VPN DNS 提供商列在你的 wlo1 接口上,尽管这可能不会影响任何实际问题,直到你当前的 DNS 服务器出现故障。]
我在 20.04 LTS 上的 network-manager-openconnect 上也遇到了类似的问题,在阅读了 mcatanzaro 的关于 VPN 和 Split DNS 的博客我已经弄清楚了足够多的事情,可以让我的设置正常工作。一些提示:
- solved 确实允许您将默认的 DNS 搜索更改为不同的接口(不确定为什么您的接口还不起作用)但这确实会将所有查找泄露到 VPN 的 DNS 服务器。
- 您可以直接使用 resolvectl 设置和清除 DNS 域设置来测试这一点;例如,下面我让 wlo1 激活 DNS 搜索,并且不会对 tun0 进行任何查询:
sudo resolvectl domain tun0 "" sudo resolvectl domain wlo1 "~¨
- 如果您清除两个接口的 DNS 域设置(将两者都设置为空字符串),则将查询两个接口的 DNS 服务器,如果其中一个返回答案,那么您将获得该答案。(我不确定如果它们在 NXDOMAIN 结果以外的任何方面存在分歧,它如何解决冲突。)
- 但是,如果您不想泄露 DNS 请求,则需要将 DNS 域设置为仅使用特定子集域的 DNS 服务器。您可以
resolvectl
像上面一样使用,或者,要在 NetworkManager 配置中永久更改此配置,请使用名称令人困惑的dns-search
配置:sudo nmcli con mod vpn0 ipv4.dns-search "~foo.internal,~bar.corp.com"
- 没有比这更复杂的方法了。您要么需要告诉 solved 将 VPN 的 DNS 服务器用于一组特定的域,要么将所有 DNS 查询泄露给它。
关于输出中的波浪号nmcli
,请注意,dns-search
语法允许您同时指定 DNS 域和 DNS 搜索;以波浪号为前缀的域不会添加到 DNS 搜索中,我认为这是有意义的,否则您最终可能会意外泄露缺少 FQDN 的请求。