Rocky Linux 9 DHCP服务部署完全指南:从原理到排错

发布时间:2026/10/13 7:20:28
Rocky Linux 9 DHCP服务部署完全指南:从原理到排错 直接开始写这篇博文。围绕“Rocky Linux DHCP服务部署完全指南”这个标题我结合自己实际部署和维护的经验把从原理、环境准备、配置细节到排错经验一次讲透。本文的场景设定是给某公司内部办公网段部署一台DHCP服务器整个部署过程在Rocky Linux 9环境下完成。1. 项目整体思路与核心需求拆解1.1 为什么选Rocky Linux做DHCP服务先说结论Rocky Linux作为RHEL的下游发行版和CentOS停更之前的用法几乎无缝衔接尤其是对做惯了CentOS 7运维的人来说迁移成本极低。我这次给公司部署内部DHCP服务器直接选了Rocky Linux 9原因有三点第一稳定性。DHCP服务属于基础设施里的基础设施挂了就是全网断网级别的故障选发行版必须优先看生命周期和稳定性。Rocky Linux 9的支持周期到2032年对多数企业的硬件更替节奏来说基本够用。第二生态兼容。很多老运维的脚本、监控模板、自动化工具都是基于RHEL系写的Rocky Linux可以直接复用不需要像切Debian那套体系一样重写一堆东西。我这边现有的Ansible Playbook改个主机名就能跑。第三仓库里的软件包足够直接。Rocky Linux 9的AppStream仓库里就有dhcp-server包配好源之后一条命令装完不像某些发行版还需要额外加第三方源。虽然DHCP服务本身不是什么新东西但“开箱即用”在运维里能省不少事。选型时也对比过别的方案有人建议用dnsmasq做DHCP轻量、配置简单但功能边界很明确——dnsmasq更适合小型局域网和临时环境租约管理、多网段中继、复杂选项下发这些能力偏弱。用正式dhcpd的好处是配置虽然略复杂但上限高后面要加Option 82中继、多级作用域、动态DNS更新时不会被工具本身卡住。1.2 DHCP服务到底解决什么问题网络里没人手动配IP的机器一多手工管理就是灾难。DHCP的核心价值本质上是三件事自动分配IP地址、下发网络参数、集中管理地址占用情况。打个比方DHCP服务器就像酒店的客房前台客人终端设备进门说“我要个房间”前台从可用的房态表地址池里挑一间登记给客人同时告诉客人餐厅在哪、Wi-Fi密码是什么网关、DNS、路由等选项。客人退房租约释放后房间重新回到可用房态表里可以分给下一位客人。这个机制在企业里的直接收益是新电脑插上网线就能上网不用IT一个个去按键盘员工私自改IP导致的冲突大幅减少IP资源的使用情况可以随时查哪个IP分给哪台设备一目了然。设计部署方案时需要明确几个需求点服务对象办公区有线终端、无线接入点、打印机等设备。地址池规划办公网段用/24掩码地址范围从193开始往后分配避开前面一段保留给静态设备的地址。下发的参数除了IP和掩码还要下发网关、DNS、域名后缀以及租约时间。高可用预期一期先做单机预留双机热备的扩展空间。1.3 DHCP工作流程简述要配好DHCP至少得知道它在网络里是怎么跑的。标准的DHCP交互流程就是常说的DORA四个阶段Discover客户端开机后发广播问“网段里有DHCP服务器吗”Offer服务器收到广播后从地址池里挑一个空闲IP带着参数回应“这个IP给你用配套参数在这。”Request客户端选中的offer如果有多个服务器响应再广播一次“我选这台服务器的这个IP。”Acknowledge服务器收到Request后正式确认把租约记到数据库里。这里有个很容易被忽略的点客户端发Discover时源IP是0.0.0.0目标IP是255.255.255.255广播地址所以DHCP服务天然依赖广播通信。这也解释了为什么跨网段部署DHCP必须配中继DHCP Relay——路由器默认不会把广播转发到别的网段。理解这个流程对后面排错很有帮助。比如客户端拿不到IP的时候第一反应应该是抓包看DORA走到哪一步断了是压根没收到Offer还是发了Request没收到Ack。不同阶段的故障原因差别很大后面排查部分会细讲。2. 环境准备与安装配置要点2.1 服务器基础环境设置我在实际部署中用的是一台2核4G的虚拟机磁盘40G系统装的是Rocky Linux 9.3最小化安装。硬件指标上DHCP服务很省资源没有必要用大机器但这个角色必须稳定所以虚拟化平台一定要给它设好开机自启和资源预留。系统装完后的第一件事是配好固定IP。这一步必须在装DHCP之前就完成千万别先启网卡拿了DHCP地址再做服务器——市面上绝大多数“DHCP服务器启动失败”的坑都是因为服务器自己的网卡是从别处拿的IP或者IP和地址池冲突导致的。我给这台服务器的网卡配置的静态地址是192.168.80.10/24和客户端同一个广播域。配置文件在/etc/NetworkManager/system-connections/下面用nmcli操作更省事nmcli con mod ens160 ipv4.addresses 192.168.80.10/24 nmcli con mod ens160 ipv4.gateway 192.168.80.2 nmcli con mod ens160 ipv4.dns 192.168.80.2 223.5.5.5 nmcli con mod ens160 ipv4.method manual nmcli con up ens160这里把网关和主DNS都指向公司原有的网关设备以保证DHCP服务器自身能正常上网和解析。确认配置生效后再关掉SELinux或者放行相关端口。SELinux这一项容易坑到新人——dhcpd在SELinux enforcing状态下需要放行dhcpd的监听端口否则服务起来后外部请求直接被拦。我这边直接对dhcpd模块放行setsebool -P dhcpd_use_dns 1如果你不想折腾SELinux至少也要保证端口67/udp通畅。Rocky Linux默认的firewalld要放行DHCP服务firewall-cmd --permanent --add-servicedhcp firewall-cmd --reload2.2 安装DHCP服务器软件包Rocky Linux 9安装dhcp-server很简单dnf一条命令dnf install dhcp-server -y装完后系统里会出现两个关键文件/etc/dhcp/dhcpd.conf主配置文件/usr/lib/systemd/system/dhcpd.servicesystemd服务单元一个常见的疑问是为什么不直接装dhcp包在RHEL系发行版上dhcp包是客户端工具dhcp-server才是真正的服务端。初次安装的人经常装了个客户端然后抱怨“怎么没有dhcpd服务”这个问题我至少见过三次。用rpm -ql dhcp-server可以确认装出来的文件路径。安装完成后先别急着启动。默认的dhcpd.conf里几乎没有有效配置直接启动必然失败。这是RHEL系的一个老传统——提供一个需要你自己填写的样板文件而不是一个开箱即用的配置。下面进入核心的配置环节。3. 配置dhcpd.conf的核心细节解析3.1 全局参数的正确写法dhcpd.conf是DHCP服务的灵魂所有分配策略都在这个文件里描述。它的语法整体不复杂但有几个参数的含义和优先级必须搞清楚否则后面会出各种莫名其妙的问题。首先是租约时间配置。我所在公司办公网用的是默认两小时租约但配置文件里我建议统一显式写明default-lease-time 7200; max-lease-time 86400;第一个参数是客户端没有主动申请租期时的默认租期单位秒7200秒2小时。第二个参数是客户端要求延长租期时能给出的上限86400秒24小时。这里有个设计逻辑短租约适合地址池紧张、设备流动性大的场景释放回收快长租约适合MAC地址基本固定、IP资源充裕的场景减少续租广播流量。实际调优的时候要有自己的判断。比如访客Wi-Fi网段地址池小、设备来去频繁我会把default-lease-time压到1800秒而打印机、门禁控制器这类长期在线且IP最好别变的设备可以单独为它们划子池把租期放宽到7天。其次是日志输出。默认情况下dhcpd的日志都走syslog到/var/log/messages排查问题时要不停翻tail。为了让排错更方便我通常会在配置文件里单独指定一个日志文件log-facility local7;然后修改/etc/rsyslog.conf加一行规则把local7的日志单独输出到/var/log/dhcpd.log。这个习惯在我管理多台DHCP服务器时帮了大忙——不同服务器的日志分开存对比频率、排查冲突时不用在一堆无关日志里大海捞针。最后是权威声明。在单DHCP服务器接入现有网络时如果没有“我不知道这个网段还有别的DHCP服务器”的把握千万别轻易写authoritative。我见过同事在改造老网络时直接加了这个参数导致网段里原本那台老DHCP服务器直接罢工全网断了十几分钟。正确姿势是确认全网只有这一台DHCP后再把它加上让服务器对错误请求回NAK。3.2 作用域和地址池声明配置文件里最核心的结构是subnet段它声明了一个作用域里面可以有pool、固定地址绑定、参数覆盖等。以我这次部署的办公网为例subnet 192.168.80.0 netmask 255.255.255.0 { option routers 192.168.80.2; option subnet-mask 255.255.255.0; option domain-name office.example.local; option domain-name-servers 192.168.80.2, 223.5.5.5; default-lease-time 7200; max-lease-time 86400; range 192.168.80.193 192.168.80.249; }这里有几个容易写错的地方range必须写在subnet声明的花括号内部表示这个子网可分配的地址范围。地址池范围应该和subnet的网段严格一致不能把另一网段的地址写进range里——dhcpd启动时用语法检查就会报错。option routers是客户端收到的默认网关必须填真实存在的网关地址填错的话终端虽然能拿到IP但上不了外网。我习惯把range避开网段前几十个地址专门留给服务器、交换机管理IP、打印机等需要静态绑定的设备。这个习惯可以直接减少“明明DHCP池子够大却和静态设备冲突”的尴尬。3.3 地址保留和绑定配置办公场景里最常遇到的需求是某台打印机、门禁设备或者领导办公室的固定终端必须永远拿到同一个IP。DHCP有两种实现方式——host保留和class匹配。最常用、也最直观的是host保留host printer-office { hardware ethernet 00:1B:2F:3A:4B:5C; fixed-address 192.168.80.100; }这段配置的意思是凡是来自MAC地址00:1B:2F:3A:4B:5C的请求一律分配192.168.80.100。注意hardware ethernet后面跟MAC地址时不要加冒号分隔别的方式也可以写但规范写法就是每两位之间用冒号分隔。写错格式的话dhcpd在语法检查阶段就会报错。另外一个更灵活的做法是通match if语法按vendor class或MAC前缀分组分配。比如会议室专用的瘦客户机全是同一个厂商的网卡可以针对厂商的类标识统一走特定地址段。但这种做法不是所有设备都支持在Discover包里带正确的vendor class信息所以通用性不如host保留。我目前生产环境里绝大部分特殊分配需求都是host保留解决的简化维护负担。3.4 租约数据库和持久化dhcpd运行时会维护一份租约数据库记录当前分配出去的IP、对应的MAC、租约到期时间等信息。Rocky Linux上默认路径是/var/lib/dhcpd/dhcpd.leases。这个文件在运行时会持续追加内容。需要注意两点第一千万不要手动编辑这个文件。dhcpd在启动时会读它如果文件格式有问题服务直接起不来。如果真想清理租约比如要重现一个干净的环境停掉dhcpd服务备份旧文件然后把dhcpd.leases清空、保留dhcpd.leases~备份文件即可。dhcpd服务启动时如果发现没有租约文件会自动创建一个空的。第二定期观察租约文件的大小。办公网络规模不大时基本没问题但如果是几千终端的园区网租约文件会增长很快。这时候要规划租约文件的归档策略或者用isc-dhcp-server自带的omapi接口做在线管理。我这边办公网规模几百台租约文件一年下来也才几百KB暂时不需要额外清理但我会在监控脚本里加一条租约文件超过50MB就告警。3.5 配置语法检查和基本排错写完配置后一定要先做语法检查再启动服务dhcpd -t -cf /etc/dhcp/dhcpd.conf这个命令只做语法检查不启动服务。如果输出类似“Configuration file /etc/dhcp/dhcpd.conf OK”的字样说明语法通过。我每次改完配置都会跑一遍养成习惯了。如果语法检查报错绝大多数原因是漏了结尾的分号。dhcpd.conf里每条声明都要以分号结束比如option routers后面的分号少了一个就会导致后面所有配置解析失败。花括号不匹配。subnet段、host段、pool段都需要成对的花括号。写了不存在的option名。dhcpd对option名敏感写错会直接报unknown option。语法检查通过后启动服务systemctl enable --now dhcpd systemctl status dhcpd这里有个初学者必踩的坑dhcpd在启动时会读取网卡列表默认它只监听/etc/sysconfig/dhcpd里指定的接口。如果配置文件里没有显式指定DHCPD_INTERFACE有些版本会报“Not configured to listen on any interfaces!”启动失败。所以装完服务后第一件事就应该编辑/etc/sysconfig/dhcpd把网卡写进去DHCPDARGSens160;这个问题在CentOS 7时代就坑过不少人到了Rocky Linux 9依然存在因为打包策略没变。提前写进配置可以省掉一次启动失败的调试时间。4. 实操部署全过程与验证4.1 从零开始的完整配置实录下面这一段是我实际部署时执行的完整流程。假设服务器IP已配好、软件包已安装开始编辑主配置文件。先备份原配置这是好习惯cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak然后写入基础配置vim /etc/dhcp/dhcpd.conf文件内容如下default-lease-time 7200; max-lease-time 86400; log-facility local7; authoritative; subnet 192.168.80.0 netmask 255.255.255.0 { option routers 192.168.80.2; option subnet-mask 255.255.255.0; option domain-name office.example.local; option domain-name-servers 192.168.80.2, 223.5.5.5; range 192.168.80.193 192.168.80.249; } host printer-office { hardware ethernet 00:1B:2F:3A:4B:5C; fixed-address 192.168.80.100; }这里解释一下我为什么把domain-name-servers写成两个地址第一个是公司内部DNS负责解析内网域名第二个是公共DNS作为兜底。这样配置的好处是内网解析不受公共DNS干扰外网解析也不至于因为内网DNS压力大而出问题。保存退出后立刻做语法检查dhcpd -t -cf /etc/dhcp/dhcpd.conf然后编辑接口监听配置vim /etc/sysconfig/dhcpd DHCPDARGSens160;最后启动服务并设置开机自启systemctl enable --now dhcpd systemctl status dhcpd看到active (running)之后再确认端口监听状态ss -unlp | grep :67正常情况下应该能看到dhcpd进程监听0.0.0.0:67。这个端口是DHCP服务核心端口后面排查问题第一步就检查它。4.2 客户端获取地址的实际验证服务端配置完成后需要找一台测试终端做验证。我这边习惯用一台Linux主机做dhcp客户端因为可以用命令行精确控制续租和释放的过程dhclient ens192 ip addr show ens192如果看到ens192上分配了192.168.80.x网段的地址、网关和DNS都正确那基本就成了。要看更细的信息就用dhclient -v ens192-v参数会打印完整的DHCP交互过程能看到Discover、Offer、Request、Ack四个阶段的状态。正常流程走到DHCPACK就代表分配成功。Windows客户端验证更直观把网卡设成自动获取IP然后在命令行里执行ipconfig /renew再用ipconfig /all看结果。拿到IP之后去服务器上查租约cat /var/lib/dhcpd/dhcpd.leases能查到刚分配出去的记录lease行里有IP地址、客户端的MAC和租约到期时间。看到这条记录就等于整个DORA流程闭环了说明服务器不仅能听广播还能正确回包和记账。4.3 动态DNS联动和扩展预留基础功能跑通之后我通常会顺手把动态DNS更新配好。它的价值在于客户端拿到DHCP地址后自动在DNS服务器上注册一条A记录这样其他机器可以直接用主机名访问它不用查IP。这个功能需要DHCP服务器能和DNS服务器联动。以Rocky Linux bind为例配置思路是在named.conf里允许dhcpd更新指定zone。dhcpd.conf里开启ddns-update-style interim并配置ddns-domainname和ddns-rev-domainname。给dhcpd对应的DNS key文件。这一步不是所有部署都需要。如果你的DNS不是自己管的或者不想引入额外的安全复杂度可以跳过。我这次因为公司内网DNS本来就是自己维护的所以顺手配了省得以后设备多了满网ping去找IP。如果有多个网段需要分配IP而DHCP服务器又不在这几个网段里就必须配DHCP中继。做法是在三层交换机或路由器上配置ip helper-address指向DHCP服务器地址。这个扩展项在校园网或园区网里很常见但在单网段办公网里用不上我这边暂时不需要配。5. 常见问题与排查技巧实录5.1 客户端拿不到IP的四个排查方向遇到客户端拿不到IP我建议按“端口-配置-日志-抓包”的顺序排查不要一上来就重启服务。第一步确认服务端正常监听ss -unlp | grep :67如果没有输出说明dhcpd没起来。看服务状态和日志找原因。第二步确认配置语法没问题dhcpd -t -cf /etc/dhcp/dhcpd.conf语法检查通过不代表逻辑一定对但语法挂了服务必然起不来。第三步看日志tail -f /var/log/messages | grep dhcpd常见的日志报错有几种“no free leases”地址池被占满了需要扩容或者缩短租约时间。“dynamic and static leases present for ...”同一个IP既配了host绑定又出现在range里冲突了。这种情况dhcpd会跳过range里的该IP导致可用地址变少。“uid ... already in use”客户端请求中带的client-identifier和已有租约冲突。第四步抓包确认DORA交互。tcpdump可以抓DHCP报文tcpdump -i ens160 port 67 or port 68 -n抓包时让客户端重新续租观察请求是否到达服务器、服务器有没有回Offer。如果客户端一直在发Discover但服务器不回Offer问题大概率在服务器配置或者防火墙如果客户端发出Request但服务器不回Ack大概率是租约状态异常清掉租约文件重启就能解决。5.2 多个DHCP服务器冲突办公网络如果没有统一规划经常会出现“房间里私自接了一台小路由器它自己也发DHCP地址”的经典事故。现象是客户端拿到的网关不对、上不了网、时好时坏还完全没规律。排查方法是用抓包看网络里有没有多个DHCP服务器在回Offer。tcpdump抓一条完整DORA就能看出端倪如果同一个Discover包有多个不同MAC的服务器回Offer基本可以断定有非法DHCP服务器。处理办法一个靠管理制度一个靠网络侧的DHCP Snooping功能。如果交换机支持我建议在接入层开启DHCP Snooping把合法DHCP服务器的端口设为信任端口其他端口只允许客户端请求、不允许回复DHCP Offer。这一招对于抑制私接路由器非常有效而且实施成本低一条全局配置加几条端口配置的事。5.3 地址池耗尽和租约碎片化办公网地址池只有几十个地址但上百号员工的手机电脑都往同一个网段怼就会出现“no free leases”的告警。有两个比较快的缓解措施一是缩短default-lease-time。比如从2小时缩短到30分钟让不活跃的设备更快释放地址。需要注意的是租约到期前客户端会续租只要设备还在线缩短租期并不会把它踢下线但设备一离开网络短租约能让地址更快回收。二是排查租约碎片。有的时候地址池里确实有空闲地址但因为客户端requested address不在range里或者冲突检测失败dhcpd不会分配它们。查看dhcpd.leases文件把那些过期残留的租约清理掉然后重启服务通常能恢复一部分可用地址。长期方案还是重新规划网段把无线设备拆到独立VLAN和独立地址池里。5.4 客户端获取地址后无法上网这个问题的原因跟DHCP本身反而关系不大更多是网关和路由的问题。常见场景是地址拿到了掩码也对网关也拿到了但ping不通外网。排查路径是先在客户端ping网关地址不通就是二层或网关问题。网关能ping通再ping外网地址比如223.5.5.5。如果通说明DNS有问题。用dig或者nslookup解析域名确认DNS返回结果。如果DNS没配好就回到服务器检查option domain-name-servers配置。但要注意区分一种特殊场景如果客户端的IP地址和网关不在同一个网段即使网关配置正确也无法直接通信。一次我在现场就遇到这种情况排查了半天才发现是办公网VLAN划分调整后网关地址被移到了另一个网段DHCP下发的option routers照旧填了旧的网关地址。所以每次网络拓扑调整后要记得同步检查DHCP的下发参数。6. 我踩过的一些坑和最后想说的6.1 配置文件里的“看似无害”细节dhcpd这个服务对配置的严谨度要求很高一个分号、一个花括号、一个引号都能让服务起不来。这里我说几个自己踩过的、特别容易犯的错第一option domain-name和option domain-name-servers是两个完全不同的参数。前者是下发DNS后缀后者才是下发DNS服务器地址。我见过新同事把两个参数混在一起写结果终端拿到的DNS后缀成了IP地址域内解析全部失败。第二lease文件和服务启动顺序的坑。如果系统是克隆出来的虚拟机或者做过快照回滚租约文件里可能残留其他环境的租约记录导致IP分配混乱。解决办法很直接停服、清空租约文件、启动干干净净。第三千万不要在图省事时把配置里的注释写得太随意。dhcpd配置里的注释用#号开头是没问题的但如果你把注释符号写在了某条声明语句中间极可能导致语法错乱。这种情况排错特别耗时间因为报错位置往往不在你写错的那一行。6.2 关于高可用和演进单台DHCP服务器终究是单点。我在生产环境里至少会做两步加强一是定期备份dhcpd.conf和dhcpd.leases文件用定时任务推到备份服务器上二是规划第二台DHCP服务器做故障切换。isc-dhcp官方支持failover peer模式两台服务器之间同步租约状态一台挂了另一台无缝接管。配置思路是声明一个failover peer然后在subnet里通过pool指定primary和secondary的地址分配比例。有了双机之后日常维护比如升级系统、重启服务就不用再挑半夜窗口了。对于规模更大、需要更灵活管理的数据中心网络可以进一步考虑把DHCP和IPAM系统集成用API动态分配和管理地址池。但那是另一个层级的话题了对大多数企业办公网来说把一台Rocky Linux上的dhcpd吃透足够应对日常需求。我个人的体会是DHCP这种“年迈”的基础服务恰恰是最不能掉以轻心的。它平时默默干活没人关注一旦出问题就是全网范围的事故。写这篇指南就是希望后来者能少走我走过的弯路——配置之前先想清楚地址规划改完配置记得先做语法检查出问题先抓包再动手。把这几个习惯养成了DHCP这个服务的运维就会简单很多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询