域名解析

出自 Arch Linux 中文维基

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

名稱服務轉換(NSS)[編輯 | 編輯原始碼]

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

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

使用 NSS 解析域名[編輯 | 編輯原始碼]

NSS 數據庫可使用 getent(1) 查詢。可以使用以下命令通過 NSS 解析域名:

$ getent ahosts domain_name(域名)
注意: 雖然大多數程序使用 NSS 解析域名,但是有些程序可能會直接讀取 /etc/resolv.conf 和/或 /etc/hosts。參見 網絡配置#局域網主機名解析

Glibc 解析器[編輯 | 編輯原始碼]

覆蓋 /etc/resolv.conf[編輯 | 編輯原始碼]

網絡管理器們會有意覆蓋 /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 查找實用工具。例如:

解析器性能[編輯 | 編輯原始碼]

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

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

隱私與安全[編輯 | 編輯原始碼]

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

您需要相信您的 DNS 服務器處理您的查詢時能夠保密。網絡服務供應商和第三方會提供 DNS 服務器。 另外您也可以運營自己的遞歸名稱服務器,但這需要花費更多精力。 如果您在不受信任的網絡中使用 DHCP 客戶端,請一定要設置靜態名稱服務器,以避免使用和受制於任意 DNS 服務器。 為了保證您與遠程 DNS 服務器的通信安全,您可以使用加密協議,例如 DNS over TLSRFC 7858)、DNS over HTTPSRFC 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/Privacy#Encrypted Client Hello

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 地址),但是「條件轉發」一名似乎更用於描述「域名查詢」這一條件。

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