概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个工作在应用层的局域网网络协议,数据传输时使用UDP不可靠传输协议工作,通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配网络资源,使网络环境中的主机能动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

1. DHCP工作原理(租约四部曲+续租)

3.DHCP - 图1

1.1 客户端进行 IP 请求

当一个 DHCP 客户机启动时,会自动将自己的 IP 地址配置成 0.0.0.0,由于使用 0.0.0.0 不能进行正常通信,所以客户机就必须通过 DHCP 服务器来获取一个合法的地址。由于客户机不知道 DHCP 服务器的 IP 地址,所以它使用 0.0.0.0 的地址作为源地址,使用 255.255.255.255 作为目标地址,使用 UDP 67 端口作为目的端口来广播请求 IP 地址信息。广播信息 DHCP Discover 中包含了 DHCP 客户机的 MAC 地址和计算机名,以便使 DHCP 服务器能确定是哪个客户机
发送的请求。

1.2 服务器响应请求

当DHCP服务器接收到客户机请求IP地址的信息时,它就在自己的IP地址池中查找是否有合法的IP地址提供给客户机。如果有,DHCP服务器就将此IP地址做上标记,加入到DHCPOFFER的消息中,然后DHCP服务器就广播一则包括下列信息的DHCPOFFER消息:
DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限;DHCP服务器的IP地址-MAC。因为DHCP客户机还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用255.255.255.255作为目标地址,使用UDP 68端口作为源端口来广播DHCP OFFER信息

1.3 客户机选择 IP

DHCP客户机从接收到的第一个DHCPOFFER消息中选择IP地址,发出IP地址的DHCP服务器将该地址保留,这样该地址就不能提供给另一个DHCP客户机。当客户机从第一个DHCP服务器接收DHCPOFFER并选择IP地址后,DHCP租约的第三过程发生。客户机将DHCPREQUEST消息广播到所有的DHCP服务器,表明它接受提供的内容。DHCPREQUEST消息包括为该客户机提供IP配置的服务器的服务标识符(IP地址)。DHCP服务器查看服务器标识符字段,以确定它自己是否被选择为指定的客户机提供IP地址,如果那些DHCPOFFER被拒绝,则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。
在客户机选择IP的过程中,虽然客户机选择了IP地址,但是还没有配置IP地址,而在一个网络中可能有几个DHCP服务器,所以客户机仍然使用0.0.0.0的地址作为源地址,使用255.255.255.255作为目标地址,使用UDP 67端口作为目的端口来广播DHCP REQUEST信息

1.4 服务器确认租约

服务器确认租约:DHCP ACK
DHCP服务器接收到DHCP REQUEST消息后,以DHCPACK消息的形式向客户机广播成功的确认,该消息包含有IP地址的有效租约和其他可能配置的信息。虽然服务器确认了客户机的租约请求,但是客户机还没有收到服务器的DHCPACK消息,所以服务器仍然使用自己的IP地址作为源地址,使用255.255.255.255作为目标地址,使用UDP 68端口作为源端口来广播DHCP ACK信息。当客户机收到DHCP ACK消息时,它就配置了IP地址,完成了TCP/IP的初始化。
服务器拒绝租约:DHCP NACK(DHCP NAK)
如果DHCP REQUEST不成功,例如客户机试图租约先前的IP地址,但该IP地址不再可用,或者因为客户机移到其他子网,该IP无效时,DHCP服务器将广播否定确认消息DHCP NACK。当客户机接收到不成功的确认时,它将重新开始DHCP租约过程。

注1:如果DHCP客户机无法找到DHCP服务器,它将从TCP/IP的B类网段169.254.0.0/16中挑选一个IP地址作为自己的IP地址,继续每隔5分钟尝试与DHCP服务器进行通讯,一旦与DHCP服务器取得联系,则客户机放弃自动配置的IP地址, 而使用DHCP服务器分配的IP地址。

注2:DHCP客户机收到DHCP服务器回应的ACK报文后,通过地址冲突检测(arp)发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送DECLINE报文,通知服务器所分配的IP地址不可用。

1.5 客户机续租


3.DHCP - 图2
DHCP客户机会在租期过去50%的时候,直接向为其提供IP地址的DHCP服务器发送DHCP REQUEST消息包。如果客户机接收到该服务器回应的DHCP ACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没有收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
如果在租期过去50%的时候没有更新,则DHCP客户机将在租期过去87.5%的时候再次向为其提供IP地址的DHCP服务器联系。如果还不成功,到租约的100%时候,DHCP客户机必须放弃这个IP地址,重新申请。
如果此时无DHCP服务器可用,DHCP客户机会使用169.254.0.0/16中随机的一个地址,并且每隔5分钟再进行尝试。**

2.DHCP服务搭建

2.1 实验环境

两台机器,网络连接模式设为V8网卡下(同一网络中)
并且关闭VMware软件→选项→虚拟网络编辑器的DHCP功能

2.1.1 安装dhcp服务

  1. [root@localhost ~]$ yum -y install dhcp
  2. [root@localhost ~]$ cat /etc/dhcp/dhcpd.conf

2.2 相关信息

2.2.1 软件名:

dhcp #DHCP服务软件包
dhcp-common #DHCP命令软件包(默认已安装)

2.2.2 服务名:

dhcpd #DHCP服务名
dhcrelay #DHCP中继服务名

2.2.3 端口号:

udp 67 #作为客户端的目标端口,接收客户端的请求DHCP请求
udp 68 #作为服务器的源端口,用来向客户端回复数据包

2.2.4 配置文件:

dhcpd /etc/dhcp/dhcpd.conf #此配置文件默认是空的,需要找模板文件重新生成
dhcpd.conf.sample /usr/share/doc/dhcp-4../dhcpd.conf.sample #DHCP的模板配置文件

dhcrelay /etc/sysconfig/dhcrelay #该文件时中继配置文件,中继实验中用到

2.2.5 生成配置文件:

[root@localhost ~]$ cp -a /usr/share/doc/dhcp-4.*.*/dhcpd.conf.sample /etc/dhcp/dhcpd.conf                 #centos6 将DHCP配置文件cp到模板目录下 

[root@centos7 doc]# cp -a dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf     
                                                        #centos7 将DHCP配置文件cp到模板目录下

2.2.6 DHCP 配置文件详解

subnet 192.168.88.0 netmask 255.255.255.0{     #声明要分配的网段和子网掩码
range 192.168.88.3 192.168.88.254; #声明可用 IP 地址池
option domain-name "atguigu.com" ; #设置 DNS 域
option domain-name-servers 8.8.8.8 ; #设置 DNS 服务器地址
option routers 192.168.88.2; #默认网关的地址
option broadcast-address 192.168.88.255; #广播地址(可不写)
default-lease-time 600; #默认租约(s)
max-lease-time 7200; #最大租约(s) 
}

3.DHCP实验

3.1基本功能实验

网卡配置

注意网卡名称及IP地址是否修改,DHCP服务器要与V8网卡同网段。setup命令是红帽系独有GUI配置界面,如其他linux发行版可手动修改文件
image.png

修改配置文件

#centos7 将DHCP配置文件cp到模板目录下 
[root@centos7 doc]# cp -a dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf

也可以直接新建配置文件,因为主要配置的就几项,不需要模板文件格式

subnet 192.168.44.0 netmask 255.255.255.0 {
  range 192.168.44.50 192.168.44.99;
  option domain-name-servers 8.8.8.8;
  option routers 192.168.44.2;
  option subnet-mask 255.255.255.0;
}

#这是我的配置文件

启动服务

#启动服务
systemctl start dhcpd

#查看dhcp服务端口是否开启
netstat -pantu | grep dhcp

# 查看服务状态
systemctl status dhcpd.service 

#开机自启动
systemctl enable dhcpd
#关闭防火墙
systemctl stop firewalld
#selinux
setenforce 0

#生产环境中不关闭防火墙,需要开启对应端口

client机访问

客户机自动从DHCP获取IP地址
image.png