域名解析

出自 ArchWiki
(重定向自 DNS over TLS)

通常,域名代表一个 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/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 解析器,但浏览器在请求网站证书时,仍然会在 服务器名称指示 中泄漏域名。可以使用 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])开始实现 DNS over HTTPS。虽然查询加密通常被视为一种奖励,但也意味着软件绕过了系统解析器配置来发送查询。[4]

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

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

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

盲 DNS

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

第三方 DNS 服务

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

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

  • cloudflared — 用于 Cloudflare DNS over HTTPS 的 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
over TLS
DNS
over HTTPS
DNS
over 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 可以同时提供 DNS over TLS 和 DNS over HTTPS 服务(参见 tls{}listen-on),但目前还不能将查询转发到 DNS over TLS/DNS over HTTPS 上游。dig 工具可以通过 DNS over TLS 和 DNS over HTTPS 发出查询(使用 +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 地址),但“条件转发”似乎是用于“查询的域名”条件的名称。

参见