
1. 先想清楚为什么要自己搭一台DHCP服务器说实话现在不管是做系统运维还是搞网络基础设施改造手头几台、几十台甚至上百台机器要统一管理IP地址的时候第一个想到的就是部署DHCP服务。Rocky Linux作为企业级Linux发行版稳定性没得说又是RHEL的下游重建版本很多人拿它做生产环境的核心服务器。而DHCP这种基础网络服务恰恰是所有设备接入内网的第一道关口。没有DHCP你总不能让运维一台一台去手动配IP那样不仅效率低还容易因为手误把IP写错造成地址冲突。我自己经历过一次印象很深的场景公司搬迁新机房网络架构从原来的单C段扩成多个VLAN设备数量翻了一倍多。如果继续沿用原来的静态IP规划表光是整理那份Excel就要折腾大半天更别提新设备上线时按着表格找到空闲IP有多痛苦。后来我果断在Rocky Linux上把DHCP服务搭起来配合网工那边在交换机上做DHCP中继整个网络接入的维护成本直线下降。这篇文章就是把我实际部署过程中的完整思路、配置步骤、踩过的坑、验证方法全部整理出来。不扯大而全的理论重点讲怎么落地。如果你是刚接触Linux服务部署的新人或者正在准备给公司内网做IP统一管理的运维这篇内容可以直接照着操作也能帮你理解每一步背后的原因。2. 部署前的规划IP怎么分、作用域怎么切割比敲命令更重要2.1 先规划好IP段和子网掩码很多人上来就写配置文件结果后面前后矛盾排查半天也不知道问题出在哪。我建议第一步永远是先画一张简单的网络拓扑把需要下发IP的网段列清楚然后确定每个网段的子网掩码、网关、DNS、租期时长。假设内网有三个网段办公网192.168.10.0/24网关192.168.10.1服务器网192.168.20.0/24网关192.168.20.1无线访客网192.168.30.0/24网关192.168.30.1那么DHCP服务器上要做的就是创建三个subnet配置块每个块对应一个网段的地址池。地址池不能包含网关地址也不建议包含交换机管理地址、打印机、监控摄像头这些需要固定IP的设备。这里有一个常见误区分清“DHCP服务所在的网段”和“DHCP下发的网段”。如果DHCP服务器和客户端在同一个二层网络里可以直接广播响应如果客户端在别的VLAN就需要在中继设备上配ip helper-address指向DHCP服务器。Rocky Linux服务器本身不关心客户端在哪它只关心收到的DHCP Discover报文里有没有giaddr字段这个后面配置时会涉及。2.2 租期怎么定全局和子网哪个优先租期是很多人容易忽略的配置。默认配置里通常给的是600秒10分钟但生产环境我建议按设备类型区分固定工位电脑可以设置8小时甚至1天无线终端用2小时就够了如果是给服务器网段下发IP干脆设置成3天以上减少不必要的续租流量。需要注意的是配置文件里subnet内部可以用default-lease-time和max-lease-time覆盖全局设置。我个人的习惯是全局设一个保守值比如3600秒然后针对特殊子网单独覆盖这样灵活性更高。还有一点容易被忽略DHCP客户端在租期过半时会开始续租服务器要保证可用性。如果你在Rocky Linux上同时跑着防火墙一定要放行UDP 67和UDP 68端口否则客户端的Discover报文根本到不了dhcpd进程。3. DHCP的工作原理只有理解了DORA交互才能看懂配置和排错3.1 四步握手Discover、Offer、Request、Acknowledge记得第一次看DHCP抓包时我盯着那些简写看了一头雾水。其实整个过程理解成“找房东租房”就很直观客户端开机不知道自己有没有IP于是向全网广播“有没有DHCP服务器我需要一个地址”这就是Discover。服务器收到后从地址池里挑一个回应“我可以租给你这个IP”这就是Offer。客户端收到Offer后广播“我决定用这个IP”这就是Request。服务器收到Request后把租约记录到文件里然后回应“确认这个IP归你用了”这就是Acknowledge。在这个交互过程里最值得关注的是客户端收到Offer之后不是直接采用而是广播Request。这样做的目的是让网段内所有的DHCP服务器都知道“客户端选了谁”其他服务器就可以把自己的Offer回收避免冲突。3.2 租约续期与地址冲突检测租约过了50%客户端会单播给服务器请求续租如果没收到响应到了87.5%才广播续租。这种时间机制很多文章写过但实际操作中有一个对排错很有用的结论如果你看到客户端日志频繁出现DHCPDISCOVER但迟迟没有DHCPOFFER别急着怀疑配置格式先看看服务器上是不是有另一个DHCP服务也在跑或者抓包确认一下请求报文是否真的到达了dhcpd所在的网络接口。另外dhcpd启动时会扫描本机网络接口的IP如果配置文件中某个subnet声明的网段和本机网卡IP完全不沾边又没有中继的场景dhcpd会拒绝启动并报“not found on interface”之类的问题。理解了DORA交互再看这类报错就心里有数了。3.3 为什么广播和单播同时存在客户端在没有IP的时候只能发广播但它拿到IP之后续租请求既可以走单播也可以走广播。这个细节在实际排错中很有用比如你用tcpdump在服务器上抓到大量的DHCPREQUEST广播这说明客户端对单播请求没有收到回应可能是服务器回包路由有问题也可能是中间有防火墙拦截了单播流量。相比之下如果你只按“看日志有没有报错”来排查这个方向就很难发现。4. Rocky Linux上安装和配置DHCP服务的完整实操4.1 安装dhcp-server并理解Rocky Linux的仓库特性Rocky Linux的默认AppStream仓库里就带有dhcp-server不需要额外添加第三方源。安装命令很简单sudo dnf install -y dhcp-server装完之后配置文件位于/etc/dhcp/dhcpd.conf服务名是dhcpd。这里要注意一个特点Rocky Linux上的dhcpd默认没有提供/etc/dhcp/dhcpd.conf的完整示例只有一堆注释。所以你如果第一次装打开文件发现几乎全空不要惊讶直接自己写配置就行。启动服务前可以用下面的命令验证配置语法sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf我习惯在每次改动配置后都执行一次这个检查语法测试通过后再重启服务能把因为手误导致的线上事故概率降到最低。4.2 从零写一个可用的dhcpd.conf下面这份配置是我在Rocky Linux 9上实测过的作用于办公室A网段192.168.10.0/24。配置路径可以按需调整sudo vi /etc/dhcp/dhcpd.conf内容如下# 全局设置 option domain-name example.internal; option domain-name-servers 192.168.10.1, 114.114.114.114; default-lease-time 7200; max-lease-time 21600; authoritative; # 日志设施 log-facility local7; # 子网配置办公网 subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; option broadcast-address 192.168.10.255; default-lease-time 86400; max-lease-time 172800; }拆开细说一下每部分的作用domain-name客户端自动获得的DNS搜索域如果不希望影响客户端解析可以留空或不加。domain-name-servers下发给客户端的DNS服务器。这里我填了网关和内网DNS。authoritative这个参数相当重要表示“本网段的DHCP服务器是权威的”。对于客户端发来的、不在本网段地址池中的IP续租请求dhcpd会主动回应NAK让客户端重新走完整的获取流程。如果不加客户端带着残缺甚至是错误配置的IP可能一直无法自愈。range地址池范围。我把100到200之间排除掉网关也建议把打印机这类固定IP设备放在这个范围之外。option routers必填不给这个客户端就没有默认网关等于配了IP也上不了网。broadcast-address一般子网掩码算出来是多少就填多少不要随意改。配置写完后启动并设置开机自启sudo systemctl enable --now dhcpd sudo systemctl status dhcpd如果服务处于active (running)状态说明基本起来了。接着在客户端上用dhclient命令测试一下获取IP或者直接重启网卡。4.3 启动失败最常见的三类原因第一类配置文件里subnet和本机网卡不匹配。如果服务器自己的IP是10.0.0.5/24但你写的subnet是192.168.10.0/24dhcpd会直接拒绝启动。这时需要加一个不匹配网段的虚拟网卡或者把配置改成服务器所在网段。如果你确实要下发其他网段那必须确保有中继场景dhcpd判断“是否存在对应接口”时允许依靠中继过来的请求来动态识别但前提是配置文件语法正确且至少有一个subnet能和本机接口对上。第二类权限问题。dhcpd进程以dhcpd用户运行需要读写租约数据库文件/var/lib/dhcpd/dhcpd.leases如果这个文件的属主不对服务也会起不来。用ls -l确认一下属主是dhcpd:dhcpd不是root就能避开。第三类SELinux干扰。Rocky Linux默认开启SELinuxdhcpd一般是被允许监听的但如果你改了非标准端口或自定义日志目录就可能触发AVC拒绝。遇到奇怪的行为先用ausearch -m avc -ts recent看看有没有SELinux拦截记录。5. 配置参数精讲哪些必须设哪些用默认就好5.1 必须谨慎设置的参数option routers、range、subnet和netmask是三个地基少一个客户端都拿不到完整的网络配置。还有一个很容易被忽略的参数是next-server和filename这俩是给PXE网络启动用的如果只是做DHCP地址分配不用管它们。option domain-name-servers建议显式写入不要依赖上级自动下发。有时企业内部DNS就是域控如果不给客户端指定域名解析会走外网公共DNS导致内网主机名解析失败这是很多“能上外网但打不开内网系统”问题的原因。5.2 租约文件的检查与备份dhcpd.leases这个文件记录着所有分配出去的IP池状态不能随便删除。如果你误删了dhcpd会重新创建一个空文件但这样所有客户端都会被视为新请求可能造成短时间内大量IP重新分配甚至导致部分设备拿到不同IP。我建议在crontab里定期备份租约文件30 3 * * * cp /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd.leases.bak这样如果服务器意外重启或损坏可以基于最近的备份恢复分配记录减少地址变动带来的一系列连锁问题。5.3 运维时如何在线修改配置而不中断服务改配置不可避免但直接改完重启dhcpd所有客户端的续租请求都会中断当前租约对应的进程虽然客户端不会立刻掉线但会增加不必要的续租失败。稳妥的做法是sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf sudo systemctl reload dhcpdreload会平滑加载新配置对已经在线的租约影响最小。注意dhcpd的reload不是所有版本都支持在Rocky Linux上实测是支持的如果你用其他发行版先确认一下服务脚本。6. 绑定固定IP、配置DHCP中继这两个技能是生产环境的分水岭6.1 给打印机和服务器保留固定地址很多设备虽然支持DHCP但你在打印机、NAS或门禁控制器上还是希望地址不变。如果靠“把租期调最长”显然不够优雅正确做法是在DHCP服务器上做MAC地址与IP的绑定。host printer-01 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.168.10.50; }注意host配置块既可以写在subnet内部也可以放在全局。如果放在全局需要确保对应的subnet里存在这个IP否则dhcpd会报地址不在作用域内。这种方式比在设备上手动配置静态IP好管理得多因为你可以统一在服务器上查看、修改不用挨个设备去登录设置。有一个坑如果绑定的IP落在range地址池范围内虽然dhcpd一般能正确处理但我建议将保留地址统一放在range之外避免逻辑混乱。比如range是100到200那打印机就用50、51这类低位地址一眼扫过去就知道哪些是保留的哪些是可动态分配的。6.2 一个DHCP服务器下发多个VLAN的地址多网段环境下最常见的做法不是每台服务器都配一套DHCP而是利用中继。三层交换机上配置DHCP中继后各VLAN的客户端广播Discover中继会给报文加上giaddr字段表示客户端所在网段然后单播给DHCP服务器。dhcpd看到giaddr后匹配对应的subnet并从中选择地址。比如在思科交换机上进入VLAN 20接口后执行ip helper-address 192.168.10.5Rocky Linux上dhcpd不需要做额外特殊设置只需要在配置里写清楚192.168.20.0/24这个subnet的地址池和网关即可。这里有一个很常见的经验中继设置的地址必须能路由到DHCP服务器同时在服务器防火墙上放行来自中继设备IP的UDP 67流量。很多环境里DHCP服务明明配得没错客户端就是获取不到IP最后排查发现是防火墙把中继设备的请求拦了。6.3 多网段配置示例下面是一份多subnet的完整配置参考option domain-name corp.local; option domain-name-servers 192.168.10.10, 192.168.10.11; default-lease-time 7200; max-lease-time 21600; authoritative; subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; option broadcast-address 192.168.10.255; } subnet 192.168.20.0 netmask 255.255.255.0 { range 192.168.20.100 192.168.20.200; option routers 192.168.20.1; option broadcast-address 192.168.20.255; } host barcode-scanner-01 { hardware ethernet 00:1a:2b:3c:4d:5e; fixed-address 192.168.20.55; }要注意当服务器本机IP不在上述任何一个subnet里时dhcpd可能会拒绝启动。解决办法是在服务器网卡上配置一个属于任意子网的IP或者干脆把服务器网段也作为一个subnet写进去。更优雅的方案是在配置里给服务器本机网卡划分一个最小范围的subnet比如只有一两个地址。7. 常见问题与排错实录实战中撞过的那些坑7.1 客户端能拿到IP但上不了网这类问题我遇到不少通常是网关没下发或者DNS配置错误。先登录客户端查看获取到的IP、网关和DNS检查option routers是否正确。有几次我发现是配置了多块网卡导致DHCP请求走了错误的接口客户端拿到的是别的VLAN的IP这时要在/etc/dhcp/dhcpd.conf里用allow/deny matching规则或者干脆指定监听接口。7.2 收到DHCPOFFER但客户端一直用不了典型场景是客户端抓包能看到服务器发来的Offer但是网络就是不通。排查方向有两个一是地址池里包含已经被手动占用的IP导致ARP冲突二是交换机端口开启了DHCP Snooping而服务器端口没有配置为信任端口。DHCP Snooping会拦截所有DHCP回应导致客户端收不到Offer或者收到但被丢弃。这个现象在办公网大规模部署后很常见。7.3 服务器日志怎么定位问题Rocky Linux上dhcpd日志默认走syslog配置里log-facility local7的意思就是让日志归到local7这个facility默认情况下也会写到/var/log/message。定位问题最直接的方法是sudo tail -f /var/log/messages | grep dhcpd如果把local7单独定义到了/etc/rsyslog.conf里也可以加一行把日志输出到独立文件方便检索。实际排错时建议把抓包工具和日志同时进行一边看dhcpd输出一边用tcpdump抓67端口的数据包sudo tcpdump -i eth0 udp port 67 or port 68 -n这样能迅速判断问题出在“报文没到服务器”还是“服务器没回包”还是“回包被丢弃”。7.4 排查速查表现象可能原因检查手段dhcpd启动失败配置文件语法错误dhcpd -tdhcpd启动失败subnet与网卡不匹配ip addr 对比配置客户端收不到Offer防火墙拦截UDP 67/68firewall-cmd --list-all收到Offer但无法上网网关或DNS未下发客户端ipconfig/ip addr固定IP不生效host块不在对应subnet内检查host位置客户端被拒绝续租配置缺authoritative配置文件确认8. 我在多次部署中沉淀下来的几个实操建议部署DHCP服务这件事说难不难说简单也不简单。前前后后我帮不同的项目环境部署过很多次每次都会有一些新的体会。如果你准备在生产环境上做我个人有几个建议供参考。第一DHCP服务器尽量用静态IP而且不要和地址池混在同一个段里使用靠前的地址。虽然你可以让服务器本身也通过DHCP获取地址但一旦租约出问题服务器失联了整个网段都得跟着瘫痪这种风险没必要冒。第二地址池规划要留有余量。我见过有人把/24网段的可用地址几乎全部写进range结果业务扩张需要加新设备时才发现IP不够只能调整Pool范围而调整范围会导致某些客户端重新获取地址多少会影响业务。一般建议range只占可用地址的70%左右剩下的作为保留池用来应对临时扩容。第三尽量把配置文件注释写清楚。尤其是host绑定和服务器的用途到一个季度后你回看这些配置就会发现良好的注释能让你少死很多脑细胞。最后改完配置一定要记得备份。把dhcpd.conf和dhcpd.leases一起备份恢复的时候最快。这个习惯我坚持了很久某次恢复服务时全靠这份备份十分钟就搞定而如果回去慢慢回忆配置细节可能得折腾半小时以上。希望这篇实操指南能帮你顺利在Rocky Linux上把DHCP服务跑起来。如果你也遇到过什么奇怪的DHCP故障或者有什么部署细节想交流不妨按上面的排查思路走一遍一般都会有所收获。