Domain-Name-System

Linux 中如何處理 DNS 查詢?

  • October 11, 2022

我試圖了解如何在 Linux 中完成 DNS 查詢。

我知道程序可以先檢查/etc/hosts附加到名稱的 IP,然後/etc/resolv.conf檢查 DNS 伺服器。

那麼它在瀏覽器中是如何工作的呢?當我輸入時http://www.google.fr,瀏覽器首先做什麼?

如果沒有任何內容,它是否只檢查那些文件並將查詢發送到 DNS 伺服器/etc/hosts查詢是如何發送的(在DNS

的維基百科文章中有幾個 RFC 和協議):哪個埠和協議?

現在它對 OpenVPN 是如何工作的?

如果我使用類似OpenVPNcurlfirefox啟動了 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,除非它們不使用。

請參閱DNS 協議如何從 UDP 切換到 TCP?

認為在 UDP 上使用經典 DNS 查詢以外的其他東西需要使用更高級的 systemd resolvd(例如支持 DNS over TLS)作為解析器,而不是依賴經典的 C 庫。

或者,類似於 PAM 的設計方式,名稱服務切換 (NSS) 旨在添加新模組,而無需更改呼叫系統解析器的任何程序和程式碼。添加額外的解析器庫以支持不同的 DNS 協議並調整nsswitch.conf以使用該庫,例如https://github.com/dimkr/nss-tls

引用自:https://serverfault.com/questions/1112794