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-resolved
DNS 存根解析器绑定到此 IP 地址,并在端口53
上侦听传入的 DNS 请求。因此,文件中的上述nameserver
行通过“正常”DNS 请求/etc/resolv.conf
将所有不使用systemd-resolved
D-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-resolved
Ubuntu 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-resolved
resolvectl 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.service
sudo 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。试一试。
归档时间: |
|
查看次数: |
3509 次 |
最近记录: |