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机器上的默认设置进行任何更改:

  1. 首先,您的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 
  2. 其次,如果与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