域名解析

出自 ArchWiki
(重定向自 域名系统)

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

名称服务切换

本章节需要扩充。

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

名称服务切换 (NSS) 工具是 GNU C 库 (glibc) 的一部分,并为 getaddrinfo(3) API 提供支持,该 API 用于解析域名。NSS 允许系统数据库由单独的服务提供,其搜索顺序可以由管理员在 nsswitch.conf(5) 中配置。负责域名解析的数据库是 hosts 数据库,glibc 为其提供以下服务

systemd 提供了三个用于主机名解析的 NSS 服务

使用 NSS 解析域名

可以使用 getent(1) 查询 NSS 数据库。可以使用以下命令通过 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/etc/resolvconf.conf(如果使用 openresolv)中将 127.0.0.1::1 设置为名称服务器来使用它。

提示
  • drilldig 查找工具 报告查询时间。
  • 路由器通常将其自己的缓存解析器设置为网络的 DNS 服务器,从而为整个网络提供 DNS 缓存。
  • 如果切换到下一个 DNS 服务器的时间太长,您可以尝试减少超时时间

隐私和安全

DNS 协议是未加密的,并且不考虑机密性、完整性或身份验证,因此,如果您使用不受信任的网络或恶意 ISP,您的 DNS 查询可能会被窃听,响应可能会被篡改。此外,DNS 服务器可能会进行 DNS 劫持

您需要信任您的 DNS 服务器以保密处理您的查询。DNS 服务器由 ISP 和第三方提供。或者,您可以运行自己的递归名称服务器,但这需要付出更多努力。如果您在不受信任的网络中使用 DHCP 客户端,请务必设置静态名称服务器,以避免使用任意 DNS 服务器并受其影响。为了保护您与远程 DNS 服务器的通信,您可以使用加密协议,例如 DNS over TLS (RFC 7858)、DNS over HTTPS (RFC 8484) 或 DNSCrypt,前提是上游服务器和您的解析器都支持该协议。另一种选择是使用专用软件来加密和解密通信,例如 stunnel。为了验证响应是否真的来自权威名称服务器,您可以验证 DNSSEC,前提是上游服务器和您的解析器都支持它。

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

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

应用层 DNS

请注意,一些客户端软件,例如主要的网络浏览器[2][3],正在开始实施基于 HTTPS 的 DNS。虽然查询加密通常被视为一项优势,但也意味着该软件绕过了系统解析器配置来查询。[4]

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

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
基于 HTTPS 的 DNS 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 解析,而对互联网的查询仍将由您的标准 DNS 解析器解析。它也可以在本地网络上使用。

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

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

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

参见