☰
Rocky Linux搭建DHCP服务器:从IP规划到配置排错全指南
2026/10/13 7:20:17 网站建设 项目流程

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/24,dhcpd会直接拒绝启动。这时需要加一个不匹配网段的虚拟网卡,或者把配置改成服务器所在网段。如果你确实要下发其他网段,那必须确保有中继场景,dhcpd判断“是否存在对应接口”时,允许依靠中继过来的请求来动态识别,但前提是配置文件语法正确且至少有一个subnet能和本机接口对上。

第二类,权限问题。dhcpd进程以dhcpd用户运行,需要读写租约数据库文件/var/lib/dhcpd/dhcpd.leases,如果这个文件的属主不对,服务也会起不来。用ls -l确认一下属主是dhcpd:dhcpd,不是root就能避开。

第三类,SELinux干扰。Rocky Linux默认开启SELinux,dhcpd一般是被允许监听的,但如果你改了非标准端口或自定义日志目录,就可能触发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 dhcpd

reload会平滑加载新配置,对已经在线的租约影响最小。注意,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.5,Rocky 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 -t
dhcpd启动失败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故障,或者有什么部署细节想交流,不妨按上面的排查思路走一遍,一般都会有所收获。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询