> 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.6.-dong-tai-zhu-ji-she-zhi-xie-yi-dhcp.md).

# 33.6.动态主机配置协议（DHCP）

动态主机配置协议（DHCP）让系统能连接到网络，并分配必要的地址信息以在网络中通信。FreeBSD 包含 OpenBSD 版本的 `dhclient`，该客户端用于获取地址信息。FreeBSD 并没有安装 DHCP 服务器，但在 FreeBSD Ports 中有几个服务器可供选择。DHCP 协议的完整说明可以参见 [RFC 2131](http://www.freesoft.org/CIE/RFC/2131/)。更多信息可以访问 [isc.org/downloads/dhcp/](http://www.isc.org/downloads/dhcp/)。

本节将介绍如何使用内置的 DHCP 客户端。接下来介绍如何安装和配置 DHCP 服务器。

> **注意**
>
> 在 FreeBSD 中，DHCP 服务器和客户端都需要 [bpf(4)](https://man.freebsd.org/cgi/man.cgi?query=bpf\&sektion=4\&format=html) 设备。这个设备包含在 FreeBSD 安装的 **GENERIC** 内核中。如果用户想创建定制内核，需要保留此设备以便使用 DHCP。值得注意的是，**bpf** 还让具有特权的用户能在该系统上运行网络数据包嗅探器。

## 33.6.1. 配置 DHCP 客户端

FreeBSD 安装程序中包含 DHCP 客户端支持，让新安装的系统能自动从现有的 DHCP 服务器获取网络配置地址信息。有关网络配置的示例，请参阅 [网络接口、账户、时区、服务和加固](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan.md)。

在客户端机器上执行 `dhclient` 时，它会广播请求配置信息。默认情况下，这些请求使用 UDP 端口 68。服务器在 UDP 端口 67 上回复，向客户端提供 IP 地址以及其他相关的网络信息，例如子网掩码、默认网关和 DNS 服务器地址。这些信息以 DHCP“租约”的形式提供，并且在可配置的时间内有效。这样不再连接到网络的客户端的过期 IP 地址能自动回收。DHCP 客户端可以从服务器获取大量的信息。有关详细信息，请参见 [dhcp-options(5)](https://man.freebsd.org/cgi/man.cgi?query=dhcp-options\&sektion=5\&format=html)。

默认情况下，FreeBSD 系统引导时，其 DHCP 客户端会在后台运行，或称为 *异步模式*。其他启动脚本会继续运行，而 DHCP 进程在后台完成，这样可以加速系统引导。

背景模式下的 DHCP 工作良好，前提是 DHCP 服务器能快速响应客户端的请求。然而，在某些系统上，DHCP 可能需要较长时间才能完成。如果网络服务在 DHCP 配置完成之前尝试启动，它们将会失败。使用同步模式的 DHCP 可以避免这个问题，因为它会在引导时暂停，直到 DHCP 配置完成。

在 **/etc/rc.conf** 中使用以下行配置后台或异步模式：

```sh
ifconfig_fxp0="DHCP"
```

如果在安装过程中已配置该系统使用 DHCP，则这行配置可能已经存在。请将这些示例中的 *fxp0* 替换为要动态配置的接口名称，如在 [有线网络](/di-7-zhang-wang-luo/7.3.-you-xian-wang-luo.md) 中所述。

要配置系统使用同步模式，并在引导时暂停直到 DHCP 配置完成，请使用“SYNCDHCP”：

```sh
ifconfig_fxp0="SYNCDHCP"
```

可以使用其他客户端选项。请在 [rc.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=rc.conf\&sektion=5\&format=html) 中搜索 `dhclient` 以获取更多详细信息。

DHCP 客户端使用以下文件：

* **/etc/dhclient.conf** `dhclient` 使用的配置文件。通常，这个文件仅包含注释，因为默认配置适合大多数客户端。此配置文件的详细说明请参见 [dhclient.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=dhclient.conf\&sektion=5\&format=html)。
* **/sbin/dhclient** 有关此命令的更多信息，请参见 [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html)。
* **/sbin/dhclient-script** FreeBSD 特定的 DHCP 客户端配置脚本。它的说明请参见 [dhclient-script(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient-script\&sektion=8\&format=html)，但通常不需要用户修改即可正常工作。
* **/var/db/dhclient.leases.interface** DHCP 客户端将有效的租约保存在此文件中，以日志的形式记录，详细信息请参见 [dhclient.leases(5)](https://man.freebsd.org/cgi/man.cgi?query=dhclient.leases\&sektion=5\&format=html)。

## 33.6.2. 安装和配置 DHCP 服务器

本节演示如何配置 FreeBSD 系统，使其充当 DHCP 服务器，使用互联网系统联盟（ISC）实现的 DHCP 服务器。安装软件包或 Port [net/isc-dhcp44-server](https://cgit.freebsd.org/ports/tree/net/isc-dhcp44-server/) 即可获得此实现及其文档。

安装 [net/isc-dhcp44-server](https://cgit.freebsd.org/ports/tree/net/isc-dhcp44-server/) 后，会安装一个示例配置文件。将 **/usr/local/etc/dhcpd.conf.example** 复制到 **/usr/local/etc/dhcpd.conf**，并编辑新文件。

配置文件由子网和主机的声明组成，这些声明定义了提供给 DHCP 客户端的信息。例如，以下几行配置了如下内容：

```ini
option domain-name "example.org";  ①
option domain-name-servers ns1.example.org;  ②
option subnet-mask 255.255.255.0;  ③

default-lease-time 600;  ④
max-lease-time 72400;  ⑤
ddns-update-style none;  ⑥

subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;  ⑦
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;  ⑧
}

host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;  ⑨
  fixed-address fantasia.fugue.com;  ⑩
}
```

* ① 该选项指定将提供给客户端的默认搜索域。有关更多信息，请参见 [resolv.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=resolv.conf\&sektion=5\&format=html)。
* ② 该选项指定客户端应使用的 DNS 服务器的逗号分隔列表。可以使用其完全限定的域名（FQDN），如示例中所示，或者使用它们的 IP 地址。
* ③ 将提供给客户端的子网掩码。
* ④ 默认租约到期时间，以秒为单位。客户端可以配置为覆盖此值。
* ⑤ 租约的最大有效时长，以秒为单位。如果客户端请求更长的租约，仍然会发放租约，但它将仅在 `max-lease-time` 的有效期内有效。
* ⑥ 默认值 `none` 禁用动态 DNS 更新。将其更改为 `interim` 配置 DHCP 服务器，在每次发放租约时更新 DNS 服务器，这样 DNS 服务器就知道哪些 IP 地址与网络中的哪些计算机相关联。除非 DNS 服务器已配置为支持动态 DNS，否则不应更改默认设置。
* ⑦ 这一行创建可供 DHCP 客户端分配的 IP 地址池。地址范围必须对前面指定的网络或子网有效。
* ⑧ 声明在前面花括号之前指定的网络或子网的默认网关。
* ⑨ 指定客户端的硬件 MAC 地址，以便 DHCP 服务器在客户端请求时识别该客户端。
* ⑩ 指定该主机应始终获得相同的 IP 地址。使用主机名是正确的，因为 DHCP 服务器将在返回租约信息之前解析主机名。

此配置文件支持更多选项。有关详细信息和示例，请参见与服务器一起安装的 [dhcpd.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=dhcpd.conf\&sektion=5\&format=html)。

配置完 **dhcpd.conf** 后，在 **/etc/rc.conf** 中启用 DHCP 服务器：

```sh
dhcpd_enable="YES"
dhcpd_ifaces="dc0"
```

将 `dc0` 替换为 DHCP 服务器应侦听 DHCP 客户端请求的接口（或多个接口，接口间以空格分隔）。

运行以下命令启动服务器：

```sh
# service isc-dhcpd start
```

以后对服务器配置的任何更改都需要先停止 `dhcpd` 服务，然后使用 [service(8)](https://man.freebsd.org/cgi/man.cgi?query=service\&sektion=8\&format=html) 命令重新启动。

DHCP 服务器使用以下文件。请注意，手册页已随服务器软件一起安装。

* **/usr/local/sbin/dhcpd** 有关 `dhcpd` 服务器的更多信息，请参见 [dhcpd(8)](https://man.freebsd.org/cgi/man.cgi?query=dhcpd\&sektion=8\&format=html)。
* **/usr/local/etc/dhcpd.conf** 服务器配置文件需要包含所有应提供给客户端的信息，以及关于服务器操作的信息。此配置文件在 [dhcpd.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=dhcpd.conf\&sektion=5\&format=html) 中有详细说明。
* **/var/db/dhcpd.leases** DHCP 服务器将它所发放的租约保存在此文件中，文件以日志的形式写入。请参阅 [dhcpd.leases(5)](https://man.freebsd.org/cgi/man.cgi?query=dhcpd.leases\&sektion=5\&format=html)，该文档给出了稍长的说明。
* **/usr/local/sbin/dhcrelay** 该守护进程用于在高级环境中，其中一个 DHCP 服务器将客户端的请求转发到另一个 DHCP 服务器，该服务器位于不同的网络中。如果需要此功能，请安装软件包或 Port [net/isc-dhcp44-relay](https://cgit.freebsd.org/ports/tree/net/isc-dhcp44-relay/)。安装后包含 [dhcrelay(8)](https://man.freebsd.org/cgi/man.cgi?query=dhcrelay\&sektion=8\&format=html)，提供更多详细信息。
