因为 ISC-DHCP-Sever 已经被官方终止维护,基于安全考虑,最近把 DHCP 服务器软件从 ISC-DHCP-Sever 迁移到了 Kea-DHCP。从日常的维护角度上来讲,因为Kea-DHCP 采用的是 JSON 格式的配置文件,迁移了之后,配置文件的结构更清晰,可读性改善了不少,如果要增加或者删除新的配置(如分配静态地址),很容易找到增加/修改的地方(个人感觉)。
不过随着使用时间的增加,渐渐发现了 Kea-DHCP 的一些问题,特别是当设备第一次通过Kea-DHCP获取IP地址的时候,可能需要等30秒以上,才能获取到IP地址,哪怕是那个设备是已经通过配置文件设定了静态IP,但在断开一段时间,后续再请求分配IP地址的时候,获取速度就很快。后来了解到,Kea-DHCP的分配机制是:
1、在收到客户端的请求后,Kea-DHCP 先检查自身是否有针对该客户端的租约记录(租约记录的文件在/etc/kea/dhcpv4.conf中的”lease-database”: { },部分进行配置),如果查询到有,则直接按租约记录文件里面的记录直接分配IP地址给到客户端,然后结束分配过程;
2、如果客户端没有在租约文件里面留下记录,则按顺序遍历地址池,即从池中的起始 IP 开始,依次往后分配,同时在分配过程中,为了避免出现冲突情况,Kea-DHCP 会查找可用的 IP 地址,导致首次分配出现延迟,不管客户端的MAC地址是否在静态分配IP地址之列;
3、客户端在第一次获取到IP地址之后,Kea-DHCP 会把相关记录写到租约文件里面。不过租约是有时间限制的,具体可以在/etc/kea/dhcpv4.conf进行设置,一旦过期,Kea-DHCP会把相关租约从租约文件里面删除。
基于上述过程,笔者大致知道设备第一次获取IP地址出现获取地址缓慢的原因了,就是无论设备是否在配置文件里面设定了静态分配IP地址,Kea-DHCP在收到请求的时候会在地址池中对不在租约文件里面的IP地址进行冲突探测,这个过程需要一些时间。那有没有办法让Kea-DHCP不对已经进行了静态分配的设备进行冲突检测呢?方法是有的,就是在配置文件内的”subnet4″之前(最好是在 “Dhcp4”: { 的下一行)添加一行配置:
“reservations-lookup-first”: true,
添加之后保存配置文件,并且执行 sudo systemctl restart kea-dhcp4-server 重启 Kea-DHCP 服务。重启之后,在配置文件里面已经定义好的静态分配设备,应该就可以很快地从Kea-DHCP获得IP地址了。不过需要注意的是,如果预留的 IP 已被其它设备占用(极少见),可能会导致分配失败。

