Linux 中如何处理 DNS 查询?

Linux 中如何处理 DNS 查询?

我试图了解在 Linux 中 DNS 查询是如何完成的。

我知道程序可以先检查/etc/hosts名称附带的 IP,然后再/etc/resolv.conf检查 DNS 服务器。

那么浏览器是如何工作的呢?当我输入时,http://www.google.fr浏览器首先会做什么?
它是否只检查那些文件,如果没有任何内容,则将查询发送到 DNS 服务器/etc/hosts
查询是如何发送的(网络上有多个 RFC 和协议DNS 的 Wikipedia 文章): 哪个端口和协议??

那么,OpenVPN 如何工作呢?

curl如果我使用类似或激活 OpenVPN 的程序firefox,它会通过隧道发送 DNS 查询还是独立发送?
它使用哪个端口和协议?
根据我的基本理解,我猜 OpenVPN 会重新排列 iptables 并使用 iptables 规则通过隧道发送查询。因此,这取决于发送 DNS 查询的程序所使用的协议。我说得对吗?

答案1

这取决于

应用程序可能会执行自己的操作,而与操作系统的配置无关。

例如,在 Chrome 网络浏览器的“设置 > 隐私和安全 > 安全”中设置自定义安全 DNS 提供程序后,系统解析器不再使用。

系统解析器

当应用程序不是做自己的事情,应用程序通常通过使用操作系统/内核函数来调用系统解析器,比如传统的gethostbyname()和/或更现代的getaddrinfo()将主机名或完全限定域名 (FQDN) 转换为 IPv4/IPv6 地址。

名称服务交换 (NSS) 配置文件,/etc/nsswitch.conf,用于配置从哪里获取名称服务信息以及获取顺序。

例如/etc/nsswitch.conf,通常的默认顺序是/etc/hosts“文件”在配置 DNS 之前,请先咨询以下关键字:

# /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

当在主机文件中找不到主机名时,将使用 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

/etc/resolv.conf据我所知,VPN 软件通常具有一项功能,即在配置后,在连接到 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

相关内容