
咱们做网络运维的几乎每天都和 DHCP 打交道但真正遇到故障时能一口气把链路理清楚的人并不多。DHCP 全称是 Dynamic Host Configuration Protocol动态主机配置协议它解决的不是“能不能上网”的问题而是“终端设备凭什么觉得自己能上网”的问题。这个协议藏在用户感知之外却直接决定了办公网、宿舍网、机房网能不能平稳运转。这篇文章我就从协议机制讲到实际部署再讲排障和加固全程基于我自己的真实踩坑经验适合刚入门网络的小白也适合需要系统梳理 DHCP 知识的网管同学。1. 先搞清楚 DHCP 到底在替我们做什么1.1 没有 DHCP 的日子有多可怕想象一个两百人的公司所有终端手工配置 IP。今天来了一位新同事你得给他找一台能上网的电脑看一眼上面配的 IP再找一个没被占用的网段手动填进新机器里。填完发现网关不对因为不同部门可能分了不同的 VLAN你还得逐台核对。这只是新增设备的烦恼更麻烦的是冲突。一台机器休眠几天另一台机器把同一个 IP 占用了等休眠机器醒来两台设备拿着同一个地址在网络里互相“打架”表现为一段时间的间歇性断网。这种故障排查起来非常痛苦因为纯靠肉眼无从下手。DHCP 的出现就是把“分配地址”这件事集中化、自动化了。你只需要维护一台服务器告诉它“这个网段哪些地址能分、分多久、分的时候带上什么附加信息”剩下所有的事情都由协议自动完成。用户感受不到它的存在但每台设备开机后能顺利入网靠的正是它。1.2 协议里的三个角色和四个核心报文DHCP 系统里有三个角色要记清楚DHCP 客户端就是需要获取 IP 的终端设备比如电脑、手机、打印机甚至 IP 话机。DHCP 服务器负责管理地址池、分配租约、回收地址是整条链路的决策者。DHCP 中继代理当客户端和服务器不在同一个广播域时负责把客户端请求转发给服务器的设备。通常是三层交换机或路由器。客户端与服务器之间通过四个报文完成一次完整的地址分配这就是老网工常说的 DORADiscover客户端在网络上大喊“有没有 DHCP 服务器给我一个地址用”。Offer服务器回应“我这里有个地址你要不要”。Request客户端说“我就要这个地址确认一下”。Ack服务器说“好这个地址归你用租期多久参数是什么”。有人会问客户端怎么知道服务器在哪它不知道所以 Discover 报文是广播发出的。正因如此DHCP 协议天然依赖广播而中继的作用就是在跨网段的时候把这种广播“打包成单播”再转交给远处的服务器。这个特性后面排障时非常重要。1.3 租约、续租和释放地址不是永久的拿到地址并不代表永久使用。服务器给客户端的地址有一个租期常见设置是 24 小时到 7 天不等。租期过半时客户端会尝试续租也就是重新发送 Request 报文请求继续使用同一个地址。如果服务器同意就继续用如果不同意或联系不上客户端会在租期剩余 12.5% 时再次尝试直到最后租约到期才彻底放弃重新走一遍完整 DORA。很多人把 DHCP 理解成“每次开机随机发一个 IP”这其实不对。DHCP 是有状态记忆的服务器会记录客户端的标识符通常是 MAC 地址和最近分配的地址。客户端续租时只要地址没被分给别人一般都会继续拿到同一个 IP。但这种“尽量保持稳定”的原则不是绝对的如果地址池紧张、租期设置过短或者服务器重启后缓存丢失IP 跳变就会变得频繁。理解了租约机制就能解释很多现象为什么有人改了 MAC 地址后 IP 变了、为什么地址池明明空着但某台设备就是拿不到想要的 IP、为什么排查时要先看看租约文件里到底记了什么。协议本身不复杂复杂的是它和现实场景交织在一起的各种例外。2. 部署 DHCP 之前先学会算地址池2.1 地址池规划的完整思路很多初学朋友部署 DHCP 时直接设一个192.168.10.100-192.168.10.200就完事了这是典型的随缘配置。正规做法是先摸清楚这个网段到底有多少设备、哪些设备需要固定地址、未来半年会不会扩容然后反推地址池范围。以我常用的办公网规划为例。假设公司内部使用一个三层交换机划分了三个 VLAN其中办公 VLAN 的网段是192.168.10.0/24。在这个网段里192.168.10.1给网关也就是核心交换机192.168.10.2到192.168.10.10留给服务器和网络设备管理地址包括文件服务器、监控平台、路由器管理口192.168.10.11到192.168.10.50留给打印机、门禁控制器等需要固定地址但不用服务器静态绑定的设备192.168.10.51到192.168.10.200作为动态地址池给普通终端使用192.168.10.201到192.168.10.254作为预留段未来给新增服务器或扩展网段使用。这样分配的核心逻辑是动态池尽量向高端或中段靠把低段留给网络设备和基础设施。原因是排查故障时一看 IP 段的分布就能大致判断设备类型不用每台都登进去查。你要在 DHCP 服务器里把保留地址段排除掉否则服务器把打印机或服务器自己的地址分给了终端冲突在所难免。2.2 一个可直接参考的 DHCP 服务配置样例这里我用 Linux 环境下常见开源 DHCP 服务作为例子纯命令行实现适合大多数中小型网络。假设服务运行在 Ubuntu 上主配置文件是/etc/dhcp/dhcpd.conf基础内容大概长这样# 全局参数 option domain-name office.internal; option domain-name-servers 10.0.0.53, 10.0.0.54; default-lease-time 86400; max-lease-time 604800; log-facility local7; # 办公网段 subnet 192.168.10.0 netmask 255.255.255.0 { option routers 192.168.10.1; option subnet-mask 255.255.255.0; range 192.168.10.51 192.168.10.200; option broadcast-address 192.168.10.255; option ntp-servers 192.168.10.5; }逐行说几个容易忽略的点default-lease-time 86400表示默认租期 86400 秒也就是一天。max-lease-time是客户端主动请求租期上限时的最大限制一般设成 7 天。option routers是给客户端的默认网关必须和真实网关一致填错的话终端能拿到 IP 但上不了外网。option domain-name-servers这里填内部 DNS 地址不要填公网 DNS。公司有域环境的话尤其要注意否则域名解析会出各种奇怪问题。range是动态地址池范围注意要和保留段错开。如果你只需要轻量级方案也可以考虑用 dnsmasq它可以同时承担 DNS 缓存和 DHCP 服务配置格式更简单特别适合家里、实验室或小型办公室。但企业正式环境我仍然推荐完整版 DHCP 服务因为它的日志、租约文件、权限控制更清晰出问题时可查的信息更多。2.3 网关、DNS、租期和 Option 到底该怎么填很多新手对 Option 这个概念发怵其实它就是 DHCP 服务器在分配 IP 时顺便携带的“附加信息”。最常见的几个选项如下Option 1子网掩码客户端用它与 IP 地址结合判断自己所在网段。Option 3默认网关这是最不能填错的选项。Option 6DNS 服务器地址可以配多个用逗号分隔。Option 42NTP 服务器时间同步不上的终端很多是少了这个选项。Option 66TFTP 服务器地址用于 IP 话机和 PXE 网络启动。Option 67启动文件名PXE 无盘启动时用得比较多。租期长短怎么定需要平衡稳定性和地址利用率。如果是会议室、访客 Wi-Fi租期可以设短一些例如 2 小时避免大量临时设备长时间占用地址如果是办公终端、打印机租期建议 24 小时起步甚至 7 天。租期太短会导致设备频繁续租网络里充斥着 DHCP 报文无线环境下会明显增加空口开销租期太长则可能导致地址池回收慢来了一批访客设备之后动态地址很快就见底了。从运维角度我习惯在正式配置前把所有 Option 写成一张表对照网段规划逐一填填完再上线。不要嫌麻烦这一步能省掉之后至少一半的“为什么上不了网”类工单。3. 核心排障流程DORA 走到哪一步断的3.1 先别急着抓包按顺序做三层确认收到“我的电脑获取不到 IP”的反馈我先不碰命令行先问三个问题是只有一台设备获取不到还是整个网段的设备都获取不到这个网段是新划的还是以前正常的最近有没有改过交换机配置或者加过新设备这三个问题的答案决定了排查方向。单台设备拿不到 IP大概率是客户端问题、网线问题、或者这台设备被加入了某种黑名单。整个网段拿不到 IP重点查服务器、交换机、DHCP 服务进程甚至可能存在私接的二级路由把 DHCP 报文劫持了。只有交叉确认之后抓包才有意义否则在错误的方向上抓半天也看不到任何东西。基础命令这里也一并给出。Windows 上按WinR输入cmd然后执行ipconfig /release ipconfig /renew ipconfig /allipconfig /all能看到当前是否拿到了地址、DNS 是多少、租约过期时间。Linux 系可以用dhclient -r释放dhclient重新获取或者更通用的nmcli系列命令。如果 release 之后renew一直卡住说明客户端发出的 Discover 没有得到回应这时候才轮到抓包上场。3.2 抓包定位四个报文缺了哪一个抓包工具选择上图形界面用常见的抓包软件命令行环境用 tcpdump 都行。我在 Linux 服务器上排查时经常直接执行tcpdump -i eth0 port 67 or port 68 -n -vv然后让客户端 renew观察 67服务器端口和 68客户端端口上的报文。整个 DORA 的每一段对应一类典型的故障原因只有 Discover没有 Offer服务器没收到请求或者收到了但无法响应。先确认服务是否在运行再确认地址池是否还有可用地址最后检查交换机上是否配置了 DHCP Snooping 且把服务器的端口标记成了非信任端口。有 Discover 和 Offer但没有 Request说明客户端收到了多台服务器的 Offer或者客户端对收到的参数有异议。这种情况常见于网络里意外存在第二个 DHCP 服务器你查配置时只维护了一台但某台路由器的 DHCP 功能没关。有 Discover、Offer、Request 但没有 Ack服务器收到了请求但拒绝确认。最典型的原因是客户端请求的地址已被服务器判定为冲突或者客户端不在服务器的授权范围内。某次我给一个分部配置跨网段中继后发现终端一直拿不到 IPv4 地址就是卡在只有 Discover 没有 Offer 这个阶段。排查后发现中继配置本身没问题但交换机上有一条 ACL 刚好把 UDP 67、68 端口拦截了跨网段的广播被“静默丢弃”。这个案例教训深刻协议跑不通先看报文再看配置最后看防火墙。3.3 跨网段部署必须理解的中继原理DHCP 服务器不可能每个网段都放一台规模稍大一般都会集中部署。这时客户端所在的网段并没有服务器Discover 广播到达三层设备后会被直接丢弃所以需要中继代理站出来。在主流三层交换机上配置 DHCP 中继的方式通常是在 VLAN 接口下指定下一跳服务器地址思路上等同于对客户端广播说“你找我没用我帮你把这事转交给那边那台服务器”。配置完成后最好用抓包工具在服务器侧抓一次确认报文确实是单播进来的。如果有人配置完中继后仍然拿不到地址优先检查三层到服务器之间路由是否可达以及服务器是否正确配置了对应子网的 subnet 声明。很多服务器默认只响应自己有 subnet 定义的网段请求一个网段漏写了客户端就卡在 Offer 之前。4. 安全加固私接路由器、DHCP 饿死与绑定4.1 DHCP Snooping 的必要性和配置要点DHCP 有一个天然的弱点它信任网络上所有的报文。这意味着任何人都可以在办公室里接一个小路由器给其它设备分配错误的网关或 DNS从而把流量指向自己的设备。这不是危言耸听很多企业内部断网都是因为某位同事私接了一个家用路由导致整个楼层终端 IP 混乱。对抗这类问题的标准手段是 DHCP Snooping。原理并不复杂交换机检查所有的 DHCP 报文只信任来自特定端口的 Offer 和 Ack 报文其它端口只能发 Discover 和 Request。交换机还会根据真实的 DHCP Ack 报文维护一张动态绑定表记录 MAC、IP、端口、VLAN 的对应关系后续可以做更严格的限制。在交换机上配置时核心动作就两句话把连 DHCP 服务器的端口设置为信任端口把连接终端的端口设置为非信任端口然后启用 DHCP Snooping。# 全局启用 dhcp snooping # 在 VLAN 10 上启用 dhcp snooping vlan 10 # 连接 DHCP 服务器的上联口设为信任口 interface GigabitEthernet0/1 dhcp snooping trust # 其它端口默认是非信任口不需要单独配置配置之后要把日志开起来。一旦交换机检测到非信任端口收到了 Offer 报文会记录一条日志这往往是定位私接路由器的重要线索。4.2 防 DHCP 饿死攻击与终端接入限制所谓 DHCP 饿死攻击就是攻击者伪装成大量客户端不断发送带有随机 MAC 的 Discover 报文把服务器地址池耗尽让正常设备永远拿不到地址。这在办公网里不一定是有意攻击某些有漏洞的终端驱动或奇怪的网卡在异常状态下也会产生大量重复请求。防御思路可以从三个层面同时做交换机端口安全限制单个端口最多学习到的 MAC 数量比如 2 到 3 个。配置之后如果同一个端口下出现超过限制的 MAC交换机会丢弃报文或关闭端口。DHCP Snooping 绑定表由于交换机记录了 MAC、IP、端口的绑定关系后续可以在接入交换机上做基于绑定的 IP 源防护丢弃不符合绑定表的报文。注意这个功能需要先让终端正常获取到地址动态绑定表建立后才会生效。服务端层面缩小地址池把真实终端数量与池大小对齐并监控租约文件里当前分配的地址数设置告警阈值。地址池长期爆满本身就是一个需要介入的信号。4.3 主备 DHCP 与多服务器冲突怎么避坑主备模式最怕的不是服务器宕机而是两台服务器配置不一致导致同一个地址被两台服务器分给不同终端。实际操作中我建议要么使用规范的故障转移协议要么使用类似按序划分地址池的方式主服务器分 A 段备服务器分 B 段两边互不重叠。即便备机在主机构活期间临时接管也不会因为地址范围冲突引发雪崩。启用了双 DHCP 服务器之后不要想当然觉得配置重复就行。要定期检查两台服务器上的租约文件并设置租约时间错峰例如主服务器默认租期 1 天备服务器默认租期 6 小时这样即使客户端走到了备机地址也会更快释放回池子。另外所有变更操作先改主服务器验证确认后再改备服务器避免两边配置在时间差内不一致。5. 一段时间的运营维护日志、监控与自动化5.1 日志里藏着最多有用的信息很多运维同事不到故障不查日志这是不对的。DHCP 服务每分配一个地址、每续租一次都会写日志日志里能看到客户端的 MAC、分配的 IP、操作时间是租约异常的第一现场。常见开源 DHCP 服务默认把日志写到系统日志里例如grep dhcpd /var/log/syslog | tail -n 50日志过长时注意轮转避免日志文件占满磁盘。生产环境我习惯把 DHCP 日志单独输出到一个文件并且配置轮转策略按天分割保存 30 天。这样查历史问题时能快速定位“昨天下午这个 IP 到底分配给了谁”。5.2 用简单脚本定期检查地址池水位检查地址池水位不一定要上重型监控系统一条命令加一个 cron 就够了。例如从租约文件里统计当前有多少地址被分配awk {print $3} /var/lib/dhcp/dhcpd.leases | sort -u | wc -l再配合当前子网的地址池大小就可以得出使用率。使用率超过 80% 时手动扩充地址池或清理无效租约。真实场景里最常见的池水位异常是我前面提到的 DHCP 饿死型请求所以脚本里最好同步检查同一 MAC 是否异常地出现在大量租约里出现这种情况基本可以断定有设备在疯狂发送 Discover。5.3 配合终端准入IP、MAC、端口三位一体大一点的企业网会把 DHCP 与准入系统打通。设备接入后通过 DHCP 获取到地址只是拿到了“临时身份”通过准入认证后才会被放行到业务网段。这时候 DHCP 服务器的角色从“地址管理员”变成了“身份分发中心”它分配的 IP 必须要和准入系统下发的 VLAN 信息一致。我个人的建议是即便你的环境还没有准入系统也至少在交换机上把 DHCP Snooping 和端口安全打开。免费的开源方案已经能挡住绝大多数误配置和低级攻击不要等到网络出了大问题再回头补课。6. 几个我真实踩过的坑以及给你们的小建议6.1 坑一第二台 DHCP 服务器的“幽灵”分配某次现场反馈办公网 IP 频繁变化抓包发现同一网段存在两个 Offer。排查了很久最后发现是机房一台测试用路由器开着 DHCP 服务地址池恰好和办公网重叠。从那以后我养成了习惯所有三层设备在接入网络前必查接口下是否有 DHCP 服务处于开启状态而且全公司在用交换机也会定期巡检一遍确保没有设备意外开启了这个服务。6.2 坑二地址池没有排除保留地址给打印机做了 IP 保留之后把保留地址忘了从动态池中排除。结果打印机的保留地址被某台笔记本电脑拿走了打印机反而拿不到 IP。排查时一看绑定表就明白了排除地址池里的占用项之后改配置文件重启服务才恢复正常。这个错误非常低级但它确实会发生尤其是大家都喜欢在地址池里“挑一段看上去没人用的”。6.3 坑三租期设置太短导致无线频繁掉线园区无线环境里最初为了快速回收地址把所有租期设为了 10 分钟。运行几天后收到大量“Wi-Fi 每隔几分钟断开重连”的投诉。原因就是租期太短终端频繁续租尤其在多 AP 环境下续租报文的时延和处理不一致会让客户端认为网络异常主动断开后重新关联。把租期改到 1 小时后问题立刻消失。无线环境下 DHCP 参数必须和网络架构相匹配不能照搬有线的经验。6.4 最后给你一份速查建议新部署 DHCP 不要直接在生产网络里改配置先搭一套测试环境复现日常的设备和流量模型观察 24 小时。变更运维时改配置前备份配置文件改完后手动 renew 几台终端并紧盯着日志确认新租约正常生成。排查故障时永远先看现象确认范围再抓包不要凭感觉改配置。DHCP 这个协议看上去不过几十个报文选项但要在一个真实网络里跑得稳、跑得安全需要投入的注意力其实不少。我见过太多人第一次配 DHCP 觉得“这有什么难的”结果第一周就栽在地址池冲突或者私接路由上。希望这篇文章能帮你把这条路走平。