名称:DHCP – Dynamic Host Configuration Protocol 动态主机配置协议
功能:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工做, 主要有两个用途:
一、 给内部网络或网络服务供应商自动分配IP地址,主机名,DNS服务器,域名
二、 配和其它服务,实现集成化管理功能。如:无人执守安装服务器数据库
DHCP是一个C/S架构的协议,DHCP服务器端使用UDP的67号端口; DHCP 客户端使用UDP的68号端口。vim
①DHCP服务器用于为客户机动态分配IP地址,避免了TCP/IP网络中地址的冲突,便于对网络的IP地址进行管理;
②在使用TCP/IP协议通讯的网络中,每台计算机都必须至少有一个IP地址,这样才能与其余计算机通讯。对于一个较大规模的网络来讲,逐个地为每台计算机分配和设置IP地址,将是一件很麻烦的事情,也不便于管理和维护;
③对于像笔记本这样的移动用户,常常从一个子网移动到另外一个子网,须要不断地手动更换IP地址,很不方便;
④DHCP服务器经过动态的IP地址分配还能解决IP地址资源不足的状况,所以DHCP产生了。windows
咱们看下面的图,客户端从DHCP服务器获取IP地址的过程咱们称为DHCP租约过程,分为四个步骤:服务器
一、客户发出的IP租用请求报文网络
DHCP客户机初始化TCP/IP,经过UDP端口67向网络中发送一个DHCP DISCOVER广播包,请求租用IP地址。该 广播包中的源IP地址为0.0.0.0,目标IP地址为255.255.255.255;包中还包含客户机的MAC地址和计算机名。架构
二、DHCP Server回应的IP租用提供报文dom
任何接收到DHCP DISCOVER广播包而且可以提供IP地址的DHCP服务器,都会经过UDP端口68给客户机回应一个DHCP OFFER广播包,提供一个IP地址。该广播包的源IP地址为DHCP服务器IP,目标IP地址为255.255.255.255;包中还包含提供的IP地址、子网掩码及租期等信息。ide
三、客户选择IP租用报文测试
客户机从不止一台DHCP服务器接收到提供以后,会选择第一个收到的DHCP OFFER包,并向网络中广播一个 DHCP REQUEST消息包,代表本身已经接受了一个DHCP服务器提供的IP地址。该广播包中包含所接受的IP地址和服务器的IP地址。 全部其余的DHCP服务器撤消它们的提供以便将IP地址提供给下一次IP租用请求。gradle
四、DHCP服务器发出IP租用确认报文
被客户机选择的DHCP服务器在收到DHCP REQUEST广播后,会广播返回给客户机一个DHCP ACK消息包,代表已经接受客户机的选择,并将这一IP地址的合法租用以及其余的配置信息都放入该广播包发给客户机。
五、客户配置成功后发出的公告报文
客户机在收到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地址段。
(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网络的主机为广播通讯)。
[root@localhost ~]# yum -y install 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中继程序,可执行文件
[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 日志信息
一、每一行必须以分号 ; 结尾。只能经过/var/log/messages文件查看是否有错误
二、全局参数对全局生效,当全局配置与局部配置冲突时,局部参数将覆盖全局参数。
三、局部配置必须包含在 花括号 中,其余都是全局配置
指令 说明
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中没有定义的时候生效。当内部定义后,则匹配最精确的,也就是自身定义的。
[root@localhost ~]# vim /etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=eth0 #绑定网卡名称
[root@localhost ~]# service dhcpd start
[root@localhost ~]# ss -tulpn | grep dhcp
udp UNCONN 0 0 *:67 *:* users:(("dhcpd",27249,7)
做为服务器端的租约文件:/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,而后再启动守护进程。
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 客户,须要修改/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 也能够看到分配的租期数据库。