[ Content contribution] 服务搭建系列(3):DHCP服务配置
Tofloor
poster avatar
废物头子
deepin
2024-01-08 13:16
Author

服务搭建系列(3):DHCP服务配置

一、DHCP作用

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。

二、DHCP工作原理

DHCP报文种类

报文类型 说明
DHCP DISCOVER DHCP客户端首次接入网络时进行DHCP交互过程发送的第一个报文,用来寻找DHCP服务器。
DHCP OFFER DHCP服务器用来响应DHCP DISCOVER报文,此报文携带了各种配置信息。
DHCP REQUEST 此报文用于以下三种用途。
客户端初始化后,发送广播的DHCP REQUEST报文来回应服务器的DHCP OFFER报文。
客户端重启后,发送广播的DHCP REQUEST报文来确认先前被分配的IP地址等配置信息。
当客户端已经和某个IP地址绑定后,发送DHCP REQUEST单播或广播报文来更新IP地址的租约。
DHCP ACK 服务器对客户端的DHCP REQUEST报文的确认响应报文,客户端收到此报文后,才真正获得了IP地址和相关的配置信息。
DHCP NAK 服务器对客户端的DHCP REQUEST报文的拒绝响应报文,例如DHCP服务器收到DHCP REQUEST报文后,没有找到相应的租约记录,则发送DHCP NAK报文作为应答,告知DHCP客户端无法分配合适IP地址。
DHCP DECLINE 当客户端发现服务器分配给它的IP地址发生冲突时会通过发送此报文来通知服务器,并且会重新向服务器申请地址。
DHCP RELEASE 客户端可通过发送此报文主动释放服务器分配给它的IP地址,当服务器收到此报文后,可将这个IP地址分配给其它的客户端。
DHCP INFORM DHCP客户端获取IP地址后,如果需要向DHCP服务器获取更为详细的配置信息(网关地址、DNS服务器地址),则向DHCP服务器发送DHCP INFORM请求报文。

DHCP服务器首次接入网络的客户端工作流程

DHCP无中继场景时DHCP客户端首次接入网络

第一步:发现阶段

首次接入网络的DHCP客户端不知道DHCP服务器的IP地址,为了学习到DHCP服务器的IP地址,DHCP客户端以广播方式发送DHCP DISCOVER报文(目的IP地址为255.255.255.255)给同一网段内的所有设备(包括DHCP服务器或中继)。

第二步:提供阶段

与DHCP客户端位于同一网段的DHCP服务器都会接收到DHCP DISCOVER报文,DHCP服务器选择跟接收DHCP DISCOVER报文接口的IP地址处于同一网段的地址池,并且从中选择一个可用的IP地址,然后通过DHCP OFFER报文发送给DHCP客户端。
通常,DHCP服务器的地址池中会指定IP地址的租期,如果DHCP客户端发送的DHCP DISCOVER报文中携带了期望租期,服务器会将客户端请求的期望租期与其指定的租期进行比较,选择其中时间较短的租期分配给客户端。

第三步:选择阶段

如果有多个DHCP服务器向DHCP客户端回应DHCP OFFER报文,则DHCP客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST报文,该报文中包含客户端想选择的DHCP服务器标识符和客户端IP地址。

第四步:确认阶段

当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,DHCP服务器回应DHCP ACK报文,表示DHCP REQUEST报文中请求的IP地址分配给客户端使用。

DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DHCP DECLINE报文,并重新向服务器请求IP地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。

当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,如果DHCP服务器由于某些原因(例如协商出错或者由于发送REQUEST过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP REQUEST报文中填充的IP地址,则发送DHCP NAK报文作为应答,通知DHCP客户端无法分配此IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请新的IP地址。

DHCP有中继场景时DHCP客户端首次接入网络

有DHCP中继的场景中,首次接入网络的DHCP客户端和DHCP服务器的工作原理与无中继场景时DHCP客户端首次接入网络的工作原理相同。主要差异是DHCP中继在DHCP服务器和DHCP客户端之间转发DHCP报文,以保证DHCP服务器和DHCP客户端可以正常交互。下面仅针对DHCP中继的工作原理进行介绍。

第一步:发现阶段

DHCP中继接收到DHCP客户端广播发送的DHCP DISCOVER报文后,进行如下处理:

  1. 检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
  2. 检查DHCP报文中的giaddr字段。如果是0,将giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。
  3. 将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。

如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,后面的中继接收到DHCP DISCOVER报文的处理流程同前面所述。

注:hops字段:表示DHCP报文经过的DHCP中继数目。每经过一个中继服务器,该字段加1。服务器和客户端之间的中继服务器不能超过16个,也就是该字段的值不能大于16,否则DHCP报文将被丢弃。

giaddr字段:表示第一个DHCP中继的IP地址。当客户端发出DHCP请求时,如果服务器和客户端不在同一个网段,那么第一个DHCP中继在将DHCP请求报文转发给DHCP服务器时,会把自己的IP地址填入此字段,DHCP服务器会根据此字段来判断出客户端所在的网段地址,从而选择合适的地址池,为客户端分配该网段的IP地址。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。若在到达DHCP服务器前经过了多个DHCP中继,该字段作为客户端所在的网段的标记,填充了第一个DHCP中继的IP地址后不会再变更,只是每经过一个DHCP中继,hops字段的数值会加1。

第二步:提供阶段

DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数,然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。

DHCP中继收到DHCP OFFER报文后,会进行如下处理:

  1. 检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。
  2. DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。
第三步:选择阶段

DHCP中继服务器收到来自客户端的DHCP REQUEST报文的处理过程同上。

第四步:确认阶段

DHCP中继服务器收到来自客户端的DHCP ACK报文的处理过程同上。

DHCP客户端重用曾经使用过的地址

第一步:选择阶段

客户端广播发送包含前一次分配的IP地址的DHCP REQUEST报文,报文中的请求的IP地址选项字段填入曾经使用过的IP地址。

第二步:确认阶段

DHCP服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录,如果有则返回DHCP ACK报文,通知DHCP客户端可以继续使用这个IP地址。否则,保持沉默,等待客户端重新发送DHCP DISCOVER报文请求新的IP地址。

DHCP客户端更新租期

DHCP服务器采用动态分配机制给客户端分配IP地址时,分配出去的IP地址有租期限制。DHCP客户端向服务器申请地址时可以携带期望租期,服务器在分配租期时把客户端期望租期和地址池中租期配置比较,分配其中一个较短的租期给客户端。租期到期或者客户端下线释放地址后,服务器会收回该IP地址,收回的IP地址可以继续分配给其他客户端使用。这种机制可以提高IP地址的利用率,避免客户端下线后IP地址继续被占用。如果DHCP客户端希望继续使用该地址,需要更新IP地址的租期。

  1. 当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
  2. 当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
  3. 如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。

客户端在租期时间到之前,如果用户不想使用分配的IP地址(例如客户端网络位置需要变更),会触发DHCP客户端向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租期。DHCP服务器会保留这个DHCP客户端的配置信息,将IP地址列为曾经分配过的IP地址中,以便后续重新分配给该客户端或其他客户端。客户端可以通过发送DHCP INFORM报文向服务器请求更新配置信息。

三、DHCP配置

DHCP服务由dhcp-server软件包提供,需要手动安装该软件包。

[root@1060a ~]# yum -y install dhcp-server
[root@1060a ~]# rpm -qa | grep dhcp
dhcp-client-4.3.6-49.uelc20.01.x86_64
dhcp-libs-4.3.6-49.uelc20.01.x86_64
dhcp-common-4.3.6-49.uelc20.01.noarch
dhcp-server-4.3.6-49.uelc20.01.x86_64

DHCP配置文件存放在 /etc/dhcp目录下,名称为 dhcpd.conf,该配置文件中没有任何配置,示例配置存放在 /usr/share/doc/dhcp-server/dhcpd.conf.example文件中。

DHCP基础配置

需求:搭建一台dhcp服务器,为客户端分配IP地址,地址池范围为:192.168.200.100~192.168.200.200,掩码为24位,网关为192.168.200.2,dns服务器地址为114.114.114.114。

1.安装软件包
[root@1060a ~]# yum -y install dhcp-server
2.修改配置文件
[root@1060a ~]# vim /etc/dhcp/dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
subnet 192.168.200.0 netmask 255.255.255.0 {		//DHCP分配的网段和掩码
  range 192.168.200.100 192.168.200.200;			//DHCP分区的IP地址范围
  option domain-name-servers 114.114.114.114;		//分配的DNS地址
  option routers 192.168.200.2;						//分配的网关
  default-lease-time 600;							//默认租约时间,单位为秒
  max-lease-time 7200;								//最长租约时间,单位为秒
}
3.重启DHCP服务,设置开机自启
[root@1060a ~]# systemctl enable --now dhcpd

DHCP给主机分配指定IP地址

1.修改配置文件
[root@1060a ~]# vim /etc/dhcp/dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
subnet 192.168.200.0 netmask 255.255.255.0 {
  range 192.168.200.100 192.168.200.200;
  option domain-name-servers 114.114.114.114;
  option routers 192.168.200.2;
  default-lease-time 600;
  max-lease-time 7200;
}
host client {								//指定主机
  hardware ethernet 00:0c:29:29:95:2a;		//网卡MAC地址
  fixed-address 192.168.200.11;				//分配的IP地址
}
2.重启服务
[root@1060a ~]# systemctl restart dhcpd
3.验证
[root@client ~]# ifconfig ens33
ens33: flags=4163  mtu 1500
        inet 192.168.200.11  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::a836:ce70:c328:dfc4  prefixlen 64  scopeid 0x20
        ether 00:0c:29:29:95:2a  txqueuelen 1000  (Ethernet)
        RX packets 233  bytes 58750 (57.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 208  bytes 58630 (57.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

本人不才,在deepin论坛分享了一些自己在Linux学习过程中的一些知识积累,在分享的同时也在论坛中学习到了很多知识。现在想去拉起一个群聊,来分享知识,希望大家都能加入进来,分享自己所擅长的知识,本人也会在群里分享Linux,网络,docker,mysql等知识,同时也希望各位大佬能够帮助在下,完善自己的分享中的不足。
群号:751639288

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2024-01-08 13:25
#1

like

Reply View the author
yanjuner
Super Moderator
2024-01-08 13:31
#2

系列文章了啊

质量太高了

Reply View the author
废物头子
deepin
2024-01-08 14:24
#3
yanjuner

系列文章了啊

质量太高了

like

Reply View the author