1. 实验整体设计与思路拆解
1.1 为什么要在RIP环境里折腾MGRE
先把标题拆开看:HCIP、RIP、MGRE,三个词分别对应认证层级、路由协议、隧道技术。这个实验的本质,是在一个运行RIP的动态路由环境里,把多点GRE隧道搭起来,让多个分支站点通过隧道互通,同时用RIP把隧道网段和各自背后的私网路由互相传递。
很多人第一次接触这个组合会疑惑:RIP这么老的协议,为什么还要配MGRE这种相对"新"的隧道形态?我的理解是,这恰恰是HCIP阶段刻意设计的考察点——RIP简单、收敛逻辑清晰,能把注意力从协议本身转移到隧道接口的路由行为上。MGRE的核心难点不在隧道怎么建,而在于隧道接口是"逻辑接口",它的网络类型、下一跳解析方式、水平分割行为都和物理接口不一样,这些差异在RIP环境下会被放大得非常明显。
具体来说,这个实验要解决的问题是:总部与多个分支之间没有直达链路,只有各自到公网的出口,希望通过一条逻辑隧道把多个站点连成一个逻辑上的星型或全互联网络,并且让各站点背后的私网网段能够互相学习到。用RIP承载路由,是因为它配置量小、排错直观,适合把隧道建立、路由传递、下一跳解析这几件事分开验证。
适合谁来参考:正在备考HCIP、已经会配基本RIP和GRE但一遇到MGRE就卡在"隧道起来了但路由不通"的人;以及实际工作中需要快速搭一个多点隧道验证环境、不想上复杂协议的网络从业者。下面我按自己实际搭环境的顺序来讲,参数和踩坑点都会给到。
1.2 拓扑选型:星型还是全互联
MGRE的拓扑有两种典型形态:一种是NHRP驱动的星型(中心站点做NHS,分支注册到中心),另一种是手工配置的全互联。这个实验我建议先用星型,理由很实在:
- 星型只需要中心站点有一个固定的公网地址,分支可以是动态地址,NHRP负责把分支的公网地址注册到中心,中心再回应分支的地址解析请求。这贴近真实分支场景。
- 全互联要求每个站点都知道其他所有站点的公网地址,配置量大,而且RIP的水平分割在全互联下容易出环路,不适合作为第一个验证环境。
星型拓扑下,中心站点承担两个角色:MGRE的NHS(下一跳服务器)和RIP环境里的路由汇聚点。分支之间要互通,流量必须经过中心,这天然形成"中心-分支"的转发路径,RIP的跳数计算也简单:分支到中心1跳,分支经中心到另一分支2跳,不会触发RIP的16跳不可达。
我用的逻辑拓扑是这样的:中心站点用一个Tunnel接口作为MGRE的NHS,分支各用一个Tunnel接口注册上去,隧道网段统一规划成一个大网段(比如10.1.1.0/24),中心占.1,分支依次占.2、.3、.4。各站点背后的私网网段单独规划,比如中心背后192.168.10.0/24,分支一背后192.168.20.0/24,以此类推。这样隧道网段和私网网段分离,RIP宣告时边界清晰,排错时一眼能看出是哪一层出的问题。
提示:隧道网段不要和各站点物理接口网段重叠,这是MGRE实验里最常见的低级错误。规划阶段拿张纸把每个站点的物理网段、隧道地址、背后私网网段列清楚,后面能省一半排错时间。
1.3 协议组合的取舍逻辑
为什么是RIP而不是OSPF?除了前面说的"聚焦隧道行为",还有一个现实原因:RIP的network宣告是按主类网段走的,在隧道接口上宣告时,行为非常"可预测"——你宣告10.0.0.0,它就把隧道接口所在的10网段带进去,不会像OSPF那样牵扯到接口网络类型、DR选举、邻居状态机。MGRE隧道接口默认网络类型是point-to-multipoint,这个类型在OSPF下会引发一系列邻居建立问题,而在RIP下几乎无感,因为RIP是广播式更新,不依赖邻居状态机。
但RIP也有它的坑:水平分割。MGRE是NBMA式的多点接口,中心站点从隧道接口收到一个分支的路由更新后,如果水平分割开着,就不会再从同一个接口把这条路由发给其他分支,导致分支之间学不到对方背后的网段。这是这个实验最核心的考点之一,后面会专门讲怎么处理。
所以整个方案的设计逻辑可以归纳成一句话:用NHRP解决"隧道对端地址怎么找",用MGRE解决"一条隧道连多点",用RIP解决"路由怎么传",三者各管一段,排错时按段切分。这个分层思路贯穿全文,你照着这个顺序验证,基本不会乱。
2. 核心细节解析与实操要点
2.1 MGRE与GRE的本质差异,先搞清楚再动手
GRE是点对点隧道,一个Tunnel接口对应一个对端,配置里tunnel destination写死对端地址。MGRE是把GRE的"点对点"扩展成"点对多点",Tunnel接口不再指定单一destination,而是通过NHRP动态解析对端。这个差异带来三个直接影响:
第一,接口网络类型。MGRE的Tunnel接口默认是point-to-multipoint,意味着它把隧道当成一个多路访问网络看待,但又不像以太网那样有广播能力。RIP在这种接口上发更新时,是逐对端单播还是组播,取决于具体实现,这也是为什么后面要关注NHRP映射是否完整。
第二,下一跳解析。物理接口的下一跳靠ARP,MGRE的下一跳靠NHRP。分支要访问另一个分支的隧道地址,得先向NHS发NHRP解析请求,NHS查自己的NHRP表,把目标分支的公网地址回给请求方,请求方再用这个公网地址封装GRE。如果NHRP表里没有对应条目,隧道包就发不出去,表现为"ping隧道对端不通但物理层正常"。
第三,MTU。GRE封装会增加至少24字节开销(外层IP头20字节+GRE头4字节),MGRE在此基础上还有NHRP相关开销。隧道接口MTU如果按默认1500走,大包会被分片或丢弃,RIP更新报文虽小,但后续传数据时会暴露问题。我习惯把隧道接口MTU设成1400,给封装留足余量。
注意:MGRE的Tunnel接口上不要配tunnel destination,配了就和普通GRE没区别了,NHRP也不会正常工作。这是新手最容易犯的错,配完发现分支注册不上,回头一看destination写死了。
2.2 NHRP的角色分工:NHS与NHC
NHRP里两个关键角色:NHS(Next Hop Server)和NHC(Next Hop Client)。中心站点配成NHS,负责维护NHRP映射表;分支配成NHC,主动向NHS注册自己的隧道地址和公网地址的映射关系。
中心站点的NHS配置要点:在Tunnel接口上开ip nhrp network-id,这个ID是NHRP域的标识,所有站点必须一致,不一致就注册不上。然后配ip nhrp map multicast dynamic,让NHS能动态学习分支的映射。分支的NHC配置要点:同样开network-id,配ip nhrp nhs <中心隧道地址>指明NHS是谁,再配ip nhrp map <中心隧道地址> <中心公网地址>做静态映射,保证分支能先找到中心。
这里有个细节值得说:分支到中心的映射为什么用静态?因为分支启动时NHRP表是空的,它必须先知道NHS的公网地址才能发注册请求,这个"先有鸡还是先有蛋"的问题只能靠静态映射解决。而分支到分支的映射,靠NHS动态下发,不需要手工配。
注册成功的标志是中心NHS上show ip nhrp能看到各分支的条目,类型显示dynamic,状态显示registered。如果只看到自己的条目没有分支的,说明分支的注册请求没到或者network-id不匹配,按这个顺序查:分支能不能ping通中心公网地址、network-id是否一致、NHS地址配得对不对。
2.3 RIP在隧道接口上的宣告边界
RIP宣告有个原则:只宣告需要传递的网段,不要图省事用network 0.0.0.0。在MGRE环境里,这个原则更重要,因为隧道接口和物理接口可能落在同一个主类网段下(比如都是10网段),一条network 10.0.0.0会把物理接口和隧道接口一起带进RIP,导致物理链路也被宣告,路由表里出现不该有的条目。
我的做法是:隧道网段单独规划成一个不冲突的主类网段,比如隧道用10.1.1.0/24,背后私网用192.168.x.0/24,RIP里分别宣告network 10.0.0.0和network 192.168.x.0。这样隧道网段和私网网段在RIP里是两条独立的路由,跳数计算清晰,排错时show ip route一眼能看出哪条是隧道学来的、哪条是本地直连。
还有一个容易忽略的点:RIP的更新源。隧道接口上跑RIP,更新报文从隧道发出时,源地址是隧道地址,但外层封装用的是物理接口地址。如果物理接口没开RIP,某些实现下更新可能发不出去。稳妥做法是确保物理接口的网段也在RIP宣告范围内,或者至少保证物理接口可达。这个细节在不同厂商设备上表现略有差异,实测时以"分支能否学到中心背后的私网路由"为准来验证。
2.4 水平分割:这个实验的"隐藏Boss"
前面提过,水平分割是MGRE+RIP组合的核心坑点。原理是这样的:RIP默认开启水平分割,从某个接口学到的路由,不会再从同一接口发回去。在MGRE星型拓扑下,中心从隧道接口收到分支A的路由,因为水平分割,不会从隧道接口转发给分支B,结果就是分支A和分支B互相学不到对方背后的网段。
解决办法有两个:一是在中心站点的隧道接口上关闭水平分割(no ip split-horizon),让中心能把从一个分支学到的路由转发给其他分支;二是改用单播更新,指定邻居。第一种更简单,但要注意关闭水平分割后,星型拓扑下不会产生环路(因为分支之间没有直连隧道),所以是安全的。如果是全互联拓扑,关水平分割就要配合其他防环手段,这也是我前面建议先用星型的原因之一。
关闭水平分割后,验证方法是:在分支A上show ip route看能不能看到分支B背后的私网网段,跳数应该是2(分支A→中心→分支B)。如果看到路由但ping不通,问题就不在RIP而在NHRP映射或隧道转发,按层排查。
提示:关闭水平分割是"治标",理解为什么需要关才是"治本"。面试或考试里被问到"MGRE下RIP为什么分支间不通",答"水平分割"只是第一步,能说清楚"中心从隧道接口学到的路由被水平分割拦住、无法从同一接口转发"才算讲透。
3. 实操过程与核心环节实现
3.1 地址规划与基础配置
动手前先把规划表列出来,我用的是四个站点:中心、分支一、分支二、分支三。物理网段各自独立,隧道网段统一10.1.1.0/24,背后私网各自192.168.x.0/24。
| 站点 | 物理接口地址 | 隧道地址 | 背后私网 | NHRP角色 |
|---|---|---|---|---|
| 中心 | 200.1.1.1/24 | 10.1.1.1/24 | 192.168.10.0/24 | NHS |
| 分支一 | 200.1.2.1/24 | 10.1.1.2/24 | 192.168.20.0/24 | NHC |
| 分支二 | 200.1.3.1/24 | 10.1.1.3/24 | 192.168.30.0/24 | NHC |
| 分支三 | 200.1.4.1/24 | 10.1.1.4/24 | 192.168.40.0/24 | NHC |
物理层先保证各站点到中心公网地址可达,这是所有后续操作的前提。基础配置包括接口地址、物理接口的RIP宣告(用于传递物理网段,可选但建议保留以便排错)、以及到公网的默认路由。默认路由指向公网网关,保证隧道封装的外层包能路由出去。
中心站点的Tunnel接口配置大致如下(以常见命令行为例):
interface Tunnel0 ip address 10.1.1.1 255.255.255.0 tunnel source 200.1.1.1 tunnel mode gre multipoint ip nhrp network-id 100 ip nhrp map multicast dynamic ip mtu 1400 no ip split-horizon分支站点的Tunnel接口配置:
interface Tunnel0 ip address 10.1.1.2 255.255.255.0 tunnel source 200.1.2.1 tunnel mode gre multipoint ip nhrp network-id 100 ip nhrp nhs 10.1.1.1 ip nhrp map 10.1.1.1 200.1.1.1 ip nhrp map multicast 200.1.1.1 ip mtu 1400注意tunnel mode gre multipoint这一行,它把接口从点对点GRE切换成MGRE,是整段配置的灵魂。ip nhrp map multicast用于让组播/广播流量(RIP更新走组播224.0.0.9)能通过隧道转发,星型下分支只需映射到中心,中心用dynamic自动学习。
3.2 NHRP注册验证与映射表解读
配完Tunnel接口,第一件事不是急着配RIP,而是验证NHRP注册。在中心上执行show ip nhrp,正常应该看到类似这样的输出:每个分支一条dynamic条目,NBMA地址是分支的公网地址,隧道地址是分支的隧道地址,状态registered。如果分支条目缺失,按前面说的顺序查network-id、NHS地址、公网可达性。
在分支上执行show ip nhrp,应该看到两条:一条是到NHS的static条目(你手工配的),一条是到NHS的dynamic条目(注册成功后NHS回应的)。分支到分支的条目初始是没有的,只有当分支A要访问分支B的隧道地址时,才会触发NHRP解析,向NHS请求,NHS回应后分支A的NHRP表里才出现分支B的条目。
这个"按需解析"的机制要理解透:分支A ping分支B的隧道地址,第一个包触发NHRP解析,可能丢一两个包,解析完成后后续包正常。所以验证分支互通时,ping要带足够次数(比如ping 10个包),不要ping一两个不通就判定失败。
3.3 RIP配置与路由传递验证
NHRP注册正常后,配RIP。中心站点:
router rip version 2 no auto-summary network 10.0.0.0 network 192.168.10.0分支站点(以分支一为例):
router rip version 2 no auto-summary network 10.0.0.0 network 192.168.20.0version 2必须开,因为RIPv1不支持子网掩码传递,隧道网段和私网网段都是/24,v1会按主类网段处理导致路由错误。no auto-summary关闭自动汇总,避免192.168.x.0被汇总成192.168.0.0/16,星型拓扑下汇总会导致路由指向错误。
配完等30秒左右(RIP更新周期),在分支一上show ip route,应该能看到:直连的10.1.1.0/24和192.168.20.0/24,通过RIP学到的192.168.10.0/24(跳数1,下一跳10.1.1.1)和192.168.30.0/24、192.168.40.0/24(跳数2,下一跳10.1.1.1)。如果分支间路由缺失,回到水平分割那一节检查中心的no ip split-horizon是否生效。
验证连通性时,从分支一背后的主机ping分支二背后的主机,应该通。如果不通但路由表正确,检查NHRP映射是否完整(分支一上show ip nhrp应该有分支二的条目),以及隧道接口MTU是否导致大包丢弃(用不同大小的包测试,比如ping带size参数)。
3.4 抓包验证隧道封装
想真正吃透这个实验,建议在中心站点抓一次包。抓物理接口,过滤GRE协议,能看到外层IP头是公网地址、协议号47(GRE)、内层是隧道地址的IP包。这个观察能直观印证"隧道是逻辑的、封装是真实的"。
抓包还能帮你定位一类隐蔽问题:NHRP解析失败时,能看到NHRP请求发出但没有回应,或者回应了但请求方没收到。这类问题在路由表上表现为"路由有但下一跳不可达",光看配置看不出来,抓包一看就明白。
4. 常见问题与排查技巧实录
4.1 分支注册不上NHS的排查顺序
这是最高频的问题。我整理了一个排查顺序,按这个走基本能定位:
| 排查项 | 检查命令 | 常见原因 |
|---|---|---|
| 公网可达性 | ping中心公网地址 | 物理链路或默认路由问题 |
| network-id一致性 | show ip nhrp | 两端ID不一致 |
| NHS地址正确性 | show run interface tunnel | nhs地址写错 |
| 静态映射正确性 | show ip nhrp | map的隧道地址与公网地址对应错 |
| 隧道源地址 | show run interface tunnel | tunnel source指向错误接口 |
实测下来,network-id不一致和静态映射写错占了大头。静态映射里ip nhrp map 10.1.1.1 200.1.1.1,前面是中心的隧道地址,后面是中心的公网地址,两个都不能错,写反了注册请求就发不出去。
4.2 路由学到了但不通的三层定位法
路由表正确但ping不通,问题一定在转发层。我的定位法是三层切分:
第一层,隧道对端可达性。在分支一上ping分支二的隧道地址,通说明NHRP和隧道转发正常,问题在背后私网;不通说明隧道层有问题,查NHRP映射。
第二层,背后私网网关可达性。从分支一ping分支二背后私网的网关地址(分支二的私网接口),通说明路由和隧道都正常,问题在末端主机;不通说明私网路由没传对,查RIP宣告。
第三层,末端主机。前两层都通但主机不通,查主机网关、防火墙、ARP。这一层问题通常和实验配置无关,但新手容易在这里耗时间。
4.3 水平分割引发的"单向通"现象
有个现象很迷惑人:分支一能ping通分支二,但分支二ping不通分支一。这通常是水平分割没关干净,或者只在一个方向关了。检查中心隧道接口的no ip split-horizon是否生效,以及是否所有相关接口都处理了。RIP的水平分割是接口级配置,中心隧道接口关了,但如果还有其他接口参与转发,也要一并检查。
另一个变种是"路由有但跳数异常"。比如分支一看到分支二的路由跳数是1而不是2,说明路由来源不对,可能是自动汇总或宣告范围过大导致。回到no auto-summary和network宣告范围检查。
4.4 MTU导致的"小包通大包不通"
这个坑很经典。ping默认包小,能通;一传文件或ping大包就不通。原因是隧道封装后包超过物理接口MTU被丢弃,而路径MTU发现机制在隧道环境下经常失效。解决办法是把隧道接口MTU调小(我设1400),或者在物理接口上调整TCP MSS。验证方法是ping <目标> size 1400 df-bit,带df-bit禁止分片,能通说明MTU够,不通就继续调小。
注意:MTU问题在实验环境里可能因为设备默认行为不同而不出现,但真实环境里几乎必现。养成配隧道就设MTU的习惯,比事后排错省事得多。
4.5 独家避坑心得
最后分享几条从反复搭环境中攒下的经验。第一,配置顺序很重要:先物理、再隧道、再NHRP、最后RIP,每步验证通过再进下一步,不要一口气全配完再排错,那样问题会叠在一起。第二,每改一处配置就存一次,MGRE实验里改错一个network-id可能让整个NHRP域失效,有备份能快速回滚。第三,善用show命令而不是重启,show ip nhrp、show ip route、show ip rip database三条命令能覆盖八成排错场景,比反复重启设备高效。第四,分支间验证时ping要带次数,NHRP按需解析会丢首包,别被假故障骗了。
这个实验后续还可以往两个方向扩展:一是把星型改成全互联,观察NHRP映射和水平分割行为的变化;二是把RIP换成OSPF,对比point-to-multipoint网络类型下的邻居建立差异。两个扩展都能加深对"隧道接口是逻辑接口"这件事的理解,我在实际带人做实验时,通常会让对方先做完星型RIP版,再自己动手改全互联,改的过程中遇到的问题比看十遍文档都管用。