NetworkManager、systemd-resolved 和 VPN 隧道“忽略”DNS 服务器

NetworkManager、systemd-resolved 和 VPN 隧道“忽略”DNS 服务器

使用 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 。wlo1sudo resolvectl domain wlo1 some.search.tldtun0

我甚至添加了其中一个 DNS tun0wlo1并期望它会被使用,因为 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 的请求。

相关内容