32.6. 动态主机设置协议(DHCP) ============================== 动态主机配置协议(DHCP)允许系统连接到网络,以便为该网络上的通信分配必要的寻址信息。FreeBSD 包含 OpenBSD 版本的 ``dhclient``\ ,使用它来获取寻址信息。FreeBSD 不安装 DHCP 服务器,但是在 FreeBSD ports 中有好几个服务器可用。DHCP 协议在 `RFC 2131 `__ 中进行了全面描述。\ `isc.org/downloads/dhcp/ `__ 也提供信息资源。 本节介绍了如何使用内置 DHCP 客户端。然后,它说明了如何安装和配置 DHCP 服务器。 **注意** 在 FreeBSD 中,DHCP 服务器和 DHCP 客户端都需要 `bpf(4) `__ 设备。这个设备被包含在随 FreeBSD 安装的 **GENERIC** 内核中。喜欢创建定制内核的用户在使用 DHCP 时需要保留这个设备。 应该注意的是,\ **bpf** 也允许有特权的用户在该系统上运行网络数据包嗅探器。 32.6.1. 配置 DHCP 客户端 ------------------------ DHCP 客户端支持包含在 FreeBSD 安装程序中,使得配置新安装的系统很容易,以自动从现有的 DHCP 服务器接收其网络寻址信息。有关网络配置的示例请参阅\ `帐户、时区、服务和加固 `__\ 。 在客户端计算机上执行时,它将开始广播配置信息请求。默认情况下,这些请求使用 UDP 端口 68。服务器在 UDP 端口 67 上进行回复,为客户端提供 IP 地址和其他相关网络信息,如子网掩码、默认网关和 DNS 服务器地址。此信息采用 DHCP“租约”的形式,在可配置的时间内有效。这允许自动重用不再连接到网络的客户端的陈旧 IP 地址。DHCP 客户端可以从服务器获取大量信息。详尽的列表可以在 `dhcp-options(5) `__ 中找到。 缺省情况下,当 FreeBSD 系统引导时,它的 DHCP 客户端在后台运行,或者 *异步* 运行。在 DHCP 进程完成时,其他启动脚本将继续运行,从而加快系统启动速度。 当 DHCP 服务器快速响应客户端的请求时,后台 DHCP 可以很好地工作。但是,DHCP 在某些系统上可能需要很长时间才能完成。如果网络服务尝试在 DHCP 分配网络寻址信息之前运行,则它们将失败。在 *同步* 模式下使用 DHCP 可防止此问题,因为它会暂停启动,直到 DHCP 配置完成。 **/etc/rc.conf** 中的这一行用于配置后台或异步模式: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ifconfig_fxp0="DHCP" 如果系统配置为在安装过程中使用 DHCP,则此行可能已存在。如“\ `设置网卡 `__\ ”中所述,将这些示例中所示的 *fxp0* 替换为要动态配置的接口的名称。 要改为将系统配置为使用同步模式,并在 DHCP 完成时在启动期间暂停,请使用“SYNCDHCP”: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ifconfig_fxp0="SYNCDHCP" 有其他的客户端选项可用。在 `rc.conf(5) `__ 中搜索 ``dhclient``\ 。 DHCP 客户端使用以下文件: - **/etc/dhclient.conf** ``dhclient`` 使用的配置文件。通常,此文件仅包含注释,因为默认值适用于大多数客户端。此配置文件在 `dhclient.conf(5) `__ 中进行了说明。 - **/sbin/dhclient** 有关命令本身的更多信息可以在 `dhclient(8) `__ 中找到。 - **/sbin/dhclient-script** FreeBSD 特定的 DHCP 客户端配置脚本。它在 `dhclient-script(8) `__ 中进行了说明,但不需要任何用户修改即可正常运行。 - **/var/db/dhclient.leases.interface** DHCP 客户端在此文件中保留一个有效租约数据库,该文件以日志形式写入,并在 `dhclient.leases(5) `__ 中进行了说明。 32.6.2. 安装和配置 DHCP 服务器 ------------------------------ 本节演示如何使用 DHCP 服务器的互联网系统联盟(ISC)实现来配置 FreeBSD 系统以充当 DHCP 服务器。可以使用软件包或 port `net/isc-dhcp44-server `__ 安装此实现及其文档。 `net/isc-dhcp44-server `__ 的安装将放置一个示例配置文件。将 **/usr/local/etc/dhcpd.conf.example** 复制到 **/usr/local/etc/dhcpd.conf**\ ,并对此新文件进行任何编辑。 配置文件由子网和主机的声明组成,这些声明定义了提供给 DHCP 客户端的信息。例如,这些行配置以下内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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) `__\ 。 ② 此选项指定客户端应使用的以逗号分隔的 DNS 服务器列表。它们可以按其完全限定域名(FQDN)列出(如示例中所示)或按其 IP 地址列出。 ③ 将提供给客户端的子网掩码。 ④ 默认租约到期时间(以秒为单位)。可以将客户端配置为覆盖此值。 ⑤ 租约允许的最大时间长度(以秒为单位)。如果客户端请求更长的租约,仍会发出租约,但该租约仅对 ``max-lease-time`` 有效。 ⑥ 默认 ``none`` 禁用动态 DNS 更新。将此更改为 ``interim`` 将 DHCP 服务器配置为在发出租约时更新 DNS 服务器,以便 DNS 服务器知道哪些 IP 地址与网络中的哪些计算机相关联。除非已将 DNS 服务器配置为支持动态 DNS,否则不要更改默认设置。 ⑦ 此行创建一个可用 IP 地址池,这些 IP 地址保留用于分配给 DHCP 客户端。地址范围必须对上一行中指定的网络或子网有效。 ⑧ 声明对 ``{`` 左括号前指定的网络或子网有效的默认网关。 ⑨ 指定客户端的硬件 MAC 地址,以便 DHCP 服务器在发出请求时可以识别客户端。 ⑩ 指定应始终为此主机提供相同的 IP 地址。使用主机名是正确的,因为 DHCP 服务器将在返回租约信息之前解析主机名。 此配置文件支持更多选项。有关详细信息和示例,请参阅随服务器一起安装的 dhcpd.conf(5)。 **dhcpd.conf** 的配置完成后,在 **/etc/rc.conf** 中启用 DHCP 服务器: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session dhcpd_enable="YES" dhcpd_ifaces="dc0" 替换 ``dc0`` 为 DHCP 服务器应侦听 DHCP 客户端请求的接口(或多个接口,用空格分隔)。 通过执行以下命令启动服务器: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service isc-dhcpd start 将来对服务器配置的任何更改都需要停止 dhcpd 服务,然后使用 `service(8) `__ 启动。 DHCP 服务器使用以下文件。请注意,手册页随服务器软件一起安装。 - **/usr/local/sbin/dhcpd** 有关 dhcpd 服务器的更多信息可以在 dhcpd(8) 中找到。 - **/usr/local/etc/dhcpd.conf** 服务器配置文件需要包含应提供给客户端的所有信息,以及有关服务器操作的信息。此配置文件在 dhcpd.conf(5) 中进行了概述。 - **/var/db/dhcpd.leases** DHCP 服务器在此文件中保留它已颁发的租约的数据库,该文件以日志形式写入。请参阅 dhcpd.leases(5),它给出了详细的解释。 - **/usr/local/sbin/dhcrelay** 此守护程序用于高级环境,其中一个 DHCP 服务器将请求从客户端转发到单独网络上的另一个 DHCP 服务器。如果需要此功能,请通过软件包或 port 安装 `net/isc-dhcp44-relay `__\ 。安装包括 dhcrelay(8),它提供了更多细节。