Show Table of Contents
10.2. 配置 DHCP 服务器
dhcp 软件包包含互联网系统联盟(ISC)
DHCP
服务器。请作为 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
,如下所示。
10.2.1. 配置文件
配置
DHCP
服务器的第一步是创建保存客户端网络信息的配置文件。使用这个文件向客户端系统声明选项。
该配置文件可包含附加标签或空白行以方便格式化。关键词区分大小写,同时将以井号(
#
)开始的行视为注释。
配置文件中有两类语句:
- 参数 -- 说明如何执行任务,是否执行任务或向该客户端发送什么网络配置选项。
- 声明 -- 描述网络拓扑,描述客户端,提供客户端 IP 地址,或在一组声明中应用一组参数。
以关键字选项开始的参数请参考 选项。这些选项控制
DHCP
选项,必须为这些参数配置参数值,或控制 DHCP
服务器的行为。
大括号(
{ }
)前面一部分的参数(包括选项)是全局参数。全局参数适用于其后的所有内容。
重要
如果更改配置文件,更改的部分要在使用
systemctl restart dhcpd
重启 DHCP
守护进程后方可生效。
注意
与其每次更改
DHCP
配置文件并重启该服务,不如使用 omshell
命令提供一个互动的方法连接、查询并更改 DHCP
服务器的配置。使用 omshell
可在服务器运行过程中进行所有更改。有关 omshell
的详情请查看 omshell
man page。
在 例 10.1 “子网声明” 中,可在下述
host
语句中使用以下routers
、subnet-mask
、domain-search
、domain-name-servers
和 time-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.10
和 192.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.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_number 是
DHCP
版本号。
有关选项语句的完整列表及其功能,请查看
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
文件。例如:
~]#编辑 [Service] 部分中的内容:cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
~]#vi /etc/systemd/system/dhcpd.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
-- 启动该守护进程时不要输出完整版权信息。