域名解析 - Arch Linux 中文维基

跳至內容

# 域名解析

出自 Arch Linux 中文维基
翻譯狀態：

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

通常，一個域名代表了一個 IP 地址，並在域名系統（Domain Name System，DNS）中與其關聯。本文將介紹如何配置域名解析和解析域名。

## 名稱服務轉換（NSS）

名稱服務轉換（Name Service Switch，NSS）工具是 GNU C 庫（glibc包）的一部分，支持 getaddrinfo(3) API，用於解析域名。NSS 允許系統資料庫由單獨的服務提供，其搜索順序可由管理員在 nsswitch.conf(5) 中配置。負責響應域名解析的資料庫是 hosts 資料庫，glibc 為此提供了下列服務：

- files（文件）：讀取 `/etc/hosts` 文件，參見 hosts(5)
- dns：讀取 `/etc/resolv.conf` 的 glibc 解析器，參見 resolv.conf(5)

systemd 為主機名解析提供了三項 NSS 服務：

- nss-resolve(8)——緩存 DNS 存根解析器，systemd-resolved 一文中有描述
- nss-myhostname(8)——無需編輯 `/etc/hosts` 即可提供本地主機名解析，網絡配置#Local hostname resolution 一文中有描述
- nss-mymachines(8)——為本地 systemd-machined(8) 容器的名稱提供本地主機名解析

### 使用 NSS 解析域名

NSS 資料庫可使用 getent(1) 查詢。可以使用以下命令通過 NSS 解析域名：

    $ getent ahosts domain_name（域名）

注意：雖然大多數程序使用 NSS 解析域名，但是有些程序可能會直接讀取 `/etc/resolv.conf` 和/或 `/etc/hosts`。參見 網絡配置#區域網主機名解析。

## Glibc 解析器

### 覆蓋 /etc/resolv.conf

網絡管理器們會有意覆蓋 `/etc/resolv.conf`，具體細節請參見相應文章章節：

- dhcpcd#/etc/resolv.conf
- Netctl#/etc/resolv.conf
- NetworkManager#/etc/resolv.conf
- ConnMan#/etc/resolv.conf

要防止程序覆蓋 `/etc/resolv.conf`，還可以通過設置不可變文件屬性來為其建立防寫：

    # chattr +i /etc/resolv.conf

提示：如果想要多個進程寫入 `/etc/resolv.conf`，可以使用 resolvconf。

#### 使用 nmcli 的替代方案

本文或本章節可能需要合併到NetworkManager#/etc/resolv.conf。

附註： NetworkManager 有專門的章節來介紹這一主題。（在 Talk:域名解析 中討論）

如果使用 NetworkManager，可以使用 nmcli(1) 為 `/etc/resolv.conf` 設置持久選項。將下面的Wired改為連接名稱。例如

    # nmcli con mod Wired +ipv4.dns-options 'rotate,single-request,timeout:1'

有關更多選項，請參閱手冊 nmcli(1)、nm-settings-nmcli(5) 和 resolv.conf(5)。

### 限制查找時間

如果您遇到了非常長時間查找主機名的情況（可能是在 pacman 裡或者在瀏覽網頁時），定義一個小的超時時間通常能對問題有所幫助，在此之後系統會使用備用域名伺服器（nameserver）。為此，請在 `/etc/resolv.conf` 中添加以下內容。

    /etc/resolv.conf

    options timeout:1

### IPv6 主機名查找延遲

如果在解析主機名時遇到 5 秒延遲的情況，原因可能是 DNS 伺服器/防火牆行為不當，只對並行的 A 和 AAAA 請求給出了一個回應。[1] 可以在 `/etc/resolv.conf` 中設置以下選項來修復問題：

    /etc/resolv.conf

    options single-request

### 本地域名

為了能夠使用本地機器名稱的主機名，而無需使用格式完全合格的域名，請在 `/etc/resolv.conf` 中添加一行本地域名，如：

    /etc/resolv.conf

    search example.org

這樣當使用 ssh 命令時，可以把 `mainmachine1.example.org` 這樣的本地主機簡單地稱為 `mainmachine1`，不過使用 drill 命令時仍需要格式完全合格的域名以便查找。

## 查找實用工具

要查詢特定的 DNS 伺服器和 DNS/DNSSEC 記錄，可以使用專用 DNS 查詢實用工具。這些工具自身實現了 DNS 功能，不使用 NSS。

ldns包 軟體包提供了 drill(1) 命令，是一個旨在檢索 DNS 信息的工具。

例如，要用 drill 查詢特定名稱伺服器（nameserver）獲取一個域名的 TXT 記錄，可執行：

    $ drill @nameserver TXT domain（域名）

除非指定了一個 DNS 伺服器，否則 drill 將使用 `/etc/resolv.conf` 中定義的名稱伺服器。

提示：一些 DNS 伺服器附帶它們自己的 DNS 查找實用工具。例如：

- knot包 軟體包提供了 khost(1) 和 kdig(1) 命令。
- Unbound 有 unbound-host(1)。
- BIND 有 dig(1)、host(1)、nslookup(1) 和一堆 `dnssec-` 工具。
- systemd-resolved 有 resolvectl(1)，它提供了用於DNS 查找的`query`子命令。

## 解析器性能

Glibc 不緩存查詢結果。要實現本地緩存，請使用 systemd-resolved 或者配置一個本地緩存 DNS 伺服器將其用作伺服器，方法是在 `/etc/resolv.conf`（如果使用 openresolv，則在 `/etc/resolvconf.conf`）中設置 `127.0.0.1` 和 `::1` 為名稱伺服器。

提示：

- drill 或 dig 查找實用工具能報告查詢時間。
- 路由器通常將自己的緩存解析器設置為網絡的 DNS 伺服器，從而為整個網絡提供 DNS 緩存。
- 如果切換到下一個 DNS 伺服器的時間過長，可以嘗試減少超時時間。

## 隱私與安全

傳統的 DNS 協議是沒有加密的，並且不會考慮傳輸的機密性、完整性和身份驗證問題，所以如果您在使用不受信任的網絡或者有惡意行為的網絡服務供應商（ISP），您的 DNS 查詢可能會被竊聽並響應他人的操縱。此外，DNS 伺服器可進行 DNS 劫持。

您需要相信您的 DNS 伺服器處理您的查詢時能夠保密。網絡服務供應商和第三方會提供 DNS 伺服器。 另外您也可以運營自己的遞歸名稱伺服器，但這需要花費更多精力。 如果您在不受信任的網絡中使用 DHCP 客戶端，請一定要設置靜態名稱伺服器，以避免使用和受制於任意 DNS 伺服器。 為了保證您與遠程 DNS 伺服器的通信安全，您可以使用加密協議，例如 DNS over TLS（RFC 7858）、DNS over HTTPS（RFC 8484）或 DNSCrypt，前提是上游伺服器和您的解析器都支持該協議。 另一種方法是使用專用軟體來加密和解密通信，例如 stunnel。 要驗證響應是否來自權威的名稱伺服器，您可以驗證 DNSSEC 記錄，前提是上游伺服器和您的解析器都支持它。

雖然可以使用加密 DNS 解析器，但瀏覽器在請求網站證書時仍會洩漏伺服器名稱指示（Server Name Indication, SNI）中的域名。可以使用 Wireshark 過濾器 `tls.handshake.extensions_server_name_len > 0` 或者下面的命令檢查這種洩漏。建議的解決方案是使用ECH (Encrypted Client Hello)，這是 TLS 1.3 協議的擴展。

    # tshark -p -Tfields -e tls.handshake.extensions_server_name -Y 'tls.handshake.extensions_server_name_len>0'

### 應用級 DNS

值得注意的是，一些客戶端軟體，例如主流的網頁瀏覽器[2][3]，都在開始實現 DNS over HTTPS 功能。雖然一般來說，提供加密查詢可以視為一種善舉，但這也同時意味著軟體可以繞過系統解析器配置，另闢蹊徑進行查詢。[4]

Firefox 提供了配置選項來啟用或禁用 DNS over HTTPS 和選擇 DNS 伺服器。Mozilla 設立了可信遞歸解析器 (TRR) 計劃，並提供了默認提供商的透明度信息。這裡要注意，Firefox 支持並自動為 TRR 提供商啟用 ECH，請參閱 Firefox/隱私#加密客戶端問候。

Chromium 會檢查用戶的系統解析器，如果得知系統解析器地址也提供 DNS over HTTPS 支持，則啟用 DNS over HTTPS 功能。請參見這篇博文獲取更多信息，了解如何禁用 DNS over HTTPS。

Mozilla 提議，如果系統解析器無法解析域名 `use-application-dns.net`，就普遍禁用應用級 DNS。目前，這一功能僅在 Firefox 中實現了。

### 遺忘式 DNS

遺忘式 DNS（Oblivious DNS，ODNS；RFC:9230）是一套解決了若干 DNS 關切隱私問題的系統。參見 Cloudflare 的文章（英文）獲取更多信息。

## 第三方 DNS 服務

注意：在使用第三方 DNS 服務前，請檢查其隱私政策，了解其如何處理用戶數據。用戶數據是有價值的，可以出售給其他各方。

現在有各種第三方 DNS 服務可用，其中有一些還有專用軟體：

- cloudflared — Clondflare DNS over HTTPS 的 DNS 客戶端

  https://developers.cloudflare.com/1.1.1.1/dns-over-https/cloudflared-proxy || cloudflared包

- dingo — Google DNS over HTTPS 的 DNS 客戶端

  https://github.com/pforemski/dingo || dingo-gitAUR

- opennic-up — 可以自動更新為反應最迅速的 OpenNIC DNS 伺服器

  https://github.com/kewlfft/opennic-up || opennic-upAUR

- nextdns — NextDNS 的 DNS-over-HTTPS 命令行客戶端

  https://github.com/nextdns/nextdns || nextdnsAUR

可以使用 dnsperftest 從您所在位置來測試主流 DNS 解析器們的性能。dnsperf.com 提供了全球 DNS 服務供應商的基準。

## DNS 伺服器

DNS 伺服器有權威式和遞歸式。如果兩個都不是，則稱為根解析器，只將所有查詢轉發到其他的遞歸名稱伺服器。根解析器典型用途是在本地主機或網絡上引入 DNS 緩存機制。請注意，同樣的功能可以通過技術完全成熟的名稱伺服器來實現。本小節我們比較了可用的 DNS 伺服器，如需更詳細的比較，請參考維基百科：DNS 伺服器軟體比較。

這篇文章的某些內容需要擴充。

原因：Fill in the unknowns. (在 Talk:域名解析 中討論)

名稱 | 軟體包 | 功能兼容性 | resolvconf | 受支持的協議
--- | --- | --- | --- | ---
權威式 | 遞歸式 | 緩存式 | 驗證 DNSSEC | DNS | DNSCrypt | DNS over TLS | DNS over HTTPS | DNS over QUIC
BIND | bind包 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 伺服器1 | 伺服器 | 否
CoreDNS | corednsAUR | 是 | 否 | 是 | 否 | 否 | 是 | 否 | 是 | 是 | 否
DNS-over-HTTPS | dns-over-https包 | 否 | 否 | 否 | 否 | ? | ? | 否 | 否 | 是 | 否
Deadwood (MaraDNS recursor) | maradnsAUR | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否
dnscrypt-proxy | dnscrypt-proxy包 | 否 | 否 | 是 | 否 | 否 | 伺服器 | 解析器 | 否 | 是 | ?
dnsmasq | dnsmasq包 | 部分2 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否
dnsproxy | dnsproxyAUR | 否 | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 | 是
Knot Resolver | knot-resolver包 | 否 | 是 | 是 | 是 | 否 | 是 | 否 | 是 | 伺服器 | 否
pdnsd | pdnsd包 | 部分2 | 是 | 永久 | 否 | 是 | 是 | 否 | 否 | 否 | 否
PowerDNS Recursor | powerdns-recursor包 | 否 | 是 | 是 | 是 | 是 | 是 | 否 | 部分 | 否 | ?
Rescached | rescached-gitAUR | 否 | 否 | 是 | 否 | 是 | 是 | 否 | 是 | 是 | 否
RouteDNS | routedns-gitAUR | 否 | 否 | 是3 | 否 | 否 | 是 | 否 | 是 | 是 | 是
SmartDNS | smartdns包 | 否 | 否 | 是 | 否 | ? | 是 | 否 | 解析器 | 解析器 | 否
Stubby | stubby包 | 否 | 否 | 否 | 是 | 否 | 伺服器 | 否 | 解析器 | 否 | 否
systemd-resolved | systemd包 | 否 | 否 | 是 | 是 | 是 | 解析器和有限的伺服器 | 否 | 解析器 | 否 | 否
Unbound | unbound包 | 部分 | 是 | 是3 | 是 | 是 | 是 | 伺服器 | 是 | 伺服器 | 否

1. BIND 可以為 DNS over TLS 和 DNS over HTTPS 提供服務（請參閱 tls{} 和listen-on)），但尚無法將查詢轉發到 DNS over TLS/DNS over HTTPS 上游。 dig 工具可以通過 DNS over TLS 和 DNS over HTTPS（使用 `+tls` 和 `+https` 選項）進行查詢，但沒有任何證書檢查。
2. 根據維基百科：對權威式名稱伺服器功能支持有限，是旨在為內部網絡使用而不是公共網際網路使用。
3. 支持使用 Redis 後端進行持久緩存。

### 僅權威式伺服器

名稱 | 軟體包 | DNSSEC | 地理負載均衡
--- | --- | --- | ---
gdnsd | gdnsd包 | 否 | 是
Knot DNS | knot包 | 是 | 是
MaraDNS | maradnsAUR | 否 | ？
NSD | nsd包 | 是 | 否
PowerDNS | powerdns包 | 是 | 是

### 條件轉發

在查詢特定域名時，可以使用特定的 DNS 解析器。這在連接到虛擬專用網絡（VPN）時特別有用，這樣，對 VPN 網絡的查詢由 VPN 的 DNS 解析，而對普通網際網路的查詢仍由標準 DNS 解析器解析（分流）。這也可以用於本地網絡中。

要實現這個目的，您需要使用本地解析器，因為 glibc 並不支持這樣做。

在動態環境中（筆記本和某種程度的台式機），需要根據所連接的網絡來配置解析器。最好的方式是使用 openresolv，因為它支持多個訂閱器。一些網絡管理器會通過 openresolv 或者直接通過配置解析器來支持此功能。NetworkManager 支持條件轉發而無需 openresolv。

注意：雖然您可以使用其他條件進行轉發（比如源 IP 地址），但是「條件轉發」一名似乎更用於描述「域名查詢」這一條件。

## 另請參閱

- Linux 網絡管理員指南（英文）
- Debian 手冊（英文）
- RFC:7706 - 通過在迴環上運行一個根伺服器來減少對根伺服器的訪問時間（Decreasing Access Time to Root Servers by Running One on Loopback，英文）
- 域名系統概覽（英文） - DNS 有關圖表
- 備用 DNS 服務
- What does DNS stand for

分類：​

- DNS
- 網絡配置

隱藏分類：​

- 使用「模板:合併」標記的頁面或章節

域名解析
新增話題