systemd 127.0.0.53 上的 DNS 忽略了一些查找

sch*_*rak 20 networking dns 18.04

在 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
Run Code Online (Sandbox Code Playgroud)

也失败

$ nslookup -i wlp3s0 web1
nslookup: couldn't get address for 'web1': not found
Run Code Online (Sandbox Code Playgroud)

正确结果:

$ nslookup web1 192.168.1.1

Server:     192.168.1.1
Address:    192.168.1.1#53

Name:   web1
Address: 192.168.1.107
Run Code Online (Sandbox Code Playgroud)

配置信息 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
                      d.f.ip6.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
Run Code Online (Sandbox Code Playgroud)

配置信息 NetworkManager

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=false

[device]
wifi.scan-rand-mac-address=no
Run Code Online (Sandbox Code Playgroud)

那么如何让 nslookup 返回正确的答案呢?链接 3 似乎是正确的信息(我的 wifi 连接),我在路由器上的 DNS 返回了正确的答案,但本地缓存从不尝试查找地址(或者看起来如此)。

sch*_*rak 24

我找到了对我有用的修复程序。

我的 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
Run Code Online (Sandbox Code Playgroud)

我删除了它并指向正确的文件。重新启动后,这解决了我的问题。我什至能够在我的笔记本电脑上切换网络并且 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
Run Code Online (Sandbox Code Playgroud)

之后,一切都按我的预期工作,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
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,这解决了它。我没有重新启动笔记本电脑,只是使用“sudo /etc/init.d/networking restart”重新启动了网络 (2认同)
  • 哇,这太疯狂了。谢谢。这个错误有没有得到修复?这是 Docker 特有的错误吗?我认为 `resolv.conf` 是为 docker 桥接网络 DNS 设置的,对吗? (2认同)

Lau*_*ves 13

-您的resolv.conf文件没有指向错误的地方../run/systemd/resolve/stub-resolv.conf 它在默认情况下应该点。

问题是systemd-resolved不会将非点名称传递到 DNS。显然,这是“按设计”工作的。请参阅此 github 问题,其中指出“已解决永远不会允许单标签查找泄漏到单播 DNS”。

无论你在GitHub的问题推理同意,有一种方法来解决这个问题。它甚至不需要对 Ubuntu 机器上的默认设置进行任何更改:

  1. 首先,你的局域网的 DNS 必须有一个域名。

    如果您使用的是 dnsmasq,请/etc/dnsmasq.conf在您的 DNS 服务器上添加以下内容:

    expand-hosts
    domain=your-domain # replace "your-domain" with domain of your choice
    
    Run Code Online (Sandbox Code Playgroud)

    如果您添加域,您现在应该能够解析 LAN 主机名:

    nslookup web1.your-domain
    
    Run Code Online (Sandbox Code Playgroud)
  2. 其次,如果您的 DHCP 服务器与您的 DNS 服务器不同,请确保您的 LAN 域的名称也在您的 DHCP 服务器中设置。在我的 DHCP 服务器(我的路由器)上,此设置仅称为“域名”。

    如果您随后在 Ubuntu 机器上续订 DHCP 租约,您应该会看到一个搜索指令出现在/run/systemd/resolve/stub-resolv.conf

    nameserver 127.0.0.53
    search your-domain
    
    Run Code Online (Sandbox Code Playgroud)

现在查找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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用dig代替nslookupdig默认情况下不使用搜索路径 - 使用其+search选项来启用它。


Mar*_*tin 5

有时删除符号链接/etc/resolv.conf正确的做法。

我最近将我们的权威 DNS 服务器迁移到了一台新建的主机,该主机(与之前的主机不同)安装了 systemd。

结果很糟糕

尽管世界其他地方会看到正确的结果,但 systemd 解析器会将过时的结果提供给本地服务,这会扰乱其他服务,特别是内部邮件转发器。

dig @127.0.0.53会显示它不时地备份 TTL,因此它的缓存永远不会过期;我怀疑它正在有效地查询自身,因为 NS 指向该主机。

跑步systemd-resolve --flush-caches什么也没做。

编辑/etc/systemd/resolved.conf和设置DNSStubListener=no最终停止了解析器的运行,尽管它似乎时不时地弹出几秒钟。

至少现在传统的服务实际上可以得到正确的答案,但是那些通过 DBUS 执行名称查找的服务已经无法挽回地被破坏了。

现在我明白为什么这么多人讨厌 systemd 了;它会干扰其他它没有理由触及的子系统,并且没有有效的方法来阻止它这样做。即使 NIS 也没有被破坏得这么严重;为什么 systemd 需要改变它并使其变得更糟?