一、DHCP是什么

名称:DHCP – Dynamic Host Configuration Protocol 动态主机配置协议 
功能:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途: 
1、 给内部网络或网络服务供应商自动分配IP地址,主机名,DNS服务器,域名 
2、 配和其它服务,实现集成化管理功能。如:无人执守安装服务器

DHCP是一个C/S架构的协议,DHCP服务器端使用UDP的67号端口; DHCP 客户端使用UDP的68号端口。

为什么使用DHCP

①DHCP服务器用于为客户机动态分配IP地址,避免了TCP/IP网络中地址的冲突,便于对网络的IP地址进行管理; 
②在使用TCP/IP协议通信的网络中,每台计算机都必须至少有一个IP地址,这样才能与其他计算机通信。对于一个较大规模的网络来说,逐个地为每台计算机分配和设置IP地址,将是一件很麻烦的事情,也不便于管理和维护; 
③对于像笔记本这样的移动用户,经常从一个子网移动到另一个子网,需要不断地手动更换IP地址,很不方便; 
④DHCP服务器通过动态的IP地址分配还能解决IP地址资源不足的情况,因此DHCP产生了。

二、DHCP工作原理(C/S)

我们看下面的图,客户端从DHCP服务器获取IP地址的过程我们称为DHCP租约过程,分为四个步骤:

wKiom1gYdKnTAQe-AABFNdtE_kg586.png

1、客户发出的IP租用请求报文

DHCP客户机初始化TCP/IP,通过UDP端口67向网络中发送一个DHCP DISCOVER广播包,请求租用IP地址。该 广播包中的源IP地址为0.0.0.0,目标IP地址为255.255.255.255;包中还包含客户机的MAC地址和计算机名。

2、DHCP Server回应的IP租用提供报文

任何接收到DHCP DISCOVER广播包并且能够提供IP地址的DHCP服务器,都会通过UDP端口68给客户机回应一个DHCP OFFER广播包,提供一个IP地址。该广播包的源IP地址为DHCP服务器IP,目标IP地址为255.255.255.255;包中还包含提供的IP地址、子网掩码及租期等信息。

3、客户选择IP租用报文

客户机从不止一台DHCP服务器接收到提供之后,会选择第一个收到的DHCP OFFER包,并向网络中广播一个 DHCP REQUEST消息包,表明自己已经接受了一个DHCP服务器提供的IP地址。该广播包中包含所接受的IP地址和服务器的IP地址。 所有其他的DHCP服务器撤消它们的提供以便将IP地址提供给下一次IP租用请求。

4、DHCP服务器发出IP租用确认报文

被客户机选择的DHCP服务器在收到DHCP REQUEST广播后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。

5、客户配置成功后发出的公告报文

客户机在收到DHCP ACK包,会使用该广播包中的信息来配置自己的TCP/IP,则租用过程完成,客户机可以在网络中通信。至此一个客户获取IP的DHCP服务过程基本结束,不过客户获取的IP一般是用租期,到期前需要更新租期,这个过程是通过租用更新数据包来完成的。

注意:客户端执行DHCP DISCOVER 后,如果没有DHCP 服务器响应客户端的请求,客户端会随机使用169.254.0.0/16 网段中的一个IP 地址,配置本机地址。

169.254.0.0/16是windows的自动专有IP寻址范围,也就是在无法通过DHCP获取IP地址时,由系统自动分配的IP地址段。

客户IP租用更新报文,由于IP是“租”来的,所以是有租期的:

(1)在当前租期已过去50%时,DHCP客户机直接向为其提供IP地址的DHCP服务器发送DHCP REQUEST消息包。如果客户机接收到该服务器回应的DHCP ACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。 
(2)如果在租期过去50%时未能成功更新,则客户机将在当前租期过去87.5%时再次向为其提供IP地址的DHCP联系。如果联系不成功,则重新开始IP租用过程。 
(3)如果DHCP客户机重新启动时,它将尝试更新上次关机时拥有的IP租用。如果更新未能成功,客户机将尝试联系现有IP租用中列出的缺省网关。如果联系成功且租用尚未到期,客户机则认为自己仍然位于与它获得现有IP租用时相同的子网上(没有被移走)继续使用现有IP地址。 如果未能与缺省网关联系成功,客户机则认为自己已经被移到不同的子网上,将会开始新一轮的IP租用过程。


总结 
50%:续约。(续不上继续用) 
87.5%:再次续约。(续不上找别人) 
DHCP工作站除了在开机的时候发出 DHCPrequest 请求之外,在租约期限一半的时候也会发出 DHCPrequest ,如果此时得不到 DHCP服务器的确认的话,工作站还可以继续使用该IP;当租约期过了87.5%时,如果客户机仍然无法与当初的DHCP服务器联系上,它将与其它 DHCP服务器通信。如果网络上再没有任何DHCP协议服务器在运行时,该客户机必须停止使用该IP地址,并从发送一个Dhcpdiscover数据包开 始,再一次重复整个过程。要是您想退租,可以随时送出 DHCPRELEASE 命令解约,就算您的租约在前一秒钟才获得的。

什么是中继(建议不要用)

设想一个场景:一个公司有A和B两个网络,但是不想给每个网络都分配一个DHCP服务器,只想用一个DHCP服务器完成地址的分配,该怎么办呢?此时就可以用到中继了,将DHCP服务器放到A网络中,配置一个地址池,用于给A网络分配地址,然后配置一个中继地址池,用于给B网络分配地址。之后在路由器(直连A-B)上,配置一个中继,当B网络的客户机发起DHCP的请求时,路由器就将请求发给A网络的DHCP服务,DHCP服务器将请求响应给路由器,路由器再响应给B网络。(注意:此过程路由器和DHCP服务器间是单播通信,路由器和B网络的主机为广播通信)。

三、DHCP配置

1、安装 dhcp

[root@localhost ~]# yum -y install dhcp

2、dhcp主文件列表

[root@localhost ~]# rpm -ql dhcp
/etc/dhcp/dhcpd.conf                # dhcp 配置文件
/etc/rc.d/init.d/dhcpd              # dhcp 服务启动脚本
/etc/rc.d/init.d/dhcrelay           # dhcp中继 服务启动脚本
/etc/sysconfig/dhcpd                # 服务脚本配置文件
/usr/sbin/dhcpd                     # dhcp 程序,可执行文件
/usr/sbin/dhcrelay                  # dhcp中继程序,可执行文件

3、配置文件详解

[root@localhost ~]# cat /etc/dhcp/dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see 'man 5 dhcpd.conf'
#

提示说配置文件在 /usr/share/doc/dhcp*/dhcpd.conf.sample, 那么我们把它复制到/etc/dhcp目录,并改名为 dhcpd.conf :

[root@localhost ~]# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf 
cp: overwrite `/etc/dhcp/dhcpd.conf'? y

配置文件主要分为四个部分:

option               #定义全局参数

subnet Netaddress netmask NETMask{  #定义子网
}

host NAME {          #主机配置,分配固定IP
}

log-facility         #定义dhcp 日志信息

1、每一行必须以分号 ; 结尾。只能通过/var/log/messages文件查看是否有错误 
2、全局参数对全局生效,当全局配置与局部配置冲突时,局部参数将覆盖全局参数。 
3、局部配置必须包含在 花括号 中,其他都是全局配置

常用指令介绍:

指令                    说明
domain-name             指定域名
domain-name-servers     DNS服务器地址
routers                 默认网关
default-lease-time      默认租约期限
max-lease-time          最大租约期限
log-facility            日志
subnet                  定义子网
range                   定义地址池
host                    保留主机地址
filename                指定PXE文件
server-name             服务器名称
fixed-address           固定IP地址

配置文件:

全局配置

#option domain-name "mageedu.com";          #定义域名为test.org,这个没用,一般都注释掉
option domain-name-servers 192.168.211.128;   #定义DNS服务器为172.16.0.1,多个以逗号分隔
default-lease-time 600;    #定义默认租约期限,这里为600
max-lease-time 7200;       #定义最大租约期限,这里为7200

### 日志信息
log-facility local7;       #日志为faility local7;可以看/etc/rsyslog.conf,这里不解释

### 子网选项
subnet 192.168.211.0 netmask 255.255.255.0 {    # 子网声明
#定义了一个子网192.168.211.0/24,注意,这个地址池一定要和你服务器的IP在同一网段,即使是中继,也要至少有一个本地子网段!
 192.168.211.240 192.168.211.245;    #地址池从192.168.211.240192.168.211.245;以空格分割
 option domain-name-servers 114.114.114.114,192.168.211.128;  #定义DNS服务器
 option routers 192.168.211.128;         #定义网关为192.168.211.128
 option broadcast-address 192.168.211.255;   #定义广播地址为192.168.211.255
 default-lease-time 86400;     #定义默认IP 租约时间,以秒为单位的租约时间。
 max-lease-time 86400;         #定义客户端IP租约时间的最大值,当客户端超过租约时间,却尚未更新IP 时,最长可以使用该IP 的时间;
}

### 主机选项,保留地址(有时我们需要为某些主机配置固定IP地址,host选项满足这一需求)
host server1 {                        #定义一个名为server1的主机
   option routers 192.168.211.128;     #定义网关
   option domain-name-servers 192.168.211.128;  #定义域名服务器
   option broadcast-address 192.168.211.255;   #定义广播地址
   filename "vmunix.passacaglia";     #指向一个文件,用于PXE
   server-name "cobbler.mageedu.com";   #通知客户端dhcp服务器名字
   hardware ethernet 0:0:c0:5d:bd:95;   #声明了server1这个主机的MAC地址
   fixed-address 192.168.211.133;   #定义这个主机的固定ip地址为192.168.211.133
}

## 绑定pc1主机ip地址配置
host pc1 {
    hardware ethernet 00:a0:cc:cf:9C:14;   #客户端MAC地址
    fixed-address 192.168.1.20;            #客户端要获取的地址
}

没有写在subnet或host中的选项是全局选项,也就是默认值,当host或者subnet中没有定义的时候生效。当内部定义后,则匹配最精确的,也就是自身定义的。

如果DHCP服务器是多网卡,还需要配置dhcpd监听网卡:

[root@localhost ~]# vim /etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=eth0   #绑定网卡名称

4、启动 dhcp 服务

[root@localhost ~]# service dhcpd start

5、查看监听端口

[root@localhost ~]# ss -tulpn | grep dhcp
udp    UNCONN     0      0                      *:67                    *:*      users:(("dhcpd",27249,7)

6、查看租约信息

作为服务器端的租约文件:/var/lib/dhcpd/dhcpd.leases 
作为客户端的租约文件: /var/lib/dhclient/dhclient-eth0.leases

租期数据库

在 DHCP 服务器上,/var/lib/dhcp/dhcpd.leases 文件中存放着 DHCP 的客户租期数据库。该文件不应该被手工修改。每个新近分配的 IP 地址的 DHCP 租期信息都会自动储存在租期数据库中。该信息包括租期的长度;IP 地址被分配的对象;租期的开始和终止日期;以及用来检索租期的网卡的 MAC 地址。 
租期数据库中所用的时间是格林威治标准时间(GMT),不是本地时间。 
租期数据库不时被重建,因此它不算太大。首先,所有已知的租期会被储存到一个临时的租期数据库中,dhcpd.leases 文件被重命名为 dhcpd.leases~,然后,临时租期数据库被写入 dhcpd.leases 文件。 
在租期数据库被重命名为备份文件,新文件被写入之前,DHCP 守护进程有可能被杀死,系统也有可能会崩溃。如果发生了这种情况,启动服务所需的dhcpd.leases 文件就不会存在。这时,请不要创建新租期文件。因为这样做会丢失所有原有的旧租期文件,从而导致更多问题。正确的办法是把dhcpd.leases~ 备份文件重命名为 dhcpd.leases,然后再启动守护进程。

配置dhcp中继

1)在dhcp服务器上的主配置文件/etc/dhcp/dhcpd.conf中添加需要中继的subnet并重启dhcp服务 
2)在中继服务器上开启包转发功能

[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p    #更新配置文件

3)在中继服务器上的配置文件/etc/sysconfig/dhcrelay中添加参数

[root@localhost ~]# vim /etc/sysconfig/dhcrelay
INTERFACES="eth0 eth1"            #声明你要使用哪几块网卡中继
DHCPSERVERS="192.168.211.128"        #指定dhcp服务器

4)在中继服务器上启动中继服务

[root@localhost ~]# service dhcprelay start

配置DHCP客户端

通常网管员使用选择手工配置 DHCP 客户,需要修改/etc/sysconfig/network 文件来启用联网;并修改/etc/sysconfig/network-scripts 目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做ifcfg-eth?的配置文件,eth?是网络设备的名称。如eth0等。如果你想在引导时启动联网,NETWORKING变量必须设为 yes。除了此处之外/etc/sysconfig/network 文件应该包含以下行:

NETWORKING=yes
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

测试:

在 dhcp 服务器上, tail -f /var/log/messages , 可以看到dhcp分配的详细信息。 
cat /var/lib/dhcpd/dhcpd.leases 也可以看到分配的租期数据库。