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.conf由resolvconf(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.1和9.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 解析。做到这一点的“最佳”方法是什么,为什么?
谢谢你。
我认为没有推荐的方法,但这里有一些选择。
免责声明:所有这些都是在Ubuntu 20.04系统上测试的,其他版本可能存在一些差异。
/etc/resolv.conf管理创建您自己的resolv.conf:
echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv-manual.conf
Run Code Online (Sandbox Code Playgroud)
删除 systemd 解析的符号链接并链接到您自己的文件:
sudo rm /etc/resolv.conf
sudo ln -s /etc/resolv-manual.conf /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)
通过发出查询来验证您的 dns 配置是否正在使用:dig google.com
成为resolv.conf符号链接很重要,因为否则它会被 NetworkManager 覆盖。
请注意,resolvectl status仍然会显示 DHCP 提供的用于连接的 DNS 服务器,并且通过解析的 dbus 接口完成的查询仍可能使用它们。
你已经有了这个:
/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)
sudo systemctl restart systemd-resolvedresolvectl status您仍会看到 ISP 提供的用于连接的 DNS 服务器,但它们仅用于输出中列出的DNS Domain:域resolvectl status。
如果您想完全摆脱这些 DNS 服务器:
cat <<EOF | sudo tee /etc/NetworkManager/conf.d/dns.conf
[main]
dns=none
systemd-resolved=false
Run Code Online (Sandbox Code Playgroud)
sudo systemctl reload NetworkManager.servicesudo systemd-resolve --interface=wlp3s0 --set-dns 8.8.8.8我怀念那些很容易管理域名服务器,只需编辑的日子/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.conf,resolve可能是之前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。试一试。