systemd-resolved - Arch Linux 中文维基

跳至內容

# systemd-resolved

出自 Arch Linux 中文维基

相關文章

- systemd-networkd
- 域名解析

翻譯狀態：

- 本文（或部分內容）譯自 Systemd-resolved，最近一次同步於 2025-01-16，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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-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解析始終工作。

注意：備用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

警告：截至2023年6月，systemd-resolved中的DNSSEC支持被認為是實驗性和不完整的。[2] 因此，systemd包默認禁用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

通過查詢一個具有無效簽名的域名來測試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 的詳細數據包內容。

#### 額外的監聽接口

默認情況下，systemd-resolved通過環回接口響應本地應用程式的DNS請求。要使systemd-resolved在默認接口之外的額外接口或地址上響應DNS請求，請在resolved.conf(5)中為每個額外接口設置`DNSStubListenerExtra`選項。例如：

    /etc/systemd/resolved.conf.d/additional-listening-interfaces.conf

    [Resolve]
    DNSStubListenerExtra=192.168.10.10
    DNSStubListenerExtra=2001:db8:0:f102::10
    DNSStubListenerExtra=192.168.10.11:9953

提示：這在將systemd-resolved用作路由器的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和[3]。

### LLMNR

Link-Local Multicast Name Resolution是由微軟創造的主機名解析服務。

LLMNR將只會在systemd-resolved的全局設置（resolved.conf(5) § OPTIONS中的`LLMNR`）和網絡管理器的每個連接的設置都啟用時才會活動。默認情況下，systemd-resolved啟用LLMNR響應程序，systemd-networkd和NetworkManager[4]為連接啟用它。

- 對於systemd-networkd，選項是`[Network]`部分中的`LLMNR`。請參閱systemd.network(5) § [NETWORK] SECTION OPTIONS。

- 對於NetworkManager，選項是`[connection]`部分中的`llmnr`。請參閱nm-settings(5) § connection setting。

提示：所有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=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`。

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

這似乎只在禁用LLMNR的情況下工作（`LLMNR=no`）。

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

    [Network]
    UseDomains=true

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

    $ resolvectl domain

## 另請參閱

- 我們通過Francisco Ros在外面發現的systmed-resolved的名稱解析問題
- 查看resolvectl(1) § EXAMPLES以獲取更多示例。

分類：​

- 網絡

systemd-resolved
新增話題