**
redhat 7 中DHCP服务器搭建与应用
DHCP涉及的常见术语
作用域:一个完整的IP地址段,DHCP根据作用域来管理网络的分布、IP地址的分配及其他配置参数。
超级作用域:用于管理处于同一个物理网络中的多个逻辑子网段,它包含了可以统一管理的作用域列表。
排除范围:把作用域中的某些IP地址排除,确保这些IP地址不会分配给DHCP客户端。
地址池:在定义了DHCP的作用域并应用了排除范围后,剩余的用来动态分配给客户端的IP地址范围。
租约:DHCP客户端能够使用动态分配的IP地址的时间。
预约:保证网络中的特定设备总是获取到相同的IP地址。
dhcp的服务程序的配置文件中只有3行注释语句,这意味着我们需要自行编写这个文件。
不过在/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example有一个模板配置文件,我们可以将文件中的内容复制到配置文件中。如果不知道怎么编写,可以看一下下图参考示例文件,其组成架构如图所示。
dhcpd服务程序配置文件的架构
一个标准的配置文件应该包括全局配置参数、子网网段声明、地址配置选项以及地址配置参数。其中,全局配置参数用于定义dhcpd服务程序的整体运行参数;子网网段声明用于配置整个子网段的地址属性。
考虑到dhcpd服务程序配置文件的可用参数比较多,这里挑选了最常用的参数(见表),并逐一进行了简单介绍,以便为接下来的实验打好基础。
| 参数 | 作用 |
|---|---|
| ddns-update-style 类型 | 定义DNS服务动态更新的类型 |
| ddns-update-style 类型 | 类型包括:none(不支持动态更新)、 |
| ddns-update-style 类型 | interim(互动更新模式)与ad-hoc(特殊更新模式) |
| allow/ignore client-updates | 允许/忽略客户端更新DNS记录 |
| default-lease-time 21600 | 默认超时时间 |
| max-lease-time 43200 | 最大超时时间 |
| option domain-name-servers 8.8.8.8 | 定义DNS服务器地址 |
| option domain-name “domain.org” | 定义DNS域名 |
| range | 定义用于分配的IP地址池 |
| option subnet-mask | 定义客户端的子网掩码 |
| option routers | 定义客户端的网关地址 |
| broadcast-address 广播地址 | 定义客户端的广播地址 |
| ntp-server IP地址 | 定义客户端的网络时间服务器(NTP) |
| nis-servers IP地址 | 定义客户端的NIS域服务器的地址 |
| hardware 硬件类型 MAC地址 | 指定网卡接口的类型与MAC地址 |
| server-name 主机名 | 向DHCP客户端通知DHCP服务器的主机名 |
| fixed-address IP地址 | 将某个固定的IP地址分配给指定主机 |
| time-offset 偏移差 | 指定客户端与格林尼治时间的偏移差 |
一、dhcp服务器配置实验步骤
实验准备
软件:VMware Workstation Pro
虚拟机:Red Hat Enterprise Linux 7 64 位 多台
DHCP 配置、DHCP中继代理、DHCP多作用域配置
DHCP服务器:192.168.1.10/24
由于VMware Workstation虚拟机软件自带DHCP服务,为了避免与自己配置的dhcpd服务程序产生冲突,应该先将虚拟机软件自带的DHCP功能关闭,但是一定要注意,DHCP客户端与服务器需要处于同一种网络模式—仅主机模式(Hostonly),否则就会产生物理隔离,从而无法获取IP地址。
在确认DHCP服务器的IP地址等网络信息配置妥当后,就可以配置dhcpd服务程序了。请注意,在配置dhcpd服务程序时,配置文件中的每行参数后面都需要以分号(;)结尾,这是规定。另外,dhcpd服务程序配置文件内的参数都十分重要,因此在表中罗列出了每一行参数,并对其用途进行了简单介绍。
[root@localhost \]# yum install -y dhcp \\安装DHCP软件包
[root@localhost \]# rpm -qa | grep dhcp \\查询安装结果
[root@localhost \]# systemctl start dhcpd \\启动DHCP服务
[root@localhost \]# systemctl restart dhcpd \\重启DHCP服务
[root@localhost \]# systemctl status dhcpd \\查看DHCP服务运行状态
[root@localhost \]# systemctl enable dhcpd \\设置DHCP服务开机自启
[root@localhost \]# systemctl stop dhcpd \\停止DHCP服务
[root@localhost \]# systemctl list-unit-files | grep dhcp \\查看开机自启项
[root@localhost \]# cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example >> /etc/dhcp/dhcpd.conf
[root@localhost /]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option domain-name-servers 192.168.1.2;
option domain-name "redhat.com";
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 602;
max-lease-time 7200;
}
| 参数 | 作用 |
|---|---|
| ddns-update-style none; | 设置DNS服务不自动进行动态更新 |
| ignore client-updates; | 忽略客户端更新DNS记录 |
| subnet 192.168.1.0 netmask 255.255.255.0 { | 作用域为192.168.1.0/24网段 |
| range 192.168.1.100 192.168.10.200; | IP地址池为192.168.10.100-200(约100个IP地址) |
| option subnet-mask 255.255.255.0; | 定义客户端默认的子网掩码 |
| option routers 192.168.1.1; | 定义客户端的网关地址 |
| option domain-name “redhat”; | 定义默认的搜索域 |
| option domain-name-servers 192.168.1.1; | 定义客户端的DNS地址 |
| default-lease-time 602; | 定义默认租约时间(单位:秒) |
| max-lease-time 7200; | 定义最大预约时间(单位:秒) |
| } | 结束符 |
[root@localhost /]# dhcpd \\检验配置文件
[root@localhost \]# systemctl restart dhcpd \\重启DHCP服务
把dhcpd服务程序配置妥当之后就可以开启客户端来检验IP分配效果了。
[root@localhost Desktop]# nmcli device connect eno16777736
Device 'eno16777736' successfully activated with '08f0a4ec-6c40-4963-b21a-143897fc020a'.
[root@localhost Desktop]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe4f:bc07 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4f:bc:07 txqueuelen 1000 (Ethernet)
RX packets 368 bytes 29647 (28.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 90 bytes 13904 (13.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 6 bytes 592 (592.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 592 (592.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果是在生产环境中配置dhcpd服务,则有可能会因为DHCP没有被防火墙放行而导致失败,此时执行下面的命令即可:
[root@linuxprobe ~]# firewall-cmd --zone=public --permanent --add-service=dhcp
success
[root@linuxprobe ~]# firewall-cmd --reload
success
二、绑定IP地址
在DHCP协议中有个术语是“预约”,它用来确保局域网中特定的设备总是获取到固定的IP地址。换句话说,就是dhcpd服务程序会把某个IP地址私藏下来,只将其用于相匹配的特定设备。
要想把某个IP地址与某台主机进行绑定,就需要用到这台主机的MAC地址。
[root@localhost /]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.30 192.168.1.254;
option domain-name-servers 192.168.1.2;
option domain-name "redhat.com";
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 602;
max-lease-time 7200;
host xiaozhang {
hardware ethernet 00:0c:29:4f:bc:07;
fixed-address 192.168.1.88;
}
host mishu {
hardware ethernet 00:0c:29:b7:5e:33;
fixed-address 192.168.1.99;
}
}
[root@localhost /]# dhcpd \\检验配置文件
[root@localhost \]# systemctl restart dhcpd \\重启DHCP服务
三、 DHCP配置多作用域
单一的作用域,大部分时间能够满足网络的需求,但随着网络规模的扩大,如何增加可用的IP地址?
那么需要我们通过设置多个作用域来实现IP地址增容了
有两种方法实现:一是采用双网卡,二是利用DHCP超级作用域功能;
3.1双网卡实现两个作用域
(增加了网络拓扑的复杂性,加大了维护难度)
先看图例:
在VMware Workstation Pro菜单虚拟网络编辑器中增加新的虚拟网络VMnet2,类型为仅主机模式。
在DHCP服务器上增加一张新网卡,设置网络连接类型为虚拟网络VMnet2.
1、配置IP地址
为每块网卡配置独立的IP地址。IP地址配置的网段要与DHCP服务器发布的作用域一一对应,如下所示。
[root@localhost /]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe2a:36a7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2a:36:a7 txqueuelen 1000 (Ethernet)
RX packets 625 bytes 73801 (72.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1094 bytes 98614 (96.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno33554992: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fe2a:36b1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2a:36:b1 txqueuelen 1000 (Ethernet)
RX packets 213 bytes 31517 (30.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 63 bytes 8189 (7.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 641 bytes 64246 (62.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 641 bytes 64246 (62.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、配置dhcpd.conf
搭建DHCP服务器网络环境后,编辑配置文件,即可完成多作用域的设置,如下所示。
[root@localhost /]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.254;
option domain-name-servers 192.168.1.2;
option domain-name "redhat.com";
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 602;
max-lease-time 7200;
}
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.30 192.168.0.254;
option domain-name-servers 192.168.0.2;
option domain-name "redhat.com";
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
default-lease-time 602;
max-lease-time 7200;
}
[root@localhost /]# dhcpd \\检验配置文件
[root@localhost \]# systemctl restart dhcpd \\重启DHCP服务
开启两个DHCP客户端,测试。
3.2 超级作用域

1 确定DHCP服务器的IP
[root@desktop ~] # ifconfig eno16777736 192.168.1.3 netmask 255.255.255.0
2 配置dhcpd.conf文件
[root@localhost /]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
shared-network company {
option domain-name-servers 192.168.1.3;
option domain-name "company.com";
default-lease-time 602;
max-lease-time 7200;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
range 192.168.1.10 192.168.1.10;
}
subnet 192.168.3.0 netmask 255.255.255.0 {
option routers 192.168.3.1;
range 192.168.3.11 192.168.3.11;
}
}
因为我们需要测试IP分配,所以最好 把一个网段的IP地址池的范围设置为一个。在内核中开启路由转发功能
永久开启,(写入内核)
[root@localhost /]# vim /etc/sysctl.conf
加入此行
net.ipv4.ip_forward = 1
[root@localhost /]# sysctl -p # 加载一下,使之生效
[root@localhost /]# dhcpd \\检验配置文件
[root@localhost /]# systemctl restart dhcpd \\重启DHCP服务
注意:如果之前做过其它的DHCP实验,建议在DHCP客户端上删除原网卡,新建一张新网卡获取新的MAC地址,再进行测试,防止之前实验对新实验造成影响。
四、配置DHCP中继代理
当网络中存在多个子网的时候,通过搭建一台或者几台DHCP 服务器,就能够承担整个网络的IP地址分配工作,完全没有必要为每个子网建立一台DHCP 服务器。由于客户计算机只能通过广播发送DHCP请求,而这些请求一般不能跨越路由器,因此需采用特殊的设置使客户机获得其他子网的 TCP/IP信息。
DHCP客户机能够通过 DHCP中继代理计算机转发 DHCP的请求。DHCP 中继代理计算机能听取DHCP广播,由于它了解DHCP服务器的IP地址,因此通过正常的IP数据包可将原广播包转发到服务器中,然后再将服务器的回应信息回复给客户机。这样,就好像子网中存在一个 DHCP服务器一样。
实例1 某学院内部有两个子网,IP地址网段分别为192.168.1.0/24 以及192.168.3.0/24。现需要使用一台 DHCP服务器,为这两个子网客户机分配IP地址。其学院网络拓扑结构如图2.13所示。
1、配置DHCP服务器
配置DHCP服务器,IP地址192.168.3.10及网关192.168.3.2(指向中继外网卡),设置网络连接为VMnet1,并在VMware虚拟网络编辑器中设置VMnet1,及VMnet8的子网地址。

[root@localhost \]# yum install -y dhcp \\安装DHCP软件包
[root@localhost \]# rpm -qa | grep dhcp \\查询安装结果
[root@localhost /]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore-client-updates;
shared-network school {
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.10;
option domain-name-servers 192.168.1.3;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
}
subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.10 192.168.3.100;
option domain-name-servers 192.168.3.10;
option routers 192.168.3.1;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
}
}
[root@localhost \]# systemctl start dhcpd \\启动DHCP服务
2、配置DCHP中继代理
中继代理服务器关机后添加一块网卡,根据网络拓扑图,设置DCHP中继代理服务器两张网卡分别为VMnet1网卡地址192.168.3.2/24,DNS及网关为192.168.3.1;设置VMnet8网卡地址192.168.1.3/24,DNS及网关为192.168.1.1;,测试网络连通情况
[root@localhost network-scripts]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::20c:29ff:fe44:2ec6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:44:2e:c6 txqueuelen 1000 (Ethernet)
RX packets 3637 bytes 406661 (397.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2388 bytes 548064 (535.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno33554992: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.3 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe44:2ed0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:44:2e:d0 txqueuelen 1000 (Ethernet)
RX packets 3414 bytes 389000 (379.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 664 bytes 205845 (201.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost \]# yum install -y dhcp \\安装DHCP软件包
出于安全考虑,Linux系统默认是禁⽌数据包转发的。所谓转发即当主机拥有多于⼀块的⽹卡时,其中⼀块收到数据包,根据数据包的⽬的ip地址将数据包发往本机另⼀块⽹卡,该⽹卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
开启路由转发功能
[root@localhost network-scripts]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost network-scripts]# sysctl -a | grep forward
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eno16777736.forwarding = 1
net.ipv4.conf.eno16777736.mc_forwarding = 0
net.ipv4.conf.eno33554992.forwarding = 1
net.ipv4.conf.eno33554992.mc_forwarding = 0
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.ip_forward = 1 \\已开启
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.all.mc_forwarding = 0
net.ipv6.conf.default.forwarding = 0
net.ipv6.conf.default.mc_forwarding = 0
net.ipv6.conf.eno16777736.forwarding = 0
net.ipv6.conf.eno16777736.mc_forwarding = 0
net.ipv6.conf.eno33554992.forwarding = 0
net.ipv6.conf.eno33554992.mc_forwarding = 0
net.ipv6.conf.lo.forwarding = 0
net.ipv6.conf.lo.mc_forwarding = 0
3、启用中继代理
dhcrelay命令可以提供中继DHCP和BOOTP请求,从一个没有DHCP服务器的子网直接连接到其它子网内的一个或多个DHCP服务器。该命令在DHCP中继服务器上使用,同时支持DHCPv4/BOOTP和DHCPv6协议。
[root@localhost network-scripts]# dhcrelay 192.168.3.10
Dropped all unnecessary capabilities.
Internet Systems Consortium DHCP Relay Agent 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eno33554992/00:0c:29:44:2e:d0
Sending on LPF/eno33554992/00:0c:29:44:2e:d0
Listening on LPF/eno16777736/00:0c:29:44:2e:c6
Sending on LPF/eno16777736/00:0c:29:44:2e:c6
Sending on Socket/fallback
4、测试
1)开户一台LIUNX客户端,设置网络模式为VMnet8,连接网卡
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::ffdf:d95a:1113:4879 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f9:9f:5c txqueuelen 1000 (Ethernet)
RX packets 1822 bytes 286859 (280.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2011 bytes 227200 (221.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2)开启一台win7客户端,设置网络模式为VMnet1,打开CMD,测试
3)查看DHCP服务器租约数据库文件
vim /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(6) manual page.
# This lease file was written by isc-dhcp-4.2.5
server-duid "\000\001\000\001*\337\322\333\000\014)\200?\270";
lease 192.168.1.10 {
starts 1 2022/10/17 08:47:55;
ends 1 2022/10/17 08:57:55;
cltt 1 2022/10/17 08:47:55;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:44:2e:c6;
}
lease 192.168.3.10 {
starts 1 2022/10/17 08:54:02;
ends 1 2022/10/17 09:04:02;
cltt 1 2022/10/17 08:54:02;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:a4:6b:76;
uid "\001\000\014)\244kv";
client-hostname "student";
}