第五章 DHCP服务
5.1 DHCP工作原理
5.1.1 DHCP功能
DHCP,动态主机控制协议,规定了客户端如何通过网络访问服务器,获取上网所需的ip地址等网络参数。
我们知道,一台主机若要正常上网,必须配置完整的ip、子网掩码、网关、DNS四个主要参数(网络参数请读者参阅TCP/IP协议相关知识)。在实际工作环境中,为了方便用户客户端上网,也为了简化网络维护人员的工作繁度,一般客户端网卡都是采用自动获取的方式获取到ip等参数的。如下图:
这就意味着客户主机的网卡,默认是无ip的,当该网卡连接上网线或wifi后,会自动向所连接的网络发送申请,请求网内的DHCP服务器为其分配一个ip地址。此时,网内事先搭建好的DHCP服务器就会接收捕获到该请求,即会从自己的ip地址池中拿出一个未被使用的ip分配给客户端网卡,并分配配套的掩码、网关、DNS等参数,这样客户端网卡就会暂时使用所获取到的ip及网络参数上网了。但是这个获取到的ip并不是永远给客户机使用的,它是以租借的形式给客户的,所以到期需要归还给DHCP服务器。那么,作为一名网络维护人员,只需要维护好网络内的DHCP服务器就好了,客户机的ip地址都是自动完成分配的,无需人为参与,减少了工作量、提高了效率。
总结就是,DHCP服务器负责给客户端网卡分配ip、掩码、网关、DNS等参数,当然这些参数必须符合客户机所在子网的网络环境,好让客户机可以按照TCP/IP协议正常上网。
其实,DHCP服务器可以给客户端分配的参数有很多,除了基本的四项参数外,还有时间服务器、wins服务器、域名等,可以说所有网络参数中,除了mac地址能给客户分配外,其他所有参数都可由DHCP服务器分配。再者,作为DHCP服务器,给客户端分配ip时是有必要做分配记录的,即哪个ip分配给了哪块网卡使用,这就需要收集网卡的mac地址以作记录(因为mac地址的唯一性)。所以当客户端申请ip时,会携带自己的网卡mac到服务器端,以便于服务器记录。
另外,客户端通过DHCP获取到ip的形式,被称为动态ip;客户端不使用DHCP,而配置固定ip的方式被称为静态ip(如上图中点击“使用下面的 ip地址”后,需要手动输入ip等参数)。
PS:本章内的理论原理,完全依托于TCP/IP协议栈的知识,所以需要各位读者首先复习一下OSI七层、TCP/IP四层的内容,再学习本章的以下内容。
5.1.2 DHCP工作原理
客户端向服务器申请ip,从过程上来讲,它们共经历了四次通信,才最终获得ip。四次通信的过程如下图:
图中可见,客户机申请ip的过程是:
1、Client向所在网络发送DHCPDISCOVER数据包,申请广播,会被Server捕获
2、Server给Client回复DHCPOFFER数据包,给客户端分配一个ip,询问其是否使用
3、Client收到offer后,给Server回复DHCPREQUEST数据包,请求使用Server刚才分配的ip
4、Server给Client回复DHCPACK数据包,确认让客户机使用ip。
我们可以想到,在以上四步的过程中,客户端是并未有ip的,所以它们之间的通信数据包都是以广播的形式发送,以保证相互之间可以接收到数据。
另外,这四个数据包,按照TCP/IP协议栈的分层结构,都是属于网络层rarp协议的,即遵守rarp协议的封装结构。
我们有些读者可能会问,客户端申请ip时,服务器直接分配就好了,经过两步就可以完成,为什么会用到四步通信呢?原因是,一个网络中为了解决DHCP服务器的异常故障,有时会同时架设两个或多个DHCP服务器(如上图),那么当客户端申请ip时,发送的discover广播多台服务器都会收到,就都会给客户端提供一个ip,这时一般客户端会选择最先收到的offer作为自己的选择ip,向该服务器发送request请求,则其他服务器就会把分配出去的ip回收,以备其他客户机使用。由此可见,四步通信步骤是必要的。
下面举例来深入查看一下这四次通信的具体数据包封装,假设dhcp服务器ip是192.168.10.1,则四次通信的细节如下:
图中,当客户端申请ip时,是不知道谁是DHCP服务的,且也不知道自己所在的网段是多少,所以封装包中的目的ip为255.255.255.255的全广播包;因为客户端暂无ip,所以数据包中的源ip填为0.0.0.0;并且discover数据中还携带者自己的mac地址。
图中offer包是由服务器发出的,因为服务器必须有固定ip,所以包中源ip是明确的,而客户端此时还没有ip,所以目的ip仍然写255.255.255.255的全广播地址。之下是给客户端分配的ip:192.168.1.101,以及子网掩码和租期,最后还有一个server identifier项,表示明确服务器的身份是192.168.1.1。
上图中,request包中客户端会向服务器发送所申请使用的ip,并通过server identifier指定要申请哪个服务器分配的ip。PS:则其他DHCP服务器就会收回分配了。
最后的ACK包,服务器就会确认让客户端使用ip了。同时还会给客户端分配网关、DNS等其他参数。PS:除了ip、掩码外,其他参数是在最后的ACK包中给客户端分配的。
客户端获取到ip后,可以在网卡的状态中查看得到获取到ip的信息,或者在cmd中使用ipconfig /all 查看网卡详细信息,如下图:
可见到DHCP服务器ip、租期等信息。
理解了客户端获取ip的过程,以上步骤都是在通信正常的前提下进行的,但是如果网络通信不通或服务器宕机了呢?那么客户端该如何处理通信不畅时的状况呢?下面来解释一下:
当客户端发送discover申请广播后,会等1s,看是否收到了服务器的offer,若没有,则再等1s后再发送一次,则等于发送后隔了2s再发的,若还收不到回复则再隔4s发discover,不行再隔8s发,不行再隔16s发。如此,总结就是隔了2s、4s、8s、16s,共发了5次discover,都收不到服务器的回复,则客户端会认为暂时与服务器断连,那么会临时给自己配一个169.254.X.X/255.255.0.0的B类ip,这个网段被称为自动私有ip。所以,在日常工作中,若发现某台主机无法上网,查看到该主机的网卡ip显示为169.254.X.X的话,则说明该主机获取ip失败,可能是网络通信故障或DHCP服务器宕机造成的。
那么,问题来了,既然客户端获取不到ip,为什么还要使用自动私有ip呢?原因是,当客户端获取失败时,虽然无法获取到网关和DNS信息,无法上网。但是同子网内的主机在都获取不到ip的情况下,都会临时使用169.254.X.X的地址,那么它们ip就都在同一网段了,符合同子网、同网段的通信规则(TCP/IP协议中的规则),所以子网内的主机仍是可以通信的。并且,在使用自动私有ip的同时,客户端仍会每5min重试一次discover。
再来介绍一下租期更新(又称租期续租)的机制。我们介绍过,客户端获取到ip是以租借的形式使用的,如果到期要归换给服务器,但客户机仍然需要上网,还要再次重新申请的话,那就十分网络浪费资源,且重新申请时会影响到客户端的上网,也增加了服务器的负担。所以,为了解决这种浪费,DHCP规定了一种自动续租的机制。续租时有两种情况未断网情况(即持续连接,主机未关机、断网)、租期内有断网重连现象(重启或重连)。
未断网的情况下,客户端会在租期的50%、87.5%、100%的三个时间点自动联系服务器申请续租,当然这三个时间点是依次续租的,一个时间点续租成功,就不会在后面的时间点续租了。续租成功的话,会自动重新计时。
有断网重连的情况下,当客户端重连后,会立即申请续租,成功后也会重新计时。续租失败,则会联系网关,成功则继续使用ip,等到最近的时间点自动续租,若联系网关失败,则会重新discover申请新的ip。
下面我们来举例说明两种情况,假设某主机某月1日获取到ip,租期8天,即使用期是1日-8日,那么它的续租机制如下:
未断网的情况:
可用租期1日-8日
50%点 即4日,client向Server发送DHCPRequest数据包请求续租,若服务器接收到,则会回复DHCPACK数据包确认续租,则租期重新计时,即更新至4日-12日。若未收到服务器回复,则视为更新失败,但ip继续使用。
87.5%点 即7日,当50%的点更新失败,会在87.5%时,即7日,client向Server发送DHCPRequest数据包请求续租,若成功接收DHCPACK回复,则重新计时,即7日-15日。若失败,仍继续使用ip
100%点 即8日,当87.5%的点更新失败,会在100%时,即8日,client向Server发送DHCPRequest数据包请求续租,若成功接收DHCPACK回复,则重新计时,即8日-16日。若失败,因为ip已到期,不可以继续使用了,所以只能重新discover申请。
有重连情况
可用租期1日-8日
5日重连,立即更新,client向Server发送DHCPRequest数据包请求续租,若成功接收DHCPACK回复,则重新计时,即5日-13日。若失败,客户端会考虑在断网期间是否主机被搬移了,即换子网了,所以更新失败后,客户端会联系网关,成功,则说明未被搬移,则ip继续使用,到最近的时间点,即87.5% 7日时自动更新。若联系网关失败,则主机认为断网期间被搬移了。所以原ip将不再使用,主机会重新discover申请ip。
再有就是,重连时如果已经出期了,那么ip一定会被服务器收回了,所以只能发送discover重新申请了。
在租期更新过程中,客户端发送的DHCPRequest包与服务器回复的DHCPACK包都是以单播形式发送的。因为更新时,客户端ip还在期内,还是有权利继续使用的,又明确知道服务器的ip,所以可以使用单播通信了。同时若某些网络参数发生了变化,会更新新的网络参数。具体封装如下图:
最后,再介绍一下DHCP的通信端口,它使用的是UDP的67、68端口。其中服务器使用UDP 67对外提供服务,客服端使用UDP 68申请ip。在这里需要说明的是,在TCP/IP协议中,一般服务器的服务进程都使用知名端口(1-1023),客户端进程使用动态端口(1024-65535)。但是,DHCP服务是为数不多的几个客户端进程仍然使用知名端口的几个服务之一。
好了,介绍了这么多,说明DHCP的理论部分是十分重要的,读者需要深入理解后,再学习下面实验部分的内容。
5.2 DHCP服务部署
本案例中DHCP服务器ip设定为192.168.10.1,其余客户端使用windows2003系统。
5.2.1 DHCP服务基本配置
DHCP服务的安装包,在CentOS的系统光盘上自带,所以配置好yum源后,可以直接yum安装:
yum -y install dhcp
安装完毕后,即可编辑DHCP配置文件设定地址池及各分配的参数了:
vi /etc/dhcp/dhcp.conf ---写入
subnet 192.168.10.0 netmask 255.255.255.0 ---创建地址池
---注:第一个地址池,必须和本机网卡ip在同一网段
{
range 192.168.10.100 192.168.10.200; ---设置地址池范围
option routers 192.168.10.254; ---设置网关
option domain-name-servers 8.8.8.8,9.9.9.9; ---设置dns
default-lease-time 86400;
---设置租期为1天,单位秒,不写该行,默认租期12个小时
}
注:该文件中的每个标点符号都是英文状态的;且每行最后是分号,表示本项结束;再者就是里面的单词拼写一定需要注意,不要写错。
保存退出后,可以启动服务了:
systemctl restart dhcpd ---启动服务
systemctl enable dhcpd
systemctl status dhcpd
lsof -i:67 ---查看端口状态及监听进程
netstat -anu | grep 67 ---抓取端口状态及进程
下面来使用windows客户端查看一下效果。
windows中设置网卡为自动获取,进入cmd命令界面。在cmd界面中,windows使用的网卡管理命令一般是ipconfig,它有几个常用格式或参数,具体如下:
ipconfig ---查看网卡基本参数
ipconfig /all ---查看网卡详细参数
ipconfig /release ---释放ip,即提前归还ip
ipconfig /renew ---更新或申请
注:执行该命令是,若是无ip状态,则申请ip,即发送discover,若有已有ip,则是手动更新租期,即发送request单播包请求更新。则无需等到50%等几个时间点客户端自动更新了。
所以我们为了查看获取效果,可以先ipconfig /release 释放原有ip后(怕是在DHCP服务器启动前,客户端网卡已经有其他ip存在,或是配置上了自动私有ip),再执行ipconfig /renew命令重新获取,结果如下:
使用ipconfig /all后可见到详细参数,如:DHCP服务器ip、DNS、租期等。再次执行ipconfig /all后见到租期更新续租了。