我正在笔记本电脑上设置 VPN 客户端。
为了避免 DNS 泄漏,我需要使用我的 VPN 提供商提供的 DNS 服务器。假设这些服务器是<DNS1>
和<DNS2>
。
为了使用这些 DNS 服务器,我发出了以下命令:
nmcli con down <SSID>
sudo ifconfig <INTERFACE> down
sudo ifconfig <INTERFACE> up
nmcli con modify <SSID> ipv4.ignore-auto-dns yes
nmcli con modify <SSID> ipv4.dns "<DNS1> <DNS2>"
nmcli con up <SSID>
之后我重新启动。
我/etc/resolv.conf
的如下:
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 127.0.0.53
尽管 NetworkManager 收到了指令:
$ nmcli con show <SSID> | grep dns
ipv4.dns: <DNS1>,<DNS2>
ipv4.ignore-auto-dns: yes
由于名称解析不起作用,我认为它仍在使用我的 ISP 通过 DHCP 提供的 DNS 服务器。
如果我强制使用 DNS 服务器,名称解析就会开始起作用:
sudo chattr -i /etc/resolv.conf
sudo chmod 666 /etc/resolv.conf
sudo echo "nameserver <DNS1>" > /etc/resolv.conf
sudo echo "nameserver <DNS2>" >> /etc/resolv.conf
sudo chmod 444 /etc/resolv.conf
sudo chattr +i /etc/resolv.conf
为什么 NetworkManager 没有/etc/resolv.conf
根据我给出的配置进行更新?
答案1
您已启用 systemd-resolved,因此不是直接在 resolv.conf 中配置名称服务器,而是通过解析守护进程间接配置它们。
您的 resolv.conf 指向本地“已解析”服务,并且 NetworkManager 通过 D-Bus 将所有名称服务器信息提交给该服务,然后您可以使用来查看这些信息resolvectl
。
如果您想禁用此功能,请更改NetworkManager.conf 中的dns=
和选项。resolv-manager=
(这样做是因为 systemd-resolved 允许不同的连接同时配置不同的 DNS 服务器。例如,许多使用企业 VPN 连接的人需要将 VPN 提供的 DNS 用于“corp.example.com”,但宁愿避免将其用于其他所有用途,因为他们不想将其浏览历史记录泄露给公司网络。
此类配置无法仅通过 resolv.conf 来表达,因此需要使用中间件,例如 Dnsmasq、Unbound,或者(如您的情况)systemd-resolved。)