域名解析

出自 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 hosts domain_name(域名)
注意: 雖然大多數程序使用 NSS 解析域名,但是有些程序可能會直接讀取 /etc/resolv.conf 和/或 /etc/hosts。參見 網絡配置#Local hostname resolution

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

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

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

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

# chattr +i /etc/resolv.conf
提示:如果想要多個進程寫入 /etc/resolv.conf,可以使用 resolvconf

限制查找時間[編輯 | 編輯原始碼]

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

options timeout:1

IPv6 主機名查找延遲[編輯 | 編輯原始碼]

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

options single-request

本地域名[編輯 | 編輯原始碼]

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

domain 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[編輯 | 編輯原始碼]

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

Firefox 提供了配置選項來啟用或禁用 DNS over HTTPS 和選擇 DNS 服務器。

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

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

遺忘式 DNS[編輯 | 編輯原始碼]

遺忘式 DNS(Oblivious DNS,ODNS) 是一套解決了若干 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 服務器軟件比較

名稱 軟件包 功能兼容性 resolvconf 受支持的協議
權威式 遞歸式 緩存式  驗證
DNSSEC
DNS DNSCrypt DNS
over TLS
DNS
over HTTPS
BIND bind stunnel#DNS over TLS
CoreDNS corednsAURcoredns-binAUR
Deadwood (MaraDNS recursor) maradnsAUR
dnscrypt-proxy dnscrypt-proxy 服務器 解析器
dnsmasq dnsmasq 部分1
Knot Resolver knot-resolver 服務器
pdnsd pdnsd 永久
PowerDNS Recursor powerdns-recursor
Rescached rescached-gitAUR 有限2
SmartDNS smartdns ? 解析器 解析器
Stubby stubby 服務器 解析器
systemd-resolved systemd 解析器和有限的服務器 解析器
Unbound unbound 部分 3 服務器 服務器
  1. 根據維基百科:dnsmasq 對權威式名稱服務器功能支持有限,是旨在為內部網絡使用而不是公共互聯網使用。
  2. 只有當 Rescached 本身使用 DNS over HTTPS 查詢時,才會使用 DNS over HTTPS 進行轉發。
  3. Redis 後端可為 Unbound 提供持久性緩存功能。

僅權威式服務器[編輯 | 編輯原始碼]

名稱 軟件包  DNSSEC 地理負載均衡
gdnsd gdnsd
Knot DNS knot
MaraDNS maradnsAUR
NSD nsd
PowerDNS powerdns

條件轉發[編輯 | 編輯原始碼]

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

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

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

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

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