常见原因:配置文件语法错误、服务未启动、网络接口未绑定、端口被占用、SELinux/防火墙阻止。
解决方法:
systemctl status dhcpd(或isc-dhcp-server,取决于发行版)确认服务是否运行。未运行则用systemctl start dhcpd启动,并设置开机自启systemctl enable dhcpd。dhcpd -t(或dhcpd /etc/dhcp/dhcpd.conf)检查/etc/dhcp/dhcpd.conf是否有语法错误,根据提示修正(如子网声明格式错误、重复声明)。/etc/sysconfig/dhcpd(或/etc/default/isc-dhcp-server)中的DHCPDARGS参数,确保绑定了正确的网络接口(如eth0);用ip link确认接口处于UP状态(ip link set eth0 up)。ss -tuln | grep -E '67|68'查看UDP 67(服务器)、68(客户端)端口是否被占用,若有则停止占用程序或修改DHCP端口(需同步调整客户端配置)。setenforce 0)测试是否解决问题,若解决则修改/etc/selinux/config将SELINUX=enforcing改为permissive;用firewall-cmd --add-service=dhcp --permanent(Firewalld)或iptables -A INPUT -p udp --dport 67:68 -j ACCEPT(iptables)开放端口并重载规则。常见原因:DHCP服务器未运行/配置错误、客户端网络设置异常、地址池耗尽、防火墙阻止、IP冲突。
解决方法:
nmcli device show <接口>查看DHCP4是否为yes;Windows下用ipconfig /all确认“DHCP Enabled”为“是”)。ping 8.8.8.8检查是否能访问外网,traceroute 8.8.8.8排查中间网络设备问题(如路由器未转发DHCP请求)。dhcpd -t检查地址池范围(如range 192.168.1.100 192.168.1.200)是否合理,是否有足够空闲IP;用journalctl -u dhcpd查看日志是否有“no address available”提示。systemctl stop firewalld)测试是否解决问题;用ip addr检查客户端是否已获取IP,若有冲突则sudo dhclient -r释放IP,sudo dhclient重新获取。常见原因:多个设备分配了相同IP、DHCP地址池与静态IP重叠、客户端未释放旧IP。
解决方法:
journalctl -u dhcpd查看日志,搜索“duplicate IP”或“conflict”记录,获取冲突的MAC地址和IP。arp -a(Linux)或arp -a(Windows)查看冲突IP对应的MAC地址,定位是DHCP客户端还是静态配置的设备。sudo dhclient -r释放IP,sudo dhclient重新获取;在DHCP服务器地址池中用deny members of "冲突MAC地址"排除该MAC地址的IP分配(可选)。常见原因:子网声明错误、参数配置不当(如网关/DNS错误)、文件权限问题。
解决方法:
dhcpd -t检查/etc/dhcp/dhcpd.conf,确保无语法错误(如缺少}、IP格式错误)。subnet、range、option routers(网关)、option domain-name-servers(DNS),例如:subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
/etc/dhcp/dhcpd.conf属于root用户且权限为644(chown root:root /etc/dhcp/dhcpd.conf; chmod 644 /etc/dhcp/dhcpd.conf)。关键日志路径:/var/log/syslog(Ubuntu/Debian)、/var/log/messages(CentOS/RHEL)。
解决方法:
tail -f /var/log/syslog | grep dhcpd(或journalctl -u dhcpd)实时查看DHCP服务日志,根据错误信息定位问题(如“cannot bind to port 67”表示端口被占用,“no subnet declaration”表示子网配置缺失)。