23.3. DHCP 服务器 dhcpd

任何 DHCP 系统的核心都是动态主机配置协议守护程序。根据配置文件 /etc/dhcpd.conf 中定义的设置,此服务器租出地址并监视它们的使用。通过更改此文件中的参数和值,系统管理员可以在许多方面影响程序的行为。让我们看一下例 23.1 “配置文件 /etc/dhcpd.conf”中的基本示例 /etc/dhcpd.conf 文件。

例 23.1. 配置文件 /etc/dhcpd.conf

default-lease-time 600;         # 10 minutes
max-lease-time 7200;            # 2  hours

option domain-name "cosmos.all";
option domain-name-servers 192.168.1.1, 192.168.1.2;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;

subnet 192.168.1.0 netmask 255.255.255.0
 {
  range 192.168.1.10 192.168.1.20;
  range 192.168.1.100 192.168.1.200;
 }

这个简单的配置文件足以使 DHCP 服务器在网络中指派 IP 地址。确保在每行末尾插入一个分号,否则将不能启动 dhcpd。

示例文件可以分为三部分。第一部分定义了将 IP 地址租出给请求它的客户机的默认秒数 (default-lease-time),超过这个时间就应申请续期。此部分还包含一个最大期限语句,在此期限内计算机可以保留 DHCP 服务器指派的 IP 地址而无需申请续期 (max-lease-time)。

第二部分在全局级别上定义了一些基本网络参数:

文件的最后一部分用于定义网络,其中包含子网掩码。最后指定一个地址范围,DHCP 守护程序将使用此范围来向相关的客户机指派 IP 地址。在例 23.1 “配置文件 /etc/dhcpd.conf”中,可以为客户机指派 192.168.1.10192.168.1.20 之间以及 192.168.1.100192.168.1.200 之间的任何地址。

在编辑这些行后,便可以使用命令 rcdhcpd start 来激活 DHCP 守护程序。随后将可以立即使用它。使用命令 rcdhcpd check-syntax 来执行简要的语法检查。如果配置出现意外问题(服务器由于错误而中止或在启动时不返回 done),通过在主系统日志 /var/log/messages 或控制台 10 (Ctrl-Alt-F10) 上查找相关信息,就能够发现问题出在哪里。

在默认 SUSE Linux 系统上,由于安全原因,将在 chroot 环境中启动 DHCP 守护程序。必须将配置文件复制到 chroot 环境,以便守护程序能够找到它们。通常情况下无需担心这一点,因为命令 rcdhcpd start 会自动复制这些文件。

23.3.1. 具有固定 IP 地址的客户机

DHCP 可用来向特定客户机指定预定义的静态地址。显式指派的地址始终优先于来自地址池的动态地址。静态地址永远不会像动态地址那样过期。例如,对于动态地址而言,如果没有足够的地址可用,服务器需要在客户机之间重新分发这些地址。

要标识配置有静态地址的客户机,dhcpd 将使用硬件地址,这是一个全局唯一的固定数字代码,其中包含 6 个八进制数对,用于标识所有网络设备(例如 00:00:45:12:EE:F4)。如果将相应的各行(如例 23.2 “配置文件的添加项”中的行)添加到例 23.1 “配置文件 /etc/dhcpd.conf”的配置文件,DHCP 守护程序会将相同的一组数据指派到相应的客户机。

例 23.2. 配置文件的添加项

host earth {
hardware ethernet 00:00:45:12:EE:F4;
fixed-address 192.168.1.21;
}

在第 1 行输入相应客户机的名称(host hostname,在这里是 earth),在第 2 行输入 MAC 地址。在 Linux 主机上,使用后面带有网络设备(例如 eth0)的命令 ip link show 来查找 MAC 地址。输出应包含如下内容:

link/ether 00:00:45:12:EE:F4

在上面的示例中,网卡的 MAC 地址为 00:00:45:12:EE:F4,为具有此网卡的客户机自动指派 IP 地址 192.168.1.21 和主机名 earth。虽然也支持在 IBM 系统上常见的 token-ring,但在几乎所有情况下,要输入的硬件类型都是 ethernet

23.3.2. SUSE Linux 版本

为了提高安全性,ISC 的 DHCP 服务器的 SUSE 版本附带有 Ari Edelkind 编写的非根 /chroot 增补程序。这使得 dhcpd 能够使用用户 ID nobody 来运行,并可以在 chroot 环境 (/var/lib/dhcp) 中运行。要实现这一点,必须使配置文件 dhcpd.conf 位于 /var/lib/dhcp/etc 中。init 脚本在启动时会自动将文件复制到此目录。

通过文件 /etc/sysconfig/dhcpd 中的项来控制与此特性相关的服务器的行为。如果不希望在 chroot 环境中运行 dhcpd,请将 /etc/sysconfig/dhcpd 中的变量 DHCPD_RUN_CHROOTED 设置为“no”。

为了使 dhcpd 甚至能够解析来自 chroot 环境的主机名,还必须复制其它一些配置文件:

  • /etc/localtime

  • /etc/host.conf

  • /etc/hosts

  • /etc/resolv.conf

在启动 init 脚本时,将把这些文件复制到 /var/lib/dhcp/etc/。如果通过 /etc/ppp/ip-up 这样的脚本动态修改这些文件,则无论这些文件需要任何更改,都必须同时考虑这些副本。但是,如果配置文件仅指定 IP 地址(而不是主机名),就不需要担心这一点。

如果您的配置中包含应复制到 chroot 环境中的其它文件,请在文件 etc/sysconfig/dhcpd 中的变量 DHCPD_CONF_INCLUDE_FILES 下设置它们。为了确保 DHCP 日志记录功能即使在 syslog-ng 守护程序重启动后也能保持运行,文件 /etc/sysconfig/syslog 中必须有附加条目 SYSLOGD_ADDITIONAL_SOCKET_DHCP