VRRP和DHCP这两个词摆在一起,很多刚接触园区网的人会以为只是两条独立配置:一条做网关冗余,一条发地址。实际在机房里,它们是一对必须一起算账的搭档。VRRP负责让终端始终看到一个虚拟网关,DHCP负责把这个虚拟网关、DNS和地址租期准确送到终端手里;任何一边的参数错位,表现都是“地址拿到了,网却不通”或者“主网关切换后,新终端上不了线”。这篇内容围绕VRRP与DHCP的联动设计展开,面向刚能配单台设备、准备接手核心网关和地址池的读者,也适合已经踩过双主、地址冲突、切换掉线坑的运维人员复盘。我会从流量路径、方案选型、参数计算、配置片段、故障排查几个层面拆开讲,尽量把机房里真正会遇到的细节写清楚。
1. VRRP与DHCP联动的真实问题:先看清谁在什么位置干活
1.1 VRRP只负责虚拟网关,别把它当负载均衡
VRRP的核心动作很朴素:两台或多台三层设备在同一个广播域里跑一个虚拟路由器组,选出一台Master,由Master持有虚拟IP并回应ARP,Backup只监听VRRP通告。终端把网关配成虚拟IP,它不关心背后是核心A还是核心B。VRRP通告默认走组播224.0.0.18,协议号112,TTL通常是255,这些细节在后面排错时很关键。很多人第一次配VRRP会把虚拟IP和物理接口IP配成同一个,设备直接报冲突;正确做法是虚拟IP单独占一个地址,物理接口各用各的地址,再把虚拟IP从DHCP地址池里排除掉。
需要特别提醒:VRRP不是负载均衡。同一个VRRP组里,同一时刻只有Master转发,Backup处于待命状态。有人看到两台核心都有CPU利用率,就以为流量被分摊了,其实那可能只是协议报文、监控流量或者别的VLAN在跑。真正要做网关负载分担,得按VLAN拆成多个VRRP组,让不同组的主备角色错开,比如VLAN10以核心A为Master,VLAN20以核心B为Master。这个设计会直接影响DHCP中继源地址和地址池的对应关系,不能拍脑袋决定。
实操心得:先把“哪个VLAN用哪个VRRP组、谁是Master、虚拟IP是多少”写成一张表,再动配置。VRRP和DHCP最怕边配边改,地址池里混进虚拟IP或者中继指错接口,排查起来会绕很大一圈。
1.2 DHCP的四个角色:服务器、中继、客户端、地址池
DHCP看起来就是自动发地址,实际链路里有四个角色:客户端发Discover,服务器回Offer,客户端发Request,服务器回Ack。跨网段时还要多一个中继角色。客户端发出的Discover是广播,三层网关收到后如果接口配置了DHCP中继,就把广播转成单播发给DHCP服务器,并在报文里填入giaddr字段,告诉服务器“这个请求来自哪个网段”。服务器根据giaddr匹配地址池,再从池子里挑一个地址回Offer。终端最终拿到的网关地址,来自地址池里的gateway-list,也就是DHCP Option 3;DNS来自Option 6。这个Option 3填什么,直接决定VRRP切换后终端还能不能上网。
地址池不是越大越好。池子里要排除虚拟网关、物理接口地址、网络设备管理地址、服务器静态地址、打印设备地址,还要留出足够的租期周转空间。租期太短,DHCP请求频繁,地址池翻台快,但服务器和网络压力大;租期太长,终端下线后地址还被占着,地址池容易“看起来没用满却发不出地址”。我一般把办公有线终端租期设8小时,无线终端设2到4小时,服务器和网络设备全部静态绑定,不放进动态池。这个习惯能省掉很多“地址冲突”和“池子耗尽”的半夜电话。
1.3 典型拓扑与流量路径:从PC请求地址到跨网关转发
假设一个园区网,接入交换机划分VLAN10,终端网关是VRRP虚拟IP 10.10.10.1。核心A和核心B都跑VLAN10的VRRP组,核心A是Master,核心B是Backup。DHCP服务器放在服务器区VLAN20,地址是10.10.20.10。终端开机后发Discover,接入交换机在VLAN10里广播,核心A的Vlanif10收到后,因为接口配了DHCP中继,就把请求单播给10.10.20.10,giaddr填Vlanif10的物理地址10.10.10.2。DHCP服务器匹配10.10.10.0/24地址池,回Offer,里面网关写10.10.10.1,DNS写10.10.20.53。终端拿地址后,ARP请求10.10.10.1,核心A用虚拟MAC回应,流量走核心A上行。
如果核心A上行链路断了,VRRP通过track感知到,优先级从120降到90,低于核心B的100,核心B抢占成为Master,虚拟IP和虚拟MAC漂移过去。此时已经拿到地址的终端还能继续用原网关地址,因为虚拟IP没变;新上线的终端继续向DHCP服务器请求地址,中继请求由核心B发出,giaddr变成10.10.10.3。DHCP服务器必须能匹配这个giaddr,并且回程路由要能到达10.10.10.3。很多切换后“老终端能用、新终端拿不到地址”的问题,就出在这里:中继只在核心A上配了,或者DHCP服务器只回指了核心A的物理地址。
2. 方案选型:DHCP服务器放哪里、VRRP组怎么切
2.1 三种常见部署:本地服务器、集中服务器加中继、双机热备
DHCP服务器放哪里,决定了后面中继怎么配、故障怎么查。第一种是本地服务器,DHCP跑在核心网关自己身上,适合单栈小型网络,优点是路径短,缺点是核心设备重启会影响地址分配,而且两台核心同时开DHCP容易池子冲突。第二种是集中服务器加中继,DHCP服务器独立在服务器区,核心网关只做中继,这是园区网最常见的方式,地址池集中管理,服务器可以做双机。第三种是双机热备或地址池拆分,两台DHCP服务器各自负责一部分地址,或者一台主用一台备用,中继指向两个服务器地址。
| 部署方式 | 适合场景 | 优点 | 需要盯住的点 |
|---|---|---|---|
| 本地DHCP | 小型网络、临时项目 | 配置简单、路径短 | 核心重启影响发地址、双机池子易冲突 |
| 集中服务器加中继 | 园区网、多VLAN | 地址池集中、易审计 | 中继源接口、回程路由、服务器可达性 |
| 双机热备或拆分 | 中大型网络 | 单台服务器故障时仍能发地址 | 地址池边界、租约同步、中继多服务器行为 |
选型时别只看“高可用”三个字。如果网络只有两百个终端,集中一台DHCP服务器加定期备份就够,硬上双机反而增加租约同步和地址池拆分的心智负担。如果终端超过一千,或者地址分配直接影响生产,双机就有必要。我的习惯是:核心网关一定做VRRP,DHCP服务器尽量独立;服务器区做双机,地址池按80/20或50/50拆分,中继同时指向两台服务器,任何一台不可达时另一台还能接住请求。
2.2 VRRP主备与DHCP中继的匹配关系
VRRP和DHCP中继的匹配,核心就三句话:中继源接口必须和客户端在同一个子网;主备网关都要配中继;DHCP地址池里的网关必须填虚拟IP。中继源接口一般用Vlanif的物理地址,不用虚拟IP。因为虚拟IP在切换时会漂移,DHCP服务器看到的giaddr如果跟着漂,地址池匹配和回程路由都会变得不可控。用物理地址做中继源,核心A的giaddr是10.10.10.2,核心B是10.10.10.3,两个地址都在10.10.10.0/24里,DHCP服务器可以用同一个地址池匹配它们。
这里有一个容易忽略的点:DHCP服务器的回程路由。服务器收到giaddr为10.10.10.2的请求,回Offer时目的地址是10.10.10.2,不是虚拟IP。如果服务器和核心之间隔着三层设备,服务器所在网段必须有到10.10.10.0/24的路由,核心也要有到服务器网段的路由。只配中继不配路由,现象就是中继计数器有请求、服务器也有日志,但Offer回不来。还有一种情况是安全策略只放行了虚拟IP,没放行两个物理接口地址,切换后新请求直接被丢掉。
注意:地址池里的gateway-list必须写VRRP虚拟IP,不能写Master物理IP。写物理IP的后果是:切换前一切正常,切换后老终端因为ARP缓存还能撑一会儿,新终端直接把网关指向了已经不再是Master的地址,表现为“地址拿到了,网关ping不通”。
2.3 地址池、租期、排除地址的计算方法
地址池容量要按峰值在线终端数、租期窗口内离线仍占用的地址、预留地址三部分算。一个简单公式是:地址池规模大于等于峰值在线终端数加上租期窗口内下线终端数,再加10%到20%预留。比如某VLAN有180个终端,峰值在线150个,租期8小时内大约有20个终端下线但地址还没释放,预留30个,池子至少要200个地址。一个/24网段可用254个地址,排除虚拟IP、物理接口、网关、服务器、打印机等20个静态地址后还有234个,够用但不宽裕。如果终端数到300,/24就不够了,得换/23。
| 终端规模 | 推荐网段 | 可用地址 | 租期建议 | 说明 |
|---|---|---|---|---|
| 200以内 | /24 | 254 | 8小时 | 排除静态地址后仍有余量 |
| 300到500 | /23 | 510 | 8小时 | 要算上租期周转和预留 |
| 600到900 | /22 | 1022 | 4到8小时 | 建议按VLAN拆分地址池 |
| 超过1000 | 多VLAN或多个/22 | 按VLAN规划 | 无线短租、有线长租 | 不建议单池硬撑 |
租期不是拍脑袋。有线办公终端每天在线时间长,租期8小时问题不大;无线终端流动性强,租期2到4小时能加快地址回收;访客网络可以更短,但要注意DHCP请求量。排除地址要写全:VRRP虚拟IP、两台核心的Vlanif物理IP、网关上行互联地址、DHCP服务器地址、DNS服务器地址、网络管理地址、打印机和视频会议终端等静态设备。最省事的做法是先做一张IP规划表,把静态段和动态段切开,动态池只覆盖连续的一段,别让静态地址散落在池子里。
3. 实操落地:从地址规划到VRRP与DHCP中继配置
3.1 拓扑与地址规划示例
这里用一个两层园区网做示例:核心A和核心B做VRRP,接入交换机双上行,VLAN10是办公终端,VLAN20是服务器区。DHCP服务器放在VLAN20,两台服务器地址分别是10.10.20.10和10.10.20.11。VLAN10网段10.10.10.0/24,VRRP虚拟IP 10.10.10.1,核心A物理IP 10.10.10.2,核心B物理IP 10.10.10.3。VRRP组10,核心A优先级120,核心B优先级100,抢占延迟30秒,上行链路track减30。DHCP地址池排除10.10.10.1到10.10.10.20,动态范围从10.10.10.21开始。
| 角色 | 接口或地址 | 说明 |
|---|---|---|
| 核心A Vlanif10 | 10.10.10.2/24 | VRRP Master,优先级120 |
| 核心B Vlanif10 | 10.10.10.3/24 | VRRP Backup,优先级100 |
| VRRP虚拟IP | 10.10.10.1/24 | 终端网关,必须从DHCP池排除 |
| DHCP服务器1 | 10.10.20.10/24 | 主用地址池 |
| DHCP服务器2 | 10.10.20.11/24 | 备用或拆分地址池 |
| DNS | 10.10.20.53 | 通过DHCP Option 6下发 |
这个规划里,核心A和核心B的Vlanif10物理地址都在10.10.10.0/24内,所以DHCP服务器可以用同一个地址池匹配两个giaddr。服务器区到办公网段的路由要双向打通:核心上有到10.10.20.0/24的路由,DHCP服务器上有到10.10.10.0/24的路由。如果服务器和核心之间还有防火墙,安全策略要放行UDP 67和68,源和目的都要覆盖两个核心物理地址,别只放虚拟IP。
3.2 核心网关VRRP配置要点
下面用通用CLI风格示意,不同设备命令不同,逻辑一致。核心A的Vlanif10配置VRRP组10,虚拟IP 10.10.10.1,优先级120,抢占延迟30秒,跟踪上行接口Uplink0,上行故障时优先级减30。核心B优先级100,同样配置虚拟IP和抢占延迟。两台设备都要配DHCP中继,指向两台DHCP服务器。注意VRRP通告间隔默认1秒,Master down时间大约是3倍通告间隔加偏移,实际切换通常在3秒左右;如果业务对中断敏感,可以缩短通告间隔,但别短到让设备频繁误判。
interface Vlanif10 ip address 10.10.10.2 255.255.255.0 vrrp vrid 10 virtual-ip 10.10.10.1 vrrp vrid 10 priority 120 vrrp vrid 10 preempt-mode timer delay 30 vrrp vrid 10 track interface Uplink0 reduced 30 dhcp select relay dhcp relay server-ip 10.10.20.10 dhcp relay server-ip 10.10.20.11核心B把物理地址改成10.10.10.3,优先级改成100,其余VRRP和中继配置保持一致。这里有两个细节:第一,抢占延迟要留够,上行链路抖动几秒就抢回来会造成终端ARP表反复刷新,体验很差;第二,track的减幅要算清楚,核心A优先级120减30等于90,低于核心B的100,才会触发切换。如果减幅只有10,变成110,仍然高于100,上行断了也不会切,等于白配。
注意:VRRP认证、TTL检查、组播放行要一起看。有些网络在接入层做了ACL,把224.0.0.18拦了,VRRP通告收不到,两台核心都认为自己是Master,形成双主。双主的表现很怪:一部分终端走A,一部分走B,ARP表来回跳,抓包能看到两个设备都在回虚拟MAC。
3.3 DHCP服务器与中继配置
DHCP服务器上的地址池要匹配10.10.10.0/24,网关写虚拟IP 10.10.10.1,DNS写10.10.20.53,排除虚拟IP和静态段,租期8小时。如果两台DHCP服务器做拆分,可以把10.10.10.21到10.10.10.150放在服务器1,10.10.10.151到10.10.10.230放在服务器2,中继同时指向两个服务器地址。这样任何一台服务器故障,另一台还能覆盖一部分地址。如果做热备,地址池范围可以相同,但需要服务器侧的租约同步机制,配置前先确认两台服务器的时间同步和心跳状态。
dhcp enable ip pool VLAN10_POOL network 10.10.10.0 mask 255.255.255.0 gateway-list 10.10.10.1 dns-list 10.10.20.53 excluded-ip-address 10.10.10.1 10.10.10.20 lease day 0 hour 8 minute 0中继侧的核心A和核心B都要配dhcp select relay和服务器地址。中继源地址默认取接收请求的接口地址,也就是Vlanif10的物理地址,不要手工改成虚拟IP。DHCP服务器回包时目的地址是giaddr,所以服务器所在网段必须有到10.10.10.2和10.10.10.3的路由。如果服务器和核心在同一个三层域内,这条路由可能是直连或默认路由;如果跨防火墙,要单独放行。配置完成后,先在核心上查看DHCP中继计数,确认请求有没有发出去,再到服务器上看地址池租约,确认Offer有没有生成。
3.4 验证与切换测试:看什么、怎么记录
验证分四步。第一步,终端释放并重新获取地址,确认IP在动态范围内、网关是虚拟IP、DNS正确。第二步,在核心A上查看VRRP状态,确认它是Master,核心B是Backup,虚拟MAC和虚拟IP都正常。第三步,模拟核心A上行故障,断开Uplink0或者在接口上做shutdown,观察核心B是否在预期时间内变成Master,终端ping网关是否只丢少量包。第四步,在核心B成为Master后,让一台新终端上线,确认它还能通过核心B的中继拿到地址。这一步最容易被省略,但恰恰是VRRP和DHCP联动最容易出问题的地方。
测试记录要写清楚:切换前Master是谁、切换触发条件、切换耗时、丢包数量、新终端获取地址耗时、DHCP服务器日志里的giaddr。不要只测“老终端还能不能ping通”,老终端有ARP缓存和已有租约,不能代表新终端。也不要只测一次,至少做Master故障和恢复两次,观察抢占延迟是否生效。恢复时如果核心A立刻抢回Master,而DHCP服务器还没准备好回程路由,新终端会在几十秒内拿不到地址,这种问题在变更窗口里很容易被忽略。
4. 高频故障与排查表:VRRP起来了但终端上不了网
4.1 DHCP拿不到地址的排查路径
终端拿不到地址,先看它是不是169.254开头。如果是,说明Discover没有收到Offer。排查顺序从下往上:接入端口VLAN对不对,VLAN有没有放行到核心,核心Vlanif有没有起来,DHCP中继有没有配,中继服务器地址可达不可达,DHCP地址池有没有耗尽,DHCP Snooping信任口有没有配错。如果接入交换机开了DHCP Snooping,连接核心或DHCP服务器的上行口要设为信任口,连接终端的口设为非信任口;否则终端发的Discover会被丢弃,现象就是“端口灯亮、VLAN通、就是拿不到地址”。
| 现象 | 优先检查 | 判断依据 | 处理 |
|---|---|---|---|
| 终端地址169.254开头 | 接入VLAN、中继、地址池 | 核心中继计数是否增长 | 补中继、放行VLAN、扩池 |
| 部分终端能拿、部分不能 | Snooping信任口、端口安全 | 不能拿的端口是否同一交换机 | 调整信任口或MAC限制 |
| 地址池显示有地址但发不出 | 排除地址、租期、冲突检测 | 可用地址数、租约表 | 缩小排除段、缩短租期 |
| 新终端拿不到、老终端正常 | 中继是否只在Master配 | Backup上是否有中继配置 | 主备都配中继 |
实操心得:排DHCP问题别一上来就重启服务器。先看核心的中继计数和giaddr,再看服务器地址池匹配,最后看回程路由。十次里有六次是VLAN没放行或者中继指错接口,重启服务器只会把租约表搅乱。
4.2 VRRP双主与频繁切换的排查路径
VRRP双主通常有三个原因:组播被拦、认证不一致、优先级和track配置错误。组播被拦最常见,核心之间经过三层设备或ACL,224.0.0.18过不去,双方都收不到通告,于是都当Master。认证不一致也会导致通告被丢弃,一边配了认证,另一边没配,或者认证字不同。优先级和track错误则表现为该切的不切、不该切的乱切,比如track减幅太小,上行断了优先级还高于Backup;或者抢占延迟太短,链路闪断就抢回。
频繁切换要看物理链路和STP。上行口光衰、模块松动、生成树拓扑变更都会让接口状态抖动,VRRP跟着切。可以先把抢占延迟拉长到60秒,观察切换次数是否下降;如果还切,就查接口CRC错误、光功率、STP事件。还要注意VRRP通告间隔不要设得太小,1秒是常见值,改成200毫秒虽然切换快,但对链路抖动更敏感,丢一个包就可能触发切换。
4.3 终端拿到地址但网关不通的排查路径
终端有地址、网关是虚拟IP,但ping不通,先确认VRRP Master是否真的持有虚拟IP。在Master上查看VRRP状态和虚拟MAC,在Backup上确认它是Backup。如果两台都是Master,按双主处理。然后看终端ARP表,虚拟IP对应的MAC是不是VRRP虚拟MAC;如果ARP学不到,检查VLAN内二层通路、STP阻塞、端口隔离。再看DHCP地址池的gateway-list,如果填的是物理IP,终端网关就指错了,这种问题在切换后集中爆发。
还有一类是回程路由或安全策略问题。终端能ping通网关,但ping不通服务器,或者服务器能ping终端、终端不能ping服务器,说明网关本身通了,问题在核心到服务器区的路由或策略。查核心路由表、服务器网关、防火墙会话。VRRP切换后,如果新Master上没有到服务器区的路由,或者策略只绑定了旧Master的接口,流量就会断。这类问题不是VRRP协议本身的问题,而是切换前没有做路径一致性检查。
4.4 运维避坑清单
第一,地址池排除段一定要包含VRRP虚拟IP和两台核心的物理IP,别让DHCP把网关地址发出去。第二,主备核心都要配DHCP中继,不要只配Master。第三,DHCP服务器回程路由要覆盖两个物理地址,安全策略也要放行两个地址。第四,VRRP track减幅要大于主备优先级差值,否则上行故障不切换。第五,抢占延迟别设太短,30秒起步,链路质量差的环境可以更长。第六,变更前做一次主备切换演练,记录新终端获取地址的时间。
第七,监控要同时看VRRP状态和DHCP地址池使用率。只监控设备ping,不监控地址池,池子耗尽了才发现,终端已经批量上不了线。第八,租期调整要分批做,先改一个VLAN观察DHCP请求量,再推广。第九,无线和有线尽量分池,无线终端流动性大,租期短,地址回收快;有线终端租期长,减少续租风暴。第十,所有静态设备做绑定,别让打印机、摄像头、会议终端混在动态池里抢地址。
5. 安全与可靠性加固:让VRRP DHCP组合经得住日常运维
5.1 DHCP Snooping、防私接与地址冲突
园区网里最怕私接路由器。有人把家用路由器的LAN口插到办公网,路由器自带DHCP,终端可能拿到错误网关,表现为“有的人能上网,有的人不能”。DHCP Snooping的作用是把交换机端口分成信任口和非信任口,只有信任口收到的DHCP Offer才放行。连接合法DHCP服务器或中继的上行口设为信任口,连接终端的口设为非信任口。这样私接DHCP发出的Offer会被丢弃,终端继续向合法服务器请求地址。
地址冲突要同时防两层:一层是DHCP池里排除静态地址,另一层是开启地址冲突检测。服务器在发Offer前先ping一下候选地址,有人回应就跳过。终端侧可以配ARP检测或IP Source Guard,防止手工改IP。VRRP虚拟IP和物理IP一定要在排除段里,否则地址池可能把网关地址发给某台终端,冲突后网关和终端都异常。这个坑很隐蔽,因为冲突不一定立刻发作,可能过几天地址租期轮转到才爆出来。
5.2 VRRP认证、TTL、抢占策略和监控
VRRP认证能防止有人伪造通告抢Master。虽然认证不能替代网络边界控制,但在核心互联区配一个简单认证,能挡住误配和低级攻击。TTL检查建议开启,VRRP通告TTL应该是255,收到TTL不是255的报文可以丢弃,防止跨网段伪造。组播224.0.0.18要在核心互联链路上放行,但不要在终端接入端口泛洪,可以在接入层做组播抑制。
抢占策略要按业务定。核心主备一般开启抢占,让主设备恢复后回到Master,但必须配延迟。延迟时间要大于上行链路振荡和路由收敛时间,30到60秒比较常见。监控要抓三个指标:VRRP组状态变化次数、Master持续时间、DHCP地址池使用率。状态变化次数突然升高,说明链路或协议有问题;地址池使用率超过80%,要提前扩池或缩短租期。别等用户报故障才看。
5.3 变更与演练:不要只测ping
VRRP和DHCP的变更,最忌讳只测“网关能ping通”。至少要做四组测试:终端释放续租、主备手动切换、上行链路故障切换、新终端在Backup成为Master后获取地址。每组测试都要记录时间点和结果,尤其是DHCP服务器日志里的giaddr和租约分配情况。演练时把DHCP服务器的一台关掉,观察中继是否切到另一台,终端是否还能拿到地址。这个测试能暴露地址池拆分边界和中继多服务器配置的问题。
变更窗口里先改Backup,再改Master,最后做切换。改完Backup先观察VRRP状态是否还是Backup,改完Master后手动触发一次切换,确认虚拟IP漂移和DHCP中继都正常。如果网络里有防火墙,提前确认策略放行了两个物理地址和虚拟地址的DHCP、VRRP流量。最后再分享一个小经验:把VRRP虚拟IP、物理IP、DHCP池范围、排除段、中继源地址写进同一张变更表,每次改地址池都对照一遍。我见过太多“只改了一个地址池,忘了同步排除段”的事故,表上多写一行,半夜少接一个电话。