使用 resolvectl 临时指定 DNS 服务器
在日常运维中,我们经常需要临时切换 DNS 服务器来排查域名解析问题。传统做法是修改 /etc/resolv.conf,但在使用 systemd-resolved 的现代 Linux 发行版中,resolvectl 提供了更优雅的解决方案。
为什么用 resolvectl
传统的修改 /etc/resolv.conf 方式有几个痛点:
- systemd-resolved 管理下会被覆盖:直接编辑
/etc/resolv.conf可能无效,因为该文件是一个指向/run/systemd/resolve/stub-resolv.conf的符号链接 - 需要 root 权限:编辑系统文件必须 sudo
- 容易忘记还原:排查完问题后忘记改回来,可能影响业务
而 resolvectl 的优势:
| 特性 | 传统方式 | resolvectl |
|---|---|---|
| 修改配置文件 | ✅ | ❌ |
| 需要 root | ✅ | ❌(per-link) |
| 重启后恢复 | 需手动还原 | ✅ 自动恢复 |
| 影响范围 | 全局 | 可按网卡控制 |
查看当前 DNS 状态
# 查看全局 DNS 配置
resolvectl status
# 查看指定网卡
resolvectl status eth0
# 查看当前生效的 DNS 服务器
resolvectl dns
输出示例:
Global
Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
Resolving DNS Servers: 192.168.1.1
Fallback DNS Servers: 8.8.8.8
Link 2 (eth0)
Current Scopes: DNS
Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
Resolving DNS Servers: 192.168.1.1
DNS Domain: lan
临时指定 DNS(per-link)
指定单网卡 DNS
# 将 eth0 的 DNS 指定为 Google DNS
sudo resolvectl dns eth0 8.8.8.8
# 指定多个 DNS(主备)
sudo resolvectl dns eth0 8.8.8.8 1.1.1.1
# 指定国内 DNS
sudo resolvectl dns eth0 223.5.5.5 119.29.29.29
验证生效
# 查看当前 DNS
resolvectl dns eth0
# 测试解析
resolvectl query example.com
# 使用指定 DNS 解析
resolvectl query example.com --interface=eth0
恢复默认 DNS
# 恢复为空(回退到全局配置)
sudo resolvectl dns eth0
# 恢复为 DHCP 下发的 DNS
sudo resolvectl revert eth0
全局临时指定 DNS
如果需要全局修改(影响所有网卡):
# 设置全局 DNS
sudo resolvectl dns 8.8.8.8 1.1.1.1
# 恢复全局 DNS
sudo resolvectl dns
⚠️ 全局修改同样会在重启后恢复,但会影响所有网卡的 DNS 解析。
常用国内公共 DNS
| DNS 服务商 | 地址 | 说明 |
|---|---|---|
| 阿里 | 223.5.5.5 / 223.6.6.6 | 稳定快速 |
| 腾讯 | 119.29.29.29 | DNSPod |
| 百度 | 180.76.76.76 | - |
| 114 DNS | 114.114.114.114 | 老牌公共 DNS |
| 8.8.8.8 / 8.8.4.4 | 海外推荐 | |
| Cloudflare | 1.1.1.1 / 1.0.0.1 | 海外 |
实战场景
场景一:排查域名解析故障
# 1. 查看当前 DNS
resolvectl dns
# 2. 临时切换到公共 DNS 验证
sudo resolvectl dns eth0 223.5.5.5
# 3. 测试解析
resolvectl query api.example.com
# 4. 如果公共 DNS 正常,说明内网 DNS 有问题
# 5. 恢复原配置
sudo resolvectl revert eth0
场景二:测试 DoH/DoT
# 查看是否支持 DNS over TLS
resolvectl status | grep -i tls
# 开启 DNS over TLS(需要 DNS 服务器支持)
sudo resolvectl dns-over-tls eth0 yes
sudo resolvectl dns eth0 tls://dns.google
场景三:多网卡环境指定 DNS
# eth0 走内网 DNS
sudo resolvectl dns eth0 192.168.1.1
# eth1 走公共 DNS
sudo resolvectl dns eth1 223.5.5.5
# 查询时指定网卡
resolvectl query internal.example.com --interface=eth0
resolvectl query www.0niu.cn --interface=eth1
注意事项
- 临时性:
resolvectl的修改在系统重启后会自动恢复为配置文件中的默认值 - 与 NetworkManager 冲突:如果使用 NetworkManager 管理 DNS,可能会被 NM 覆盖,可以设置
NM_CONTROLLED=no或在 NM 配置中指定 DNS - systemd-resolved 必须运行:确认服务状态
systemctl status systemd-resolved - 域名搜索后缀:可以使用
resolvectl domain eth0 example.com临时添加搜索域
总结
resolvectl 是 systemd-resolved 提供的 DNS 管理工具,用于临时切换 DNS 非常方便:
- ✅ 无需修改配置文件
- ✅ 重启自动恢复
- ✅ 可按网卡粒度控制
- ✅ 支持 DNS over TLS
下次排查 DNS 问题时,不妨试试 resolvectl。