目录
1. DHCP简介 2. DHCP协议数据包格式 3. DHCP服务器搭建 4. DHCP协商交互过程
1. DHCP简介
DHCP是DynamicHostConfigurationProtocol之缩写﹐它的前身是BOOTP。DHCP可以说是BOOTP的增强版本﹐它分为两个部份(C/S架构): 一个是伺服器端,而另一个是客户端。所有的IP网路设定资料都由DHCP伺服器集中管理﹐并负责处理客户端的DHCP要求﹔而客户端则会使用从伺服器分配下来的IP环境资料。比较起BOOTP,DHCP透过"租约"的概念,有效且动态的分配客户端的TCP/IP设定,而且,作为兼容考量,DHCP也完全照顾了BOOTPClient的需求。
DHCP支持三种类型的地址分配:
1. 自动分配方式: DHCP给主机指定一个永久的IP地址,一旦DHCP客户端第一次成功的从DHCP伺服器端租用到IP位址之后﹐就永远使用这个位址 2. 动态分配方式: DHCP给主机指定一个有"时间限制(租约)"的IP地址,到时间(租约到期)或主机明确表示放弃这个地址(主机主动断开连接)时,这个地址可以被其他的主机使用,当然,客户端可以比其它主机更优先的延续(renew)租约,或是租用其它的IP位址 3. 手工分配方式: 主机的IP地址是由网络管理员指定的,它可以按照MAC地址来固定的分配IP位址﹐DHCP只是把指定的IP地址告诉主机,相当于将某个MAC和IP进行了静态绑定
除了分配IP之外﹐DHCP还可以帮客户端指定IP环境:
1. router(默认网关) 2. netmask(默认子网掩码) 3. DNSServer(DNS服务器IP) 4. WINSServer﹑等等项目
您在客户端上面,除了将DHCP选项打勾之外,几乎无需做任何的IP环境设定
DHCP有3个端口,其中:
1. UDP67: DHCP Server服务端口 2. UDP68: DHCP Client服务端口 3. UDP546: 用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做"双机热备"的
DHCP协议主机配置的优缺点
1. DHCP协议主机配置方式最重要的特征就是整个配置过程自动实现,而且所有配置信息在一个地方集中控制,这就是DHCP SERVER的作用。 2. 最初的BOOTP/DHCP协议是在同一个物理子网中使用广播方式实现的,无法穿越路由器扩展到不同的物理子网中,也就是要使用DHCP协议的每一个网络(广播域)中必须配置一台DHCP服务器,为了克服这一缺陷,采用了DHCP RELAY(DHCP中继服务器)的方式使得BOOTP/DHCP协议能够穿越路由器实现。 3. DHCP协议一般采用终端的硬件地址(如果是以太网,就是我们常说的MAC地址)来唯一标识一个终端设备。 4. DHCP协议通过设置IP地址使用租期,可以达到IP地址的分时复用效果,解决IP地址资源短缺的问题。 5. DHCP协议基本上是一个单向驱动协议,SERVER完全是被动的,其动作、行为基本完全由CLIENT的请求行为而激发,即SERVER端无法主动控制CLIENT端。因此其交互性和安全性就没有PPP协议那么完善,这是DHCP协议的一个安全风险点
2. DHCP协议数据包格式
0x1: DHCP协议的封装
学习DHCP协议不能单纯学习协议本身,还必须连带了解它的封包结构,之所以这么说,是因为DHCP是一个特殊的"服务发现"类型的协议,它用于客户端"获取某种资源",所以它的封包格式具有一定的特殊性
链路层头 |
IP头 |
UDP头 |
DHCP报文 |
其中:
1. 链路层头: 承载报文的链路层信息头,常见的有Ethernet_II格式、802.1Q格式、 IEEE802.3格式、令牌环链路层头格式等。 2. IP头: 标准的IP协议头,IPV4中长度为20bytes,包括了SrcIp,DstIp等信息。 3. UDP头: 8bytes,包括了SrcPort,DstPort,报文长度及UDP校验和等信息。 4. DHCP报文:具体的DHCP报文内容。
由于DHCP协议是初始化协议,更简单的说,就是让终端获取IP地址的协议,既然终端连IP地址都没有,何以能够发出IP报文呢?SERVER给CLIENT回送的报文该怎么封装呢?带着这些疑问,继续学习
为了解决这个问题,DHCP报文的封装采取了如下措施:
1. 首先链路层的封装必须是广播形式,即让在同一物理子网中的所有主机都能够收到这个报文 2. 由于终端目前没有IP地址,IP头中的SrcIp规定填为全0。 3、当终端发出DHCP请求报文,它并不知道DHCP SERVER的IP地址,因此IP头中的DstIp填为有限的子网广播IP——全1(广播),以保证DHCP SERVER的IP协议栈不丢弃这个报文 4. 上面的措施保证了DHCP SERVER能够收到终端的请求报文,但仅凭链路层和IP层信息,DHCP SERVER无法区分出DHCP报文,因此终端发出的DHCP请求报文的UDP层中的SrcPort 为68,DstPort为67。即DHCP SERVER通过知名端口号67来判断一个报文是否是DHCP报文 5. DHCP SERVER给终端的响应报文将会根据DHCP报文中的内容决定是广播还是单播,一般都是广播形式: 5.1 广播封装时: 5.1.1 链路层的封装必须是广播形式 5.1.2 IP头中的DstIp填为有限的子网广播IP——全1(广播) 5.2 单播封装时 5.2.1 链路层的封装是单播形式(因为客户端在发送DHCP数据包的时候在链路层帧头填写了sourceMAC) 5.2.2 IP头中的DstIp填为有限的子网广播IP(全1)、或者是即将分配给用户的IP地址(当终端能够接收这样的IP报文时)
两种封装方式中的UDP层都是相同的,SrcPort 为67,DstPort为68。终端通过知名端口号68来判断一个报文是否是DHCP SERVER的响应报文
0x2: DHCP协议本身的报文格式
接下来继续学习在DHCP交互过程中,DHCP数据包本身的报文格式
1. OP: 1.1) client发送给server的封包,设为1 1.2) server发送给client的封包,设为2 2. HTYPE: 硬件类别 2.1) 1表示10Mb/s的以太网(Ethernet)的硬件地址 3. HLEN: 硬件地址长度、 3.1) Ethernet为6(字节) 4. HOPS: 跳数,若封包需经过router传送,每站加 1,若在同一网内,为0(客户端的初始设置为0) 5. XID: TRANSACTION ID(事务ID),DHCP REQUEST 时产生的数值,服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。以作 DHCPREPLY 时的依据 5. SECONDS: 由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数 6. FLAGS: 从0到15共16 bits 6.1) 最左1Bit为1时表示 server将以广播方式传送封包给client 6.2) 最左1Bit为0时表示 server将以单播方式传送封包给client 其余尚未使用。 7. ciaddr: 客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。即要是 client 端想继续使用之前取得的IP地址,则这个字段会被填充 8. yiaddr: 从server送回client的DHCP OFFER与DHCPACK封包中,此栏填写分配给client的IP地址。 9. siaddr: 表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。 10. giaddr:若需跨网域进行DHCP获取,此栏为 relay agent的地址,否则为0 11. chaddr: 客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。 12. sname: Server的名称字符串,由DHCP服务器填写,以0x00结尾。 13. file: 启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。 14. options: 允许厂商定议选项(Vendor-Specific Area),以提供更多的设定信息。 格式为CODE(占1字节)+LEN(占1字节)+VALUE(长度由LEN而定) 1) 1、4、Subnet Mask 2) 3、n*4、Router(网关) 3) 6、n*4、DNS Server 4) 7、n*4、Log Server 5) 26、2、Interface MTU 6) 33、n*8、Static route 7) 35、4、ARP cache timeout 8) 42、n*4、NTP servers 9) 51、4、IP address lease time 10) 53、1、Message type 10.1) 1: DHCPDISCOVER 10.2) 2: DHCPOFFER 10.3) 3: DHCPREQUEST 10.4) 4: DHCPDECLINE 10.5) 5: DHCPACK 10.6) 6: DHCPNAK 10.7) 7: DHCPRELEASE 10.8) 8: DHCPINFORM 11) 5、4、DHCP Server Identifier 12) 60、n、华为自定义: 可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。ME60收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。 13) 82、n、华为自定义:ME60作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址
从数据包格式的学习中我们可以看到,DHCP服务器除了进行IP分配之外,还会负责给客户端发送DNS服务器IP、默认网关IP、默认子网掩码之类的信息
0x3: DHCP报文类型
DHCP共有八种报文,不同报文之间的区别除了DHCP数据包本身之外,在封包上(UDP头,IP头、链路层头)也有一些差别
1. DHCP Discover DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。 2. DHCP Offer DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户(可以广播、也可以单播),告知用户本服务器可以为其提供IP地址。(注意,只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复) 3. DHCP Request 客户端会在两种情况下发送DHCP Request 1) DHCP客户端可能会收到来自DHCP服务器的很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。注意,"Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器"这里存在一个安全问题,如果我们的伪DHCP服务器能比原始DHCP服务器先发送Offer数据包,就能达到欺骗的目的,从而劫持目标用户的流量 2) 获取DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。 4. DHCP ACK DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录(即之前的预分配过程中登记的那个MAC),如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。 5. DHCP NAK 如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。 6. DHCP Release 当用户不再需要使用分配IP地址时,就会"主动"向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约(在数据库中清除某个MAC对某个IP的租约记录,这样,这个IP就可以分配给下一个请求租约的MAC) 7. DHCP Decline DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用,我们在手工设置静态IP、或者DHCP分配中有时会遇到"检测到IP冲突"的提示就是因为客户端利用ARP机制来在当前内网中确认当前指定的IP是否已经被占用 8. DHCP Inform DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端
3. DHCP服务器搭建
1. 修改DHCP服务器网卡配置:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改为:
DEVICE=eth0 BOOTPROTO=static HWADDR=00:0C:29:83:BB:21 ONBOOT=yes IPADDR=192.168.159.128 NETMASK=255.255.255.0 BROADCAST=192.168.159.255 GATEWAY=192.168.159.2
重启网络服务
service network restart
2. 安装DHCP服务
yum -y install dhcp*
3. 配置DHCP服务
vim /etc/dhcpd.conf
cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
vim /etc/dhcpd.conf
ddns-update-style interim; #定义所支持的DNS动态更新类型(必选),一般我们设置成关闭,interim和none都是关闭的意思 ignore client-updates; #忽略客户机更新DNS记录 subnet 192.168.159.0 netmask 255.255.255.0 #设置子网声明 { # --- default gateway option routers 192.168.159.2; #设置缺省网关 option subnet-mask 255.255.255.0; #设置客户端的子网掩码 option nis-domain "domain.org"; #为客户设置NIS域 option domain-name "LittleHann.com"; #为客户设置域名 option domain-name-servers 192.168.159.128; #为客户设置域名服务器(DNS)IP地址 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). Don't change this unless # -- you understand Netbios very well # option netbios-node-type 2; range dynamic-bootp 192.168.159.150 192.168.159.254; #设置动态的地址池 default-lease-time 21600; #设置缺省的地址租期 max-lease-time 43200; #设置客户端最长的地址租期 #这个域用于设置静态MAC-IP分配绑定,即我们前面说的管理员可以指定某些MAC静态分配一个IP,不变的 host target.host.com { hardware ethernet 00:0c:29:4b:5c:be; #指定dhcp客户的mac地址 fixed-address 192.168.63.130; #给指定的mac地址分配ip option host-name "target.host.com"; } }
启动DHCP服务:
service dhcpd start
重启网络:
service network restart
测试效果:
ifdown eth0
ifup eth0
可以看到,客户端成功从DHCP服务器获取到了IP地址
4. DHCP协商交互过程
这张有限状态机的转换图非常好的说明了DHCP的协商交互过程,我们用wireshark抓包软件来亲身实验一下DHCP的交互过程
0x1: DHCPDISCOVER
客户端在向内网中的DHCP服务器请求进行DHCP交互
0x2: DHCPOFFER
DHCP服务器对客户端的请求进行回应,在回应之前,DHCP会先对将要进行分配的IP进行ARP确认,确认当前子网没有客户端在使用这个IP
可以看到,DHCP的OFFER回应中包含了DNS服务器IP、默认网关等信息
0x3: DHCPREQUEST
客户端会选择"最先"接收到的OFFER数据包指示的IP地址,发起REQUEST请求,请求租约
0x4: DHCPASK
DHCP回应客户端的租约请求
同样,DHCP服务器的回应数据包中包含了DNS、子网掩码、网关、租约时间等信息
在确认租约之后,DHCP服务器还会发送一个PING包进行确认
以上就是客户端和DHCP服务器的租约交互过程,renew、lease过程原理类似,大家可以用wireshark抓包进行实验