一文搞懂DHCP:DORA原理、跨网段中继与安全防护

发布时间:2026/10/11 2:22:40
一文搞懂DHCP:DORA原理、跨网段中继与安全防护 做网络实验DHCP几乎是所有人的“第一课”。我当年第一次在模拟器里搭好两台PC和一个网关最想看到的就是PC啥都不用配一开机就能拿到地址上网。可偏偏这个“看起来到处都有”的DHCP实验让我把广播怎么转发、地址怎么租、中继怎么传全捋了一遍——整个网络基础的核心机制几乎都被这一个协议压在了里面。这篇内容不是官方命令手册的复述。我会从一个最小拓扑的DHCP实验开始把DORA原理讲清楚再逐步扩展到跨网段的DHCP中继、验证抓包和DHCP Snooping安全防护。如果你正在学网络、准备考网络方向认证或者刚入职做网络运维跟着这条路线做一遍你对DHCP的理解就不会停留在“能拿到地址就行”的层面。先交代实验的整体思路主实验用一台路由设备承载DHCP服务器功能给下游交换机上挂着的PC自动分配地址中间穿插抓包验证最后加两个进阶实验——跨网段分配和中继、DHCP饿死攻击防御。做完这一套DHCP这份功课基本就补扎实了。1. 先想清楚DHCP到底在解决什么问题1.1 手工配置IP的三个痛点在DHCP普及之前终端要上网基本靠手工配置。小型环境还好几十台PC逐台填IP、掩码、网关、DNS填到一半就容易出错有人把掩码写错导致跨网段不通有人把网关填成别的段甚至两个人填了同一个IP后开机的那台直接报“地址冲突”。每一台都要去现场处理运维效率极低。还有一个更麻烦的场景网络调整。假设公司把办公网段从192.168.1.0/24改成192.168.10.0/24手工环境下每台电脑都要重新配置一遍。笔记本更是灾难——家里用一种网段公司用一种网段出差到客户现场又是另一套配置手工切换不仅麻烦还特别容易配错。DHCPDynamic Host Configuration Protocol动态主机配置协议就是冲着这些问题来的。它把“地址怎么分配、哪些地址不能分、租期多长”这些规则集中放在一台服务器上终端开机后自动去找服务器“要”配置。这样终端侧不需要任何手工填写网络调整时只需要改服务器上的地址池终端重启或续租几次就能拿到新配置。1.2 DORA四次握手拆解DHCP地址分配最核心的过程叫DORA四个字母对应四个报文Discover客户端广播“我要找DHCP服务器”。Offer服务器回应“我这里有地址要不要”。Request客户端广播“我确认要这个地址”。Ack服务器确认“这个地址归你了按这个参数上网”。具体时序是这样的客户端开机后没有IP所以发出的Discover报文源地址是0.0.0.0目标地址是255.255.255.255广播源端口68目标端口67。网络上如果有多台DHCP服务器它们都会收到这个Discover并各自回应Offer。客户端通常选择第一个到达的Offer然后广播一条Request——广播的目的在于让所有服务器都知道“我选了谁”没被选中的服务器就能把自己预留的地址收回去。服务器收到Request后确认无误回复Ack里面携带完整的网络参数分配到的地址、子网掩码、默认网关、DNS服务器、租期等。客户端收到Ack后把参数应用到网卡上网络配置就完成了。续租则是另一个路子租期过去50%时客户端直接向当初分配地址的服务器单播Request续租如果没等到回应等到87.5%时再广播一次再不行才会重新走完整的DORA流程。有人说DORA像住酒店客人进门喊“我要房间”Discover前台说“有房价格这样”Offer客人说“定了”Request前台递房卡Ack。这个类比挺贴切但严谨起见得补充一点——住酒店是前台垄断经营而DHCP允许多个服务器同时竞价所以会有“多个Offer挑一个”的环节。1.3 报文类型与常见字段如果你要抓包分析下面这几个常见报文类型一定要认得报文方向作用DHCPDISCOVER客户端→服务器广播寻找可用的DHCP服务器DHCPOFFER服务器→客户端提供可租用的地址及参数DHCPREQUEST客户端→服务器确认租用某个地址或续租DHCPACK服务器→客户端确认租约生效地址分配完成DHCPNAK服务器→客户端拒绝请求常见于地址不可用或网段不匹配DHCPDECLINE客户端→服务器客户端检测到地址冲突声明该地址不可用DHCPRELEASE客户端→服务器主动释放地址DHCPINFORM客户端→服务器仅请求配置参数不请求地址抓包时真正要关注的字段并不复杂yiaddr是服务器真正分配出去的地址chaddr是客户端MACgiaddr是中继代理地址这个字段在跨网段实验中极其重要剩下的信息大都藏在Options里比如Option 53报文类型、54服务器标识、51租期、1子网掩码、3默认网关、6DNS服务器。这些字段你先有个印象后面做中继实验和抓包时会反复用到。2. 实验环境准备拓扑、平台与地址规划2.1 用什么环境做这个实验DHCP实验对环境的要求不算高但选错平台会给自己添不少麻烦。我个人的建议是优先用网络模拟器GNS3这种基于真实设备镜像的模拟器因为路由器的DHCP服务、中继功能、Snooping等都和真机行为一致后续做排错和安全实验的兼容性也最好。纯图形化模拟器也能做但有些过于简化的环境在DHCP报文细节上处理得不够严谨比如Option字段补全不全或者中继的giaddr字段没有按标准填充用来跑通流程可以用来学原理不够。如果你手头有真实的交换机或路由器当然更好。没有就模拟器顶上实验结论是一样的。还有一种方案是用Linux系统上的DHCP服务器软件做服务端客户端用普通PC虚拟机的DHCP Client。这条路也完全可以只是配置语法和路由器上的不完全一样本文后续命令以常见的路由设备命令行语法为准。想先跑通整个流程我建议你按本文的拓扑做想顺便练一下Linux方向可以等主实验做完再尝试移植。2.2 最小拓扑与地址规划主实验拓扑很简单一台路由设备R1充当DHCP服务器和网关下面接一台二层交换机SW1SW1接两台PC。实际上如果只是验证分配PC可以直接连R1的接口但加一台交换机更接近真实网络后面配Snooping时也要用交换机。地址规划如下设备接口/网段地址说明R1GigabitEthernet0/0192.168.10.1/24网关兼DHCP服务器SW1VLAN 10192.168.10.2/24管理用纯二层场景可不配PC1来自DHCP192.168.10.10~50自动测试终端PC2来自DHCP192.168.10.10~50自动测试终端这里有个设计理念的问题为什么主实验的地址池只规划20254这样的一段而不是把整个192.168.10.0/24网络全放进去答案很简单——地址池里不能包含接口本身的地址。R1的192.168.10.1是网关地址如果它也被放进地址池里理论上服务器有可能把这个地址分给客户端造成网关冲突全网断连。所以生产环境中设备接口地址、已经手工固定的服务器地址、以及需要保留给特殊设备的地址都要通过排除或单独规划来隔离。实验里我们用一个范围相对小的池子来练习这种控制力。2.3 基础配置与连通性验证先给R1和SW1做基础配置让PC能ping通网关interface GigabitEthernet0/0 ip address 192.168.10.1 255.255.255.0 no shutdownvlan 10 exit interface Vlan10 ip address 192.168.10.2 255.255.255.0 no shutdown interface GigabitEthernet0/1 switchport access vlan 10 no shutdown这个阶段最常见的坑有三个一是把路由器的接口shutdown忘关了命令敲完才发现接口是down的二是交换机的接口没有划分到目标VLANPC和网关之间存在隔阂三是给交换机的SVI地址配了与网关相同的地址两个网关并存。基础连通性用ping验证。PC如果还没有地址就手工随便配一个同网段的临时地址比如192.168.10.100/24只要能与192.168.10.1通说明二层链路没问题可以进入DHCP配置环节。这里临时手工配置只是为了测试链路别嫌麻烦排错时这种“逐步缩小范围”的做法非常常用。3. 核心配置实战地址池、排除与保留3.1 配置顺序先排除再建池DHCP服务配置在路由设备上看就是几行命令但顺序有讲究。很多初学者上来就建地址池忘了把接口地址排除出去结果客户端轮询分配时很可能分走网关地址。正确的是先做排除再做池。在R1的全局配置模式下ip dhcp excluded-address 192.168.10.1 ip dhcp excluded-address 192.168.10.20第一行排除网关地址第二行我故意多排了一个192.168.10.20用来给后面的保留地址实验用。排除命令可以写多条也可以写一个范围ip dhcp excluded-address 192.168.10.1 192.168.10.20这条命令的意思是192.168.10.1到192.168.10.20这个区间都不允许被自动分配。提示排除地址的范围必须覆盖所有不想被自动分配的地址。我在实际维护中见过有人只排了网关地址没排打印机所用地址导致打印机MAC被地址池记录了另一台机器冲突排查了半天。3.2 地址池参数逐条拆解网络、网关、DNS与租期排除配置完成后开始建地址池ip dhcp pool LAN-POOL network 192.168.10.0 255.255.255.0 default-router 192.168.10.1 dns-server 192.168.10.1 lease 0 8逐条说明network指定需要自动分配的网段。注意这个网段要和接口所处的网段一致如果这里写了172.16.0.0/24而接口是192.168.10.0/24客户端就算拿到地址也无法访问网关。default-router下发给客户端的默认网关。实验里最常见的错误是忘了配这行导致PC虽然拿到了地址却ping不通外部网络。dns-server下发DNS服务器地址。实验环境可以指向网关或模拟器自带DNS真实环境就填实际DNS。很多“能上QQ不能开网页”的问题根因就是DNS没配或配错。lease 0 8租期8小时。天时分分别对应0天8小时0分。租期设置属于策略问题办公网络一般1天或8小时比较常见公共Wi-Fi可能更短你实验时想观察租约到期行为把租期调成几分钟也完全可行。配置完成后在PC上触发一次地址获取模拟器里通常连点两次网卡的DHCP或命令行执行释放和重新获取PC应该会拿到192.168.10.10~192.168.10.50范围内的一个地址。这里有个实际测试经验把两台PC同时开机它们拿到的地址大概率是连续的比如PC1拿.10PC2拿.11这正常因为服务器是按没被占用的地址顺序分配的不用惊讶。3.3 固定保留地址给打印机和服务器留位置网络里有打印机、门禁控制器、管理服务器这类设备它们的IP往往需要长期固定否则换一次地址就得重新配置一堆引用关系。但手工配置又容易出现冲突所以更合理的做法是让DHCP来管理保留地址——DHCP服务器在池里把某个地址绑定给固定MAC只有该MAC能拿这个地址。实验里我们给打印机保留192.168.10.20先在全局配置里把它排除掉上一步已经排除了ip dhcp excluded-address 192.168.10.20再单独建一个保留池ip dhcp pool PRINTER-POOL host 192.168.10.20 hardware-address 00a1.b2c3.d4e5这里用了host命令指定固定地址再用hardware-address指定对应MAC。一定要理解为什么保留地址也要先全局排除如果不排除主地址池LAN-POOL会在分配时把这台打印机地址当成可用地址发给另一个客户端导致一个地址两处用灾难现场。保留地址的MAC写成打印机的真实MAC即可不同设备查看MAC的命令有差异Windows下是ipconfig /allLinux下是ip addr模拟器里的PC同理。保留池和普通网络池可以共存它们之间互不影响。客户端带着对应MAC去请求时服务器会把保留地址分给它其他MAC请求时这个地址永远不在候选列表中。4. 验证与抓包我常用的排错链路4.1 看好这些状态binding、statistics、pool配置本身不难但分完地址后怎么确认真实生效需要一套验证命令。我做实验的习惯是先用show命令快速扫一遍状态不急着抓包。最常用的是这三条命令看什么什么时候用show ip dhcp binding已分配的地址、对应MAC、绑定类型、过期时间确认“有没有分出去”“分给了谁”show ip dhcp server statisticsDiscover/Offer/Request/Ack各类报文的收发计数判断DHCP交互卡在哪一步show ip dhcp pool地址池范围、可用地址数、利用率排查地址池是否耗尽典型排查逻辑是这样的客户端获取不到地址时先在服务器上执行show ip dhcp server statistics看Discover计数有没有增长。如果计数器在增长说明服务器收到了请求问题可能在Offer或Request环节如果计数器纹丝不动说明请求根本没到服务器——这时就该查二层VLAN、路由、ACL和中继了。show ip dhcp binding也很关键。有时候客户端确实拿到了地址但拿的是服务器分配给另一个网卡的重复地址或者是过期状态“Expired”这类状态在binding表里一眼就能识别。4.2 抓包验证把DORA的四个包看得明明白白有时候计数器正常但地址就是有问题这时需要抓包精确判断。在你常用的网络模拟器里可以在链路上启动抓包抓取PC与交换机之间的流量或者直接摸出DHCP报文分析。抓包后筛选DHCP协议你会看到客户端开机后第一帧就是Discover目标MAC是FF-FF-FF-FF-FF-FF目标IP是255.255.255.255源地址0.0.0.0。随后服务器发回Offer里面yiaddr字段填了分配地址Option 51给出租期。抓包要看几个关键点帧是不是完整的DORA四步走。如果只有Discover和Offer没有Request多半是客户端没收到Offer或客户端认为Offer不合法。Request报文里是否带上了Option 54服务器标识。如果客户端选错了服务器后面可能收到NAK。Ack报文里是否有完整的Option 1、3、6、51。少任何一个客户端都会拿到不完整的网络配置表现通常是“有地址但上不了网”。我见过一个很典型的新手错误看了半天抓包发现客户端发的是Discover服务器回了Offer客户端却没有后续动作。最后发现是因为服务器回Offer时地址池里配置的掩码和客户端所在子网对不上——客户端计算了一下发现这个地址“不属于自己当前的链路”就直接丢弃了。这种情况不看报文永远猜不到。4.3 现场排错三个典型的“地址给不出”案例案例一客户端拿到的是169.254.x.x自动私有地址。这种地址意味着客户端自己也没能拿到DHCP分配只能给自己随机一个保留网段地址来“自救”。优先检查服务器上的Discover计数如果计数为0问题多半在链路——VLAN没放通、中继没配、ACL挡了广播如果计数增加但没有对应binding产生怀疑地址池配置错误或已耗尽。案例二客户端拿到了地址但ping不通网关。这种场景下先ping网关192.168.10.1不通就检查default-router有没有配置再检查接口地址和下发地址是否同网段。如果ping通但出不了外网再去查DNS和路由。案例三地址可以拿到但第二天早上全部掉线。这种通常是租期策略问题。比如租期设成2小时夜里终端断电第二天一开机发现租约已过期重新获取时服务器又把原来的地址分给了别人或者地址池不够大无法容纳所有终端并发请求。解决思路是合理设置租期和地址池规模必要时给关键设备做保留地址。5. 跨网段分配DHCP中继实验5.1 广播过不了路由终端却要跨网段拿地址主实验里服务器和客户端在同一个广播域内Discover广播可以直接到达服务器。但真实网络不是这样的广播域之间由路由器隔离而DHCPDiscover恰恰是广播报文。如果客户端和服务器分处不同网段它们之间隔着一台路由器广播会被路由器挡下客户端永远等不到Offer。那怎么办增加中继代理Relay Agent。中继的思路很简单由路由器替客户端接收广播然后以单播形式转发给DHCP服务器再把服务器的应答单播传回客户端。整个过程客户端无感知就像酒店前台不在同一个楼里由服务生站在前台和客人之间跑来跑去传话。5.2 ip helper-address 的配置与giaddr原理现在设计一个进阶拓扑R2作为客户端网段192.168.20.0/24的网关客户端PC3连在SW2上SW2连R2R2通过另一个接口连到R1而DHCP服务器就是R1。R1上为客户端网段单独建一个地址池ip dhcp pool REMOTE-POOL network 192.168.20.0 255.255.255.0 default-router 192.168.20.1然后在R2连接终端的接口下配置中继interface GigabitEthernet0/0 ip address 192.168.20.1 255.255.255.0 no shutdown ip helper-address 192.168.10.1这条ip helper-address指向DHCP服务器的地址。R2收到来自192.168.20.0/24网段的DHCP广播后会将其封装成单播报文发给192.168.10.1并在报文的giaddr字段写入自身接口地址192.168.20.1。为什么giaddr如此重要DHCP服务器收到请求时完全不知道客户端在哪个网段它唯一的依据就是giaddr字段。服务器从该字段判断客户端属于192.168.20.0/24从而从REMOTE-POOL中选择地址并且把Offer单播回giaddr所在地址也就是R2的192.168.20.1。R2收到后再转给客户端。如果中继没写giaddr服务器会依据收到请求的接口地址判断池子很可能选择一个错误的网段客户端拿到一个根本不是自己链路上的地址直接丢弃表现为“反复获取、一直失败”。这一段的坑我当年也踩过把ip helper-address写到了连接服务器的接口上方向完全反了服务器能收到中继但中继接口收到Offer后不知道怎么转回客户端。正确写法是放在客户端侧接口上也就是广播进来的那个接口。5.3 中继实验验证要点配置完成后PC3自动获取地址正常应拿到192.168.20.10~50范围地址。验证有两个细节要想清楚bindings应该出现在R1上因为R1才是真正的服务器。如果R2上也能show出DHCP binding那说明你的模拟器把R2当成了服务器或者配置落错了地方。抓包看中继链路PC发出的Discover是广播帧到达R2后被转成以192.168.20.1为giaddr的单播帧发往192.168.10.1。这条链路的抓包能把中继原理看得非常清楚。中继实验中另一种常见需求是一个接口上要转发给多个DHCP服务器做冗余这时可以写多条ip helper-address服务器配置做成双机互备但那就是另一个更复杂的实验范畴了。当前你把单中继跑通双中继等于复制粘贴加验证难度不大。6. DHCP安全补强从防饿死到Snooping6.1 地址池饿死攻击伪造DISCOVER能拖垮一个网段DHCP本身没有认证机制谁发Discover服务器就给谁分配地址。于是有一种非常简单粗暴的攻击方式攻击者在网络里伪造大量MAC不停发送不同chaddr的Discover报文服务器会把这些“伪客户端”全部视为合法的租户一点点耗尽地址池。真实客户端再来要地址时池里已经没有空闲地址了于是全部回落到169.254.x.x网段整个广播域内所有终端都上不了网。这就是DHCP Starvation地址池耗尽攻击。实验里模拟这个攻击不难在PC上循环伪造报文或者在交换机上多接几个节点轮番发起请求。观察服务器上的show ip dhcp pool可用地址数会快速下降bindings里出现大量陌生MAC。到这一步你就该考虑防护了。一个比较直接的缓解手段是在接入交换机上限制每端口DHCP报文速率让单个端口无法短时间发出大量Discover。比如在交换机接入端口上配置DHCP报文限速超出阈值就丢弃。限速值要根据业务需求调整太紧会把正常开机后大量终端的并发请求也误伤太松又起不到防御效果。6.2 DHCP Snooping信任口、限速与绑定表比限速更进一步的是DHCP Snooping。它的核心机制是交换机监听DHCP交互过程为每个成功获取地址的客户端建立一张“MAC地址、IP地址、端口、VLAN”的四元绑定表同时区分信任口和不信任口。连接可信DHCP服务器的端口设成信任口连接终端的端口是不信任口。不信任口上收到的DHCP Offer、Ack等服务器方向的报文会被直接丢弃从而防止有人私接路由器给全网下发错误配置。在交换机SW2上做如下配置对应中继实验的拓扑ip dhcp snooping ip dhcp snooping vlan 20 interface GigabitEthernet0/1 ip dhcp snooping trust interface GigabitEthernet0/2 ip dhcp snooping limit rate 30这里把连R2的口设成信任口连PC的口保持默认的不信任状态并做了每端口报文速率限制。连接终端的接口收到Offer会被丢弃收到终端发出的Discover却能正常记录并转发。配置完成后可以用show ip dhcp snooping binding查看绑定表。Snooping不仅防DHCP层面的攻击后续做动态ARP检测DAI和IP源地址防护IP Source Guard时它创建的绑定表也是基础数据源属于网络中基础且重要的安全机制。6.3 从实验到生产安全配置的取舍实验环境里配置Snooping往往一次成功因为拓扑简单不会引入干扰因素。但到了生产网络有几个现实问题要提醒你所有接入交换机上都要开启Snooping并且只有可信DHCP服务器所在端口是信任口。如果漏配了信任口终端会请求不到地址甚至全网瘫痪。我的习惯是先全局关闭Snooping把所有信任口配好再全局开启最大限度减少误伤。Snooping的绑定表会占用设备内存。终端数量很大的交换机会有一定性能损耗需要评估设备容量并合理规划绑定表老化时间。生产网络上配置时客户端续租行为也受Snooping监听影响。如果绑定表老化参数设置不当可能导致合法终端续租被拦截。安全实验做完我强烈建议你回头再想一遍DHCP从“自动分地址”到“安全准入控制”每一步演化背后都是网络运维的真实痛点。能把一个协议从功能到安全完整串起来比背一百条命令更有价值。如果你也正在做DHCP实验我的建议是最后把DORA四个报文亲手抓一遍每个字段对着协议标准看一遍。要比单纯抄配置命令有用得多。实验做完之后可以继续往DHCP故障切换、Option 43给无线AP下发AC地址、通过绑定表联动准入控制这些方向拓展每一个都够你折腾一阵子也都能帮你把网络这块拼图补得更完整。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询