我希望我的新 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-resolved
DNS 存根解析器绑定到此 IP 地址并正在端口上侦听53
传入的 DNS 请求。因此,文件nameserver
中的上述/etc/resolv.conf
行将所有不使用systemd-resolved
D-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
管理
创建您自己的
resolv.conf
:echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv-manual.conf
删除 systemd 解析的符号链接并链接到您自己的文件:
sudo rm /etc/resolv.conf sudo ln -s /etc/resolv-manual.conf /etc/resolv.conf
通过发出查询来验证您的 dns 配置是否正在使用:
dig google.com
成为resolv.conf
符号链接很重要,因为否则它会被 NetworkManager 覆盖。
请注意,resolvectl status
仍然会显示 DHCP 提供的用于连接的 DNS 服务器,并且通过解析的 dbus 接口完成的查询仍可能使用它们。
强制全局 DNS 解析
你已经有了这个:
- 创造
/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
- 重启解决:
sudo systemctl restart systemd-resolved
- 验证与
resolvectl status
您仍会看到 ISP 提供的用于连接的 DNS 服务器,但它们仅用于输出DNS Domain:
中列出的域resolvectl status
。
如果您想完全摆脱这些 DNS 服务器:
- 告诉 NetworkManager 不要为解析设置 DNS 服务器:
cat <<EOF | sudo tee /etc/NetworkManager/conf.d/dns.conf [main] dns=none systemd-resolved=false
- 重新加载网络管理器:
sudo systemctl reload NetworkManager.service
- 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.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
各种服务重新启动后,systemd-resolved 应该有默认的 DNS 服务器,而 NetworkManager 应该忽略设置 DNS。试一试。