10.2. 配置 DHCP 服务器

dhcp 软件包包含互联网系统联盟ISCDHCP 服务器。请作为 root 安装该软件包:
~]# yum install dhcp
安装 dhcp 软件包可生成文件 /etc/dhcp/dhcpd.conf,该文件基本是一个空白配置文件。请作为 root 运行以下命令:
~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
可在 /usr/share/doc/dhcp-version;/dhcpd.conf.example 找到示例配置文件。使用这个文件可帮助您配置 /etc/dhcp/dhcpd.conf,如下所示。
DHCP 还使用 /var/lib/dhcpd/dhcpd.leases 文件保存客户端租用数据库。详情请查看 第 10.2.2 节 “租期数据库”

10.2.1. 配置文件

配置 DHCP 服务器的第一步是创建保存客户端网络信息的配置文件。使用这个文件向客户端系统声明选项。
该配置文件可包含附加标签或空白行以方便格式化。关键词区分大小写,同时将以井号(#)开始的行视为注释。
配置文件中有两类语句:
  • 参数 -- 说明如何执行任务,是否执行任务或向该客户端发送什么网络配置选项。
  • 声明 -- 描述网络拓扑,描述客户端,提供客户端 IP 地址,或在一组声明中应用一组参数。
以关键字选项开始的参数请参考 选项。这些选项控制 DHCP 选项,必须为这些参数配置参数值,或控制 DHCP 服务器的行为。
大括号({ })前面一部分的参数(包括选项)是全局参数。全局参数适用于其后的所有内容。

重要

如果更改配置文件,更改的部分要在使用 systemctl restart dhcpd 重启 DHCP 守护进程后方可生效。

注意

与其每次更改 DHCP 配置文件并重启该服务,不如使用 omshell 命令提供一个互动的方法连接、查询并更改 DHCP 服务器的配置。使用 omshell 可在服务器运行过程中进行所有更改。有关 omshell 的详情请查看 omshell man page。
例 10.1 “子网声明” 中,可在下述 host 语句中使用以下routerssubnet-maskdomain-searchdomain-name-serverstime-offset 选项。
对所有提供的子网及连接到 DHCP 服务器的所有子网,必须有一个 subnet 声明,该声明告知 DHCP 守护进程如何识别该子网中的地址。即使没有动态为那个子网分配任何地址,每个子网也都需要有一个 subnet 声明。
在这个示例中,子网中的每个 DHCP 客户端都有全局选项及一个声明的 range。会为这些客户端分配一个 range 范围内的 IP 地址。

例 10.1. 子网声明

subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers                  192.168.1.254;
        option subnet-mask              255.255.255.0;
        option domain-search              "example.com";
        option domain-name-servers       192.168.1.1;
        option time-offset              -18000;     # Eastern Standard Time
	range 192.168.1.10 192.168.1.100;
}
要配置一个为子网中的某个系统动态租用 IP 地址的 DHCP 服务器,请修改 例 10.2 “Range 参数” 中的示例值。它会说明客户端的默认租用时间、最长租用时间及网络配置值。这个示例为客户的系统分配 range 范围内的 IP 地址 192.168.1.10192.168.1.100

例 10.2. Range 参数

default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-search "example.com";
subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.100;
}
要根据网卡的 MAC 地址为客户端分配 IP 地址,请在 host 声明中使用 hardware ethernet 参数。如 例 10.3 “使用 DHCP 的静态 IP 地址” 所示,host apex 声明指定使用 MAC 地址 00:A0:78:8E:9E:AA 的网卡永远接收 IP 地址 192.168.1.4
注:还可以使用自选参数 host-name 为客户端分配主机名。

例 10.3. 使用 DHCP 的静态 IP 地址

host apex {
   option host-name "apex.example.com";
   hardware ethernet 00:A0:78:8E:9E:AA;
   fixed-address 192.168.1.4;
}
Red Hat Enterprise Linux 7 支持为 InfiniBank IPoIB 接口分配静态 IP 地址。但因为这些接口没有正常的硬件以太网地址,因此必须使用不同的方法为 IPoIB 接口指定唯一识别符。该标准是使用选项 dhcp-client-identifier= 结构指定 IPoIB 接口的 dhcp-client-identifier 字段。DHCP 服务器主机架构最多支持一个硬件以太网,在每个主机段中支持一个 dhcp-client-identifier 条目。但可能有多个固定地址条目,同时 DHCP 服务器会在接收 DHCP 请求后自动使用适用于该网络的地址响应。

例 10.4. 使用 DHCP 在多个接口中使用静态 IP 地址

在使用复杂配置的机器中,例如:有两个 InfiniBand 接口,且每个物理接口中都有 P_Key 接口,外加一个以太网连接,则可在配置时使用以下静态 IP 架构:
Host apex.0 {
    option host-name “apex.example.com”;
    hardware ethernet 00:A0:78:8E:9E:AA;
    option dhcp-client-identifier=ff:00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:03:00:31:7b:11;
    fixed-address 172.31.0.50,172.31.2.50,172.31.1.50,172.31.3.50;
}

host apex.1 {
    option host-name “apex.example.com”;
    hardware ethernet 00:A0:78:8E:9E:AB;
    option dhcp-client-identifier=ff:00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:03:00:31:7b:12;
    fixed-address 172.31.0.50,172.31.2.50,172.31.1.50,172.31.3.50;
}
要为您的设备找到正确的 dhcp-client-identifier,通常可使用前缀 ff:00:00:00:00:00:02:00:00:02:c9:00,然后在最后添加 8 字节 IPoIB 接口(恰好是 IPoIB 接口所在 InfiniBand 端口的 8 字节 GUID)。在有些旧的控制器中,这个前缀是错误的。如果出现那种情况,建议您在 DHCP 服务器中使用 tcpdump 捕获传入 IPoIB DHCP 请求,并从中获取正确的 dhcp-client-identifier。例如:
]$ tcpdump -vv -i mlx4_ib0
tcpdump: listening on mlx4_ib0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
23:42:44.131447 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request, length 300, htype 32, hlen 0, xid 0x975cb024, Flags [Broadcast] (0x8000)
          Vendor-rfc1048 Extensions
            Magic Cookie 0x63825363
            DHCP-Message Option 53, length 1: Discover
            Hostname Option 12, length 10: "rdma-qe-03"
            Parameter-Request Option 55, length 18:
              Subnet-Mask, BR, Time-Zone, Classless-Static-Route
              Domain-Name, Domain-Name-Server, Hostname, YD
              YS, NTP, MTU, Option 119
              Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Static-Route
              Option 252, NTP
            Client-ID Option 61, length 20: hardware-type 255, 00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:02:00:21:ac:c1
上述转储显示了 Client-ID 字段。hardware-type 255 与 ID 起始的 ff: 对应,然后将 ID 的剩余部分括起,因为要在 DHCP 配置文件中有这些内容。
例 10.5 “Shared-network 声明” 所示,应在 shared-network 声明中宣布共享同一物理网络的所有子网。shared-network 中的参数(未包含在子网声明中的除外)都应被视为全局参数。为 shared-network 分配的名称必须可描述该网络,比如使用 test-lab 描述所有 test lab 环境中的所有子网。

例 10.5. Shared-network 声明

shared-network name {
    option domain-search            "test.redhat.com";
    option domain-name-servers      ns1.redhat.com, ns2.redhat.com;
    option routers                  192.168.0.254;
    #more parameters for EXAMPLE shared-network
    subnet 192.168.1.0 netmask 255.255.252.0 {
        #parameters for subnet
        range 192.168.1.1 192.168.1.254;
    }
    subnet 192.168.2.0 netmask 255.255.252.0 {
        #parameters for subnet
        range 192.168.2.1 192.168.2.254;
    }
}
例 10.6 “组声明” 所示,group 声明是用来在一组声明中应用全局参数。例如:共享网络、子网及主机都可分组。

例 10.6. 组声明

group {
   option routers                  192.168.1.254;
   option subnet-mask              255.255.255.0;
   option domain-search              "example.com";
   option domain-name-servers       192.168.1.1;
   option time-offset              -18000;     # Eastern Standard Time
   host apex {
      option host-name "apex.example.com";
      hardware ethernet 00:A0:78:8E:9E:AA;
      fixed-address 192.168.1.4;
   }
   host raleigh {
      option host-name "raleigh.example.com";
      hardware ethernet 00:A1:DD:74:C3:F2;
      fixed-address 192.168.1.6;
   }
}

注意

可参照提供的示例配置文件,在其中添加自定义配置选项。请作为 root 使用以下命令将这个文件复制到正确位置:
~]# cp /usr/share/doc/dhcp-version_number/dhcpd.conf.example /etc/dhcp/dhcpd.conf
其中 version_numberDHCP 版本号。
有关选项语句的完整列表及其功能,请查看 dhcp-options(5) man page。

10.2.2. 租期数据库

DHCP 服务器中,使用文件 /var/lib/dhcpd/dhcpd.leases 保存 DHCP 客户端租用数据库。请勿更改这个文件。该租用数据库会自动保存每个最近分配给 IP 地址的 DHCP 租用信息。该信息包括租期、分配 IP 地址的对象、租用起始及终止日期、以及用来检索租用信息的网卡 MAC 地址。
租期数据库中所用的时间是格林威治标准时间(GMT),不是本地时间。
会经常重新生成这个租期数据库以免其过于庞大。首先,所有已知租期都保存在临时租期数据库中。将 dhcpd.leases 文件重命名为 dhcpd.leases~,并将临时租期数据库写入 dhcpd.leases
在将租用数据库重新命名为备份文件后到写入新文件前,DHCP 守护进程可被杀死,或者系统可能会崩溃。如果出现这种情况,dhcpd.leases 文件就不存在,但要求启动该服务。请勿创建新的租用文件。如果您这样做,就会丢失所有旧的租用信息,从而造成巨大影响。正确的解决方法是将 dhcpd.leases~ 备份文件重命名为 dhcpd.leases,然后重启该守护进程。

10.2.3. 启动和停止服务器

重要

首次启动 DHCP 服务器时,如果没有 dhcpd.leases 文件就会失败。如果没有该文件,可使用命令 touch /var/lib/dhcpd/dhcpd.leases 生成该文件。如果同一服务器还作为 DNS 服务器运行 BIND,那么就不需要执行这一步操作,因为 named 服务会自动检查 dhcpd.leases 文件。
请勿在之前运行的系统中创建新的租用文件。如果这样做,就会丢失所有旧的租用信息,造成很多问题。正确的解决方法是将 dhcpd.leases~ 备份文件重命名为 dhcpd.leases,然后重启该守护进程。
请使用以下命令启动 DHCP 服务:
systemctl start dhcpd.service
请使用以下命令停止 DHCP 服务器:
systemctl stop dhcpd.service
默认情况下,DHCP 服务不在引导时启动。有关如何将该守护进程配置为在引导时自动启动的信息,请查看 《Red Hat Enterprise Linux 7 系统管理员指南》
如果在该系统中添加一个以上网络接口,但 DHCP 只应侦听其中一个接口的 DHCP 请求,请将 DHCP 配置为只侦听那个设备。DHCP 守护进程将只侦听可在 /etc/dhcp/dhcpd.conf 文件的子网声明中找到的接口。
这对使用两个网卡的防火墙机器有帮助。可将一个网卡配置为 DHCP 客户端,检索互联网 IP 地址。将另一个网卡作为 DHCP 服务器用于防火墙保护下的内部网络。只指定连接到内部网络的网卡,让系统更安全,因为用户无法通过互联网连接到该守护进程。
要指定命令行选项,请作为 root 用户复制、然后编辑 dhcpd.service 文件。例如:
~]# cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
~]# vi /etc/systemd/system/dhcpd.service
编辑 [Service] 部分中的内容:
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid your_interface_name(s)
,然后作为 root 用户重启该服务:
~]# systemctl --system daemon-reload
~]# systemctl restart dhcpd
可将命令行选项附加到 /etc/systemd/system/dhcpd.service 文件 [Service] 部分的 ExecStart=/usr/sbin/dhcpd 命令中。这些选项包括:
  • -p portnum — 指定 UDP 端口号,dhcpd 应侦听该端口。默认端口为 67。DHCP 服务器将响应通过大于指定 UDP 端口号的端口传送到 DHCP 客户端。例如:如果默认端口为 67,则该服务器应在端口 67 侦听请求,并通过端口 68 为客户端提供响应。如果在此指定端口,同时使用 DHCP 中继代理,则必须为 DHCP 中继代理指定应侦听同一端口。详情请查看 第 10.3 节 “DHCP 中继代理程序”
  • -f -- 将该守护进程作为前端进程运行。这大多数是用于 debug。
  • -d — 在 DHCP 服务器守护进程日志中记录标准错误描述符。这大多用于 debug。如果未指定,则会在 /var/log/messages 中记录日志。
  • -cf filename — 指定配置文件位置。默认位置为 /etc/dhcp/dhcpd.conf
  • -lf filename — 指定租用数据库文件位置。如果已有租用数据库文件,关键是每次 DHCP 服务启动时使用同一文件。强烈建议只在非产品机器中进行 debug 时使用这个选项。默认位置为 /var/lib/dhcpd/dhcpd.leases
  • -q -- 启动该守护进程时不要输出完整版权信息。