systemd-resolved
systemd-resolved是一個通過D-Bus接口、NSS(nss-resolve(8))解析服務和一個監聽127.0.0.53
的本地DNS解析器為本地應用提供網絡名稱解析的systemd服務。
安裝[編輯 | 編輯原始碼]
systemd-resolved是默認安裝的systemd包包的一部分。
配置[編輯 | 編輯原始碼]
systemd-resolved為DNS(包括DNSSEC和Dns over TLS)、多播DNS(mDNS)和鏈路本地多播名稱解析(LLMNR)提供解析服務。
可以通過編輯/etc/systemd/resolved.conf
或 /etc/systemd/resolved.conf.d/
中的附加配置片段文件來配置解析器。請參閱resolved.conf(5)。
要使用systemd-resolved,啟用並啟動systemd-resolved.service
。
DNS[編輯 | 編輯原始碼]
依賴 glibc getaddrinfo(3)(或類似API)的軟件直接就能使用。如果存在nss-resolve(8),/etc/nsswitch.conf
的默認配置將使用它進行主機名解析。
有些軟件會直接讀取/etc/resolv.conf
進行域名解析,例如網絡瀏覽器、Go 和 GnuPG 等,為了支持這些軟件,systemd-resolved提供了四種不同的文件處理模式:本地、靜態、上聯和外部(file-stub, static, uplink和foreign),systemd-resolved(8) § /ETC/RESOLV.CONF中對這些方式進行了詳細說明。
/run/systemd/resolve/stub-resolv.conf
包含作為唯一DNS服務器和搜索域名的本地存根127.0.0.53
。這是將systemd-resolved託管配置傳播到所有客戶端的推薦操作模式。要使用它,將/etc/resolv.conf
替換為指向它的符號鏈接:
# ln -sf ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
- 未正確配置
/etc/resolv.conf
將會導致DNS解析中斷。 - 在arch-chroot內部時將無法創建
/etc/resolv.conf
符號鏈接,因為該文件從外部系統綁定安裝。應該在chroot外創建符號鏈接。例如:# ln -sf ../run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.conf
設置DNS服務器[編輯 | 編輯原始碼]
resolvectl status
.自動配置[編輯 | 編輯原始碼]
對於使用/etc/resolv.conf
的網絡管理器,systemd-resolved將開箱即用,不需要特定的配置,因為systemd-resolved將通過/etc/resolv.conf
符號鏈接探測,systemd-networkd、NetworkManager和iwd就是這樣。
但是,如果DHCP和VPN客戶端使用resolvconf程序來設置名稱服務器和搜索域名(請參閱[1]來獲得使用resolvconf程序的軟件的列表)則需要額外的軟件包systemd-resolvconf包來提供/usr/bin/resolvconf
符號鏈接。
- systemd-resolved有一個受限的resolvconf接口,可能與所有客戶端一起工作,請參閱 resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8)來獲得更多信息。
- systemd-resolvconf包只在
systemd-resolved.service
運行時才工作。 如果你沒有使用systemd-resolved確保systemd-resolvconf包包已經刪除,否則會導致需要使用/usr/bin/resolvconf
二進制文件的網絡軟件出問題。
手動配置[編輯 | 編輯原始碼]
在本地(stub)和靜態(static)模式中,自定義DNS服務器可以在resolved.conf(5)文件中設置:
/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve] DNS=192.168.35.1 fd7b:d0bd:7a6e::1 Domains=~.
- 在resolved.conf(5)中沒有
Domains=~.
選項時,如果在per-link的配置中,其中任何一個設置了Domains=~.
,systemd-resolved可能使用每per-link的DNS服務器。 - 此選項不會影響任何在per-link配置中指定了更具體的搜索域名的域名解析.
要獲得更多關於per-link配置的信息,請參閱Systemd-networkd#network_文件。
備用[編輯 | 編輯原始碼]
如果systemd-resolved沒有從網絡管理器收到任何DNS服務器地址並且沒有DNS服務器在Systemd-resolved#手動配置中配置了,systemd-resolved會回退到備用DNS地址來確保DNS解析始終工作。
地址可以通過編輯resolved.conf(5)中的FallbackDNS
來更改,例如:
/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve] FallbackDNS=127.0.0.1 ::1
要禁用備用DNS功能,請在不指定任何地址的情況下設置FallbackDNS
:
/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve] FallbackDNS=
DNSSEC[編輯 | 編輯原始碼]
可以通過更改resolved.conf(5)中的DNSSEC
設置來啟用DNSSEC驗證。
- 設置
DNSSEC=allow-downgrade
以僅在上游DNS服務器支持DNSSEC的情況下驗證DNSSEC。
- 設置
DNSSEC=true
以始終驗證DNSSEC,因此停止不支持它的名稱服務器的DNS解析。例如:
/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve] DNSSEC=true
- 如果你的DNS服務器不支持DNSSEC,並且您遇到默認允許降級模式的問題(例如systemd issue 10579),你可以通過設置
DNSSEC=false
來顯式禁用systemd-resolved的DNSSEC支持。 - systemd-resolved可能會在幾次驗證失敗後禁用DNSSEC。如果
DNSSEC
選項被設為true
,DNS解析將會完全停止工作。請參閱systemd issue 9867。
通過查詢一個具有無效簽名的域名來測試DNSSEC驗證:
$ resolvectl query badsig.go.dnscheck.tools
badsig.go.dnscheck.tools: resolve call failed: DNSSEC validation failed: invalid
現在來測試一個具有有效簽名的域名:
$ resolvectl query go.dnscheck.tools
go.dnscheck.tools: 2604:a880:400:d0::256e:b001 -- link: enp2s0 142.93.10.179 -- link: enp2s0 -- Information acquired via protocol DNS in 122.2ms. -- Data is authenticated: yes; Data was acquired via local or encrypted transport: no -- Data from: network
DNS over TLS[編輯 | 編輯原始碼]
DNS over TLS默認禁用。要啟用它,請更改resolved.conf(5)中[Resolve]
部分的DNSOverTLS
設置。要啟用對你的DNS提供商服務器證書的驗證,請在DNS設置中以ip_address#hostname
的格式包含它們的主機名。例如:
/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve] DNS=9.9.9.9#dns.quad9.net DNSOverTLS=yes
- 如果
DNSOverTLS=yes
,使用的DNS服務器必須支持DNS over TLS,否則所有DNS請求都將失敗。 - 或者,只有當服務器支持
DNSOverTLS=opportunistic
時,才可以使用DNS over TLS。如果使用的DNS服務器不支持DNS over TLS,systemd-resolved將回退到常規的未加密DNS。
ngrep包可用於測試DNS over TLS是否工作,因為DNS over TLS始終使用853端口而且從不使用53端口。當通過DNS over TLS解析主機名時,ngrep命令53端口應該不產生輸出,並且853端口應該產生加密輸出。
使用Wireshark可以檢查 TLS DNS 的詳細數據包內容。
mDNS[編輯 | 編輯原始碼]
systemd-resolved可以作為mDNS的解析程序和響應程序工作。
解析器使用"主機名.local"命名方案提供主機名([網絡配置#設置計算機名])解析。
只有同時啟用systemd-resolved的mDNS支持並且當前活動的網絡管理器為網絡連接啟用了mDNS支持,mDNS才會被激活。
systemd-resolved的mDNS支持默認啟用,可以通過它的MulticastDNS
設置禁用(請參閱resolved.conf(5) § OPTIONS)。
啟用每個連接的mDNS支持依賴網絡管理器:
- 對於systemd-networkd,設置每個連接的設置文件的
[Network]
部分中的MulticastDNS
選項。你可能也需要在[Link]
部分中設置Multicast=yes
。請參閱systemd.network(5)。
- 對於NetworkManager,在網絡連接的配置文件的
[connection]
部分中設置mdns
,可以運行nmcli connection modify interface_name connection.mdns {yes|no|resolve}
來設置。請參閱nm-settings(5)。
- 如果安裝了Avahi,請考慮禁用或屏蔽
avahi-daemon.service
和avahi-daemon.socket
以防止和systemd-resolved發生衝突。 - 如果你計劃使用mDNS和防火牆確保打開UDP端口
5353
。
/etc/NetworkManager/conf.d/
中創建配置文件並在[connection]
部分設置connection.mdns=2
來設置所有NetworkManager連接的默認值。請參閱NetworkManager.conf(5) § CONNECTION SECTION和[2]。LLMNR[編輯 | 編輯原始碼]
Link-Local Multicast Name Resolution是由微軟創造的主機名解析服務。
LLMNR將只會在systemd-resolved的全局設置(resolved.conf(5) § OPTIONS中的LLMNR
)和網絡管理器的每個連接的設置都啟用時才會活動。默認情況下,systemd-resolved啟用LLMNR響應程序,systemd-networkd和NetworkManager[3]為連接啟用它。
- 對於systemd-networkd,選項是
[Network]
部分中的LLMNR
。請參閱systemd.network(5) § [NETWORK] SECTION OPTIONS。
- 對於NetworkManager,選項是
[connection]
部分中的llmnr
。請參閱nm-settings(5) § connection setting。
/etc/NetworkManager/conf.d/
中創建配置文件並在[connection]
部分中設置connection.llmnr
來進行設置。請參閱NetworkManager.conf(5) § CONNECTION SECTION。如果你計劃使用LLMNR和防火牆,確保打開UDP和TCP端口5355
。
查找[編輯 | 編輯原始碼]
要解析DNS記錄、mDNS或LLMNR主機,你可以使用resolvectl組件。
例如,要解析一個DNS記錄:
$ resolvectl query archlinux.org
archlinux.org: 2a01:4f8:172:1d86::1 138.201.81.199 -- Information acquired via protocol DNS in 48.4ms. -- Data is authenticated: no
故障排除[編輯 | 編輯原始碼]
systemd-resolved不搜索本地域名[編輯 | 編輯原始碼]
當只給定主機名時,即使UseDomains=yes
和Domains=[domain-list]
存在於相應的systemd-networkd的.network文件中,並且該文件在resolv.conf
中生成預期的search [domain-list]
,systemd-resolved也可能不會搜索本地域名。你可以運行networkctl status
或resolvectl status
來檢查域名搜索是否真的被選中了。
可能的解決方法:
- 禁用LLMNR以使systemd-resolved立刻繼續附加DNS後綴。
- 修改
/etc/nsswitch.conf
的hosts
數據庫(例如在resolve
服務後刪除[!UNAVAIL=return]
選項。)
- 切換到使用完全限定域名(fully-qualified domain names)。
- 使用
/etc/hosts
來解析主機名。
- 回退到使用glibc的
dns
以代替systemd的resolve
。
systemd-resolved不解析沒有後綴的主機名[編輯 | 編輯原始碼]
為了使systemd-resolved解析不完全限定域名的主機名,請向/etc/systemd/resolved.conf
中添加ResolveUnicastSingleLabel=yes
。
這似乎只在禁用LLMNR的情況下工作(LLMNR=no
)。
如果你在使用systemd-networkd,你可能希望DHCP服務器或IPv6路由器提供的域名用作搜索域名,這在默認情況下是禁用的,將它添加到接口的.network文件中來啟用:
[DHCPv4] UseDomains=true [DHCPv6] UseDomains=true [IPv6AcceptRA] UseDomains=true
你可以使用以下工具檢查每個接口的systemd-resolved結果:
$ resolvectl domain