首页 > 代码库 > DHCP服务详解

DHCP服务详解

DHCP:Dynamic Host Configuration Protocol  局域网的网络协议,使用UDP协议工作,通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。在RFC 2131中有详细的描述。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做“双机热备”的。


DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动。当DHCP服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置。

DHCP具有以下功能:
1. 保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。
2. DHCP应当可以给用户分配永久固定的IP地址。
3. DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。
4. DHCP服务器应当向现有的BOOTP客户端提供服务。


DHCP有三种机制分配IP地址:(三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。)
1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。

简单来说下DHCP工作原理:
1)客户机寻找服务器:广播发送discover包,寻找dhcp服务器
2)服务器响应请求:单播发送offer包,对客户机做出响应。提供客户端网络相关的租约以供选择其中服务器在收到客户端的请求后,会针对客户端的mac地址与本身的设定数据进行一下工作:
    a)到服务器的登录文件中寻找该用户之前曾经使用过的ip,若有且该ip目前没有人使用,这提供此ip为客户机
    b)若配置文件中有针对该mac提供额外的固定ip,且该ip没有被使用,则提供此ip给客户机
    c)如果没有符合以上两个条件,则随机取用目前没有被使用的ip参数给客户机并记录到leases文件中。
3)客户机发送ip请求:广播request包,选择一个服务器提供的网络参数租约回报服务器。此外,客户机会发送一个广播封包给局域网内的所有主机,告知自己已经接受服务器的租约。
4)服务器确认租约:单播Ack包,服务器与客户机确认租约关系并记录到服务器的leases文件中 。


接着说下DHCP几个概念:
DHCP Client:DHCP客户端,通过DHCP协议请求IP地址的客户端。DHCP客户端是接口级的概念,如果一个主机有多个以太接口,则该主机上的每个接口都可以配置成一个DHCP 客户端。交换机上每个Vlan接口也可以配置成一个DHCP客户端。
DHCP Server:DHCP 服务端,负责为DHCP客户端提供IP地址,并且负责管理分配的IP地址。
DHCP Relay:DHCP中继器,DHCP客户端跨网段申请IP地址的时候,实现DHCP报文的转发功能。
DHCP Security:DHCP安全特性,实现合法用户IP地址表的管理功能
DHCP Snooping:DHCP监听,记录通过二层设备申请到IP地址的用户信息

DHCP的封包格式如右图所示,各字段定义如下:
报文格式

技术分享

报文中各字段的描述如下:

    op,报文类型,1表示请求报文,2表示回应报文。
    htype,硬件地址类型,1表示10Mb/s的以太网的硬件地址。
    hlen,硬件地址长度,以太网中该值为6。
    hops,跳数。客户端设置为0,也能被一个代理服务器设置。
    xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
    secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
    flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
    ciaddr,客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
    yiaddr,"你自己的"或客户端的IP地址。
    siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
    giaddr,DHCP中继器的IP地址。//注意:不是地址池中定义的网关
    chaddr,客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
    sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
    file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
    options,可选参数域,格式为"代码+长度+数据"
DHCP共有八种报文,分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。各报文类型功能如表1所述。


描述
DHCP Discover
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。

DHCP Offer
DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户,告知用户本服务器可以为其提供IP地址。< 只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复>

DHCP Request DHCP客户端可能会收到很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。 DHCP ACK DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。
DHCP NAK 如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。 DHCP Release 当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。 DHCP Decline DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用。 DHCP Inform DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端。

 

1、搭建过程

yum -y install dhcp* 

(1/4): dhclient-4.1.1-53.P1.el6.centos.x86_64.rpm                       | 322 kB     00:00  

###  DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
individual devices on an IP network to get their own network
configuration information (IP address, subnetmask, broadcast address,
etc.) from a DHCP server. The overall purpose of DHCP is to make it
easier to administer a large network.  The dhcp package includes the
ISC DHCP service and relay agent.


在ISC DHCP中继代理和服务。
(2/4): dhcp-4.1.1-53.P1.el6.centos.x86_64.rpm                           | 823 kB     00:00    

###DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
individual devices on an IP network to get their own network
configuration information (IP address, subnetmask, broadcast address,
etc.) from a DHCP server. The overall purpose of DHCP is to make it
easier to administer a large network.  The dhcp package includes the
ISC DHCP service and relay agent.

To use DHCP on your network, install a DHCP service (or relay agent),
and on clients run a DHCP client daemon.  The dhcp package provides
the ISC DHCP service and relay agent.
(3/4): dhcp-common-4.1.1-53.P1.el6.centos.x86_64.rpm                    | 144 kB     00:00 

    ###管理包DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
individual devices on an IP network to get their own network
configuration information (IP address, subnetmask, broadcast address,
etc.) from a DHCP server. The overall purpose of DHCP is to make it
easier to administer a large network.
(4/4): dhcp-devel-4.1.1-53.P1.el6.centos.x86_64.rpm                     | 158 kB     00:00    
##Header files and API documentation for using the ISC DHCP libraries.  The
libdhcpctl and libomapi static libraries are also included in this package.

配置过程

1、查看dhcpd.conf 配置文件,提示需要参考模板配置文件。

 cat /etc/dhcp/dhcpd.conf

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see man 5 dhcpd.conf
#
cat /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample  > /etc/dhcp/dhcpd.conf

2、编辑配置文件

[root@dhcp dhcp]# cat /etc/dhcp/dhcpd.conf 
ddns-update-style interim;
ignore client-updates;

subnet 192.168.1.0 netmask 255.255.255.0 {

# --- default gateway
option routers                  192.168.1.0;
option subnet-mask              255.255.255.0;
option time-offset              -18000; # Eastern Standard Time
#       option ntp-servers              192.168.1.1;
#       option netbios-name-servers     192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Dont change # -- you understand Netbios very well                        
#      option netbios-node-type 2;

range dynamic-bootp 192.168.1.200 192.168.1.230;
default-lease-time 21600;
max-lease-time 43200;

# we want the nameserver to appear at a fixed address
 }

3、启动服务;service dhcpd restart

4、配置文件说明

dhcpd.conf参数说明

/etc/dhcpd.conf通常包括三部分:parameters、declarations 、option。

1.DHCP配置文件中的parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户


ddns-update-style               配置DHCP-DNS 互动更新模式。 
default-lease-time              指定确省租赁时间的长度,单位是秒。 
max-lease-time                  指定最大租赁时间长度,单位是秒。 
hardware                        指定网卡接口类型和MAC地址。 
server-name                     通知DHCP客户服务器名称。 
get-lease-hostnames flag        检查客户端使用的IP地址。 
fixed-address ip                分配给客户端一个固定的地址。 
authritative                    拒绝不正确的IP地址的要求。

2.DHCP配置文件中的declarations (声明):用来描述网络布局、提供客户的IP地址等


shared-network                              用来告知是否一些子网络分享相同网络。 
subnet                                      描述一个IP地址是否属于该子网。 
range                                       起始IP 终止IP 提供动态分配IP 的范围。 
host                                        主机名称 参考特别的主机。 
group                                       为一组参数提供声明。 
allow unknown-clients;deny unknown-client   是否动态分配IP给未知的使用者。 
allow bootp;deny bootp                      是否响应激活查询。 
allow booting;deny booting                  是否响应使用者查询。 
filename                                    开始启动文件的名称. 应用于无盘工作站。 
next-server                                设置服务器从引导文件中装如主机名,应用于无盘工作站。

3. DHCP配置文件中的option(选项):用来配置DHCP可选参数,全部用option关键字作为开始

subnet-mask           为客户端设定子网掩码。 
domain-name           为客户端指明DNS名字。 
domain-name-servers   为客户端指明DNS服务器IP地址。 
host-name             为客户端指定主机名称。 
routers               为客户端设定默认网关。 
broadcast-address     为客户端设定广播地址。 
ntp-server            为客户端设定网络时间服务器IP地址。 
time-offset          为客户端设定和格林威治时间的偏移时间,单位是秒。

注意:如果客户端使用的是视窗操作系统,不要选择"host-name"选项,即不要为其指定主机名称

 

工作原理:

DHCP协议采用UDP作为传输协议,主机发送请求消息到DHCP服务器的67号端口,DHCP服务器回应应答消息给主机的68号端口。详细的交互过程如下图。
 
技术分享

 


 

 
  1. 即DHCP客户端寻找DHCP服务端的过程,对应于客户端发送DHCP Discovery,因为DHCP Server对应于DHCP客户端是未知的,所以DHCP 客户端发出的DHCP Discovery报文是广播包,源地址为0.0.0.0目的地址为255.255.255.255。网络上的所有支持TCP/IP的主机都会收到该DHCP Discovery报文,但是只有DHCP Server会响应该报文。
    如果网络中存在多个DHCP Server,则多个DHCP Server均会回复该DHCP Discovery报文。
    如果同一个vlan内没有DHCP Server,而该VlanIf配置了DHCP Relay功能,则该Vlanif即为DHCP中继,DHCP中继会将该DHCP报文的源IP地址修改为该Vlanif的IP地址,而目的地址则为DHCP Relay配置的DHCP Server的IP地址。同时修改DHCP报文中,giaddress为VlanIf的IP地址。并以单播将DHCP Discovery发送到DHCP Server端。
  2. DHCP Server提供阶段,即为DHCP Server响应DHCP Discovery所发的DHCP Offer阶段
    DHCP Server收到DHCP Discovery报文后,解析该报文请求IP地址所属的Subnet。并从dhcpd.conf文件中与之匹配的subnet中取出一个可用的IP地址(从可用地址段选择一个IP地址后,首先发送ICMP报文来ping该IP地址,如果收到该IP地址的ICMP报文,则抛弃该IP地址,重新选择IP地址继续进行ICMP报文测试,直到找到一个网络中没有人使用的IP地址,用以达到防治动态分配的IP地址与网络中其他设备IP地址冲突,这个IP地址冲突检测机制,可配置),设置在DHCP Discovery报文中yiaddress字段中,表示为该客户端分配的IP地址,并且为该Lease设置该Subnet配置的Option,例如默认leases租期,最大租期,router等信息。
    DHCP从地址池中选择IP地址,以如下优先级进行选择:
        1)当前已经存在的Ip Mac的对应关系
        2)Client以前的IP地址
        3)读取Discovery报文中的Requested Ip Address Option的值,如果存在并且IP地址可用
        4)从配置的Subnet中选择IP地址:
    DHCP Server解析DHCP Discovery请求的IP所属的Subnet,首先看该DHCP Discovery报文中giaddress是否有DHCP Relay,如果有,则从giaddress所述的subnet中可用IP地址段中获取,并分配IP。如果giaddress没有IP地址,则从该DHCP Server绑定的接口的IP地址所属的网段分配IP地址。
  3. DHCP Client收到若干个DHCP Server响应的DHCP Offer报文后,选择其中一个DHCP Server作为目标DHCP Server。选择策略通常为选择第一个响应的DHCP Offer报文所属的DHCP Server。
    然后以广播方式回答一个DHCP Request报文,该报文中包含向目标DHCP请求的IP地址等信息。之所以是以广播方式发出的,是为了通知其他DHCP Server自己将选择该DHCP Server所提供的IP地址。
  4. 当DHCP Server收到DHCP Client发送的DHCP Request后,确认要为该DHCP Client提供的IP地址后,便想该DHCP Client响应一个包含该IP地址以及其他Option的报文,来告诉DHCP Client可以使用该IP地址了。然后DHCP Client即可以将该IP地址与网卡绑定。另外其他DHCP Server都将收回自己之前为DHCP Client提供的IP地址。
  5. 当DHCP Client重新登录后,发送一个以包含之前DHCP Server分配的IP地址信息的DHCP Request报文,当DHCP Server收到该请求后,会尝试让DHCP客户端继续使用该IP地址。并回答一个ACK报文。
    但是如果该IP地址无法再次分配给该DHCP Client后,DHCP回复一个NAK报文,当DHCP Client收到该NAK报文后,会重新发送DHCP Discovery报文来重新获取IP地址。
  6. DHCP获取到的IP地址都有一个租约,租约过期后,DHCP Server将回收该IP地址,所以如果DHCP Client如果想继续使用该IP地址,则必须更新器租约。更新的方式就是,当当前租约期限过了一半后,DHCP Client都会发送DHCP Renew报文来续约租期。
      在使用租期超过50%时刻处,DHCP Client会以单播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址。
      在使用租期超过87.5%时刻处,DHCP Client会以广播形式向DHCP Server发送DHCPRequest报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。
需要说明的是:DHCP客户端可以接收到多个DHCP服务器的DHCPOFFER数据包,然后可能接受任何一个DHCPOFFER数据包,但客户端通常只接受收到的第一个DHCPOFFER数据包。另外,DHCP服务器DHCPOFFER中指定[1]  的地址不一定为最终分配的地址,通常情况下,DHCP服务器会保留该地址直到客户端发出正式请求。
      正式请求DHCP服务器分配地址DHCPREQUEST采用广播包,是为了让其它所有发送DHCPOFFER数据包的DHCP服务器也能够接收到该数据包,然后释放已经OFFER(预分配)给客户端的IP地址。
      如果发送给DHCP客户端的地址已经被其他DHCP客户端使用,客户端会向服务器发送DHCPDECLINE信息包拒绝接受已经分配的地址信息。
      在协商过程中,如果DHCP客户端发送的REQUEST消息中的地址信息不正确,如客户端已经迁移到新的子网或者租约已经过期,DHCP服务器会发送DHCPNAK消息给DHCP客户 端,让客户端重新发起地址请求过程。

 获取过程

 

 

1、查看客户端message 日志;

首次获取
May 29 12:27:38 66 dhclient[26828]: DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 8 (xid=0x3acc5b99) May 29 12:27:38 66 dhclient[26828]: DHCPOFFER from 192.168.1.2 May 29 12:27:38 66 dhclient[26828]: DHCPREQUEST on eth2 to 255.255.255.255 port 67 (xid=0x3acc5b99) May 29 12:27:38 66 dhclient[26828]: DHCPACK from 192.168.1.2 (xid=0x3acc5b99) May 29 12:27:40 66 NET[26875]: /sbin/dhclient-script : updated /etc/resolv.conf May 29 12:27:40 66 dhclient[26828]: bound to 192.168.1.47 -- renewal in 39792 seconds.

断开后重新获取 May 29 13:26:40 66 dhclient[41297]: DHCPREQUEST on eth3 to 255.255.255.255 port 67 (xid=0x207c094c) May 29 13:26:40 66 dhclient[41297]: DHCPACK from 192.168.1.2 (xid=0x207c094c) May 29 13:26:42 66 NET[41351]: /sbin/dhclient-script : updated /etc/resolv.conf May 29 13:26:42 66 dhclient[41297]: bound to 192.168.1.157 -- renewal in 38792 seconds.

2、抓包分析;

tcpdump -i any -w dhcp.pcap udp and port 67 and port 68

首次获取信息抓包;

技术分享

 

1、Discover包分析

 技术分享

2、OFFER

 技术分享

(1)DHCP服务器仍然使用广播地址作为目的地址,因为此时请求分配IP的Client并没有自己ip,而可能有多个Client在使用0.0.0.0这个IP作为源IP向DHCP服务器发出IP分配请求,DHCP也不能使用0.0.0.0这个IP作为目的IP地址,于是依然采用广播的方式,告诉正在请求的Client们,这是一台可以使用的DHCP服务器。

(2)DHCP服务器提供了一个可用的IP,在数据包的Your (client) IP Address字段可以看到DHCP服务器提供的可用IP。

(3)除此之外,如图中红色矩形框的内容所示,服务器还发送了子网掩码,路由器,DNS,域名,IP地址租用期等信息。

 

3 REQUEST包

 技术分享

4、ACK包

技术分享

 

技术分享

 

技术分享

 

 在数据包中包含以下信息,表示将这些资源信息分配给Client.
  Your(client) IP address:分配给Client的可用IP。
  后面有许多项option信息,前两项是DHCP服务器发送的消息类型(ACK)和服务器的身份标识,后面几项是:
  Subnet Mask:Client端分配到的IP的子网掩码;
  Router:路由器
  Domain Name Server:DNS,域名服务器
  Domain Name:域名
  IP Address Lease Time:IP租用期。

 技术分享

 模拟重启主机抓包

 

DHCP服务详解