DHCP故障可分为服务器端(无法启动、无法分配IP)和客户端(无法获取IP)两类,以下是系统化的排查步骤:
检查服务状态
使用systemctl命令确认DHCP服务(服务器端为dhcpd或isc-dhcp-server,客户端为dhclient)是否运行:
sudo systemctl status dhcpd # 服务器端
sudo systemctl status dhclient # 客户端
若未运行,启动服务:sudo systemctl start dhcpd。
查看日志文件
日志是定位故障的关键,DHCP日志通常位于/var/log/syslog或/var/log/messages,使用grep过滤关键词:
sudo tail -f /var/log/syslog | grep dhcpd # 服务器端
sudo grep -i dhcp /var/log/syslog # 客户端
日志会提示具体错误(如配置语法错误、端口冲突)。
验证配置文件语法
DHCP服务器配置文件通常为/etc/dhcp/dhcpd.conf,使用dhcpd -t命令检查语法:
sudo dhcpd -t
若输出错误(如子网声明格式错误、重复IP声明),需修正后重启服务:sudo systemctl restart dhcpd。
检查网络接口绑定
确保DHCP服务绑定到正确的网络接口(如eth0),编辑/etc/default/dhcpd(或/etc/sysconfig/dhcpd,取决于发行版),确认DHCPDARGS参数:
DHCPDARGS="eth0" # 绑定到eth0接口
使用ip addr show eth0确认接口存在且处于UP状态:ip link set eth0 up(若未激活)。
确认IP地址池与端口
dhcpd.conf中的range(地址池)设置,确保IP范围未被其他设备占用(如range 192.168.1.100 192.168.1.200;)。ss -tuln | grep 67或netstat -tuln | grep 67检查DHCP服务器端口(UDP 67)是否监听:sudo ss -tuln | grep 67
若未监听,可能是配置文件错误或端口被占用。排查防火墙/SELinux限制
sudo ufw allow 67/udp # Ubuntu/Debian
sudo firewall-cmd --add-service=dhcp --permanent # CentOS/RHEL
sudo firewall-cmd --reload
setenforce 0,若故障消失,修改/etc/selinux/config将SELINUX=enforcing改为permissive。检查DHCP客户端服务
确保客户端服务运行:sudo systemctl status dhclient,若未运行则启动:sudo systemctl start dhclient。
手动触发DHCP请求
使用dhclient命令手动获取IP,观察输出是否有错误:
sudo dhclient -v eth0 # -v显示详细过程
若输出“no DHCPOFFERS received”,说明客户端未收到服务器响应。
查看客户端租约文件
租约文件/var/lib/dhcp/dhclient.leases记录了IP分配历史,检查是否有有效IP:
cat /var/lib/dhcp/dhclient.leases
若无有效IP,可能是服务器未响应或网络问题。
测试网络连通性与防火墙
ping 8.8.8.8测试客户端是否能连接外网(若无法ping通,可能是网络硬件问题)。sudo ufw disable(Ubuntu/Debian),确认是否为防火墙阻止了DHCP流量。sudo dhclient -r eth0 && sudo dhclient eth0;检查服务器地址池是否有重叠。tcpdump捕获流量:sudo tcpdump -i eth0 port 67 or port 68)。通过以上步骤,可覆盖绝大多数Linux DHCP故障场景。若问题仍未解决,建议结合日志信息进一步分析,或联系网络管理员排查中间设备问题。