networkmanager 和 resolv.conf 可能有覆盖需要配置DNS
在 Linux 系统中,NetworkManager
和 /etc/resolv.conf
的 DNS 配置可能因优先级或自动覆盖导致冲突。以下是详细解决方案:
1. 确认当前 DNS 管理机制
首先检查 /etc/resolv.conf
是否为符号链接,确定由谁管理 DNS:
ls -l /etc/resolv.conf
• 输出示例:
lrwxrwxrwx 1 root root 39 Jan 1 00:00 /etc/resolv.conf -> ../run/NetworkManager/resolv.conf
若指向 NetworkManager
或 systemd-resolved
,则 DNS 由这些服务动态管理。
2. 方法一:通过 NetworkManager 配置静态 DNS
2.1 使用 nmcli
修改连接配置
# 查看当前连接名称
nmcli con show# 为指定连接设置静态 DNS(例如使用 Google DNS)
nmcli con mod <连接名称> ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod <连接名称> ipv4.ignore-auto-dns yes # 禁用自动 DNS# 重启连接使配置生效
nmcli con down <连接名称> && nmcli con up <连接名称>
2.2 手动编辑 NetworkManager 配置文件
编辑连接的配置文件(位于 /etc/NetworkManager/system-connections/
):
[ipv4]
dns=8.8.8.8;8.8.4.4;
ignore-auto-dns=true
method=auto
3. 方法二:禁用 NetworkManager 对 DNS 的覆盖
修改 /etc/NetworkManager/NetworkManager.conf
,禁用 DNS 管理:
sudo nano /etc/NetworkManager/NetworkManager.conf
添加或修改以下配置:
[main]
dns=none
重启 NetworkManager:
sudo systemctl restart NetworkManager
之后手动编辑 /etc/resolv.conf
设置 DNS:
nameserver 8.8.8.8
nameserver 8.8.4.4
4. 方法三:使用 systemd-resolved(替代方案)
若系统使用 systemd-resolved
,配置方法如下:
# 启用并启动服务
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved# 设置全局 DNS
sudo resolvectl dns <接口名> 8.8.8.8 8.8.4.4# 生成静态 resolv.conf(可选)
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
5. 验证 DNS 配置
# 检查当前 DNS 服务器
systemd-resolve --status | grep 'DNS Servers'
或
cat /etc/resolv.conf# 测试 DNS 解析
nslookup example.com
dig example.com
总结
场景 | 推荐方法 | 注意事项 |
---|---|---|
需要动态管理多网络环境 | 通过 nmcli 配置每连接的 DNS | 避免手动修改 /etc/resolv.conf |
需要完全手动控制 DNS | 禁用 NetworkManager 的 DNS 管理 | 需自行处理网络切换时的 DNS 更新 |
使用 systemd 生态 | 启用 systemd-resolved | 确保服务优先级高于 NetworkManager |
通过上述方法,可避免 NetworkManager
与 /etc/resolv.conf
的 DNS 配置冲突,确保系统稳定使用指定 DNS 服务器。