Linux 中如何處理 DNS 查詢?
我試圖了解如何在 Linux 中完成 DNS 查詢。
我知道程序可以先檢查
/etc/hosts
附加到名稱的 IP,然後/etc/resolv.conf
檢查 DNS 伺服器。那麼它在瀏覽器中是如何工作的呢?當我輸入時
http://www.google.fr
,瀏覽器首先做什麼?如果沒有任何內容,它是否只檢查那些文件並將查詢發送到 DNS 伺服器
/etc/hosts
?查詢是如何發送的(在DNS的維基百科文章中有幾個 RFC 和協議):哪個埠和協議?
現在它對 OpenVPN 是如何工作的?
如果我使用類似OpenVPN
curl
或firefox
啟動了 OpenVPN 的程序,它是通過隧道還是獨立發送 DNS 查詢?它使用哪個埠和協議?
根據我的基本理解,我猜 OpenVPN 會重新排列 iptables 並使用 iptables 規則通過隧道發送查詢。因此,這將取決於發送 DNS 查詢的程序使用的協議。我對嗎?
這取決於
應用程序可能會做自己的事情,而與作業系統的配置無關。
例如,在 Chrome 網路瀏覽器的“設置 > 隱私和安全 > 安全”中設置自定義安全 DNS 提供程序後,系統解析器將不再使用。
系統解析器
當應用程序不做自己的事情時,應用程序通常通過使用作業系統/核心功能(例如舊版
gethostbyname()
和/或更現代的功能)來呼叫系統解析器,getaddrinfo()
將主機名或完全限定域名 (FQDN) 轉換為 IPv4/ IPv6 地址。名稱服務切換 (NSS) 配置文件
/etc/nsswitch.conf
用於配置獲取名稱服務資訊的來源和順序。
/etc/nsswitch.conf
例如,在 DNS 配置之前諮詢(“文件”關鍵字)的通常預設/etc/hosts
順序*:*# /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. hosts: files dns
如果在 hosts 文件中找不到主機名,則使用回退到 DNS 解析器。
DNS 解析器配置為
/etc/resolv.conf
.經典地,該文件包含一個名稱伺服器列表(第一個
nameserver
用作預設名稱伺服器,任何其他的僅在之前的沒有響應時才使用):# /etc/resolv.conf file domain example.com search int.example.com ad.example.com nameserver 8.8.8.8 nameserver 1.1.1.1
但在現代 Linux 發行版中,您通常會看到 systemd 解析器在那裡配置。它有一些高級和有趣的功能,我不會在這裡解釋:
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8). # Do not edit. # # This file might be symlinked as /etc/resolv.conf. If you're looking at # /etc/resolv.conf and seeing this text, you have followed the symlink. # # This is a dynamic resolv.conf file for connecting local clients to the # internal DNS stub resolver of systemd-resolved. This file lists all # configured search domains. # # Run "resolvectl status" to see details about the uplink DNS servers # currently in use. # # Third party programs should typically not access this file directly, but only # through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a # different way, replace this symlink by a static file or a different symlink. # # See man:systemd-resolved.service(8) for details about the supported modes of # operation for /etc/resolv.conf. nameserver 127.0.0.53
VPN
AFAIK 通常 VPN 軟體具有
/etc/resolv.conf
在連接到 VPN 伺服器期間更改內容的功能,當配置為這樣做時。參見例如:https ://community.openvpn.net/openvpn/wiki/Pushing-DNS-to-clients
iptables 不需要任何花哨的東西,更改 resolv.conf 會立即調整整個系統進行 DNS 解析的方式。
DNS 協議
DNS 查詢始終使用 UDP 和埠 53,除非它們不使用。
我認為在 UDP 上使用經典 DNS 查詢以外的其他東西需要使用更高級的 systemd resolvd(例如支持 DNS over TLS)作為解析器,而不是依賴經典的 C 庫。
或者,類似於 PAM 的設計方式,名稱服務切換 (NSS) 旨在添加新模組,而無需更改呼叫系統解析器的任何程序和程式碼。添加額外的解析器庫以支持不同的 DNS 協議並調整
nsswitch.conf
以使用該庫,例如https://github.com/dimkr/nss-tls