在使用 systemd-resolved 的系统上设置全局 DNS 服务器覆盖的推荐方法是什么?

在使用 systemd-resolved 的系统上设置全局 DNS 服务器覆盖的推荐方法是什么?

我希望我的新 GNU/Linux 系统 (Ubuntu 18.04 LTS) 使用单个手动配置的 DNS 服务器全部DNS 查询。过去,我可以简单地echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf破坏/etc/resolv.conf文件并为整个系统持久设置 DNS 服务器的 IP 地址。

在此(以及许多较新的 GNU/Linux 发行版)上,/etc/resolv.conf由实用程序管理resolvconf(8)。在 Ubuntu 18.04 上,该文件包含如下行:

nameserver 127.0.0.53

由 可以看出sudo ss --listening --numeric --processes,本地系统的systemd-resolvedDNS 存根解析器绑定到此 IP 地址并正在端口上侦听53传入的 DNS 请求。因此,文件nameserver中的上述/etc/resolv.conf行将所有不使用systemd-resolvedD-Bus 或 glibc API 的应用程序systemd-resolved通过“正常”DNS 请求定向到该服务。

一切都很好,但这一切意味着我不能再简单地将持久更改写入文件/etc/resolv.conf以实现名称服务器更改。

看完之后很多的 手动的 页面博客文章,我了解到我可以通过编辑文件来设置“全局”DNS 名称服务器 IP 地址,例如,/etc/systemd/resolve.conf该文件包含如下行:

DNS=1.1.1.1 9.9.9.9

进行此更改并调用后sudo systemctl restart systemd-resolved,运行确实在“全局”部分中systemd-resolve --status显示了新的名称服务器(1.1.1.1和)。9.9.9.9然而,Wireshark 数据包捕获证实我的系统仍在向可能通过 DHCP 配置的“每个链接”DNS 服务器发送 DNS 查询(例如,192.168.1.1)。

进一步的实验使我将以下行添加到我的/etc/systemd/resolve.conf文件中:

Domains=~.

这似乎已经成功systemd-resolved指示总是使用全局名称服务器(在DNS=选项中设置)并绝不查询任何 DHCP 提供的名称服务器,即使当我检查systemd-resolve --status.

最后我的问题:除了对忽略 VPN 提供的 DNS 信息等产生明显影响之外,这还会对我的系统产生哪些其他潜在影响?而且,更重要的是,是否有一种推荐的方法可以在使用 Ubuntu 18.04 等系统上完全覆盖动态配置的名称服务器设置(例如 DHCP 提供的设置),systemd-resolved这比通过 GUI 简单地编辑每个 NetworkManager 管理的连接更完整?特别是,我做不是想要编辑我加入的每个 Wi-Fi 网络的 DNS 设置;我想全部自动连接到总是使用静态配置的名称服务器进行 DNS 解析。做到这一点的“最佳”方法是什么,为什么?

谢谢。

答案1

我认为没有推荐的方法,但这里有一些选择。

免责声明:所有这些都是在Ubuntu 20.04系统上测试的,其他版本可能存在一些差异。

人工/etc/resolv.conf管理

  1. 创建您自己的resolv.conf

    echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv-manual.conf
    
  2. 删除 systemd 解析的符号链接并链接到您自己的文件:

    sudo rm /etc/resolv.conf
    sudo ln -s /etc/resolv-manual.conf /etc/resolv.conf
    
  3. 通过发出查询来验证您的 dns 配置是否正在使用:dig google.com

成为resolv.conf符号链接很重要,因为否则它会被 NetworkManager 覆盖。

请注意,resolvectl status仍然会显示 DHCP 提供的用于连接的 DNS 服务器,并且通过解析的 dbus 接口完成的查询仍可能使用它们。

强制全局 DNS 解析

你已经有了这个:

  1. 创造/etc/systemd/resolved.conf.d/dns_servers.conf
    sudo mkdir -p /etc/systemd/resolved.conf.d
    cat <<EOF | sudo tee /etc/systemd/resolved.conf.d/dns_servers.conf
    [Resolve]
    DNS=192.168.35.1 fd7b:d0bd:7a6e::1
    Domains=~.
    EOF
    
  2. 重启解决:sudo systemctl restart systemd-resolved
  3. 验证与resolvectl status

您仍会看到 ISP 提供的用于连接的 DNS 服务器,但它们仅用于输出DNS Domain:中列出的域resolvectl status

如果您想完全摆脱这些 DNS 服务器:

  1. 告诉 NetworkManager 不要为解析设置 DNS 服务器:
    cat <<EOF | sudo tee /etc/NetworkManager/conf.d/dns.conf
    [main]
    dns=none
    systemd-resolved=false
    
  2. 重新加载网络管理器:sudo systemctl reload NetworkManager.service
  3. solved 会记住接口的最后一个 DNS,因此请手动覆盖它们:sudo systemd-resolve --interface=wlp3s0 --set-dns 8.8.8.8

答案2

我怀念那些很容易管理域名服务器,只需编辑的日子/etc/resolv.conf。虽然这实际上仍然有效,但现在像 Ubuntu 这样的发行版添加了符号链接和管理/etc/resolv.conf替换我所做的所有设置的服务。

使用 ubuntu 时,我遇到一个问题,即我的VPN 配置systemd-resolve未设置“当前 DNS 服务器” nm。我用这个来规避它。

sudo systemd-resolve --interface=ppp0 --set-dns=172.19.40.11

答案3

我假设您正在使用 NetworkManager,因为它是 Ubuntu。

对于你的第一个问题。除非您需要任何非全局 DNS,否则我认为将全局 DNS 设置为知名且稳定的 DNS 提供商不会有任何问题。这里的任何更改也可以轻松逆转。

/etc/resolv.conf正如您可能在 中看到的那样,systemd-resolved 在许多系统上都获得了优先级/etc/nsswitch.confresolve可能是之前dns

DNS=解析守护进程将使用中设置的地址/etc/systemd/resolved.conf,但也将使用为接口获知的任何服务器在平行下与服务器的DNS=选项。通常这不是问题,因为公共 DNS 请求要么失败,要么返回类似的有用结果。

我不知道是否有办法阻止 systemd-resolved 学习新的 DNS 服务器,但可能有办法阻止 NetworkManager 安装它们,例如

https://wiki.archlinux.org/index.php/NetworkManager#Unmanagement_/etc/resolv.conf:

在 中/etc/NetworkManager/conf.d/dns.conf,添加或更改:

[main]
dns=none
systemd-resolved=false

各种服务重新启动后,systemd-resolved 应该有默认的 DNS 服务器,而 NetworkManager 应该忽略设置 DNS。试一试。

相关内容