笔者家里的 DHCP 服务是一台基于 Ubuntu Server 下的 ISC DHCP 服务器系统(isc-dhcp-server)提供的,昨天下班后,拿起手机想看个短视频,发现手机无法正常使用无线网络,原因是无法从DHCP服务器获取IP地址。
难道是 DHCP服务器没电?结合昨天下班时分曾经电闪雷鸣,狂风暴雨,有可能出现过断电的情况,后来问了一下家人,得知由于供电的不稳定,家里和周边区域发生了好几次的断电情况,并且过了几秒钟之后就恢复供电。于是走过去机柜看了一下 DHCP 服务器工作指示灯的情况,感觉有点异常,网卡灯和硬盘灯有点懒懒散散的。由于没有接显示器,不知道断电后系统是否能正常启动,于是找来一个便携式投影机以及键盘,接到 DHCP 服务器上查看启动情况,发现系统已经启动成功,并且可以正常登录控制台。在 DHCP 服务器 ping 一下外网域名,可以正常 ping 通,说明网络连接和 DNS 服务都没有问题。由于临近吃饭时间,没那么多心思放在寻找问题原因的身上,只想尽快解决问题,于是就执行了一下重启操作,重启 DHCP 服务器后,DHCP 服务恢复正常,可以分配 IP 地址了。
但没过多久,家里又突然断电,同样很快地过了几秒就恢复供电了,但同样的也发现当所有的网络设备都启动成功后,所有的客户端都无法从 DHCP 服务器获取 IP 地址,这下就真的不得不花多一点时间去研究这个问题。这次没有接投影机和键盘了,而是直接打开电脑,手动给电脑分配一个可以正常使用的 IP 地址之后,使用 ssh 连接 DHCP 服务器,执行“systemctl status isc-dhcp-server”查看 DHCP 服务状态,奇怪的是,系统显示 isc-dhcp-server 的运行是正常的,并且没有任何的错误提示。执行了一下“sudo systemctl restart isc-dhcp-server”重启服务之后,客户端又可以正常地从 DHCP 服务器拿到 IP 地址了。
造成这种问题的原因是什么呢?个人猜测如下:
DHCP 服务初始化时的接口状态问题:
DHCP 服务器启动时,交换机接口尚未启动,导致 DHCP 服务无法正确绑定到网络接口,即使交换机后来启动完成,DHCP 服务仍保持初始的错误状态;
DHCP 租约数据库锁定:
服务器启动时可能以某种错误状态初始化了租约数据库,需要重启服务才能释放锁定;
DHCP 中继与服务器同步问题:
服务器启动时没有检测到中继代理,导致相关配置未激活;
网络接口检测机制:
isc-dhcp-server 可能在启动时检测一次接口状态,之后不再重新检测。
基于以上问题的考虑,笔者尝试编辑一下 isc-dhcp-server.service 服务,添加网络就绪依赖,后续再观察具体效果如何(不想花时间重启测试了):
执行“sudo systemctl edit isc-dhcp-server.service”,添加以下配置:
[Unit]
After=network-online.target
Wants=network-online.target
保存退出后执行“sudo systemctl restart isc-dhcp-server”重启 DHCP 服务。
