
搞网络的人基本都绕不开DHCP。不管是新设备上线、办公网终端接入、还是跨网段分配地址DHCP这一层要是没理清楚后面排查起来能让你怀疑人生。尤其是碰到“部分网段能拿到地址、部分网段拿不到”这种诡异现象多半就是DHCP的四种角色——接口地址池、中继、服务器、客户端——之间的关系没捋顺。这篇东西不念PPT直接按我实际调试网络的思路把DHCP从角色分工、配置方法到排障手段一次说透。适合刚接手网络维护的新人也适合那些配过DHCP但没系统理过体系的朋友看完能直接对着自己的环境动手改。1. DHCP角色拆解四种身份分别解决什么问题很多人把DHCP理解成“一个发地址的服务”但真到了配置和排障的时候就会发现“发地址”这件事其实被拆成了好几个位置的角色真正的服务器在哪里、地址池怎么划、跨网段时谁帮你把请求转过去、终端那边又是怎么个表现。这四个角色各管一段搞混了就会出现“服务器明明正常终端就是拿不到地址”的怪事。1.1 接口地址池与服务器地址从哪里来、给谁用先定个调DHCP服务器是真正“管地址”的角色它维护着若干个地址池收到客户端的请求后从对应的池子里挑一个空闲IP租出去。市面上常见的DHCP服务器形态有三种一是Windows Server自带的DHCP服务二是在Linux上跑的dhcpd或dnsmasq三就是很多交换机、路由器自带的DHCP服务功能。很多人一听到“接口地址池”就以为它是独立于服务器的另一种东西其实不是。接口地址池是服务器上的一种地址池组织方式常见于网络设备自带的DHCP服务在某个三层接口比如VLANIF接口下直接绑定一个网段的地址池这个接口收到的请求就用这个池子来分配。换句话说接口地址池是“跟着接口走的池子”而服务器是“管池子的角色”。举个例子感受一下一个核心交换机上创建了VLAN 10和VLAN 20VLAN 10的网关是192.168.10.1VLAN 20的网关是192.168.20.1。如果在这台交换机的VLANIF 10接口下配置接口地址池那么从VLAN 10内发来的DHCP请求交换机就从192.168.10.0/24网段对应的池子里发地址VLAN 20的请求则由VLANIF 20下的接口地址池处理。这种做法的好处是直观、跟VLAN强绑定适合中小型园区网、单台设备搞定多网段分配的场景。缺点是池子和接口耦合想跨设备做地址池冗余就麻烦了。1.2 中继与客户端跨网段怎么找到服务器接下来是重头戏DHCP中继DHCP Relay。为什么需要它因为DHCP客户端发地址请求用的是广播包DHCPDISCOVER报文的源地址是0.0.0.0目的地址是255.255.255.255而广播包默认不会穿过三层接口。如果服务器在另一个网段客户端的广播请求根本到不了服务器这就像你在小区里喊了一嗓子要快递但快递站在隔壁小区人家听不见。中继干的事就是“替你喊话”。它通常是三层交换机或路由器上的一个功能配置在客户端的网关接口上。客户端广播发请求网关中继收到后把它转换成一个单播包转给远方真正的DHCP服务器。服务器应答时再把回复交给中继由中继转回给客户端。中继还干了一件特别关键的事往请求报文里塞了一个叫做**giaddr网关IP地址**的字段填的是客户端的网关地址。服务器一看到这个字段就知道请求来自哪个网段从而从对应的地址池里挑地址。这也是为什么中继一配置错地址就乱发的原因。1.3 为什么这四种角色常常混着说聊到这儿你应该已经能体会为什么这四个词容易被绕晕因为在一台设备上可能同时身兼数职。一台三层交换机既在VLANIF 10下配置接口地址池当服务器角色又在VLANIF 20下配置中继、把请求转给外面独立的DHCP服务器。一台Linux服务器既跑着DHCP服务服务器角色又可能在自己的网卡上配置中继功能去转发其他设备的请求。而客户端这个角色相对简单就是发出请求、接收租约、续租但客户端的行为细节恰恰是很多人排查时的盲区后面会单独讲。搞清楚了角色分工配置才有方向。下面按服务器部署、中继配置、客户端行为三个阶段走一遍实操。2. DHCP服务器部署与接口地址池配置实操先说结论如果是小网络一两百台设备用一台普通PC装Linux跑个dhcpd都够如果是多VLAN的园区网我建议优先看三层交换机自带DHCP功能要是服务器数量多、要集中管理那就上Windows Server或独立的Linux服务器做集中DHCP。选型不是越重型越好而是看你的地址池规模和故障域怎么隔离。2.1 服务器选型与基础准备动手配DHCP之前环境准备里最容易被忽略的是静态IP与地址规划。DHCP服务器本身必须用静态IP这个是铁律。你要是让服务器自己跑去DHCP拿地址回头服务起不来、地址池错乱哭都来不及。接下来把要分配的网段、网关、DNS、租期时间定下来做成一张规划表比啥都管用。以下是一张很常见的规划示例项目示例值说明服务器静态IP192.168.100.10/24服务器自身地址固定终端网段VLAN 10192.168.10.0/24网关192.168.10.1终端网段VLAN 20192.168.20.0/24网关192.168.20.1可分配地址范围VLAN 10192.168.10.100-192.168.10.200避开网关、避开服务器设备DNS服务器8.8.8.8 / 114.114.114.114按实际内网DNS填租期8小时或1天办公区建议1天无线访客可2小时2.2 在常用操作系统上部署以Linux为例我自己的习惯如果环境里没有现成的Windows域控就装一个Linux跑DHCP省资源、好调试、日志直白。以Debian/Ubuntu系为例第一步装软件apt update apt install isc-dhcp-server -y装完别急着启动先看配置文件 /etc/dhcp/dhcpd.conf。下面是一个最小可跑的配置模板我按上面的规划表来写# 全局租期参数 default-lease-time 28800; max-lease-time 86400; log-facility local7; # VLAN 10 的地址池 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 domain-name-servers 8.8.8.8, 114.114.114.114; } # VLAN 20 的地址池 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 domain-name-servers 8.8.8.8, 114.114.114.114; }这里有个细节如果服务器在192.168.100.0/24网段而你分配给终端的网段是192.168.10.0/24那服务器必须在对应网卡上能路由到目标网段否则客户端借到IP也找不到网关。DHCP本身只负责发地址不负责帮你建路由。接着告诉服务跑在哪块网卡上编辑 /etc/default/isc-dhcp-server把INTERFACESv4改成服务器面向终端的那块网卡比如INTERFACESv4eth1然后启动并看状态systemctl restart isc-dhcp-server systemctl status isc-dhcp-server ss -ulnp | grep 67UDP 67端口在监听服务就是起来了。防火墙别挡UDP 67/68端口这是服务器的入站口。2.3 交换机/路由器上的接口地址池配置再来说更常见的场景直接用三层交换机当DHCP服务器。以下命令风格为某主流企业级设备的通用写法核心逻辑是“DHCP服务使能 在网关接口下绑定接口地址池”。不同厂商命令细节有差异但思路一摸一样system-view dhcp enable # 全局开启DHCP服务 interface vlanif 10 ip address 192.168.10.1 255.255.255.0 dhcp select interface # 接口地址池模式 dhcp server dns-list 8.8.8.8 114.114.114.114 dhcp server excluded-ip-address 192.168.10.1 192.168.10.99 dhcp server lease day 1 quit interface vlanif 20 ip address 192.168.20.1 255.255.255.0 dhcp select interface dhcp server dns-list 8.8.8.8 114.114.114.114 dhcp server excluded-ip-address 192.168.20.1 192.168.20.99 dhcp server lease day 1 quit注意“dhcp server excluded-ip-address”这一步很多人会漏。你规划的可分配范围是从100开始的但设备默认地址池是整个网段如果不把网关、管理地址排除掉它真会把192.168.10.1发给某个倒霉的终端然后立刻产生IP冲突。排除地址是接口地址池配置里必须做的动作没有之一。2.4 租期与保留地址租期长短直接影响网络稳定和地址池利用率。办公区PC设1天比较折中既避免频繁续租占用资源又能在员工笔记本长时间离开网络后快速回收地址。无线访客网络建议设2到4小时人流流动性大地址周转快。还有一种需求是把特定设备的IP固定下来打印机、门禁控制器、摄像头这类设备IP一变业务就趴窝。做法有两种一是DHCP静态绑定也叫保留把设备的MAC地址和某个IP绑死二是干脆给这类设备手动配静态IP不在DHCP池子里。我自己偏向在DHCP服务器上做保留好处是IP、MAC、DNS、网关统一由DHCP下发不会手滑配错。Linux的dhcpd里配置保留是这样host printer-01 { hardware ethernet AA:BB:CC:DD:EE:FF; fixed-address 192.168.10.50; }在网络交换机的全局地址池里也是类似的“static-bind ip-address mac地址”语法。绑完之后记得重启或reload配置。3. 跨三层网络的中继配置原理与实例前面说了中继是为了解决广播穿越三层的问题。但实际里什么时候才需要中继判断标准很简单DHCP客户端和DHCP服务器不在同一个网段就必须要中继。哪怕中间就隔了一个三层口客户端的广播也过不去。3.1 中继到底做了什么用一个生活类比可能更好理解你住的小区门禁不让外卖员进来但物业前台可以代收。中继就是那个物业前台。客户端住户喊“我要点外卖”DHCPDISCOVER广播中继物业听到后自己替住户打电话把广播变成单播给外面的餐厅DHCP服务器说“XX栋XX号的住户要一份”。餐厅做好了先把餐送到物业物业再转给住户。关键就在那份“地址单”上中继打电话时必须告诉服务员自己在哪个小区哪栋楼这就是giaddr字段。服务器根据giaddr从对应网段的地址池分配IP确保发出去的地址跟客户端在同一网段。这里必须强调一个初学者常犯的理解错误DHCP中继本身不是一个独立的硬件或进程它是三层网关设备上的一个路由功能直接配置在客户端的网关接口上。你不可能在服务器那端“开启中继”中继永远在离客户端近的这一侧准确说在客户端所在VLAN的三层接口上。3.2 中继配置步骤实际配置中继的场景往往是这样的核心交换机上做了VLAN 10和VLAN 20DHCP服务器单独放在VLAN 100里。VLAN 10和VLAN 20的终端要从VLAN 100的服务器拿地址。这时候DHCP服务器本身不需要什么特殊配置只要在VLAN 10和VLAN 20的网关接口上配置中继指到服务器的IP。以下命令风格依然以主流设备为例system-view interface vlanif 10 ip address 192.168.10.1 255.255.255.0 dhcp relay server 192.168.100.10 quit interface vlanif 20 ip address 192.168.20.1 255.255.255.0 dhcp relay server 192.168.100.10 quit用思科风格的命令则是“ip helper-address 192.168.100.10”原理一样。配置完不用重启服务但需要用下面的方式验证。3.3 配置中继后的验证方法配完中继不要只看配置下发成功而要确认报文真的被转过去了。我最常用的验证动作有三个在客户端释放并重新获取地址Windows下ipconfig /release然后ipconfig /renew观察是否拿到正确网段的IP。在DHCP服务器上抓包看有没有源地址是0.0.0.0、目的地址是255.255.255.255的请求如果能看到说明中继把报文单播转到了服务器再看回包里的giaddr字段是否等于客户端的网关IP。在网关设备上查看中继统计或debug信息很多设备有“display dhcp relay statistics”这类命令能看到收发报文的计数增长。如果客户端一直获取不到地址第一步就是检查中继是不是配在了正确的VLANIF口上。中继一定要配在客户端所在VLAN的网关接口而不是配在服务器那侧的接口上。这是中继排障里排第一位的低级错误。同时确保网关设备的VLANIF接口UP、VLAN成员端口正确、服务器到网关之间三层连通不然中继把包转出去了也回不来。3.4 多VLAN共享一台服务器的地址池规划用一台DHCP服务器给几十个VLAN分配地址是园区网的日常。这要求服务器侧给每个网段建一个独立的地址池subnet并根据giaddr自动选择。在dhcpd里你要做的事情其实已经在上文写过了建多个subnet块。特别注意避开每个网段的网关IP以及服务器托管的设备地址。还有一件事很多人会忘如果某个网段的地址池没有在服务器上定义中继转过去的请求会被直接丢弃日志里提示“no free leases”或“no subnet”排查时看到这句基本就是地址池缺失。我建议在规划期就给每个地址池命名规则化池名包含VLAN号、网段、用途比如“vlan10_office_pool”。这样在服务器上维护几十个池子的时候至少不会看着一堆subnet块头晕。4. 客户端行为细节与常见故障排查很多网络问题看起来是DHCP的锅查到最后是客户端状态异常。所以别急着骂服务器先搞清楚客户端在DHCP里到底做了哪些事。4.1 客户端获取地址的完整生命周期客户端从开机到拿到IP经历四个阶段这也是面试常问的点DISCOVER找服务器、OFFER服务器给地址、REQUEST客户端确认要、ACK服务器确认租约。全程是UDP报文客户端和服务器都往UDP 68/67端口收发。拿到地址那一刻开始租期计时就开始了。普通租约的一半时间T1到了客户端以单播方式向当初分配的服务器发起续租DHCPREQUEST如果服务器没回等租约87.5%的时候T2再广播续租。如果一直到租约过期都没续上地址被回收客户端就重新走一遍DISCOVER流程。生活里最直观的场景就是笔记本休眠唤醒后隔了十几个小时网络可能会卡一下然后自己好往往就是租约续期在起作用。客户端还有一个动作容易被忽略正常关机、断开Wi-Fi的时候会发一个DHCPRELEASE包还给服务器。但现实中很多终端不老实直接断电、拔网线根本没发RELEASE。这也是地址池明明很大却总显示“地址不够”的隐性原因之一后面排查会讲。4.2 常见故障排查命令与思路排查DHCP问题我的顺序永远固定先看链路和VLAN再看服务器再查中继最后才查客户端自己。很多人一上来就在服务器上翻配置结果人家链路根本不通白忙一场。客户端侧Windows系统最顺手的命令是ipconfig /all ipconfig /release ipconfig /renewLinux桌面或服务器则用dhclient -r eth0 dhclient eth0 journalctl -u dhclient --no-pager | tail -50服务器侧Linux的dhcpd日志在/var/log/syslog或/var/log/messages里。出了故障先grep“dhcpd”关键字看有没有“not authoritative for subnet”“no free leases”之类的报错这两句会直接把问题指向地址池规划或配置错误。如果是网络设备自带的DHCP服务通常有“display dhcp server statistics”“display dhcp server conflict”这类命令重点看conflict列表里面全是用过的IP和冲突记录。中继侧排查最直接的是在网关设备上ping 服务器的IP如果ping不通中继配了也白配。通网之后再看中继状态“display dhcp relay server”能查到中继指向的服务器IP和转发计数。4.3 高频问题速查表根据我这几年的排障经验把最常见的问题按“现象-原因-动作”整理成一张表现象大概率原因快速处理动作所有网段都获取不到地址DHCP服务没起来检查UDP 67监听、服务状态、防火墙特定VLAN获取不到地址中继没配或地址池缺失查网关VLANIF下中继指向查服务器对应subnet块拿到地址但无法上网网关地址没下发或网关配置错误ipconfig /all看网关核对地址池option routersIP地址冲突告警地址池没排除设备静态IP在服务器上排除或绑定保留地址地址池看着很充裕但分配失败租约未释放、MAC异常查服务器conflict表手动清理冲突记录无线终端频繁掉线租期过短地址池小适当延长租期或扩大地址池换个VLAN还拿旧网段地址客户端缓存旧租约先release再renew必要时重启网卡4.4 我踩过的坑下面几个坑都是我真金白银换来的教训写在这里算是给大家提个醒。第一个坑给接口地址池排除了地址但没排除网关。结果网关被服务器发给了某台电脑网络瞬间出问题排查了一圈发现是地址冲突。之后我每次手动规划地址池第一件事就是核对排除段是否覆盖了所有手工配置的地址。第二个坑中继配好了但忘了在VLANIF接口上开启中继模式。有些设备默认VLANIF接口是“不代理DHCP”的光把服务器IP指上去没用还要显式开启“DHCP relay”模式。第三个坑在Windows DHCP服务器上新建作用域的时候激活了所有地址没做“排除和延迟”设置结果网关、打印机、防火墙全被分出去冲突一片。正确做法是作用域创建完第一步就配置排除范围再激活。第四个坑在Linux dhcpd服务器上同时配了多个网段的subnet块但没启“authoritative”指令。这个指令的意思是本服务器是这些网段的权威DHCP服务器。如果不加客户端带着旧地址请求续租时服务器会犹豫要不要拒绝导致某些设备要等好几个租约周期才能稳定上网。在所有正常网段的dhcpd.conf里加上“authoritative;”就行。第五个坑地址池规划不预留“缓冲区”。比如地址池最大可用200个IP实际设备已经快200台了明明排除了故障设备、释放了旧租约还是不够。后来发现有些打印机、摄像头常年在线又没绑定保留地址天天跟办公电脑抢地址一到下午就崩溃。从那以后地址池使用率超过70%就必须考虑扩容或调整租期了。5. 从跑通到稳定细节打磨与后续思路配置能跑通只是第一步真正在网络里稳定运行还得在几个容易被忽视的细节上下功夫。这些细节各个文档里都写得隐晦但实际运维中天天都要面对。5.1 高可用与地址冲突处理单台DHCP服务器宕机整个网络的终端都新拿不到地址但已经拿到租约的设备还能将就用。所以如果你手里的网络对可用性要求高可以考虑做双机。DHCP双机并不像数据库主备那么复杂一个常见做法是分地址池互备比如一个网段分成两段A服务器管前一半B服务器管后一半两台服务器的地址池都互相包含对方那一段并且互为中继转发。当然更规范的是用DHCP Failover协议dhcpd支持把同一地址池同步给两台机器一台挂了另一台无缝接管。小网络用分池互备就够了至少故障一半设备还能上网。IP地址冲突是另一个必须主动处理的问题。很多人觉得服务器发了IP就没冲突了实际上客户端离开网络期间地址可能被手动配给了其他设备回来之后重新获取时就会冲突。所以一定要定期清理DHCP服务器的冲突记录设备上一般有“display dhcp server conflict”和清空命令。更稳妥的是在交换机上开DHCP Snooping它能监听DHCP报文并建一张“MAC-IP-VLAN-端口”的表既能防私接小路由器乱发地址又能帮你在冲突发生时快速定位到物理位置。5.2 安全加固关注点如果你管理的网络有访客接入或者办公区有员工自己带路由器进来就一定要考虑私接DHCP服务器的风险。访客路由器一旦接进网络它的LAN口可能开启了自己的DHCP服务抢答客户端的DISCOVER广播导致别人拿到一个“看起来能上但实际不通”的地址现象就是网络突然大面积异常。这时候交换机上的DHCP Snooping就有用了在面向终端的接口上配trust/untrust只信任连接合法DHCP服务器的端口其他接口的DHCP报文一律丢弃。配上之后私接设备就算接了网线也发不出OFFER包。我管过的所有稍正式的网络都无一例外把DHCP Snooping当成了标配。5.3 自动化与可视化管理网络规模大了之后纯手工维护地址池是噩梦。我的习惯是给DHCP规划和配置做一份“地址分配台账”——把网段、VLAN、地址范围、排除范围、保留设备、联系人、备注全部记在表格里放到内部知识库。然后周期性从DHCP服务器导出租约文件跟台账对一下看看有没有地址漂移和异常占用。进一步还可以用IPAMIP地址管理工具来做自动化扫描和冲突预警把DHCP配置、DNS记录、网络设备上的IP统一纳管。当然这是后话能先把这四种角色玩明白配置和排障顺手了再谈自动化也不迟。配置DHCP这件事难点从来不在命令本身而在脑子里有没有一张清晰的拓扑图请求从哪个VLAN来中继在哪一跳转服务器在哪个网段地址池怎么划。碰到问题不要慌按链路、服务器、中继、客户端这个顺序一层层剥基本半小时内都能定位。我自己也是从“对着文档配半天还拿不到IP”一路摸索过来的。这篇文章里写的每一个坑几乎都在我自己的测试环境里踩过。希望你看完之后再遇到终端获取不到地址脑子里能第一时间弹出那张角色分工图然后动手验证而不是对着配置发呆。如果还有别的DHCP疑难场景欢迎留言交流大家一起把细节抠明白。