systemd-resolved

出自 Arch Linux 中文维基

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

提示:要了解有關選項和開關的上下文,可以如Systemd#診斷一個服務中所述打開systemd-resolved的詳細調試信息。

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伺服器[編輯 | 編輯原始碼]

提示:要檢查systemd-resolved當前正在使用的DNS, 請運行resolvectl status.
自動配置[編輯 | 編輯原始碼]

對於使用/etc/resolv.conf的網絡管理器,systemd-resolved將開箱即用,不需要特定的配置,因為systemd-resolved將通過/etc/resolv.conf符號連結探測,systemd-networkdNetworkManageriwd就是這樣。

但是,如果DHCP和VPN客戶端使用resolvconf程序來設置名稱伺服器和搜索域名(請參閱[1]來獲得使用resolvconf程序的軟體的列表)則需要額外的軟體包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解析始終工作。

注意: 備用DNS依次為:Cloudflare、Quad9和Google。請參閱定義DNS伺服器的systemd PKGBUILD

地址可以通過編輯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[編輯 | 編輯原始碼]

警告: DNSSEC在systemd-resolved中的支持被認為是實驗性和不完整的

可以通過更改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.serviceavahi-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-networkdNetworkManager[3]為連接啟用它。

提示:所有NetworkManager連接的默認值可以通過在/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=yesDomains=[domain-list]存在於相應的systemd-networkd.network文件中,並且該文件在resolv.conf中生成預期的search [domain-list]systemd-resolved也可能不會搜索本地域名。你可以運行networkctl statusresolvectl status來檢查域名搜索是否真的被選中了。

可能的解決方法:

  • 禁用LLMNR以使systemd-resolved立刻繼續附加DNS後綴。
  • 修改/etc/nsswitch.confhosts資料庫(例如在resolve服務後刪除[!UNAVAIL=return]選項。)
  • 切換到使用完全限定域名(fully-qualified domain names)。
  • 使用/etc/hosts來解析主機名。
  • 回退到使用glibc的dns以代替systemd的resolve

systemd-resolved不解析沒有後綴的主機名[編輯 | 編輯原始碼]

為了使systemd-resolved解析不完全限定域名的主機名,請向/etc/systemd/resolved.conf中添加ResolveUnicastSingleLabel=yes

警告: 這將把single-label names轉發到可能不在你控制之下的全局DNS伺服器。這種行為不符合標準,且可能導致隱私和安全風險。請參閱resolved.conf(5)來獲得詳細信息。

這似乎只在禁用LLMNR的情況下工作(LLMNR=no)。

如果你在使用systemd-networkd,你可能希望DHCP伺服器或IPv6路由器提供的域名用作搜索域名,這在默認情況下是禁用的,將它添加到接口的.network文件中來啟用:

[DHCPv4]
UseDomains=true

[DHCPv6]
UseDomains=true

[IPv6AcceptRA]
UseDomains=true

你可以使用以下工具檢查每個接口的systemd-resolved結果:

$ resolvectl domain

另請參閱[編輯 | 編輯原始碼]