Ubuntu 18、VPN 和 DNS:curl 无法解析 VPN 主机,但 nslookup 和 dig 可以

leb*_*cht 5 dns curl openvpn ubuntu-18.04

我发现显然在 Ubuntu 18 中,整个 DNS 设置非常混乱。我通过 pritunl VPN 连接到我的 kube-cluster 并且我正在尝试使用 kube-dns 服务器。所以我首先尝试使用https://github.com/jonathanio/update-systemd-resolved通过从 VPN 推送的 DNS 服务器更新我的 DNS 设置,但目前似乎有些问题(https://github. com/jonathanio/update-systemd-resolved/issues/64)。由于我可以在某处对 DNS ip 进行硬编码,因此我尝试将 IP 放在某些地方:安装 resolvconf 并将其放入/etc/resolvconf/resolv.conf.d/head,放入/etc/systemd/resolved.conf,当然也尝试将其直接放入/etc/resolv.conf,因为我是一个天真的人。重新启动一些东西几次后,我达到了一个更加混乱的状态:

% dig pritunl-ui.infra.svc.cluster.local                      
[...]
;; ANSWER SECTION:
pritunl-ui.infra.svc.cluster.local. 30 IN A 10.15.246.61
[...]
Run Code Online (Sandbox Code Playgroud)

所以这看起来不错,但是:

% curl 'https://pritunl-ui.infra.svc.cluster.local' --insecure
curl: (6) Could not resolve host: pritunl-ui.infra.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

调用 IP 确实有效:

% curl 'https://10.15.246.61' --insecure
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="https://10.15.246.61/login">https://10.15.246.61/login</a>.  If not click the link.
Run Code Online (Sandbox Code Playgroud)

我也试过关闭再打开(我的主机),但保持不变。nslookup也工作正常,tracepath没有。

% systemd-resolve --status
Global
         DNS Servers: 10.15.240.10
          DNS Domain: svc.cluster.local
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 3 (tun0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.15.240.10
          DNS Domain: default.svc.cluster.local
                      ~.

Link 2 (wlp2s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.178.1
                      fd00::cece:1eff:feba:6468
          DNS Domain: ~.
                      fritz.box
Run Code Online (Sandbox Code Playgroud)

任何想法如何使这项工作?

leb*_*cht 6

要回答我的问题:我挖一个深一点,并了解了一些关于avahi,nscd,systemd-resolve和神奇nsswitch。所以显然问题是我的这一行/etc/nsswitch.conf:

hosts:          files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns myhostname
Run Code Online (Sandbox Code Playgroud)

我错过了update-systemd-resolved实际上建议更改此行的自述文件。所以我把它改成

hosts:          files dns resolve myhostname
Run Code Online (Sandbox Code Playgroud)

Et Voilà,现在 curl 可以到达主机:

$ getent ahosts pritunl-ui.infra.svc.cluster.local
10.15.246.61    STREAM pritunl-ui.infra.svc.cluster.local
10.15.246.61    DGRAM  
10.15.246.61    RAW    
Run Code Online (Sandbox Code Playgroud)

我也尝试只删除该[NOTFOUND=return]部分,这似乎具有相同的效果,它也有效。也许它会说“如果 mdns 失败,请停在这里并忽略其余部分”..?我认为这将是一个非常奇怪的策略。