systemd-resolved 是 Linux 中的 DNS 解析服务(Resolver),它负责接收本机程序的 DNS 请求,并根据配置转发到上游 DNS 服务器,还提供 DNS 缓存、DNSSEC、DNS over TLS(可选)等功能。
一、工作原理
默认情况下:
应用程序(浏览器、curl、apt、ssh 等)
│
▼
127.0.0.53:53
(systemd-resolved Stub)
│
▼
上游 DNS(1.1.1.1、8.8.8.8 等)
│
▼
返回解析结果
因此:
/etc/resolv.conf
nameserver 127.0.0.53
这里只是本地入口,真正的 DNS 是 systemd-resolved 配置的上游服务器。
二、常用命令
查看状态
resolvectl status
示例:
Global
Protocols: -LLMNR -mDNS -DNSOverTLS
Link 2 (eth0)
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1 8.8.8.8
查看内容包括:
-
当前 DNS
-
所有 DNS
-
DNSSEC 状态
-
DoT 状态
-
每个网卡的 DNS
查询域名
resolvectl query google.com
返回:
google.com: 142.250.xxx.xxx
-- Information acquired via protocol DNS
-- Server: 1.1.1.1
可以看到实际使用了哪个 DNS。
查看统计
resolvectl statistics
例如:
Current Cache Size: 35
Cache Hits: 210
Cache Misses: 45
清空缓存
sudo resolvectl flush-caches
查看缓存是否清空:
resolvectl statistics
查看 DNSSEC 状态
resolvectl status
例如:
DNSSEC=no
三、临时修改 DNS
仅当前运行有效,重启网络或系统后失效。
设置 DNS:
sudo resolvectl dns eth0 1.1.1.1 8.8.8.8
设置搜索域:
sudo resolvectl domain eth0 example.com
恢复默认:
sudo resolvectl revert eth0
四、永久修改 DNS
编辑配置文件:
sudo nano /etc/systemd/resolved.conf
例如:
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
DNSSEC=no
DNSOverTLS=no
修改完成:
sudo systemctl restart systemd-resolved
查看:
resolvectl status
五、配置文件说明
常见配置:
[Resolve]
DNS=1.1.1.1 8.8.8.8
主 DNS。
FallbackDNS=9.9.9.9
备用 DNS。
Domains=
DNS 搜索域。
DNSSEC=yes
启用 DNSSEC。
可选:
-
yes
-
no
-
allow-downgrade
DNSOverTLS=yes
开启 DNS over TLS。
可选:
-
yes
-
no
-
opportunistic
LLMNR=no
关闭局域网名称解析。
MulticastDNS=no
关闭 mDNS。
Cache=yes
启用缓存(多数版本默认开启)。
DNSStubListener=yes
监听:
127.0.0.53:53
如果改成:
DNSStubListener=no
则不会监听本地 53 端口,适合让 Unbound、AdGuard Home、dnsmasq 等服务接管。
六、服务管理
查看状态:
systemctl status systemd-resolved
启动:
sudo systemctl start systemd-resolved
停止:
sudo systemctl stop systemd-resolved
重启:
sudo systemctl restart systemd-resolved
开机启动:
sudo systemctl enable systemd-resolved
关闭开机启动:
sudo systemctl disable systemd-resolved
七、与 /etc/resolv.conf 的关系
推荐保持:
ls -l /etc/resolv.conf
输出类似:
/etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
文件内容:
nameserver 127.0.0.53
options edns0 trust-ad
search .
不要直接修改这个文件,否则可能会被 systemd-resolved 或网络管理工具覆盖。
八、与其他 DNS 服务的关系
如果你使用:
-
Unbound
-
AdGuard Home
-
dnsmasq
-
BIND
一般有两种方式:
方式一:继续使用 systemd-resolved(推荐给大多数桌面和普通服务器)
应用
│
127.0.0.53
(systemd-resolved)
│
Unbound / AdGuard(作为上游)
│
互联网 DNS
这种方式保留 systemd-resolved 的缓存和统一管理能力。
方式二:关闭 Stub,让其他服务直接监听 53 端口
应用
│
127.0.0.1:53
(Unbound / AdGuard)
│
互联网 DNS
此时需要将 DNSStubListener=no,避免与其他 DNS 服务争用 53 端口。
九、适用场景建议
| 场景 | 推荐方式 |
|---|---|
| 普通 Ubuntu / Debian 桌面 | 保持 systemd-resolved 默认配置 |
| 云服务器,仅使用公网 DNS | systemd-resolved + DNS=1.1.1.1 8.8.8.8 |
| 使用 Unbound、AdGuard Home 等本地解析器 | 保留 systemd-resolved 作为前端,或关闭 Stub 让本地解析器直接接管 53 端口 |
| 需要 DNSSEC 或 DNS over TLS | 在 resolved.conf 中启用相应功能,并确认上游 DNS 支持这些特性 |
