OSPF 最大度量值:不删除分支而抑制其穿行流量
分支可以保持可达,同时宣告一个不具吸引力的穿行代价。走一遍路径,读取 router-LSA,并测试最后一条路径的情形。
两个办公点通过一个分支相连,这条分支只应承载自己的流量,几乎不应承载别的。分支需要通往两个站点的路由,而两个站点都不应把它当作彼此之间的路径来优先选择。把分支从拓扑中删掉能解决穿行问题,却会破坏需求,因为分支仍要到达两个站点,两个站点也仍要到达分支。
你需要的是一种偏好,在路由协议中表达出来,让分支保持完全可达,同时让任何穿行其间的流量觉得它是个糟糕选择。按路由器看到问题的顺序走一遍。
从你想避开的那条路径开始
按协议看到的拓扑来画,而不是按示意图来画。哪些接口形成邻接,哪些在同一区域,如果优先选择分支,这些邻接中哪些会承载两个办公点之间的流量?这是三个不同的问题,示意图一个都不能可靠回答。
然后找出替代路径。如果两个办公点之间唯一的路径要穿过分支,任何度量值都无法把流量挪走,因为流量无处可去。冗余不是这个设计的细节,而是前提条件。只存在于纸面上的第二条路径不算数。
show ip ospf neighbor
show ip ospf interface brief
show ip route 10.40.0.0
这三种视图回答不同的问题:谁与谁相邻,哪些接口参与、代价多少,以及设备当前选择哪条路径。隧道部署还要加第四种:图上的一条线不能证明邻接是在它之上形成的,而形成邻接也不能证明转发走同一条路径。隧道设计正是这种偏差最常出现的地方。
最大度量值宣告了什么
RFC 6987 描述一种路由器,用最大链路度量值来宣告自己的非 stub 链路,该值定义为 0xffff。路由器仍然描述自己和自己的链路,只是把它们定价在区间的顶端,于是其他每台路由器都把它当成昂贵的一跳。
这是 router-LSA 的改动,而不是删掉拓扑。区别很重要:清空 router-LSA 会撤回拓扑信息本身,也可能连带撤回到达该路由器及其身后前缀所需的关系。保留宣告、提高价格则保住这些关系。这就是这项技术与删除之间的全部差别。
RFC 6987 的机制与区域类型、与指定路由器的选举都没有关系。stub 区域在区域边界上拦住某一类链路状态宣告,stub 路由器给自己的链路定价。字面相近,机制无关。
为什么可达性留存、穿行不留存
其他路由器仍然有通往分支所连前缀的路由,因为分支仍然宣告它们,链路也仍然存在。变化的是任何绕经分支去别处的路径的总代价。前缀不动,变的只是穿过这台路由器的价格。
对于源或目的就是分支本身的流量,昂贵链路仍在唯一合理的路径上,因此照用。对于两个办公点之间的流量,替代路径在代价上胜出,分支就此退出转发决策,却没有从拓扑中消失。两个方向、两个不同答案,两者都说明机制在起作用。
这是要验证而不是假定的行为。看分支生成的 router-LSA,再看另一台路由器为分支身后的目的、以及为另一个办公点里的目的所选的路径。两个答案应当不同;如果相同,说明度量值的改动没有到达你以为的那一步。
最后一条路径的问题
同一份 RFC 明确说,这项技术并不禁止使用。当替代路径失效时,路由器会退回到穿过分支的昂贵路径,因为它仍是有效路径,而协议宁可要昂贵路由也不要没有路由。
这种回退是否可接受,是部署前必须回答的策略问题。一条上行带宽很小的分支突然承载办公点之间的流量,可能比中断更糟;但在维护窗口里,它也可能正是你要的。两个答案都正当,沉默不正当。
如果要求是严格禁止而不是偏好,只靠度量值设计做不到。你需要与意图一致的转发强制,并为流量照样到达的情形定义明确行为。宣告某条路径可用、随后又把流量丢掉,会造出一个比路由环路更难诊断的黑洞。
对 OSPFv3,RFC 讨论 R 位作为另一种排除穿行参与的方式。不要假定它继承了与最大度量值技术相同的最后路径行为,也不要把两套地址族的配置当成同一个功能来回抄。
在正常与故障条件下证明它
测两次:一次在两条路径都可用时,一次在移除首选路径时。第一次说明偏好在起作用,第二次说明偏好无法被尊重时网络怎么走。跳过第二次,重要的一半就没有检查。
show ip ospf database router 10.0.0.3
show ip route 172.20.8.0
traceroute 172.20.8.1
数据库视图给出宣告的度量值,路由查找给出所选的下一跳,跟踪给出报文实际去了哪里。三者一致,你手里才是被验证过的设计,而不是看起来对的配置。
然后恢复首选路径,确认分支回到只承载自己的流量。恢复这一步属于测试而不属于收尾,因为只在下次变更之前有效的设计不算设计。把两个结果都记下来,包括回退——第二个才是有人凌晨三点需要的那份答案。