systemd的127.0.0.53中的DNS忽略了一些查找
除非我按名称查询本地计算机,否则在127.0.0.53处安装的systemd的DNS似乎正在工作。 但是,如果我查询它们并专门指定本地DNS服务器(我的路由器),那么我得到正确的答复。 但是配置文件说它也使用路由器作为搜索地址。 有什么想法吗?
我在戴尔笔记本电脑上运行Ubuntu 18.04。
结果不正确:
$ nslookup web1 Server: 127.0.0.53 Address: 127.0.0.53#53 ** server can't find web1: SERVFAIL
也失败了
$ nslookup -i wlp3s0 web1 nslookup: couldn't get address for 'web1': not found
正确的结果:
$ nslookup web1 192.168.1.1 Server: 192.168.1.1 Address: 192.168.1.1#53 Name: web1 Address: 192.168.1.107
配置信息systemd-resolve
$ systemd-resolve --status Global 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 dfip6.arpa home internal intranet lan local private test Link 3 (wlp3s0) Current Scopes: DNS LLMNR setting: yes MulticastDNS setting: no DNSSEC setting: no DNSSEC supported: no DNS Servers: 192.168.1.1 DNS Domain: wp.comcast.net Link 2 (enp2s0) Current Scopes: none LLMNR setting: yes MulticastDNS setting: no DNSSEC setting: no DNSSEC supported: no
配置信息NetworkManager
$ cat /etc/NetworkManager/NetworkManager.conf [main] plugins=ifupdown,keyfile [ifupdown] managed=false [device] wifi.scan-rand-mac-address=no
那么如何让nslookup返回正确的答案呢? 链接3似乎是正确的信息(我的wifi连接)和我在路由器上的DNS返回正确的答案,但本地缓存从不试图查找地址(或似乎)。
你的resolv.conf文件没有指向错误的位置 – ../run/systemd/resolve/stub-resolv.conf
是默认情况下应该指向的位置。
问题是systemd-resolved
不会将非点名称传递给DNS。 显然这是“按设计”工作。 请参阅此github问题 , 该问题表明“已解决将永远不会允许单标签查找泄漏到单播DNS”。
无论你是否同意github问题中的推理,都有办法解决这个问题。 它甚至不需要对Ubuntu机器上的默认设置进行任何更改:
-
首先,您的LAN的DNS必须具有域名。
如果您使用的是dnsmasq,请将以下内容添加到DNS服务器上的
/etc/dnsmasq.conf
:expand-hosts domain=your-domain # replace "your-domain" with domain of your choice
如果添加域,您现在应该能够解析LAN主机名:
nslookup web1.your-domain
-
其次,如果与DNS服务器不同,请确保您的LAN域名也在DHCP服务器中设置。 在我的DHCP服务器(我的路由器)上,此设置称为“域名”。
如果您在Ubuntu框中续订DHCP租约,您应该会在
/run/systemd/resolve/stub-resolv.conf
看到搜索指令:nameserver 127.0.0.53 search your-domain
现在查找web1
会将其扩展到web1.your-domain
,然后使用DNS解析。
$ nslookup web1 Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: web1.your-domain Address: 192.168.1.107
请注意,如果您使用dig
而不是nslookup
,则dig
默认情况下不使用搜索路径 – 使用其+search
选项启用它。
我找到了适用于我的修复程序。
我的resolv.conf文件指向错误的地方。 这似乎是Ubuntu中的一个错误,因为它发生在我的笔记本电脑上(我第一次注意到这个问题的机器)和全新安装的Ubuntu 18.04服务器。
默认
$ ls -l /etc/resolv.conf lrwxrwxrwx 1 root root 39 Apr 26 12:07 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
我删除了这个并指向正确的文件。 重启后,这解决了我的问题。 我甚至能够在笔记本电脑上切换网络并正确切换DNS。 当然,在外部网络上,我无法解析任何本地机器,但这是预期的。 一旦切换回本地网络,所有本地计算机都会正确解析,因为我的路由器是DNS。
修复
$ sudo rm -f /etc/resolv.conf $ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf $ ls -l /etc/resolv.conf lrwxrwxrwx 1 root root 32 May 29 08:48 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf $ sudo reboot
在那之后,一切都按预期工作,127.0.0.53根本不再使用。
正确的结果
$ nslookup web1 Server: 192.168.1.1 Address: 192.168.1.1#53 Name: web1 Address: 192.168.1.107 $ nslookup google.com Server: 192.168.1.1 Address: 192.168.1.1#53 Non-authoritative answer: Name: google.com Address: 172.217.7.174 Name: google.com Address: 2607:f8b0:4004:80e::200e