Ubuntu 18、VPN和DNS:curl不能解析VPN-host,但是nslookup和dig可以
Ubuntu 18, VPN and DNS: curl wont resolve VPN-host, but nslookup and dig can
我发现显然在 Ubuntu 18 中整个 DNS 设置非常混乱。我通过 pritunl VPN 连接到我的 kube-cluster,我正在尝试使用 kube-dns 服务器。所以我首先尝试使用 https://github.com/jonathanio/update-systemd-resolved to update my DNS settings with the pushed DNS server from the VPN, but it seems that currently something is broken (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
[...]
所以这看起来不错,但是:
% curl 'https://pritunl-ui.infra.svc.cluster.local' --insecure
curl: (6) Could not resolve host: pritunl-ui.infra.svc.cluster.local
尽管调用 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.
我也尝试过将它关闭并再次打开(我的主机),但保持不变。 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
有什么想法可以实现吗?
回答我自己的问题:我更深入地挖掘并了解了一些关于 avahi
、nscd
、systemd-resolve
和 nsswitch
的魔法。所以显然问题出在我的 /etc/nsswitch.conf
:
中的这一行
hosts: files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns myhostname
我错过了 update-systemd-resolved
的自述文件,实际上建议更改此行。所以我把它改成了
hosts: files dns resolve myhostname
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
我也试过把[NOTFOUND=return]
部分去掉,好像效果一样,也可以。也许它说的是 "if mdns fails, stop here and ignore the rest"..?我认为这是一个非常奇怪的策略。
我发现显然在 Ubuntu 18 中整个 DNS 设置非常混乱。我通过 pritunl VPN 连接到我的 kube-cluster,我正在尝试使用 kube-dns 服务器。所以我首先尝试使用 https://github.com/jonathanio/update-systemd-resolved to update my DNS settings with the pushed DNS server from the VPN, but it seems that currently something is broken (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
[...]
所以这看起来不错,但是:
% curl 'https://pritunl-ui.infra.svc.cluster.local' --insecure
curl: (6) Could not resolve host: pritunl-ui.infra.svc.cluster.local
尽管调用 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.
我也尝试过将它关闭并再次打开(我的主机),但保持不变。 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
有什么想法可以实现吗?
回答我自己的问题:我更深入地挖掘并了解了一些关于 avahi
、nscd
、systemd-resolve
和 nsswitch
的魔法。所以显然问题出在我的 /etc/nsswitch.conf
:
hosts: files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns myhostname
我错过了 update-systemd-resolved
的自述文件,实际上建议更改此行。所以我把它改成了
hosts: files dns resolve myhostname
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
我也试过把[NOTFOUND=return]
部分去掉,好像效果一样,也可以。也许它说的是 "if mdns fails, stop here and ignore the rest"..?我认为这是一个非常奇怪的策略。