DNS 设置为 systemd 的 127.0.0.53 - 如何永久更改?

Ter*_*den 72 dns systemd-resolved

我最近升级到 17.10。当我尝试浏览某个网站或 ping 一个域时,它失败并说该站点无法解析。

network-admin示出的内容/etc/resolv.confnameserver: 127.0.0.53

如果我将其更改为 8.8.8.8 或 208.67.222.222,则一切正常。直到我重新启动。

重新启动或恢复后,名称服务器将重置为 127.0.0.53。

如何将名称服务器永久设置为有效?


对于 systemd 粉丝,如果我运行,systemd-resolve --status我会得到

Link 3 (wlo1)
      Current Scopes: LLMNR/IPv4 LLMNR/IPv6
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
Run Code Online (Sandbox Code Playgroud)

如果我按照此问题的建议进行操作 - DNS 在重新启动后会不断重置。Ubuntu 17.10 - DNS 仍然无法解析。

osc*_*919 50

你可以安装一个包resolvconf,它会修改/etc/resolv.conf系统启动时建立的方式。

sudo apt install resolvconf
Run Code Online (Sandbox Code Playgroud)

然后您可以创建或修改文件/etc/resolvconf/resolv.conf.d/tail。如果你在这个文件里放了一行nameserver 8.8.8.8,这行会/run/resolvconf/resolv.conf在启动时添加到末尾。 /etc/resolv.conf现在将是该文件的符号链接。

后脚本:

在发布我的答案将近两年后,我遇到了https://bugs.launchpad.net/ubuntu/+source/ppp/+bug/1778946,这正是为什么仅仅安装resolvconf解决了我当时遇到的 dns 问题的原因。我觉得我必须在这里分享这个。

虽然我的回答以适当的方式解决了这个问题,但确实应该添加一个警告,如果您想要/需要这样做,可能还有其他问题。当时@intelfx 已经说明了这一点,127.0.0.53 应该自己工作。

根据该错误报告,在 pptp VPN 出现故障后,resolv.conf会以错误的访问权限恢复。 ping ubuntu.com不工作,sudo ping ubuntu.com做。安装resolvconf解决了它,因为它接管了resolv.conf,用正确的权限恢复它。systemd-resolve在这种情况下更改设置不是解决方案,因为错误在ppp. 但是另一种可能更简单的解决方案是sudo chmod a+r /etc/resolv.conf在 VPN 关闭之后。这可以通过在 /etc/NetworkManager/dispatcher.d 中放置一个可执行脚本来自动化,内容如下:

#!/bin/sh
if [[ "$1"="ppp0" && "$2"="vpn-down" ]]; then  
    /bin/chmod a+r /etc/resolv.conf
fi
Run Code Online (Sandbox Code Playgroud)

在所有情况下,内容resolv.conf都不会改变。而且,是的,我知道由于安全问题必须避免使用 pptp,但当时我认为它是 ubuntu 新手的一个很好的练习。我想它会开箱即用。我几乎不知道它会让我头疼,正如@intelfx 诊断的那样。

  • 这有效 - 谢谢!你知道有没有办法让 127.0.0.53 自己工作? (4认同)
  • 我不得不在这里表明我的无知,但是在您的网络上使用 DHCP 服务器分发的 DNS 服务器的做法发生了什么?我的防火墙 (OPNsense) 设置为这样做,我真的很想让我的 Ubuntu boxen 使用 **我选择**的 DNS。也许这就是这里发生的事情,但是 wtf 是 127.0.0.53...作为 IP 地址的一部分,带有 DNS 端口的环回?!:) (2认同)
  • @Seamus 这种做法没有发生任何事情。人们普遍认为,尽可能使用 DNS 存根解析器并缓存 DNS 响应是有用的。您的提供商将拥有自己的 DNS 服务器,指向根 DNS 服务器并缓存其响应,然后您的路由器(如果您使用 OpenWrt 等正常的东西)将运行 dnsmasq,该服务器指向 ISP 的 DNS 服务器并缓存其响应,最后是您的 Linux系统还将运行一个缓存 DNS 解析器,该解析器指向路由器并缓存其响应。127.0.0.53 是该缓存 DNS 解析器的地址。 (2认同)

int*_*lfx 37

正确的解决办法是要修复systemd分辨,而不是试图用断头台来治偏头痛。

如果使用得当,它确实是一个不错的工具。

看你的systemd-resolve --status输出...

Link 3 (wlo1)
      Current Scopes: LLMNR/IPv4 LLMNR/IPv6
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
Run Code Online (Sandbox Code Playgroud)

...您的网络管理器工具不会将每个接口的 DNS 配置传达给 systemd-resolved。

最新版本的 NetworkManager 将检测是否/etc/resolv.conf是已解析生成的文件 (/run/systemd/resolve/*.conf/usr/lib/systemd/resolv.conf)的符号链接,如果是,则直接与已解析的文件通信。

或者,最近版本的 systemd-resolved 尝试通过安装正确的resolvconf二进制文件来与历史的 resolvconf 接口兼容。

虽然这两种解决方案中的任何一种都是首选,但如果您正在寻找快速而肮脏的解决方案,您可以配置 systemd-resolved 以在全球范围内使用您的 DNS 服务器:

$ cat /etc/systemd/resolved.conf
<...>
[Resolve]
DNS=8.8.8.8 8.8.4.4
<...>
Run Code Online (Sandbox Code Playgroud)

然后重新启动systemd-resolved.service或重新启动。

  • @AndréM.Faria 了解解决的工作原理。`127.0.0.53` 是本地缓存存根解析器的地址。它将 DNS 请求转发到您指定的任何上游 DNS 服务器。 (4认同)
  • 这里还需要注意的是,默认情况下,`systemd-resolved` 会缓存 DNS 响应。虽然这有时可能很有用,但在某些情况下可能会导致问题。在答案的配置文件中取消注释 `cache=yes` 行并将其设置为 `no`。 (3认同)
  • @am70 是的,它已重命名为“resolvectl”(因为命令语法已更改并稳定)。 (3认同)

jmu*_*sch 12

systemd范式内工作将 DNS 添加到链接/设备

使用ubuntu 17.10+添加*.network文件:

sudo nano /lib/systemd/network/100-somecustom.network

100-somecustom.network(100 可以是任何优先级数字,它需要.network文件扩展名):

[Match]
Name=wlo1 # the device name here

[Network] # add multiple DNS 
DNS=8.8.8.8
DNS=208.67.222.222
Run Code Online (Sandbox Code Playgroud)

然后重启:

sudo service systemd-networkd restart
Run Code Online (Sandbox Code Playgroud)

还要看:

netplan apply
Run Code Online (Sandbox Code Playgroud)

然后检查:

systemd-resolve --status wlo1
Run Code Online (Sandbox Code Playgroud)

从信息页面info systemd.network

此外/etc/systemd/network还可以将插入的“.d”目录放置在 /lib/systemd/network 或 /run/systemd/network目录中。/etc 中的插入文件优先于 /run 中的文件,而 /run 又优先于 /lib 中的文件。任何这些目录下的插入文件都优先于位于任何位置的主 netdev 文件。(当然,由于 /run 是临时的,而 /usr/lib 是供供应商使用的,所以不太可能在这两个地方使用插件。)

另一种方法禁用DNSStubListenerfor 使用dnsmasq

sudo nano /etc/systemd/resolved.conf

#
DNSStubListener=false
Run Code Online (Sandbox Code Playgroud)

有关的:


小智 10

我使用 Lubuntu 和 Kubuntu 18.04。我能够通过 2 个步骤克服 DNS 问题:

第一步:安装unbound并设置它来替换systemd-resolved格雷Ç显示在这里

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl enable unbound-resolvconf
sudo systemctl enable unbound
Run Code Online (Sandbox Code Playgroud)

重启

以 root 身份打开文件 /etc/NetworkManager/NetworkManager.conf

sudo leafpad /etc/NetworkManager/NetworkManager.conf在 Lubuntu 18.04 或 Kubuntu 18.04 中SUDO_EDITOR=kate sudoedit /etc/NetworkManager/NetworkManager.conf

下面[main]放这一行:

dns=unbound
Run Code Online (Sandbox Code Playgroud)

再次重启

第二步:如果重启后问题仍然没有解决,就像我的情况一样,以 root 身份启动文件管理器,转到/etc,删除resolv.conf并创建一个新的resolv.conf. 将其留空并重新启动操作系统。在我的情况下,重新启动后问题消失了。

在 Kubuntu 18.04 中,您无法以 root 身份启动 Dolphin,因此您可以/etc先从那里打开终端,然后键入sudo su并按Enter以将其作为 root 使用,然后resolv.conf使用命令删除rm resolv.conf。然后你可以在桌面上创建一个新的空文件,命名它resolv.conf并从那里打开一个终端。使用sudo su命令输入终端根模式,然后复制到新的resolv.conf从桌面到/etc与命令cp resolv.conf /etc

补充一下,我没有在安装之前尝试做第二步unbound,所以下次我会这样做,只是看看它是否足够。


小智 8

我正在使用 Ubuntu 18.04 LTS。我不知道我的操作系统如何突然出现这个问题,而我的 DNS 已经工作了好几个月了。这是我的解决方案:

安装resolvconf

$ sudo apt install resolvconf

找到 的来源/etc/resolv.conf

$ ls -al /etc/resolv.conf 表明这/etc/resolv.conf是一个符号链接/run/resolvconf/resolv.conf

我发现:该文件/run/resolvconf/resolv.conf由以下部分组成:

/etc/resolvconf/resolv.conf.d/head
/run/resolvconf/interface/systemd-resolved
/etc/resolvconf/resolv.conf.d/tail
Run Code Online (Sandbox Code Playgroud)

$ cat /run/resolvconf/interface/systemd-resolved显示nameserver 127.0.0.53,重启后将被重置。

添加DNS

看来nameserver <my DNS>需要放在前面nameserver 127.0.0.53才能工作。

所以我nameserver <my DNS>在末尾添加/etc/resolvconf/resolv.conf.d/head

更新解析配置

$ sudo resolvconf -u


小智 5

这就是我更改接口配置上的 DNS 记录的方法。

$ vi /etc/netplan/50-cloud-init.yaml
Run Code Online (Sandbox Code Playgroud)

更改名称服务器地址,之前是 .4,然后我将其更改为 .3:

...
            nameservers:
                addresses:
                - 192.168.1.3
...
Run Code Online (Sandbox Code Playgroud)

保存配置,然后应用配置:

$ sudo netplan apply
Run Code Online (Sandbox Code Playgroud)

之后重新启动resolvectl服务。

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

注意:我确实重新启动了服务器,并且我所做的更改仍然完好无损。我使用该resolvectl dns命令来验证 dns 记录。