news 2026/10/19 9:29:44

Rocky Linux 部署 DHCP 服务器:配置、租约管理与运维实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rocky Linux 部署 DHCP 服务器:配置、租约管理与运维实战

前阵子给一套内网做设备梳理,原路由器上挂着 DHCP 服务,平时看着正常,终端数量一过百,日志就开始冒出各种怪问题。折腾一圈后,我把 DHCP 迁到了独立的 Rocky Linux 服务器上,顺便把整个流程彻底整理了一遍。这篇内容主要面向三类读者:准备把 DHCP 从家用级设备挪到 Linux 服务器的人、从 CentOS 7 迁移到 Rocky Linux 的老用户,还有刚接触 Linux 网络服务、想在真实环境里把 DHCP 跑明白的新手。

1. 动手之前:先想清楚 DHCP 要承担什么活

1.1 哪些设备会来找 DHCP,配置复杂度从何而来

很多人觉得 DHCP 就是把地址自动发出去,配置里写一个网段、一个 range 就完了。这个理解没错,但只适用于“清一色全是电脑”的简单网络。真实内网里,设备类型五花八门:员工电脑、打印机、网络摄像头、门禁主机、无线 AP、临时访客终端,甚至某些 IoT 传感器。

这些设备的区别不只是“能不能自动获取地址”这么简单,更关键的是它们的租约行为完全不一样。电脑关机后可能几小时就释放租约,打印机可能一周都不关机,摄像头可能半年都不重启。DHCP 协议本身不在乎设备类型,但它必须在地址池有限的情况下,尽量保证每台设备都能稳定拿到地址。这个“稳定”不是简单分发,而是要靠租约时间、保留地址、地址池规划三者配合。

我在动手配置之前,会先把内网设备按三类整理:需要固定地址的设备(服务器、打印机、网络设备)、需要稳定但可以动态获取的设备(办公电脑)、临时设备和访客设备。分类做完,dhcpd.conf 的骨架基本就出来了。

1.2 动态分配、保留地址和固定 IP 的边界怎么划

Linux 下实现“固定地址”其实有两条路。一条是在 DHCP 服务器上写 host 保留,通过 MAC 地址绑定,DHCP 每次都会给这台设备发同一个 IP。另一条是直接到客户端设备上手动配置静态 IP,完全不经过 DHCP。

这两条路的边界经常有人分不清。DHCP 保留地址适合打印机、无线 AP、门禁这类不方便登录 Web 后台改配置的设备。你把保留地址写在服务器端,只要 MAC 不变,它永远拿到同一个 IP。静态 IP 则适合服务器和网络设备本身,因为它们需要在 DHCP 服务还没启动的时候就提供服务,比如内网 DNS、网关、以及这台 DHCP 服务器自己。

这里有个非常容易踩的坑:一台打印机既在打印机面板里手填了静态 IP,又在 DHCP 服务器里配了保留地址,两个地址还不一样。这种冲突轻则打印机不可达,重则和地址池里其他机器撞 IP,把整个网段搅乱。我个人的原则是:能靠 DHCP 保留解决的,不在设备端手填;必须手填静态 IP 的,在 DHCP 配置里用range把这个地址排除掉,避免双重分配。

2. 环境准备:给 Rocky Linux 装 DHCP 之前的必修课

2.1 网卡固定 IP 与主机名:先让服务器“站住脚”

DHCP 服务器本身不能用 DHCP 获取地址,这是底线。你要是在虚拟机里直接拿了一个自动获取的地址,然后装上 dhcpd,服务启动时很可能根本找不到匹配的子网。所以第一步一定是先把服务器的网卡改成固定 IP。

Rocky Linux 上我习惯用nmcli,比直接改/etc/sysconfig/network-scripts/ifcfg-*方便,网络管理器会把配置持久化:

nmcli con mod ens3 ipv4.method manual \ ipv4.addresses 192.168.10.2/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 192.168.10.2 nmcli con up ens3

改完之后用ip a和ip route确认一遍地址和路由。主机名也顺手设好,虽然 DHCP 协议本身不太依赖主机名,但日志里一堆unknown看起来很痛苦:

hostnamectl set-hostname dhcp-srv

一个细节:网卡名字在 Rocky Linux 上通常是 ens3、ens160、eth0 这类形式,不同虚拟化平台差别很大。后面配置/etc/sysconfig/dhcpd时,必须写成你机器上真实存在的接口名,否则服务起来以后会报 “Not configured to listen on any interfaces”,这可能是部署 DHCP 最常见的启动失败原因。

2.2 防火墙、SELinux 和包名:三个最容易被拦住的点

安装包之前先确认仓库里有对应软件。Rocky Linux 的默认仓库里,DHCP 服务端包名是dhcp-server。注意不是dhcp,也不是dhcpd,这三个名字经常混在一起,在文档里搜东西时容易看晕。安装命令:

dnf install -y dhcp-server

装完以后,系统里会出现/etc/dhcp/dhcpd.conf、/usr/sbin/dhcpd和/etc/sysconfig/dhcpd。这三个文件分别对应配置、主程序、服务启动参数。

防火墙这套环境里几乎是必查项。DHCP 走的是 UDP 67(服务端监听)和 UDP 68(客户端监听),默认 firewalld 没有放行:

firewall-cmd --permanent --add-service=dhcp firewall-cmd --reload

如果机器上没有跑 firewalld,而是用的 nftables 或者其他防火墙管理脚本,就自己放行 UDP 67。dnsmasq 或家用路由器上不需要这一步,但换到 Rocky Linux 上,很多“服务明明起来了却拿不到地址”的问题,根子就在防火墙。

SELinux 这块,我的建议是不要急着setenforce 0。Rocky Linux 自带 SELinux 默认强制模式,dhcpd 的配套策略其实已经写好了,正常配置下能绑定端口、能读写租约文件。如果启动时遇到权限类错误,先看日志:

ausearch -m avc -ts recent

真有 AVC 记录再对症处理。常见的文件上下文问题,多半是管理员手动把租约文件或者配置文件挪过位置,导致类型标签不对,可以用restorecon -Rv /etc/dhcp /var/lib/dhcpd恢复。一上来就关 SELinux,相当于把护栏拆了,后面出问题更难定位。

3. 核心配置:dhcpd.conf 按场景拆开讲

3.1 全局段:租约时间、DNS、域名的取舍

/etc/dhcp/dhcpd.conf的语法第一眼有点老派,分号、花括号一个不能少。配置逻辑分两层:全局声明和子网声明。全局声明作用于所有子网,子网声明里的选项会覆盖全局值。

租约时间是第一个关键参数。default-lease-time是设备第一次请求地址时拿到的租约时长,max-lease-time是设备主动要求延长租约时,服务端允许给的上限。注意这个“上限”不是你随便拍脑袋定的,它直接决定地址回收速度。

办公网典型配置:

default-lease-time 3600; max-lease-time 86400; option domain-name "lan.internal"; option domain-name-servers 192.168.10.2; authoritative;

如果地址池宽裕、设备长期在线,可以把 default 调到 86400(一天),减少 DHCP 交互频率。但如果终端数量接近地址池上限,我建议default-lease-time压在 1800 到 3600 之间。租约越短,设备下线后地址回收越快,代价是 DHCP 请求报文会变多。实际网络里 3600 秒是一个很均衡的起点,跑一段时间再看日志调整。

option domain-name和option domain-name-servers是下发给客户端的 DNS 信息。这里有个经验:只要内网有独立 DNS,就把内网 DNS 放在第一个,外网 DNS 放后面。如果只写一个公共 DNS,内网机器解析内部域名时会全部失败。

authoritative这一行非常关键。它告诉 dhcpd:我是这个网段说了算的 DHCP 服务器。没有这行时,如果客户端带着旧租约请求地址,而服务端发现这个地址不在自己的池子里,它会选择沉默;加上authoritative后,服务端会明确回应 DHCPNAK,让客户端扔掉旧配置重新获取。地址池调整过、网段改过号的情况下,没有这行会有一批机器一直抱着过期 IP 不放。

3.2 subnet 声明、地址池和路由器/DNS 选项

最常见的配置是一个 C 段局域网。假设内网是192.168.10.0/24,服务器自己占用.2,网关是.1,动态地址池从.100起到.200止:

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; }

option routers是下发给客户端的默认网关。很多时候客户端能拿到 IP 却上不了网,排查到最后发现是这里漏写了网关。broadcast-address同样别省,虽然多数现代系统会自动推导,但老设备和一些网络设备固件对广播地址特别敏感,显式写出来能省掉不少兼容性问题。

地址池范围的选取也有讲究。我见过很多人直接把整个网段的可用地址都放进 range,结果打印机、服务器被动态分配走了,后面要加固定 IP 时还要到处找人协调。正确做法是把地址段里的“固定区”和“动态区”提前划分好。比如/24网段里,1-50预留给服务器和网络设备,100-200做动态池,DHCP 永远不碰1-50这段。预留这部分不用写在配置文件里,只要 range 不覆盖就行。

3.3 host 保留段:让打印机和交换机永远拿到同一地址

打印机、无线 AP、门禁主机这类设备,我全用 host 保留处理。写法:

host printer-01 { hardware ethernet 00:1a:2b:3c:4d:5e; fixed-address 192.168.10.51; }

host 段可以放在 subnet 内部,也可以放在全局。如果放在全局,dhcpd 会根据 fixed-address 自动匹配对应子网,我习惯放在 subnet 外面,便于统一管理。

注意hardware ethernet后面必须写设备的 MAC 地址。取 MAC 地址的姿势也有讲究:打印机这类设备可能同时有网口和无线网卡,你必须填它实际接网线的那个 MAC。我有一次给一台一体机做保留,填了无线网卡的 MAC,结果有线网口每次拿到的还是随机地址。

还有一个容易混淆的地方:host 保留的地址必须落在你的某个 subnet 范围内,但最好别落在动态 range 里面。如果不小心把保留地址写进了 range,dhcpd 会在地址分配时尽量绕开这个保留地址,但逻辑复杂了容易出问题。我在规划地址时就定了一个规矩:动态 range 之外的地址全部留给 host 保留和静态配置,这样两边永远不会打架。

3.4 多网段和 DHCP Relay:一台服务器管几个 VLAN

一个 DHCP 服务进程确实可以服务多个网段,但有一个前提:要么服务器上有对应每个网段的网卡接口,要么通过 DHCP Relay(中继代理)把请求转过来。实际生产环境里,一台 DHCP 服务器服务十几个 VLAN 很常见,靠的就是 relay。

服务器端要做的事不多,配置多个 subnet 声明即可:

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; } subnet 192.168.20.0 netmask 255.255.255.0 { range 192.168.20.100 192.168.20.200; option routers 192.168.20.254; }

关键在于三层交换机或路由器上要把客户端的 DHCP 广播报文转发到这台 Rocky Linux。不同厂商设备命令不一样,常见的是ip helper-address这个思路,把 DHCP 请求的广播转成单播发到 192.168.10.2。Rocky Linux 这边如果自己也承担中继角色,可以装dhcp-relay包,在/etc/sysconfig/dhcrelay里指定监听接口和对端服务器地址。

中继场景下有个坑:dhcpd 会根据收到请求的接口或 Relay 报文中携带的 giaddr 判断客户端属于哪个子网。如果三层设备没配好,所有 VLAN 的请求都会从服务器主接口进来,dhcpd 一看源地址不对,直接不响应。排查时先确认客户端所在的 VLAN 能不能 ping 通 DHCP 服务器,再看 Relay 配置里是不是所有接口都填全了。

4. 把服务拉起来:启动、验证和排错

4.1 启动失败时先看这几行错误

配置写完先做语法检查,这个操作每一次都值得做:

dhcpd -t -cf /etc/dhcp/dhcpd.conf

语法检查通过不代表能正常监听,但至少把最蠢的拼写错误和漏分号问题挡在门外。接下来启动服务:

systemctl enable --now dhcpd systemctl status dhcpd -l

如果启动失败,最常见的报错有几种。第一种是 “No subnet declaration for eth0”。dhcpd 发现自己监听网卡的 IP 不属于任何已配置的 subnet。刚才说服务器网卡如果是自动获取的地址,或者 subnet 里网段写错,就会触发这个。第二种是 “Not configured to listen on any interfaces!” 说明/etc/sysconfig/dhcpd里的DHCPDARGS没写对。这个文件是独立于 dhcpd.conf 的,用来告诉服务到底监听哪个网卡:

DHCPDARGS=ens3;

第三种是租约文件损坏。dhcpd 启动时要读取/var/lib/dhcpd/dhcpd.leases,如果这个文件以前被手动改过、格式乱了,服务会拒绝启动。处理办法是备份后重建一个空文件,但前提是你清楚自己在做什么。租约丢了,在线设备的地址短时间不会消失,但服务重启后可能会把还在使用的地址重新分配给别人,风险很大。这也是为什么我一直强调:改配置前先备份 dhcpd.leases。

4.2 从客户端角度验证地址获取与租约更新

服务跑起来,系统显示 active,这只算成功了一半。真正的验证必须站在客户端视角做一遍。

找一台测试机,把网卡设为 DHCP 获取,然后看它是否拿到预期网段的地址。Linux 客户端可以用dhclient或 NetworkManager 自带工具,Windows 上直接ipconfig /release再ipconfig /renew。拿到地址后ip addr看 IP、网关、DNS 是否都正确。

验证续租也同样重要。把客户端的租约文件或者ipconfig /all里的租约过期时间记下来,等租约过半时观察客户端是否主动 renew。DHCP 客户端默认在租约 50% 时尝试续约,如果你发现地址到了 87% 左右才续约,多半是网络路径上丢了报文,或者服务器响应太慢。

这里可以顺带提一个习惯:我在新环境调试 DHCP 时,会同时开两个终端,一个跑journalctl -u dhcpd -f,另一个在客户端执行 renew。日志里能看到 DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK 这四步完整交互。如果日志停在 DHCPDISCOVER 没有下文,通常是报文根本没到 dhcpd;如果停在 DHCPREQUEST 没有 DHCPACK,往往是地址冲突或 range 配置问题。

4.3 日志分析与 renew/release 里的“隐性坑”

dhcpd 的日志默认走系统日志,RHEL 系通常记录在/var/log/messages里,用grep dhcpd过滤。虽然有log-facility local7之类的高级玩法,但日常排查看 messages 完全够用。

日志里有几个字段值得注意。看到 DHCPACK 是正常分配;看到 DHCPNAK 要引起警觉,说明客户端请求了一个不该用的地址;看到 DHCPDECLINE 说明客户端发现地址已经被占用,服务端会把该地址标记为冲突。

运维中我踩过的最隐性一个坑是客户端释放地址后,服务端不一定立即知道。客户端正常关机时如果发了 DHCPRELEASE,服务端会立刻释放租约;但直接断电、拔网线的设备不会发任何报文,只能等租约自然过期。这就是为什么办公网里 “有人走了地址还被占着” 经常发生,不是 DHCP 坏了,而是租约还没到期。解决思路不是整天手动删租约,而是靠合理的default-lease-time和地址池冗余。如果经常出现池子见底,优先考虑扩大 range 或缩短租约,而不是频繁手工干预。

5. 运行一段时间后才会遇到的事

5.1 地址池耗尽与租约回收策略

地址池耗尽通常不是瞬间发生的,它是一个渐变过程:新设备加进来、老设备租约还没释放、某个设备异常反复请求地址,地址池里的空闲 IP 越来越少。查看当前池子占用情况,最直接的办法是统计租约文件:

awk '{print $2}' /var/lib/dhcpd/dhcpd.leases | sort | uniq -c

但要明白,dhcpd.leases里记录的是活动租约,不是全量历史。真正缺地址时,你更该关心的是“哪些设备在 long-term 不还地址”。

处理池子耗尽有几个手段,按优先级排序:先缩短max-lease-time和default-lease-time,让长期不活跃的设备更早被回收;再把地址池 range 扩大,前提是路由和网关允许;最后才考虑清理租约文件。清理租约要非常谨慎,真要操作,先停服务、备份、再清空文件、启动服务,并且挑业务低峰期做。运行时删 leases 文件没有任何意义,dhcpd 会把租约缓存在内存里,重启后才重新落盘。

5.2 与网关、内网 DNS、IP 冲突检测的协作

DHCP 服务不是独立存在的,它和网关、内网 DNS 的关系极其紧密。最常见的问题是有人把某个地址手动配到了设备上,而这个地址刚好在 DHCP 的 range 范围内。客户端请求地址时,dhcpd 默认会先 ping 一下看这个地址有没有被占用,叫ping-check。但这个检测只能降低冲突概率,不能根治。真正靠谱的做法还是我们前面讲的:把固定使用的地址全部移出 range。

网关和 DNS 也经常成为肇事者。如果 DHCP 下发的option routers指向了错误网关,客户端能拿地址但上不了外网;如果option domain-name-servers里漏了内网 DNS,客户端会发现内网域名全部解析失败。这俩选项出问题时,log 里 DHCP 本身没有任何异常,客户端也在不停 renew,但用户感知就是“网络时好时坏”。我遇到类似投诉时,第一反应不是看 DHCP 日志,而是随便找一台客户端ip route、cat /etc/resolv.conf,先确认下发的参数对不对。

5.3 备份恢复与平滑迁移

DHCP 服务的备份其实就两个文件:/etc/dhcp/dhcpd.conf和/var/lib/dhcpd/dhcpd.leases。配置文件好理解,租约文件却常被忽略。

迁移 DHCP 到一台新服务器时,光把配置文件拷过去是不够的。如果租约文件是空的,新服务启动后会不知道哪些地址已经在线,可能把正在使用的 IP 发给新设备。所以迁移时要先停掉旧服务,把dhcpd.leases一并拷贝过去,再启动新服务,尽量让租约状态平滑过渡。

有一个细节:dhcpd 启动时会检测租约文件格式,直接拷贝没问题,但如果新旧版本不一致,偶尔会出现解析告警。我在迁移时会先在新机器上跑一次dhcpd -t,再启动服务观察日志。租约这东西看着不起眼,丢一次就够你熬夜排查半天。

6. 安全加固与下一步演进

6.1 非法 DHCP 和私接小路由器的应对

办公网里最烦的一种故障就是有人私接了一个家用小路由器,把原来只有一台 DHCP 的网段变成两台 DHCP 同时在发地址。客户端拿到哪个服务器先响应,网关就不一定是“真网关”了,结果就是一堆设备上不了网。

针对这个,单靠 DHCP 服务器本身能做的有限。更有效的手段在接入交换机上做 DHCP Snooping,让交换机只信任连接合法 DHCP 服务器的端口,其他端口的 DHCPOFFER 直接丢弃。如果网络设备不支持 DHCP Snooping,至少要在接入层做端口隔离,防止广播域被私自扩展。

服务器侧可以做的,是尽量缩小风险范围。比如把地址池写成小段,range只覆盖允许动态获取的区域,其他地址即使被非法 DHCP 发出来,也不至于和核心设备冲突。还可以用deny unknown-clients或 MAC 白名单,但这类策略会显著增加管理成本,适合对终端可控性要求很高的环境,普通办公网没必要一上来就这么干。

6.2 用日志和监控把隐患提前暴露

DHCP 属于“平时没人注意,一出问题全网瘫痪”的服务。所以我觉得监控的重点不是“服务挂了报警”,而是“风险指标异常时提醒”。

值得盯的指标有几个:地址池剩余率、DHCPNAK 数量、DHCPDECLINE 数量、租约请求成功率。地址池剩余率可以从租约文件统计,也可以用dhcpd -6类似的参数来观察,不过更省事的是写脚本定期解析 leases 文件,把空闲地址量上报到监控系统。DHCPNAK 和 DHCPDECLINE 一旦突然增多,往往说明有人在配置静态 IP 时撞车,或者网络里出现了非法 DHCP,这种苗头越早发现越好。

日志别只存在本地。可以把 dhcpd 的日志通过 rsyslog 转发到集中日志平台,至少也要让它落盘保留 30 天。出问题时拉历史日志对比,很容易看出是某个网段从哪天开始异常。

6.3 什么时候考虑 Kea 和双机容错

Rocky Linux 默认仓库里很经典的dhcp-server其实已经处于维护模式,新功能基本不再加,ISC DHCP 路线图也偏向收尾。新规划环境时,我已经开始把目光转向 Kea DHCP,它是用 C++ 重写的现代实现,配置方式变成 JSON,支持数据库后端、REST API、更细的租约管理。如果你正在设计一套长期要跑的内网,建议至少了解 Kea 的架构,后面再迁移也不至于一头雾水。

至于双机容错,需求取决于业务影响面。普通办公网一台服务器已经够用,真挂了重启也很快。但如果是生产网络,甚至办公终端数量上千,DHCP 单点就成了一颗定时炸弹。ISC DHCP 自带 failover peer 配置,同步租约状态,但部署复杂度不低,而且很多时候网络设备侧也要配合 VIP。我的建议是,不要为了“高可用”盲目上双机,先把单机监控、配置备份、快速恢复这三件事做扎实,等单机方案确实顶不住了,再投入双机。

最后说一个实操心得:我每次改 dhcpd.conf 之前,都会先把当前的配置文件和租约文件复制一份带时间戳的备份,然后dhcpd -t检查一遍,再 systemctl restart。这套流程多花一分钟,却能让你在任何时候都能放心回滚。DHCP 不是一个需要频繁折腾的服务,配置一旦稳定,它应该安静地一直跑下去。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 9:29:10

Wi-Fi标准演进的三大维度:PHY、MAC与兼容性解构

1. 为什么“初探”这个词在Wi-Fi标准学习中反而最危险刚接触Wi-Fi协议栈的开发者、网络运维新人,甚至不少做了多年无线设备测试的工程师,第一次看到“802.11a/b/g/n/ac/ax初探”这类标题时,下意识会松一口气——“哦,入门级内容&a…

作者头像 李华
网站建设 2026/10/19 9:28:25

840D SL TOOLBOX安装避坑指南:V4.7控制器匹配V4.7.3.0版本实操

简介:840D SL TOOLBOX 是西门子840D SL数控系统专用的全套调试与开发辅助工具集,面向机床电气工程师、PLC程序员及数控系统集成技术人员,用于完成PLC程序下载、报警配置、GSD/GSDML设备描述文件管理、NC变量监控、硬件组态(S7HW A…

作者头像 李华
网站建设 2026/10/19 9:27:25

Lambda架构详解:从实时离线矛盾到数据一致性落地

搞数据平台时间长了,你会发现一个特别拧巴的现象:业务方白天盯着实时大屏,数字跳来跳去,晚上凌晨跑完批任务,出来的报表又是另一套数字。两边对不上,业务方就会质疑平台的数据能力。这个"实时要快、离…

作者头像 李华
网站建设 2026/10/19 9:27:12

基于SpringBoot的网上问卷调查系统:从数据库建模到统计报表实战解析

1. 项目概览:这个问卷调查系统到底能做什么做技术这么多年,我接触过不少“看起来很基础、做起来全是细节”的系统,网上问卷调查系统就是其中典型的一个。很多朋友一开始觉得它就是“问卷CRUD 答题页面”,真上手之后才发现&#x…

作者头像 李华
网站建设 2026/10/19 9:26:16

JAVA对接声网实现直播画面真实性监控

1. 为什么直播监控不能只靠“看画面”——从被动盯屏到主动截帧的思维转变在某跨平台教育直播系统上线后的第三周,运维团队连续收到三条来自不同区域的投诉:某导师在讲解高数微分方程时,学生端突然黑屏长达47秒,但后台日志显示推流…

作者头像 李华
网站建设 2026/10/19 9:24:41

open-code-review:开放可溯的代码评审新范式

1. “open-code-review”不是个工具名,而是一套正在成型的协作范式“open-code-review”这个词最近在技术社区里频繁出现,但它既不是某个开源项目的名字,也不是某家公司的产品代号——它本质上描述的是一种以开放、可解释、可复用为前提的代码…

作者头像 李华