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

Mei*_*tar 10 dns systemd-resolved

我希望我较新的 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.confresolvconf(8)实用程序管理。在 Ubuntu 18.04 上,此文件包含如下一行:

nameserver 127.0.0.53
Run Code Online (Sandbox Code Playgroud)

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

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

在阅读了大量 手册 博客文章后,我了解到我可以通过编辑/etc/systemd/resolve.conf文件来设置“全局”DNS 名称服务器 IP 地址,例如,该文件包含如下一行:

DNS=1.1.1.1 9.9.9.9
Run Code Online (Sandbox Code Playgroud)

进行此更改并调用 后sudo systemctl restart systemd-resolved,运行systemd-resolve --status确实在“全局”部分显示了新的名称服务器(1.1.1.19.9.9.9)。但是,Wireshark 数据包捕获确认我的系统仍在向可能通过 DHCP 配置的“per-link”DNS 服务器发送 DNS 查询(例如,192.168.1.1)。

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

Domains=~.
Run Code Online (Sandbox Code Playgroud)

这似乎已经成功地指示systemd-resolved始终使用全局域名服务器(在设置DNS=选项),并从来没有查询的任何DHCP提供的域名服务器,即使这些域名服务器仍然显示了,当我检查的输出systemd-resolve --status

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

谢谢你。

GnP*_*GnP 6

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

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

人工/etc/resolv.conf管理

  1. 创建您自己的resolv.conf

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

    sudo rm /etc/resolv.conf
    sudo ln -s /etc/resolv-manual.conf /etc/resolv.conf
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重新加载网络管理器:sudo systemctl reload NetworkManager.service
  3. solved 会记住接口的最后一个 DNS,因此请手动覆盖它们:sudo systemd-resolve --interface=wlp3s0 --set-dns 8.8.8.8


ton*_*ton 5

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

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

sudo systemd-resolve --interface=ppp0 --set-dns=172.19.40.11
Run Code Online (Sandbox Code Playgroud)


小智 1

我假设您正在使用 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
Run Code Online (Sandbox Code Playgroud)

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