使用 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

# 将 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.29DNSPod
百度180.76.76.76-
114 DNS114.114.114.114老牌公共 DNS
Google8.8.8.8 / 8.8.4.4海外推荐
Cloudflare1.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

注意事项

  1. 临时性resolvectl 的修改在系统重启后会自动恢复为配置文件中的默认值
  2. 与 NetworkManager 冲突:如果使用 NetworkManager 管理 DNS,可能会被 NM 覆盖,可以设置 NM_CONTROLLED=no 或在 NM 配置中指定 DNS
  3. systemd-resolved 必须运行:确认服务状态 systemctl status systemd-resolved
  4. 域名搜索后缀:可以使用 resolvectl domain eth0 example.com 临时添加搜索域

总结

resolvectl 是 systemd-resolved 提供的 DNS 管理工具,用于临时切换 DNS 非常方便:

  • ✅ 无需修改配置文件
  • ✅ 重启自动恢复
  • ✅ 可按网卡粒度控制
  • ✅ 支持 DNS over TLS

下次排查 DNS 问题时,不妨试试 resolvectl