关于Linux 中的 DNS 解析服务systemd-resolved的配置方式

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 支持这些特性

 

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享