DHCP(Dynamic Host Configuration Protocol)是一种集中对用户IP地址动态管理和配置的技术。
DHCP采用客户端/服务器通信模式,由DHCP Client向DHCP Server提出申请,Server返回为Client分配的配置信息(包括IP地址、缺省网关、DNS Server、WINS Server等参数),可实现IP地址动态分配,以及其他网络参数的集中配置管理。
DHCP原理
DHCP报文
目前DHCP定义了八种类型报文,DHCP Client和DHCP Server通过这八种类型报文进行通信。
- DHCP REQUEST
-
客户端初始化后,发送广播的DHCP REQUEST报文来回应服务器的DHCP OFFER报文。
-
客户端重启后,发送广播的DHCP REQUEST报文来确认先前被分配的IP地址等配置信息。
-
当客户端已经和某个IP地址绑定后,发送DHCP REQUEST单播或广播报文来更新IP地址的租约。
- DHCP RELEASE
客户端可通过发送此报文主动释放服务器分配给它的IP地址,当服务器收到此报文后,可将这个IP地址分配给其它的客户端。
- DHCP OFFER
DHCP服务器用来响应DHCP DISCOVER报文,此报文携带了各种配置信息。
- DHCP NAK
服务器对客户端的DHCP REQUEST报文的拒绝响应报文,例如DHCP服务器收到DHCP REQUEST报文后,没有找到相应的租约记录,则发送DHCP NAK报文作为应答,告知DHCP客户端无法分配合适IP地址。
- DHCP INFORM
DHCP客户端获取IP地址后,如果需要向DHCP服务器获取更为详细的配置信息(网关地址、DNS服务器地址),则向DHCP服务器发送DHCP INFORM请求报文。
- DHCP DISCOVER
DHCP客户端首次登录网络时进行DHCP交互过程发送的第一个报文,用来寻找DHCP服务器。
- DHCP DECLINE
当客户端发现服务器分配给它的IP地址发生冲突时会通过发送此报文来通知服务器,并且会重新向服务器申请地址。
- DHCP ACK
服务器对客户端的DHCP REQUEST报文的确认响应报文,客户端收到此报文后,才真正获得了IP地址和相关的配置信息。
DHCP获取地址
DHCP客户端首次接入网络时,经过四个阶段与DHCP服务器交互DHCP报文,从而获取到IP地址等网络参数。
- 发现阶段
DHCP Client(0.0.0.0:68) → DHCP Server(255.255.255.255:67)
DHCP Client启动时,由于没有IP地址,会自动发送以discover的广播报文,网络上的所有支持TCP/IP的主机都会收到该DHCP Discovery报文,但是只有DHCP Server会响应该报文。
- 提供阶段
DHCP Server(server_ip:67) → DHCP Client(255.255.255.255:68)
所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。
DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。
- 选择阶段
DHCP Client(0.0.0.0:68) → DHCP Server(255.255.255.255:67)
DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。DHCP Client会发出一个广播的DHCP Request报文,在选项(option)字段中会加入选中的DHCP Server的IP地址和需要的IP地址。
- 确认阶段
DHCP Server(server_ip:67) → DHCP Client(255.255.255.255:68)
DHCP Server收到DHCP Request报文后,判断选项(option)字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。
DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DECLINE报文,并重新向服务器请求IP地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。
注意:
目的IP地址都是广播地址255.255.255.255,这在发现阶段中是因为不知晓DHCP服务器地址,在提供阶段中是因为客户机还没有IP地址,在选择阶段中是因为客户机要通知子网中的所有DHCP服务器自己选中了某个特定的DHCP提供,在确认中是因为客户机还没确定IP地址。
DHCP租期更新
DHCP服务器分配给客户端的IP地址有一定的租借期限,当租借期满后服务器会收回该IP地址。为了延长DHCP客户端使用该地址的期限,需要更新IP地址租约。
1. 当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
2. 当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
3. 如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。
客户端在租期时间到之前,如果用户不想使用分配的IP地址(例如客户端网络位置需要变更),会触发DHCP客户端向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租期。DHCP服务器会保留这个DHCP客户端的配置信息,将IP地址列为曾经分配过的IP地址中,以便后续重新分配给该客户端或其他客户端。
客户端可以通过发送DHCP INFORM报文向服务器请求更新配置信息。
DHCP释放地址
DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配
DHCP配置
DHCP主要文件
/etc/dhcp/dhcpd.conf #主配置文件
/usr/lib/systemd/system/dhcpd.service #服务
/usr/sbin/dhcpd #应用
/usr/share/doc/dhcp-server/dhcpd.conf.example #模板文件
/var/lib/dhcpd/dhcpd.lease #租约文件
DHCP配置详解
定义网络
subnet [网络号] netmask [子网掩码] {
range [起始IP地址] [结束IP地址] #地址范围
option routers [IP地址] #网关
option domain-name [域名] #域名服务器
option domain-name-servers [IP地址] #域名服务器IP地址
default-lease-time [数字] #默认租约时间
max-lease-time [数字] #最大祖约时间
}
地址绑定
host [主机名]{
hardware [硬件类型] #客户机硬件地址
fixed-address [IP地址] #客户机绑定IP地址
}
网络引导
host[主机名]{
hardware [硬件类型] #硬件地址
filename [启动文件] #引导文件
next-server [IP地址] #服务器地址
}
日志定义
log-facility local7 #默认local7
DHCP配置实例
搭建DHCP服务器,网络10.10.10.0/24;网关10.10.10.254;DNS为8.8.8.8, 114.114.114.114;并绑定10.10.10.100地址。
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf
option domain-name-servers 8.8.8.8, 114.114.114.114;
default-lease-time 600;
max-lease-time 7200;
subnet 10.10.10.0 netmask 255.255.255.0 {
range 10.10.10.11 10.10.10.100;
option routers 10.10.10.254;
option broadcast-address 10.10.10.255;
default-lease-time 600;
max-lease-time 7200;
}
host dhcpserver {
hardware ethernet 00:0c:29:ab:ba:18;
fixed-address 10.10.10.100;
}
[root@localhost ~]# systemctl start dhcpd