一、DHCP基础原理

1.1 什么是DHCP

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一种基于UDP协议的应用层协议,核心作用是自动为局域网内的客户端(主机、终端设备)分配网络参数,无需手动配置,提升网络管理效率,避免IP地址冲突。

核心分配参数:IP地址、子网掩码、默认网关、DNS服务器地址、IP地址租期(租约)。

端口说明:DHCP服务端使用UDP 67端口监听请求,客户端使用UDP 68端口发送请求。

1.2 DHCP核心工作流程(DORA四步流程)

DHCP客户端获取IP地址的全过程,分为4个步骤,均基于广播(跨网段需中继)完成,称为DORA流程,是理解DHCP的核心:

  1. Discover(发现阶段):客户端启动后,未分配IP地址,以广播形式发送DHCP Discover报文,寻找局域网内可用的DHCP服务端(此时客户端使用0.0.0.0作为源IP,255.255.255.255作为目的广播IP)。

  2. Offer(提供阶段):DHCP服务端监听UDP 67端口,收到Discover报文后,从自身IP地址池中选取一个未分配的IP,搭配子网掩码、网关、DNS等参数,以广播/单播形式发送DHCP Offer报文,回应客户端。

  3. Request(请求阶段):客户端可能收到多个DHCP服务端的Offer报文,会选择其中一个(通常是第一个收到的),以广播形式发送DHCP Request报文,告知所有DHCP服务端“已选择某台服务端的IP”,同时请求确认分配。

  4. Ack(确认阶段):被选中的DHCP服务端收到Request报文后,确认该IP未被占用,以广播/单播形式发送DHCP Ack报文,正式将IP地址及相关参数分配给客户端,客户端接收后,即可使用该IP接入网络。

1.3 IP地址租期管理

DHCP分配的IP地址并非永久使用,而是有“租期”(默认通常为1小时~24小时,可手动配置),目的是避免IP地址浪费(如终端下线后,IP可回收重新分配)。

  • 续租时机:租期过半时,客户端会向分配IP的DHCP服务端发送续租请求(单播),服务端确认后,延长租期。

  • 续租失败:若租期过半未续租成功,租期剩余1/4时,客户端会再次发送续租请求;若租期结束仍未续租成功,客户端会释放该IP地址,重新执行DORA流程,获取新的IP。

二、Linux DHCP服务端配置(以CentOS 7/8为例,isc-dhcp-server)

Linux系统中,常用的DHCP服务端软件是isc-dhcp-server(dhcpd),以下是完整的安装、配置、启动流程,实操命令可直接复制使用。

2.1 安装DHCP服务端

通过yum仓库安装,确保系统能正常联网:

# CentOS 7/8 安装命令 yum install -y dhcp-server # Debian/Ubuntu 系统安装命令(备用) # apt install -y isc-dhcp-server

2.2 核心配置文件说明

DHCP服务端的核心配置文件为:/etc/dhcp/dhcpd.conf

默认情况下,该文件可能为空或只有注释,需手动编写配置;可参考模板文件(/usr/share/doc/dhcp-server/dhcpd.conf.example)修改。

配置文件结构:全局配置 → 网段声明(核心) → 固定IP绑定(可选)。

2.3 典型配置模板(常用场景)

以下配置适用于“单网段、固定地址池、绑定特定IP”的场景,修改括号内内容即可适配自身环境:

# 全局配置(作用于整个DHCP服务) ddns-update-style none; # 禁用DNS动态更新(无需DNS联动时开启) default-lease-time 600; # 默认租期(秒),600秒=10分钟 max-lease-time 7200; # 最大租期(秒),7200秒=2小时 authoritative; # 声明本服务端为该网段的权威DHCP服务器,拒绝其他服务端干扰 # 网段声明(核心,定义要分配的网段和参数) subnet 192.168.1.0 netmask 255.255.255.0 { # 目标网段(子网)和子网掩码 range 192.168.1.100 192.168.1.200; # IP地址池(可分配的IP范围,避免与网关、服务器静态IP冲突) option routers 192.168.1.1; # 客户端默认网关(通常是路由器/网关的静态IP) option subnet-mask 255.255.255.0; # 客户端子网掩码 option domain-name-servers 223.5.5.5, 8.8.8.8; # 客户端DNS服务器(阿里云+谷歌DNS,可替换) option broadcast-address 192.168.1.255; # 网段广播地址(自动计算可省略) } # 固定IP绑定(可选,适合服务器、打印机等需要固定IP的设备) host test-server { hardware ethernet 00:11:22:33:44:55; # 目标设备的MAC地址(通过ip addr查看) fixed-address 192.168.1.88; # 绑定的固定IP(需在网段内,且不在地址池范围内) }

2.4 配置监听网卡(可选,关键步骤)

DHCP服务端默认会监听所有网卡,若服务器有多个网卡,需指定“接入目标网段”的网卡,避免服务异常。

配置文件:/etc/sysconfig/dhcpd

# 编辑配置文件,添加监听网卡(ens33替换为自身网卡名称,通过ip addr查看) DHCPDARGS="ens33"

2.5 服务管理(启动、停止、开机自启)

# 启动DHCP服务 systemctl start dhcpd # 设为开机自启(避免重启系统后服务失效) systemctl enable dhcpd # 查看服务状态(确认服务是否正常启动,无报错) systemctl status dhcpd # 停止DHCP服务(如需修改配置,先停止服务) systemctl stop dhcpd # 重启DHCP服务(修改配置后,需重启服务生效) systemctl restart dhcpd

2.6 查看租约记录

DHCP服务端会记录所有已分配的IP租约信息,可通过租约文件查看,用于排错(如查看某IP分配给了哪个设备)。

# 租约文件路径 /var/lib/dhcpd/dhcpd.leases # 查看租约记录(实时查看最新记录) tail -f /var/lib/dhcpd/dhcpd.leases

三、DHCP中继(DHCP Relay)原理

3.1 为什么需要DHCP中继

DHCP协议的核心限制:DHCP请求是广播报文,而广播报文默认不能跨网段、跨VLAN传输(路由器会拦截广播报文,不转发到其他网段)。

问题场景:若企业网络分为多个VLAN(如办公网VLAN 10、服务器网VLAN 20),若每个VLAN都部署一台DHCP服务端,会增加管理成本,且不易统一维护。

解决方案:部署DHCP中继,实现“一台DHCP服务端,为多个跨网段、跨VLAN的客户端分配IP地址”,集中管理,降低维护成本。

3.2 DHCP中继核心原理

DHCP中继(也叫DHCP中继代理,dhcrelay),部署在“客户端网段与DHCP服务端网段之间”(通常是路由器或Linux服务器),核心作用是转发DHCP报文,将客户端的广播请求转为单播请求,转发给远端的DHCP服务端,再将服务端的回应转发给客户端。

DHCP中继工作流程(补充DORA流程,跨网段场景):

  1. 客户端(跨网段)发送DHCP Discover广播报文,被本地网段的DHCP中继接收;

  2. 中继将广播报文转为单播报文,添加自身IP信息,转发给远端的DHCP服务端;

  3. DHCP服务端收到单播请求后,根据客户端网段(通过中继IP识别),分配对应网段的IP及参数,以单播形式回应给中继;

  4. 中继将服务端的回应报文,转为广播报文,转发给客户端网段,客户端接收后完成IP获取。

3.3 DHCP中继核心要点

  • 中继本身不分配IP地址,仅负责转发DHCP报文;

  • 中继必须开启IP转发功能(否则无法跨网段转发报文);

  • 中继需明确指向DHCP服务端的IP地址(确保能与服务端正常通信);

  • DHCP服务端需配置“所有中继所覆盖的客户端网段”(即多个subnet声明),否则无法为跨网段客户端分配IP。

四、Linux DHCP中继配置(dhcrelay,CentOS 7/8为例)

Linux系统中,DHCP中继软件是dhcrelay,与DHCP服务端(dhcpd)同属一个安装包,安装dhcp-server后,即可使用dhcrelay,无需额外安装。

4.1 前提条件

  • 中继服务器需有两个及以上网卡(分别接入客户端网段和DHCP服务端网段);

  • 开启IP转发功能(核心,否则无法转发报文);

  • 中继服务器能与DHCP服务端正常通信(无防火墙拦截UDP 67/68端口)。

4.2 配置DHCP中继

DHCP中继的核心配置文件:/etc/sysconfig/dhcrelay

# 编辑中继配置文件 vim /etc/sysconfig/dhcrelay # 添加以下内容(修改为自身环境参数) INTERFACES="ens33 ens34" # 中继监听的网卡(ens33:客户端网段网卡;ens34:服务端网段网卡,用空格分隔) DHCPSERVERS="192.168.10.10" # 指向DHCP服务端的IP地址(必须是能与中继通信的IP)

4.3 开启IP转发功能(关键步骤)

临时开启(重启系统失效):

echo 1 > /proc/sys/net/ipv4/ip_forward

永久开启(重启系统生效):

# 编辑sysctl配置文件 vim /etc/sysctl.conf # 添加以下内容(开启IP转发) net.ipv4.ip_forward=1 # 使配置立即生效 sysctl -p

4.4 中继服务管理(启动、开机自启)

# 启动DHCP中继服务 systemctl start dhcrelay # 设为开机自启 systemctl enable dhcrelay # 查看中继服务状态(确认无报错) systemctl status dhcrelay # 停止、重启中继服务 systemctl stop dhcrelay systemctl restart dhcrelay

4.5 补充配置(DHCP服务端)

若要实现中继为多个网段分配IP,DHCP服务端需添加“所有客户端网段”的subnet声明,示例如下(新增VLAN 20网段192.168.20.0):

# 新增192.168.20.0网段声明(对应中继转发的客户端网段) subnet 192.168.20.0 netmask 255.255.255.0 { range 192.168.20.100 192.168.20.200; # 该网段的IP地址池 option routers 192.168.20.1; # 该网段的网关(通常是中继的客户端网段网卡IP) option subnet-mask 255.255.255.0; option domain-name-servers 223.5.5.5, 8.8.8.8; }

配置完成后,重启DHCP服务端(systemctl restart dhcpd),即可为跨网段客户端分配IP。

五、常见排错思路(重点,解决配置后无法获取IP的问题)

  1. 配置文件语法错误:使用命令 dhcpd -t 检查DHCP服务端配置文件语法,dhcrelay -t 检查中继配置文件,报错信息会明确指出错误位置。

  2. 地址池与网卡网段不匹配:DHCP服务端的subnet网段,必须与监听网卡的IP网段一致;否则服务无法启动,或无法分配IP。

  3. 防火墙拦截端口:DHCP依赖UDP 67(服务端)、UDP 68(客户端)端口,需放行这两个端口,命令如下: # 放行UDP 67/68端口(CentOS 7/8) firewall-cmd --permanent --add-port=67/udp firewall-cmd --permanent --add-port=68/udp firewall-cmd --reload

  4. DHCP中继未开IP转发:若中继未开启IP转发,报文无法跨网段转发,客户端无法获取IP,重新执行“开启IP转发”步骤即可。

  5. 中继指向的DHCP服务端IP错误:检查中继配置文件(/etc/sysconfig/dhcrelay)中的DHCPSERVERS参数,确保指向的是DHCP服务端的正确IP,且两者能ping通。

  6. 多DHCP服务端冲突:同一网段内若有多个DHCP服务端,会导致客户端获取IP异常,关闭多余的DHCP服务即可。

  7. 查看日志排错:Linux系统的DHCP相关日志存放在 /var/log/messages,通过日志可查看服务启动失败、报文转发异常等原因,命令:grep dhcp /var/log/messages

六、总结

  • DHCP核心:自动分配IP及网络参数,工作流程为DORA四步,依赖UDP 67/68端口。

  • Linux DHCP服务端:核心配置文件dhcpd.conf,关键是网段声明(subnet)和地址池(range)。

  • DHCP中继:解决广播报文跨网段问题,核心是转发报文、开启IP转发,指向DHCP服务端IP。

  • 排错重点:配置文件语法、端口放行、IP转发、网段匹配,日志是关键排查工具。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐