30.5. 网络自动配置 (DHCP)

Written by Greg Sutter.

30.5.1. 什么是 DHCP?

DHCP, 动态主机配置协议, 是一种让系统得以连接到网络上, 并获取所需要的配置参数手段。 FreeBSD 使用来自 OpenBSD 3.7 的 OpenBSD dhclient。 这里提供的所有关于 dhclient 的信息, 都是以 ISC 或 OpenBSD DHCP 客户端程序为准的。 DHCP 服务器是 ISC 软件包的一部分。

30.5.2. 这一节都介绍哪些内容

这一节描述了 ISC 和 DHCP 系统中的客户端, 以及和 ISC DHCP 系统中的服务器端的组件。 客户端程序, dhclient, 是随 FreeBSD 作为它的一部分提供的; 而服务器部分, 则可以通过 net/isc-dhcp31-server port 得到。 dhclient(8)dhcp-options(5)、 以及 dhclient.conf(5) 联机手册, 加上下面所介绍的参考文献, 都是非常有用的资源。

30.5.3. 它如何工作

当 DHCP 客户程序, dhclient 在客户机上运行时, 它会开始广播请求配置信息的消息。 默认情况下, 这些请求是在 UDP 端口 68 上。 服务器通过 UDP 67 给出响应, 向客户机提供一个 IP 地址, 以及其他有关的配置参数, 例如子网掩码、 路由器, 以及 DNS 服务器。 所有这些信息都会以 DHCP lease 的形式给出, 并且只在一段特定的时间内有效 (这是由 DHCP 服务器的维护者配置的)。 这样, 那些已经断开网络的客户机使用的陈旧的 IP 地址就能被自动地回收了。

DHCP 客户程序可以从服务器端获取大量的信息。 关于能获得的信息的详细列表, 请参考 dhcp-options(5)

30.5.4. FreeBSD 集成

FreeBSD 完全地集成了 OpenBSD 的 DHCP 客户端, dhclient。 DHCP 客户端支持在安装程序和基本系统中均有提供, 这使得您不再需要去了解那些已经运行了 DHCP 服务器的网络的具体配置参数。

sysinstall 能够支持 DHCP。 在 sysinstall 中配置网络接口时, 它询问的第二个问题便是: Do you want to try DHCP configuration of the interface? (您是否希望在此接口上尝试 DHCP 配置?)。 如果做肯定的回答, 则将运行 dhclient, 一旦成功, 则将自动地填写网络配置信息。

要在系统启动时使用 DHCP, 您必须做两件事:

  • 您的内核中, 必须包含 bpf 设备。 如果需要这样做, 需要将 device bpf 添加到内核的编译配置文件中, 并重新编译内核。 要了解关于编译内核的进一步信息, 请参见 第 9 章 配置FreeBSD的内核

    bpf 设备已经是 FreeBSD 发行版中默认的 GENERIC 内核的一部分了, 因此如果您没有对内核进行定制, 则不用创建一份新的内核配置文件, DHCP 就能工作了。

    注意:

    对于那些安全意识很强的人来说, 您应该知道 bpf 也是包侦听工具能够正确工作的条件之一 (当然, 它们还需要以 root 身份运行才行)。 bpf 使用 DHCP 所必须的, 但如果您对安全非常敏感, 则很可能会有理由不把 bpf 加入到您的内核配置中, 直到您真的需要使用 DHCP 为止。

  • 编辑您的 /etc/rc.conf 并加入下面的设置:

    ifconfig_fxp0="DHCP"

    注意:

    务必将 fxp0 替换为您希望自动配置的网络接口的名字, 您可以在 第 12.8 节 “设置网卡” 找到更进一步的介绍。

    如果您希望使用另一位置的 dhclient, 或者需要给 dhclient 传递其他参数, 还可以添加下面的配置 (根据需要进行修改):

    dhclient_program="/sbin/dhclient"
    dhclient_flags=""

DHCP 服务器, dhcpd, 是作为 net/isc-dhcp31-server port 的一部分提供的。 这个 port 包括了 ISC DHCP 服务器及其文档。

30.5.5. 文件

  • /etc/dhclient.conf

    dhclient 需要一个配置文件, /etc/dhclient.conf。 一般说来, 这个文件中只包括注释, 而默认值基本上都是合理的。 这个配置文件在 dhclient.conf(5) 联机手册中进行了进一步的阐述。

  • /sbin/dhclient

    dhclient 是一个静态连编的, 它被安装到 /sbin 中。 dhclient(8) 联机手册给出了关于 dhclient 的进一步细节。

  • /sbin/dhclient-script

    dhclient-script 是一个 FreeBSD 专用的 DHCP 客户端配置脚本。 在 dhclient-script(8) 中对它进行了描述, 但一般来说, 用户不需要对其进行任何修改, 就能够让一切正常运转了。

  • /var/db/dhclient.leases

    DHCP 客户程序会维护一个数据库来保存有效的 lease, 它们被以日志的形式保存到这个文件中。 dhclient.leases(5) 给出了更为细致的介绍。

30.5.6. 进阶读物

DHCP 协议的完整描述是 RFC 2131。 关于它的其他信息资源的站点 http://www.dhcp.org/ 也提供了详尽的资料。

30.5.7. 安装和配置 DHCP 服务器

30.5.7.1. 这一章包含哪些内容

这一章提供了关于如何在 FreeBSD 系统上使用 ISC (Internet 系统协会) 的 DHCP 实现套件来架设 DHCP 服务器的信息。

DHCP 套件中的服务器部分并没有作为 FreeBSD 的一部分来提供, 因此您需要安装 net/isc-dhcp31-server port 才能提供这个服务。 请参见 第 5 章 安装应用程序: Packages 和 Ports 以了解关于如何使用 Ports Collection 的进一步详情。

30.5.7.2. 安装 DHCP 服务器

为了在您的 FreeBSD 系统上进行配置以便作为 DHCP 服务器来使用, 需要把 bpf(4) 设备编译进内核。 要完成这项工作, 需要将 device bpf 加入到您的内核配置文件中, 并重新联编内核。 要得到关于如何联编内核的进一步信息, 请参见 第 9 章 配置FreeBSD的内核

bpf 设备是 FreeBSD 所附带的 GENERIC 内核中已经联入的组件, 因此您并不需要为了让 DHCP 正常工作而特别地定制内核。

注意:

如果您有较强的安全意识, 应该注意 bpf 同时也是让听包程序能够正确工作的设备 (尽管这类程序仍然需要以特权用户身份运行)。 bpf 使用 DHCP 所必需的, 但如果您对安全非常敏感, 您可能会不希望将 bpf 放进内核, 直到您真的认为 DHCP 是必需的为止。

接下来要做的是编辑示范的 dhcpd.conf, 它由 net/isc-dhcp31-server port 安装。 默认情况下, 它的名字应该是 /usr/local/etc/dhcpd.conf.sample, 在开始修改之前, 您需要把它复制为 /usr/local/etc/dhcpd.conf

30.5.7.3. 配置 DHCP 服务器

dhcpd.conf 包含了一系列关于子网和主机的定义, 下面的例子可以帮助您理解它:

option domain-name "example.com";1
option domain-name-servers 192.168.4.100;2
option subnet-mask 255.255.255.0;3

default-lease-time 3600;4
max-lease-time 86400;5
ddns-update-style none;6

subnet 192.168.4.0 netmask 255.255.255.0 {
  range 192.168.4.129 192.168.4.254;7
  option routers 192.168.4.1;8
}

host mailhost {
  hardware ethernet 02:03:04:05:06:07;9
  fixed-address mailhost.example.com;10
}

1

这个选项指定了提供给客户机作为默认搜索域的域名。 请参考 resolv.conf(5) 以了解关于这一概念的详情。

2

这个选项用于指定一组客户机使用的 DNS 服务器, 它们之间以逗号分隔。

3

提供给客户机的子网掩码。

4

客户机可以请求租约的有效期, 而如果没有, 则服务器将指定一个租约有效期, 也就是这个值 (单位是秒)。

5

这是服务器允许租出地址的最大时长。 如果客户机请求了更长的租期, 则它将得到一个地址, 但其租期仅限于 max-lease-time 秒。

6

这个选项用于指定 DHCP 服务器在一个地址被接受或释放时是否应对应尝试更新 DNS。 在 ISC 实现中, 这一选项是 必须指定的

7

指定地址池中可以用来分配给客户机的 IP 地址范围。 在这个范围之间, 以及其边界的 IP 地址将分配给客户机。

8

定义客户机的默认网关。

9

主机的硬件 MAC 地址 (这样 DHCP 服务器就能够在接到请求时知道请求的主机身份)。

10

指定总是得到同一 IP 地址的主机。 请注意在此处使用主机名是对的, 因为 DHCP 服务器会在返回租借地址信息之前自行解析主机名。

在配制好 dhcpd.conf 之后, 应在 /etc/rc.conf 中启用 DHCP 服务器, 也就是增加:

dhcpd_enable="YES"
dhcpd_ifaces="dc0"

此处的 dc0 接口名应改为 DHCP 服务器需要监听 DHCP 客户端请求的接口 (如果有多个, 则用空格分开)。

接下来, 可以用下面的命令来启动服务:

# /usr/local/etc/rc.d/isc-dhcpd start

如果未来您需要修改服务器的配置, 请务必牢记发送 SIGHUP 信号给 dhcpd不会 导致配置文件的重新加载, 而这在其他服务程序中则是比较普遍的约定。 您需要发送 SIGTERM 信号来停止进程, 然后使用上面的命令来重新启动它。

30.5.7.4. 文件

  • /usr/local/sbin/dhcpd

    dhcpd 是静态连接的, 并安装到 /usr/local/sbin 中。 随 port 安装的 dhcpd(8) 联机手册提供了关于 dhcpd 更为详尽的信息。

  • /usr/local/etc/dhcpd.conf

    dhcpd 需要配置文件, 即 /usr/local/etc/dhcpd.conf 才能够向客户机提供服务。 这个文件需要包括应提供给客户机的所有信息, 以及关于服务器运行的其他信息。 此配置文件的详细描述可以在随 port 安装的 dhcpd.conf(5) 联机手册上找到。

  • /var/db/dhcpd.leases

    DHCP 服务器会维护一个它签发的租用地址数据库, 并保存在这个文件中, 这个文件是以日志的形式保存的。 随 port 安装的 dhcpd.leases(5) 联机手册提供了更详细的描述。

  • /usr/local/sbin/dhcrelay

    dhcrelay 在更为复杂的环境中, 可以用来支持使用 DHCP 服务器转发请求给另一个独立网络上的 DHCP 服务器。 如果您需要这个功能, 需要安装 net/isc-dhcp31-relay port。 dhcrelay(8) 联机手册提供了更为详尽的介绍。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.