> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-33-zhang-wang-luo-fu-wu-qi/33.7.-yu-ming-xi-tong-dns.md).

# 33.7.域名系统（DNS）

域名系统（DNS）是一种协议，将域名映射到 IP 地址，反之亦然。DNS 在互联网上通过一个相对复杂的系统协调，该系统包括权威根、顶级域（TLD）和其他小规模的名称服务器，这些服务器承载并缓存各个域的信息。执行 DNS 查询并不需要运行名称服务器。

以下表格说明了与 DNS 相关的术语：

**表 4. DNS 术语**

| 术语     | 定义                                           |
| ------ | -------------------------------------------- |
| 正向 DNS | 将主机名映射到 IP 地址。                               |
| 原点     | 指特定区域文件中所覆盖的域。                               |
| 解析器    | 一种系统进程，计算机通过该进程向名称服务器查询区域信息。                 |
| 反向 DNS | 将 IP 地址映射到主机名。                               |
| 根区     | 互联网区域层次结构的起点。所有区域都位于根区下，类似于文件系统中所有文件都位于根目录下。 |
| 区域     | 一个由同一权威管理的独立域、子域或 DNS 的一部分。                  |

**区域示例：**

* `.` 通常在文档中表示根区。
* `org.` 是根区下的一个顶级域（TLD）。
* `example.org.` 是 `org.` TLD 下的一个区域。
* `1.168.192.in-addr.arpa` 是一个区域，引用所有属于 `192.168.1.*` IP 地址空间的 IP 地址。

如上所示，主机名的更具体部分位于其左侧。例如，`example.org.` 比 `org.` 更具体，`org.` 又比根区更具体。主机名的每一部分的布局与文件系统类似：**/dev** 目录位于根目录下，依此类推。

## 33.7.1. 运行名称服务器的原因

名称服务器通常有两种形式：权威名称服务器和缓存（也称为解析）名称服务器。

需要权威名称服务器的情况：

* 希望向外界提供 DNS 信息，权威地回答查询。
* 域名（如 `example.org`）已注册，并且需要为该域名下的主机名分配 IP 地址。
* IP 地址块需要反向 DNS 条目（IP 到主机名的映射）。
* 需要备份或第二个名称服务器（称为从服务器），它将回答查询。

需要缓存名称服务器的情况：

* 本地 DNS 服务器可以缓存并比查询外部名称服务器更快地响应。

查询 `www.FreeBSD.org` 时，解析器通常会查询上级 ISP 的名称服务器，并检索回复。使用本地缓存 DNS 服务器时，查询只需向外部世界发送一次，由缓存 DNS 服务器处理。之后的查询将不再需要通过外部网络，因为信息已在本地缓存。

## 33.7.2. DNS 服务器配置

FreeBSD 提供了 Unbound 作为基本系统的一部分。默认情况下，它仅为本地机器提供 DNS 解析服务。虽然可以配置基本系统的软件包来提供超出本地机器的解析服务，但建议从 FreeBSD Ports 安装 Unbound 解决此类需求。

要启用 Unbound，请在 **/etc/rc.conf** 中添加以下内容：

```sh
local_unbound_enable="YES"
```

**/etc/resolv.conf** 中的任何现有名称服务器将作为新的 Unbound 配置中的转发器。

> **注意**
>
> 如果列出的任何名称服务器不支持 DNSSEC，本地 DNS 解析将失败。请务必测试每个名称服务器，并删除任何测试失败的服务器。以下命令将显示信任树，或在 **192.168.1.1** 上的名称服务器失败时显示：
>
> ```sh
> % drill -S FreeBSD.org @192.168.1.1
> ```

确认每个名称服务器支持 DNSSEC 后，启动 Unbound：

```sh
# service local_unbound onestart
```

这将更新 **/etc/resolv.conf**，以便查询支持 DNSSEC 的域名。例如，运行以下命令以验证 FreeBSD.org 的 DNSSEC 信任树：

```ini
% drill -S FreeBSD.org
;; Number of trusted keys: 1
;; Chasing: freebsd.org. A

DNSSEC Trust tree:
freebsd.org. (A)
|---freebsd.org. (DNSKEY keytag: 36786 alg: 8 flags: 256)
    |---freebsd.org. (DNSKEY keytag: 32659 alg: 8 flags: 257)
    |---freebsd.org. (DS keytag: 32659 digest type: 2)
        |---org. (DNSKEY keytag: 49587 alg: 7 flags: 256)
            |---org. (DNSKEY keytag: 9795 alg: 7 flags: 257)
            |---org. (DNSKEY keytag: 21366 alg: 7 flags: 257)
            |---org. (DS keytag: 21366 digest type: 1)
            | |
            | |
            |---org. (DS keytag: 21366 digest type: 2)
                |---. (DNSKEY keytag: 40926 alg: 8 flags: 256)
                    |---. (DNSKEY keytag: 19036 alg: 8 flags: 257)
;; Chase successful
```

## 33.7.3. 权威名称服务器配置

FreeBSD 的基本系统中不提供权威名称服务器软件。建议用户安装第三方应用程序，如软件包或 Port [dns/nsd](https://cgit.freebsd.org/ports/tree/dns/nsd/) 或 [dns/bind918](https://cgit.freebsd.org/ports/tree/dns/bind918/)。
