> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man5/resolver.5.md).

# resolver(5)

`resolver` — 解析器配置文件

## 名称

`resolver`

## 概要

`resolv.conf`

## 描述

resolver(3) 是 C 库中的一组例程，提供对 Internet 域名系统的访问。解析器配置文件包含在进程首次调用解析器例程时读取的信息。该文件设计为人类可读，包含一系列带值的关键字，提供各种类型的解析器信息。

在正常配置的系统上，不需要手动设置此文件。要查询的唯一名称服务器将位于本地机器上，或通过 DHCP 或类似机制自动配置，域名由主机名确定，域搜索路径由域名构造。

不同的配置选项有：

**`nameserver`** 解析器应查询的名称服务器的 IPv4 或 IPv6 地址。最多可以列出 `MAXNS`（当前为 3）个名称服务器，每个关键字一个。如果有多个服务器，解析器库按列出的顺序查询它们。如果没有 **nameserver** 条目，默认使用本地机器上的名称服务器。（所用算法是尝试一个名称服务器，如果查询超时，尝试下一个，直到名称服务器用完，然后重复尝试所有名称服务器，直到达到最大重试次数。）

**`domain`** 本地域名。对此域内名称的大多数查询可以使用相对于本地域的短名称。如果没有 **domain** 条目，域名由 gethostname(3) 返回的本地主机名确定；域名部分取为第一个 `.` 之后的所有内容。最后，如果主机名不包含域名部分，则假定根域为域名。

**`search`** 主机名查找的搜索列表。搜索列表通常由本地域名确定；默认情况下，它仅包含本地域名。可以通过在 **search** 关键字后列出所需的域搜索路径来更改，名称之间用空格或制表符分隔。大多数解析器查询将依次使用搜索路径的每个组件进行尝试，直到找到匹配项。注意，如果所列域的服务器不在本地，此过程可能很慢并会产生大量网络流量，如果某个域没有可用的服务器，查询将超时。搜索列表目前限制为六个域，总共 256 个字符。

**`sortlist`** 排序列表允许对 gethostbyname 返回的地址进行排序。排序表由 IP 地址网络掩码对指定。如果未指定网络掩码，则默认为网络的历史 A/B/C 类网络掩码；此用法已弃用。IP 地址和网络对之间用斜杠分隔。最多可指定 10 对。例如：

```sh
sortlist 10.9.1.0/255.255.240.0 10.9.0.0/255.255.0.0
```

**`options`** 选项允许修改某些内部解析器变量。语法为

`options option ...`

其中 **option** 是以下之一：

**`debug`** 在 \_res.options 中设置 `RES_DEBUG`。

**`usevc`** 设置 `RES_USEVC`，在查询时使用 TCP 而不是 UDP。

**`ndots:`**`n` 设置一个阈值，即在传递给 res\_query（参见 resolver(3)）的名称中必须出现的点数，超过此阈值才会进行*初始绝对查询*。*n* 的默认值为 “1”，意味着如果名称中有任何点，则该名称将首先作为绝对名称尝试，然后才向其追加任何*搜索列表*元素。

**`timeout:`**`n` 设置解析器在通过不同名称服务器重试查询之前，等待远程名称服务器响应的初始时间量。解析器在当前查询的后续重试中可能会等待更长时间，因为会对超时值应用指数退避。以秒为单位测量，默认值为 `RES_TIMEOUT`，允许的最大值为 `RES_MAXRETRANS`（参见 `<resolv.h>`）。

**`attempts:`**`n` 设置解析器在放弃并向调用应用程序返回错误之前，向每个名称服务器发送查询的次数。默认值为 `RES_DFLRETRY`，允许的最大值为 `RES_MAXRETRY`（参见 `<resolv.h>`）。

**`edns0`** 设置 `RES_USE_EDNS0`。为 EDNS0 扩展附加一个 OPT 伪 RR，如 RFC 2671 所规定。这允许解析器通告更大的 UDP 接收缓冲区大小，允许超过原始 512 字节限制的响应。

**`inet6`** 设置 `RES_USE_INET6`。使 gethostbyname(3) 在查找 A 记录之前先查找 AAAA 记录，并将 IPv4 响应映射到 IPv6 地址。不鼓励使用此选项。

**`insecure1`** 设置 `RES_INSECURE1`。禁用对响应是否从发送查询的同一服务器接收的检查。使用此选项有安全风险，不建议使用。

**`insecure2`** 设置 `RES_INSECURE2`。禁用对响应是否包含与发送的查询匹配的查询的检查。使用此选项有安全风险，不建议使用。

**`no-check-names`** 设置 `RES_NOCHECKNAME`。禁用对传入主机名中无效字符（如下划线、非 ASCII 字符或控制字符）的检查。

**`no_tld_query`** 告诉解析器不要尝试解析顶级域名，即不包含点的名称。使用此选项不会阻止解析器对给定名称遵循标准的 **domain** 和 **search** 规则。

**`rotate`** 设置 `RES_ROTATE`。使解析器在配置的名称服务器之间轮转，分发查询负载，而不是始终尝试第一个列出的服务器。

**`reload-period:`**`n` 解析器每 `n` 秒检查一次 **/etc/resolv.conf** 的修改时间。如果 **/etc/resolv.conf** 已更改，则会自动重新加载。`n` 的默认值为两秒。将其设置为零可禁用文件检查。

选项也可以使用 `RES_OPTIONS` 环境变量以空格或制表符分隔的列表指定。

**domain** 和 **search** 关键字互斥。如果存在这些关键字的多个实例，最后一个实例将覆盖前面的。

关键字和值必须出现在同一行上，关键字（例如 **nameserver**）必须位于行首。值跟在关键字之后，用空白字符分隔。

## 文件

**`/etc/resolv.conf`** `resolv.conf` 文件位于 **/etc**。

## 实例

一个基本的 resolv.conf 文件可能采用以下形式。

```sh
# domain 指令仅在你的本地路由器通告类似 localdomain
# 的名称，并且你已通过外部域设置了主机名时才需要。
domain localdomain.tld
# 如果你运行本地 dns 服务器或缓存名称服务器，
# 例如 local-unbound(8)。
nameserver 127.0.0.1
# 本地或 ISP 名称服务的 IP 地址
nameserver 192.168.2.1
# 后备名称服务器，此处为 Google 的名称服务器。
nameserver 8.8.8.8
nameserver 8.8.4.4
# 为 EDNS0 扩展附加一个 OPT 伪 RR，
# 如 RFC 2671 所规定。
options edns0
```

## 参见

gethostbyname(3), resolver(3), [hostname(7)](/man7/hostname.7.md), resolvconf(8)

## 历史

`resolv.conf` 文件格式出现于 4.3BSD。
