一、DHCP服务器
DCHP(Dynamic Host Configuration Protocol),动态主机配置协议。
1、DHCP八种报文
-
DHCP DISCOVER:客户端到服务器
-
DHCP OFFER :服务器到客户端
-
DHCP REQUEST:客户端到服务器
-
DHCP ACK :服务器到客户端
-
DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
-
DHCP DECLINE :客户端到服务器,指示地址已被使用
-
DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间
-
DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到
2、DHCP工作流程
2.1、客户端发送请求
当DHCP客户机第一次登陆网络时,如客户机上无任何IP信息设定,它会以广播形式向网络发送DHCP DISCVER数据包,这个广播包,只有DHCP服务器才会响应,其它主机收到后直接丢弃。
2.2、DHCP服务器回应
DHCP服务器收到客户端的广播包后,会进行下面3个操作:
-
查看自动分配记录,根据有没有该用户(MAC地址)的记录,如果有,并且对应的IP地址目前还没有分配出去,就把该IP及相关信息分配给该用户
-
查看绑定记录,如果有该客户端的MAC地址绑定记录,就把对应的IP分配给客户端。
-
如果没有记录,它会从地址范围中选择可用IP及其它TCP/IP设定以DHCP OFFER数据包形式发送给客户机。
2.3、客户端选择
如果有多台DHCP服务器,都收到了客户端请求,并且都为该客户端分配了IP,客户端只会接受最先收到的那一个。然后再发送一个DHCPREUQEST广播包,向整个网络宣告自己将使用哪一台DHCP服务器提供的IP地址。当其它DHCP服务器收到这个包后,就收回向该客户端发送的IP租约。
同时,客户端还会向网络发送ARP广播数据包,查询网络上有没有其它机器使用该IP地址,如何发现此IP已经被占用,客户端则会发送一个DHCP DECLINE数据包给DHCP服务器,拒绝接受其DHCP OFFER,并重新发送DHCP REQUEST信息
客户端可以保留自己的一些TCP/IP设定,如网关,DHS地址等
2.4、服务器确认
当被客户端接受的DHCP服务器收到客户端发送的DHCPREQUEST包后,DHCP服务器会发送一个DHCP ACK消息,以确认IP租约正式生效,结束完整的DHCP工作过程。
2.5、客户端重新登陆
DHCP客户端成功地从服务器取得IP地址后,一般不需要再发送DHCP DISCOVER信息,除非租约已经到期或者IP地址重新设定回0.0.0.0
此时客户端会直接使用已经租用到的IP地址向为其发放此IP地址的DHCP服务器发出DHCP REQUEST信息。
当DHCP服务器收到这一信息后,它会尝试让DHCP客户端继续使用原来的IP地址,并回答一个DHCP ACK确认信息继续使用IP。
如果此IP地址已无法再分配给原来的DHCP客户端使用(比如该IP地址已分配给其他DHCP客户端使用),则DHCP服务器给DHCP客户端回答一个DHCP NACK否认信息。
当客户端收到DHCP NACK否认信息,必须重新发送DHCP discover信息来请求新的IP地址。
注意:
-
客户端执行DHCP DISCOVER后,如果没有DHCP服务器响应客户端请求,客户端会随机使用169.254.0.0/16网段中的一个IP地址配置本机地址
2.6、续租
为了防止一些用户长期占用IP,所以需要设定一个租约时间,租约时间有两种方式:
-
DHCP服务器分配IP时指定
-
客户端发送请求的时候,自己指定
续租方式:
-
50%,客户端在租赁时间达到50%时来续租,向DHCP服务器发向新的DHCPREQUEST请求(单播)。如果无特殊情况,dhcp服务则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期
-
87.5%:如果上一次的续租请求没有收到回应,等到租约期的7/8时,主机会再发送一次广播请求。
3、配置DHCP服务器
3.1、装包
yum install -y dhcp
3.2、修改配置文件
#默认配置文件里是空的,可拷贝模板文件,再进行修改
cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example \
/etc/dhcp/dhcpd.conf
#修改配置文件
vim /etc/dhcp/dhcpd.conf
#DHCP和DNS服务器同步更新,也就是动态DNS,如果要开启,将none改成interim
ddns-update-style none;
#忽略客户端更新DNS记录
ignore client-updata;
#默认租约为3天,以秒为单位
default-lease-time 259200;
#最大租约为6天,客户端申请租约限制,如果客户端请求未明确租约时间,采用默认租约
max-lease-time 518400;
#网关
option routers 10.0.0.1;
#搜索域
option domain-name “example.com”;
#DNS,以逗号分隔
option domain-name-servers 114.114.114.114,223.5.5.5;
以上为全局配置,下面subnet里面的局部配置会覆盖全局配置。
#定义作用域,声明一个子网
#指定IP范围
#配置选项:网关、dns
#配置参数:租期
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.20;
option routers 10.0.0.254;
option domain-name-servers 8.8.8.8,8.8.4.4;
default-lease-time 7200;
注意:
-
子网网络号必须和DHCP主机相同,否则启动服务报错
#声明一个host,也就是定义保留地址
host node1 {
#MAC地址
hardware ethernet 00:0c:29:38:ae:a6;
#绑定的IP
fixed-address10.0.0.100;
#为客户端主机指定hostname
#注意,客户端主机当前的/etc/hostname文件内必须是localhost.localdomain,才会生效;否则,dhcp client会认为不允许修改,所以不会更新。
option host-name "xx";
}
注意:
-
DHCP服务器会先查找固定IP地址的host语句,如果没有对应的host语句匹配,才会查非固定地址的声明。
-
为了防止IP地址冲突,DHCP服务器会先向准备分配的IP地址发送一个ICMP ECHO请求,如果1秒内没有收到ICMP ECHO REPLY信息,表示这个IP没有被使用。否则,会将此IP标记为“废弃地址”,不再把它分配给客户端,只到没有可用的地址时,才会将此IP重新标记为“可用”。
3.3、重启DHCP服务,并开机启动
systemctl restart dhcpd
systemctl enable dhcpd
4、客户端设置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp
#重启网络
systemctl restart network
#查看DNS
cat /etc/resolv.conf
#查看DHCP相关信息
cat /var/lib/dhclient/dhclient-eth0.leases
lease {
interface "eno16777736";
fixed-address 172.25.254.147;
option subnet-mask 255.255.255.0;
option routers 172.25.254.2;
option dhcp-lease-time 1800;
option dhcp-message-type 5;
option domain-name-servers 172.25.254.2;
option dhcp-server-identifier 172.25.254.254;
option broadcast-address 172.25.254.255;
option domain-name "localdomain";
#续约时间
renew 5 2018/10/19 02:18:04;
#如果服务器没有响应,或响应IP已经分给别人了,重新绑定一个新IP
rebind 5 2018/10/19 02:31:45;
#过期时间
expire 5 2018/10/19 02:35:30;
}
5、在DHCP服务器查看分配状态
#查看租期数据库
cat /var/lib/dhcpd/dhcpd.leases
-
starts,租约开始时间
-
ends,租约结束时间。
-
Tstp,Time Sent To Partner,发送给合作伙伴的时间,用于dhcp集群。
-
cltt,Client Last Transaction Time,客户端最后一次续约时间。
-
binding state,声明当前租约的绑定状态,free,表示租约可供客户使用;active,表示DHCP客户端当前正在使用该租约
-
next binding state,当前租约到期时的后续绑定状态
注意:
-
租期数据库中所用的时间是格林威治标准时间(GMT),不是本地时间
#查看日志
systemctl status dhcpd