如何在 Ubuntu Server 20.04 上刷新/获取新的 DNS 服务器?

sdb*_*bbs 7 server command-line networking dns 20.04

我在云中使用“虚拟专用服务器”,其中安装了 Ubuntu 20.04。

我注意到,有时,当我重新启动服务器时,我无法 ping 通任何内容:

$ ping yahoo.com
ping: yahoo.com: Temporary failure in name resolution
$ resolvectl query yahoo.com
yahoo.com: resolve call failed: No appropriate name servers or networks for name found
Run Code Online (Sandbox Code Playgroud)

据我了解,由于这是 Ubuntu 20.04,/etc/resolv.conf不再真正使用,并且systemd取代了 DNS 的处理。

但是,无论如何,我不想手动指定 DNS 服务器(就像将 Google 的 8.8.8.8 放入 中的老把戏一样/etc/resolv.conf) - 显然,大多数时候 DNS 工作:当服务器启动时,它以某种方式“获得” DNS 服务器。所以,我想重复这个过程,但我不知道如何重复。

(以此类推,如果我想刷新/获取一台机器的新 IP 地址,我知道该机器应该向 DHCP 服务器请求该地址 - 所以最终,很容易查找,为了做到这一点,我sudo dhclient -r eth0例如应该这样做)

另请注意,当 DNS 名称解析不起作用时,我不会DNS Servers在此输出中列出:

$ systemd-resolve --status
Global
       LLMNR setting: no
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
          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 2 (eth0)
      Current Scopes: none
DefaultRoute setting: no
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
Run Code Online (Sandbox Code Playgroud)

我发现要清除 DNS 缓存,他们(https://unihost.com/help/how-to-clear-the-dns-cache/)建议:

sudo /etc/init.d/networking restart
Run Code Online (Sandbox Code Playgroud)

...但是,我不想运行这个命令,因为我通过连接到服务器ssh,所以我想整个网络的重新启动也会终止我的ssh终端会话,并可能产生其他意想不到的后果。

所以,我想知道:是否有一个命令可以在ssh会话中运行,该命令可以刷新或获取该计算机的新 DNS 服务器 - 使用启动时使用的类似机制(当 DNS 实际在此计算机上运行时)?

sdb*_*bbs 12

好吧,我刚刚发现https://unix.stackexchange.com/questions/328131/how-to-troubleshoot-dns-with-systemd-resolved其中注释:

...有时重新启动sudo systemctl restart systemd-resolved是一个好主意。

所以,我确实尝试了这个命令:

sudo systemctl restart systemd-resolved
Run Code Online (Sandbox Code Playgroud)

...事实上,出现在(或,似乎显示相同的报告)DNS Servers的输出中systemd-resolve --statusresolvectl status

其他可能性:

在 Ubuntu 20.04 上,systemd-resolved包含一个本地 DNS 服务器,充当systemd存根解析器,它应该自动/etc/resolv.conf使用正确的配置进行编辑。

...

此文件包含来自 DHCP 租约的 DNS 服务器,但请注意,您不会从存根解析器缓存功能中受益。

啊,如果 DNS 服务器是从 DHCP 租约获得的 - 那么也有可能sudo dhclient -r eth0起作用。

终于,我敢跑了:

$ sudo /etc/init.d/networking restart
Restarting networking (via systemctl): networking.service.
Run Code Online (Sandbox Code Playgroud)

...事实证明,这并没有破坏我的ssh会话,所以这也很好。