
做网络实验这么多年每次有新人问“不同路由协议之间怎么互通”我都会推他去做一次重发布实验。这个实验看着简单翻车率却高得惊人还专坑那种“命令都敲对了”的人。今天就把我自己做这个实验的完整思路、踩坑记录和排错经验写出来给准备考CCNP/HCIP或者正在被多协议网络折磨的兄弟们一个参考。1. 重发布到底在解决什么问题1.1 为什么一个网络里会同时存在多种路由协议先想一个很现实的场景公司并购了另一家小公司人家内网原本用的是RIP而你们总部早就跑起了OSPF甚至骨干网还是BGP。两边设备一接路由表根本互相不认识。谁去当“翻译官”把这个协议学到的路由转告给另一个协议这个动作就是路由重发布也叫路由再分发。别以为只有大企业才遇到这种事。很多政企网络里你在核心设备上能看到OSPF、静态路由、直连路由甚至BGP混着用。比如省厅到市局跑OSPF市局下面还有一条专线到县里县里那台设备上只有静态路由。你不想把静态一条条敲进OSPF里直接做一次重发布就全搞定了。重发布解决的核心问题其实就一句话让运行不同路由协议的设备能互相学习到彼此的网络前缀。但在实现过程中你会撞上度量值不兼容、环路风险、次优路径一堆破事。这些才是这个实验真正的考点。1.2 重发布的核心难点度量值不在同一个频道每种路由协议都有自己的“度量值体系”。OSPF用的是开销cost基于链路带宽计算RIP用的是跳数hop count跟距离强相关IS-IS用的是私有metricBGP是路径属性那一套。你让OSPF把一个cost50的路由告诉RIPRIP听到的是“50”这个数字但它并不知道这代表带宽它只会把这个值当作跳数。RIP看到跳数50直接就判定为不可达——因为RIP的跳数上限是1516就是不可达。这就是重发布最本质的坑协议之间的度量值无法直接换算。所以在把路由注入另一个协议时必须显式指定一个种子度量值作为起点。我在实验里见过太多人漏掉这一步OSPF重发布进RIP没给metricRIP域内所有设备的路由表里这条路由的跳数直接变成16看着是学到了但永远不可达。1.3 我用的实验拓扑长什么样我这次实验用的是三台路由器加两台交换机的经典拓扑模拟一个双协议域互通的场景。R1和R2跑OSPF属于Area 0R2和R3跑RIPR3下面还挂了一个模拟生产网段的静态路由。这样安排是为了把“直连路由重发布、静态路由重发布、OSPF与RIP双向重发布”这几种常见场景一次实验全做一遍。设备地址规划很简单全部用loopback模拟业务地址物理链路上只跑互联地址R1的loopback 110.1.1.1/32放在OSPF里对外宣告R2的loopback 02.2.2.2/32作为OSPF和RIP之间的中转点R3的loopback 2192.168.2.1/24模拟远端业务网段通过静态路由在R3上指出去互联地址R1-R2之间是10.0.12.0/24R2-R3之间是10.0.23.0/24为什么要用loopback因为loopback接口不会因为链路抖动就消失你在重发布实验里用它做验证能排除很多物理链路层的干扰。排错时可以专心看路由协议本身的问题这是我一直以来的习惯。2. 基础配置与重发布的准备工作2.1 先把两个协议域各自跑通做重发布实验最大的忌讳就是一上来就在R2上敲redistribute命令。你得先保证两个协议在各自的域内是健康的不然出了问题根本分不清是重发布导致的路由问题还是原协议本来就没建立起来。我先把R1和R2之间的OSPF配好。R1上宣告loopback 1和连接R2的接口R2上只宣告连接R1的接口loopback 0先不宣告留着后面做重发布的“源”。配置命令就不贴全了重点说一个我觉得值得注意的地方R1(config)# router ospf 1 R1(config-router)# router-id 1.1.1.1 R1(config-router)# network 10.0.12.0 0.0.0.255 area 0 R1(config-router)# network 10.1.1.1 0.0.0.0 area 0network命令后面跟的反掩码0.0.0.0表示精确匹配单个地址用来宣告loopback正好。RIP这边更简单R2和R3之间配好网络号就行注意RIP的network后面跟的是主类网络号你现在习惯用无类别的写法也行但心里要清楚它会自动按主类处理。我在R2上写的是network 10.0.0.0这样10.0.23.0这个网段就会被RIPv2宣告出去。两个协议各自跑通之后在R1上能看到OSPF邻居是Full状态在R3上能看到RIP路由表里学到了直连网段这时候基础才算打牢。2.2 模拟器选择与设备型号说明我用的是GNS3加思科IOS镜像路由器型号用7200模拟的。如果你手上是华为的eNSP或者H3C的HCL思路完全一样只是命令语法上略有差异比如华为是import-route ospf、import-route static这样。我配置里用的全是思科风格命令你换成华为设备时记得对应转换一下。关于模拟器我要多说一句别在物理设备上做这个实验除非你是真在做割接演练。重发布实验里有个操作可能直接把你现网路由搞出环路模拟器上翻车了直接重置物理设备上翻车了那就是事故了。GNS3用7200的IOS跑OSPF和RIP完全够用没必要上Virl或者EVE-NG那么重的环境。2.3 重发布前必须掌握的三个底层机制在动手敲命令前我强烈建议先把这三个机制在脑子里过一遍不然你只能靠死记硬背来应对考题。第一个是路由优先级的选择问题。每台设备收到多条去往同一个目的地的路由时会先比较管理距离。OSPF内部路由的管理距离是110RIP是120。注意直连路由是0静态路由是1。这个数字决定了谁优谁劣。双向重发布之后RIP域内的设备很可能会通过RIP学到一条“看起来很好”的路由但实际上这条路由是从OSPF那边重发布过来的真实路径绕了一大圈。这就是管理距离在作祟。第二个是度量值换算问题。前面说了OSPF的cost和RIP的hop count完全不是一回事所以在重发布时必须手动指定种子度量值。怎么选如果目的协议是RIP种子度量值建议小于15我习惯给1到5之间的小数字如果目的协议是OSPF种子度量值直接决定路由的开销给个50或者100这样有辨识度的值方便后面追踪。第三个是路由回馈问题。R2把OSPF路由重发布进RIPR3学会了R3又把RIP路由重发布回OSPF如果你做了双向重发布那OSPF域内就看到了从RIP学回来的OSPF内部路由。这个路由的原始路径可能已经有更好的OSPF路由了重发布回来的这条就成了次优路径严重时还会形成环路。规避手段最常见的就是路由标记和路由过滤后面我会专门写。这三个机制理解透了实验里的坑你至少能避开一半。很多培训机构只教配置命令不教这三个底层逻辑导致学员换个拓扑就完全不会排错这不行。3. 核心实操OSPF与RIP双向重发布的完整配置3.1 第一步在R2上把OSPF路由重发布进RIP先从单向重发布开始。我的目标是让R3能从RIP学到R1上那台OSPF域内的loopback 1地址也就是10.1.1.0/24这个网段。在R2上这样配置R2(config)# router rip R2(config-router)# version 2 R2(config-router)# no auto-summary R2(config-router)# redistribute ospf 1 metric 1 R2(config-router)# network 10.0.0.0关键就在metric 1这个参数。如果不写RIP给重发布进来的路由默认的种子度量值就是0而RIPv2会把0当作不可达因为路由的跳数必须介于1到15之间。很多人在这一步翻车配置敲完一看R3上怎么都学不到先怀疑邻居有问题折腾半天才发现是种子度量值没配。路由协议的坑往往都是这种细节。配完之后马上验证。在R2上show ip route rip能看到10.1.1.0/24以RIP路由的形式出现在表里下一跳指向R1。再到R3上show ip route看是否有10.1.1.0注意此时的跳数可能是2R2到R1是一跳R3到R2是一跳完全正常。traceroute一下路径就是R3→R2→R1干净利落。3.2 第二步把RIP路由和静态路由重发布进OSPF反过来R2要把从RIP学到的路由以及R3上的静态路由都注入OSPF。这里涉及两个重发布源配置逻辑稍有不同R2(config)# router ospf 1 R2(config-router)# redistribute rip metric-type 1 subnets R2(config-router)# redistribute static metric-type 1 subnets其中subnets这个关键字是思科特有的坑。OSPF重发布默认只重发布有类网络不加subnets时像10.1.1.0/24这种非主类网段是发不出去的。很多教材喜欢把subnets归为命令格式的一部分但没有解释清楚它到底解决了什么问题实际上它就是告诉OSPF允许重发布无类子网。metric-type也有讲究。默认是metric-type 2意思是这条外部路由的开销只算AS外部那一段AS内部的开销不计入。metric-type 1则会把OSPF域内的开销加进去。这个选择会直接影响R1上路由的可达性判断。实战中通过RIP重发布进来的路由建议使用type 1这样R1在选择路径时能综合考虑整个路径的开销。我还特意把R3上的静态路由作为试验对象。R3上有两条静态路由一条是指向环路接口的192.168.2.0/24另一条是指向生产环境的172.16.0.0/16。静态路由重发布进OSPF时不用指定种子度量值因为OSPF会把外部路由的开销定为1如果没写metric但我还是写上了metric 100方便看效果。配完之后在R1上检查OSPF外部路由R1# show ip route ospf应该能看到O E1或O E2开头的路由条目显示来自RIP域和静态路由的多个网段比如192.168.2.0/24是O E2因为我们没指定type时默认是type 2。ping被测网段的loopback地址通了单向重发布就彻底完成了。3.3 第三步双向重发布后为什么会出现路由环单向重发布配置完毕网络是通的。但实际工作中很少只做单向大多数场景是“你中有我、我中有你”的双向重发布。在R2上同时配置了两个方向的重发布命令之后问题开始变得有趣了。R2把OSPF的内部路由重发布进RIPR3学到了同时R2又把RIP的路由重发布进OSPF于是R1通过OSPF能学到10.0.23.0这个RIP域网段和192.168.2.0这个静态网段。问题就出在这里R2本身就在OSPF域内OSPF的cost是110它在通过OSPF学到10.1.1.0/24的同时又通过RIP学到了一条R2自己重发布进去的10.1.1.0/24路由。因为管理距离120比110大R2会优选用OSPF学到的路由看起来没问题。但往RIP域外再走一层就不一样了。R3原本通过RIP从R2学到10.1.1.0/24现在R2做了双向重发布R3还有可能从OSPF域内绕路学到它如果你的拓扑里加了链路。一旦R2和R3之间链路Down了R3仍然会有10.1.1.0/24的路由但下一跳绕到OSPF域那边从R3→某台设备→R1再绕回R1侧路径直接绕成了环形数据包TTL耗尽直接丢包。这种环路在单点双向重发布时还不算太严重但到了多点重发布比如R4也做了双向重发布就会完全失控。排查时最明显的特征是路由表里存在两条同一前缀的路径管理距离一样的但两条路径指向前后不搭的下一跳。我在实验中制造这个环之后在R3上一个ping 10.1.1.1都通不了traceroute看着数据包在R2和R3之间来回弹特别直观。3.4 第四步用route-map加tag标记治本要彻底解决双向重发布产生的环路风险我用的方法是路由标记route tag。思路很简单在重发布的时候就给路由打上一个身份标签My prefix我发出去的Other prefix不许再往我这边传。具体来说是两行核心的route-map逻辑在R2上配置R2(config)# access-list 10 permit 10.0.0.0 0.255.255.255 R2(config)# route-map OSPF_TO_RIP permit 10 R2(config-route-map)# match ip address 10 R2(config-route-map)# set tag 100 R2(config)# route-map RIP_TO_OSPF deny 10 R2(config-route-map)# match tag 100 R2(config-route-map)# route-map RIP_TO_OSPF permit 20第一段是给OSPF重发布进RIP的路由打上tag 100标记这些路由的“娘家”是OSPF域第二段是RIP重发布进OSPF时先拒绝所有带有tag 100的路由不让它们再回到OSPF域。这样一个名为“路由回馈”的死循环就被掐断了。这个方案我在多个模拟器环境里验证过效果稳定。它的妙处在于不用机械地写一堆prefix-list去过滤具体网段而是通过tag实现“我认得我自己”的机制以后新增网段也不用改过滤规则。4. 实验中最容易踩的坑与排查技巧4.1 重发布之后路由总是“学不全”subnets关键字永远排首位我在带新人时让他们自己先做一遍实验十个人里至少有六个人会卡在“OSPF里看不到RIP路由”。最后我总会先问一句redistribute rip这条命令后面加subnets了吗没有的话看到的现象就是RIP域里那些有类网段能学到比如10.0.0.0/8能学到但一旦是10.1.1.0/24这种CIDR子网就完全消失。这个坑说白了就是思科OSPF的一个“历史包袱”。OSPF协议本身是支持VLSM的但重发布命令为了兼容老版本行为默认只放行有类路由。加了subnets就从“只放行有类”变成“放行所有子网”。这个关键字不只是重复劳动它直接决定你实验成不成功。排查顺序建议先看源设备上show ip route里有没有目标路由再看重发布设备上show ip route里有没有最后再看目标设备的OSPF外部路由表。哪一步断了问题就出在哪一步不要一上来就怀疑路由协议配置。4.2 度量值失配导致“学而不达”另一种特别阴的故障是路由表里明明有这条路由但ping永远超时。我在实验里故意复现过这个场景R2把OSPF重发布进RIP时没有指定metric或者指定了16。R3的路由表里确实出现了10.1.1.0/24但跳数是16。RIP的规则是跳数达到16就宣布网络不可达于是这条路由永远无法被用来转发数据。碰到这种问题最快的验证方法是看路由表里目标路由的metric值RIP路由超过15直接可以判断问题就出在种子度量值配置上。OSPF那边也一样如果外部路由的cost特别夸张而且你确认链路带宽没问题那就去看看重发布命令里有没有指定metric。这个坑给我们的教训是重发布命令里的metric参数不是可选项而是必选项。哪怕你写的值回头还需要调也一定得先写一个合理的值别用默认值赌运气。4.3 路由环路后的快速定位方法环路最大的特征是traceroute里TTL逐跳递减但始终到不了终点并且数据包的路径会在某两台设备之间反复横跳。我做实验时直接在R1上traceroute 192.168.2.1如果路径变成R1→R2→R3→R2→R3这种往返打转的局面基本可以断定是双向重发布没做防护。碰到环路别急着把所有重发布命令全删了。第一步先查所有参与重发布的设备上是否存在同一前缀的多条来源路径然后找出哪一跳的路由条目“来路不正”。比如在R3上看到10.1.1.0/24是从OSPF外部学到的而实际上它本来就在OSPF域内说明这条路由被重复注入了一次。用route-map加tag的方法处理后再把错误路径清掉路由表就会收敛。4.4 我个人的三条实践心得这里分享几条我做完这个实验、并且带人做了很多次之后的体会你可能在别的文档里看不到这么直白的总结。第一条重发布方向要先单一再双向。做实验时先在R2上只做OSPF到RIP验证通过再做RIP到OSPF验证通过最后才把两条命令同时开着。一步到位双向重发布的坏处是出现问题后你根本不知道是哪个方向引入的。而且单方向验证通过本身也是一次排错练习。第二条活用show ip protocols。这个命令能看到当前路由协议的重发布配置摘要包括你在redistribute里写没写metric和subnets都能看出来。我一度以为自己配置了subnets结果发现没写就是靠看这个命令抓到的。它比show running-config更直观只看重发布相关部分。第三条在模拟器里故意制造故障。实验做顺畅了把所有配置清掉故意写错metric或者故意不加tag看看路由表会变成什么样子。这个过程能让你把故障现象和根因建立起强关联比死记硬背命令有用十倍。我每次做网络实验都喜欢先“搞坏”再“修好”这种学习效率是最高的。5. 实验的扩展方向从单点重发布到多点重发布5.1 多发点重发布的环路风险比你想的更严重上面做的实验都建立在R2是唯一一个重发布点上。一旦拓扑升级成双出口甚至多出口比如R2和R4同时做OSPF与RIP的重发布情况就复杂得多。两个重发布点之间没做任何防环机制时RIP域内的一个网段既可以从R2学到也可以从R4学到OSPF域内的一个网段同样可能通过两条外部路径出现。这时候仅仅靠tag和自己的route-map就很难完全控制局面了。更麻烦的是OSPF的外部路由在不同重发布点之间还会互相传递形成一种“你发布我、我发布你”的循环。虽然OSPF本身通过AS External LSA和forwarding address能缓解一部分问题但本质上还是需要结合过滤策略来做。这也是为什么在工程上多点重发布必须配路由策略的原因。如果你有时间建议把拓扑从3台扩展到5台R2和R4同时做双向重发布不加任何策略观察路由表的变化。这个实验做下来你对“路由策略不是装饰而是必需品”这句话会有切肤之感。5.2 还可以尝试的变体实验除了OSPF和RIP互发重发布实验还有其他练法。我试过把静态路由和直连路由重发布进OSPF也试过IS-IS和OSPF之间的重发布。每个组合的度量值体系和默认行为都不一样。比如IS-IS的默认metric风格在较老版本里是按接口算的跟OSPF换算时更麻烦。多试几种组合比反复刷同一套题管用。还有一个小变体在R2上同时把OSPF重发布进RIP时用两种不同的度量值然后观察RIP域内路由表的变化。这个实验能直观地让你理解“种子度量值是重发布路由在目的域里的起点值”这个概念也能帮你养成给重发布路由指定metric的习惯。我自己做完这些扩展实验后最大的收获是重发布这个操作本身不难难的是理解每个协议之间“度量值体系”和“防环机制”的差异。这些东西靠背是背不下来的只有在一次次实验翻车、看路由表、查文档的过程中才能真正内化。这个“重发布实验”绝对值得你多花两个晚上去折腾。