域名解析

出自 ArchWiki
(重定向自 Dig

通常,域名代表一个 IP 地址,并在 域名系统 (DNS) 中与之关联。本文介绍如何配置域名解析和解析域名。

名称服务切换

本文或章节需要扩充。

原因: 提及 nss-mdnsnss-tls-gitAUR 以及其他。(在 Talk:Domain name resolution 中讨论)

名称服务切换 (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。请参阅 网络配置#localhost 通过网络解析

Glibc 解析器

glibc 解析器读取 /etc/resolv.conf 以进行每次解析,以确定要使用的名称服务器和选项。

resolv.conf(5) 列出了名称服务器以及一些配置选项。首先列出的名称服务器首先尝试,最多可以列出三个名称服务器。以数字符号 (#) 开头的行将被忽略。

注意: glibc 解析器不缓存查询。要提高查询查找时间,您可以设置缓存解析器。Glibc 解析器也无法验证 DNSSEC。为此需要支持 DNSSEC 的验证器解析器。有关更多信息,请参阅 #DNS 服务器

覆盖 /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:Domain name resolution 中讨论)

如果您使用 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 中或浏览时),通常有助于定义一个小的超时时间,在此超时时间之后将使用备用名称服务器。为此,请将以下内容放入 /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 查询特定名称服务器的域 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 服务器由 ISP 和 第三方 提供。或者,您可以运行自己的 递归名称服务器,但这需要付出更多努力。如果您在不受信任的网络中使用 DHCP 客户端,请务必设置静态名称服务器,以避免使用和受制于任意 DNS 服务器。为了保护您与远程 DNS 服务器的通信,您可以使用加密协议,例如 基于 TLS 的 DNS (RFC 7858)、基于 HTTPS 的 DNS (RFC 8484) 或 DNSCrypt,前提是上游服务器和您的 解析器 都支持该协议。另一种选择是使用专用软件来加密和解密通信,例如 stunnel。为了验证响应是否确实来自 权威名称服务器,您可以验证 DNSSEC,前提是上游服务器和您的 解析器 都支持它。

尽管可以使用加密的 DNS 解析器,但浏览器在请求网站证书时仍然会在 服务器名称指示中泄漏域名。可以使用 Wireshark 过滤器 tls.handshake.extensions_server_name_len > 0 或使用下面的命令行来检查此泄漏。一个提议的解决方案是使用 加密客户端问候 (ECH),一种 TLS 1.3 协议扩展。

# tshark -p -Tfields -e tls.handshake.extensions_server_name -Y 'tls.handshake.extensions_server_name_len>0'

应用层 DNS

请注意,某些客户端软件(例如主要的 Web 浏览器[2][3])开始实现基于 HTTPS 的 DNS。虽然查询加密通常被视为一种奖励,但也意味着该软件绕过了系统解析器配置的查询。[4]

Firefox 提供了 配置选项,用于启用或禁用基于 HTTPS 的 DNS 并选择 DNS 服务器。Mozilla 建立了一个 可信递归解析器 (TRR) 计划,其中包含有关其默认提供商的透明度信息。值得注意的是,Firefox 支持并自动为 TRR 提供商启用加密客户端问候 (ECH),请参阅 Firefox/Privacy#加密客户端问候

Chromium 将检查用户的系统解析器,如果已知系统解析器地址也提供基于 HTTPS 的 DNS,则启用基于 HTTPS 的 DNS。有关更多信息以及如何禁用基于 HTTPS 的 DNS,请参阅 这篇博客文章

Mozilla 已提议 如果系统解析器无法解析域 use-application-dns.net,则普遍禁用应用程序级 DNS。目前,这仅在 Firefox 中实现。

隐匿 DNS

隐匿 DNS (RFC:9230) 是一个解决许多 DNS 隐私问题的系统。有关更多信息,请参阅 Cloudflare 的文章

第三方 DNS 服务

注意: 在使用第三方 DNS 服务之前,请查看其隐私政策,以获取有关如何处理用户数据的信息。用户数据有价值,可以出售给其他方。

有各种 第三方 DNS 服务 可用,其中一些服务也有专用软件

  • cloudflared — 用于 Cloudflare 基于 HTTPS 的 DNS 的 DNS 客户端
https://developers.cloudflare.com/1.1.1.1/dns-over-https/cloudflared-proxy || cloudflared
  • opennic-up — 自动续订具有最快响应速度的 OpenNIC 服务器的 DNS 服务器
https://github.com/kewlfft/opennic-up || opennic-upAUR
  • nextdns — NextDNS 的基于 DNS-over-HTTPS 的 CLI 客户端
https://github.com/nextdns/nextdns || nextdnsAUR

您可以使用 dnsperftest 测试您所在位置最流行的 DNS 解析器的性能。dnsperf.com 提供了提供商之间的全球基准。

DNS 服务器

DNS 服务器可以是 权威性的递归的。如果它们都不是,则称为 桩解析器,并且仅将所有查询转发到另一个递归名称服务器。桩解析器通常用于在本地主机或网络上引入 DNS 缓存。请注意,使用功能齐全的名称服务器也可以实现相同的目的。本节比较了可用的 DNS 服务器,有关更详细的比较,请参阅 Wikipedia:DNS 服务器软件比较

本文或章节需要扩充。

原因: 填写未知项。(在 Talk:Domain name resolution 中讨论)
名称 软件包 功能 resolvconf 支持的协议
权威性 递归 缓存 验证
DNSSEC
DNS DNSCrypt DNS
基于 TLS
DNS
基于 HTTPS
DNS
基于 QUIC
BIND bind 服务器1 服务器
CoreDNS corednsAUR
基于 DNS-over-HTTPS dns-over-https ? ?
Deadwood (MaraDNS 递归器) 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 可以同时提供基于 TLS 的 DNS 和基于 HTTPS 的 DNS(请参阅 tls{}listen-on),但尚无法将查询转发到基于 TLS/HTTPS 的 DNS 上游。dig 工具可以通过基于 TLS 的 DNS 和基于 HTTPS 的 DNS 进行查询(使用 +tls+https 选项),但 没有任何证书检查
  2. 来自 Wikipedia:有限的权威支持,旨在用于内部网络而不是公共互联网。
  3. 使用 Redis 后端支持持久缓存。

仅限权威服务器

名称 软件包 DNSSEC 地理
平衡
gdnsd gdnsd
Knot DNS knot
MaraDNS maradnsAUR ?
NSD nsd
PowerDNS powerdns

条件转发

可以在查询特定域名时使用特定的 DNS 解析器。当连接到 VPN 时,这尤其有用,以便 VPN 网络的查询由 VPN 的 DNS 解析,而 Internet 的查询仍将由您的标准 DNS 解析器解析。它也可以在本地网络上使用。

要实现它,您需要使用本地解析器,因为 glibc 不支持它。

在动态环境(笔记本电脑和一定程度上的台式机)中,您需要根据您连接的网络配置解析器。最好的方法是使用 openresolv,因为它支持多个订阅者。一些网络管理器支持它,可以通过 openresolv,也可以直接配置解析器。NetworkManager 支持条件转发,无需 openresolv

注意: 虽然您可以使用其他条件进行转发(例如,源 IP 地址),但“条件转发”似乎是用于“查询的域名”条件的名称。

参见