systemd-resolved¶
systemd-resolved 是通过D-Bus接口向本地应用程序提供网络名字解析的systemd服务,包括解析(resolve) NSS服务(nss-resolve)和一个在127.0.0.53上监听的本地DNS stub监听器。不需要单独安装systemd-resolved,因为当前Linux主流发行版默认使用的systemd已经包含了这个组件,并且默认启用。
备注
在我部署 私有云架构 中,采用 Ubuntu Linux 20.04 LTS Server 发行版,默认采用 systemd-resolved
提供本地域名解析。我在 私有云DNS服务(dnsmasq)和共享因特网(ICS) 部署即结合 DNSmasq 和 systemd-resolved
提供局域网DNS解析。
配置¶
systemd-resolved为域名系统(Domain Name System, DNS)(包括DNSSEC和DNS over TLS),多播DNS(Multicast DNS, mDNS) 以及链接本地多播域名解析(Link-Local Multicast Name Resolution, LLMNR)提供解析服务。
这个解析起可以通过编辑 /etc/systemd/resolved.conf
或者 添加/删除 位于 /etc/systemd/resolved.conf.d/
目录下 .conf
配置文件来管理。注意,需要启动并激活 systemd-resolved.service
。
DNS¶
systemd-resolved有4种不同方式来处理DNS解析,其中有2中是主要使用模式:
local DNS stub模式
使用systemd DNS stub文件 /run/systemd/resolve/stub-resolv.conf
,这个文件只包含local stub 127.0.0.53
作为唯一DNS服务器,以及一系列search domains。这是 建议使用 的操作模式:原先传统的 /etc/resolv.conf
已经由systemd-resolved管理改成为软链接到systemd DNS stub文件:
lrwxrwxrwx 1 root root 39 Jul 31 16:37 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
而且,在 /run/systemd/resolve/
目录下还有一个 resolv.conf
配置,则是 systemd-resolved
使用的上级DNS服务器,也就是转发(forward)DNS解析请求给上级DNS。
检查 /run/systemd/resolve/resolv.conf
可以看到包含了上级DNS服务器配置(也就是你安装操作系统时候填写的网络配置中DNS记录),以及默认搜索域名:
nameserver 192.168.6.200
search huatai.me
检查 /run/systemd/resolve/stub-resolv.conf
可以看到内容包含了指示客户端连接本地回环地址请求DNS(也就是 systemd-resolved
服务),以及默认搜索域名:
nameserver 127.0.0.53
options edns0 trust-ad
search huatai.me
备注
上述配置是我部署 私有云基于 ZData Ceph 运行虚拟机 ,安装过程配置的结果。由于我需要部署 私有云DNS服务(dnsmasq)和共享因特网(ICS) 来提供局域网DNS解析,并且默认域名调整为 staging.huatai.me
,所以还需要做进一步调整配置。
保护resolv.conf模式
在保护模式下 /etc/resolv.conf
则依然存在,而且可以由其他软件包管理,此时systemd-resolved仅仅是这个文件的客户端。
要检查DNS当前由systemd-resolved管理状态,执行以下命令:
resolvectl status
也可以执行:
systemd-resolve --status
输出信息类似:
Global
LLMNR setting: no
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
...
Link 2 (enp1s0)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 192.168.6.200
DNS Domain: huatai.me
自动管理DNS¶
systemd-resolved默认就可以和 NetworkManager 协作管理 /etc/resolv.conf
,不需要单独配置。不过,如果使用DHCP和VPN客户端,则会使用 resolvconf
程序设置DNS和search domains,则需要安装一个 systemd-resolvconf
软件包来提供 /usr/bin/resolvconf
软链接,以便和VPN客户端和DHCP一起协作。(默认未安装)
手工配置DNS¶
在local DNS stub模式,要定制DNS服务器,需要设置 /etc/systemd/resolved.conf.d/dns_servers.conf
配置:
[Resolve]
DNS=192.168.35.1 fd7b:d0bd:7a6e::1
Domains=~.
另外可以配置 /etc/systemd/resolved.conf
也能起到同样作用:
#DNS=
DNS=192.168.6.200
#FallbackDNS=
#Domains=
Domains=dev.cloud-atlas.io
Fallback¶
如果systemd-resolved没有从 NetworkManager 收到DNS服务器地址,并且没有手工配置 dns_servers.conf
,那么systemd-resolved将fall back回fallback DNS地址以确保DNS解析可以工作。
这个fallback dns地址在 /etc/systemd/resolved.conf.d/fallback_dns.conf
配置:
[Resolve]
FallbackDNS=127.0.0.1 ::1
如果要禁止fallback DNS功能,则将 FallbackDNS
参数是设置为空:
[Resolve]
FallbackDNS=
备注
systemd-resolved还有支持 DNSSEC, DNS over TLS, mDNS 等功能,有待后续在研究DNS服务 BIND 时候学习实践。
结合网络配置工具netplan¶
实际上在发行版中, systemd-resolvd
通常不需要手工配置,因为默认系统会同时安装 network configuration abstraction renderer
(网络配置抽象渲染器),例如 netplan网络配置 。通过网络配置工具的简单设置就可以完成指定DNS。