一、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租约过程,分为四个步骤:
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.240到192.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 也可以看到分配的租期数据库。