路由破环显神威

在上一期问鼎OSPF中,我们介绍了OSPF特殊区域的设立,以及这些特殊区域中可以使用的LSA。从前几期的介绍中,我们知道,OSPF拥有一个最为人津津乐道的能力,就是能够计算出无环的路由。不管是区域内的路由(Intra-Area Route)还是区域间(Inter-Area Route)路由,在OSPF设计之初就考虑到路由环路的问题,所以OSPF各种区域在处理Type1Type2Type3Type4Type5Type7 LSA时,能够确保路由无环。

当然,在OSPF多实例场景中,也存在一套避免路由环路的方法,也就是OSPF所说的计议。介绍之前,我们先了解两个概念。

1 OSPF多实例

1.1 多实例

BGP/MPLS IP ×××场景中PECE之间需要进行路由传递,就要得到各路由协议的支持。由于传统路由器只有一张路由表,为了不影响原来的路由信息,各路由协议必须扩展其功能才能在BGP/MPLS IP ×××场景中使用。

OSPF对其自身协议进行扩展,创立OSPF ×××多实例。支持在BGP/MPLS IP ×××场景的PECE之间运行,进行路由的学习和发布。在多实例场景中,路由器上会存在多个独立的路由表,之间的路由信息相互隔离。

1.2 Domain ID

我们知道,BGP/MPLS IP ×××本质是通过MPLS骨干网,将本端PECE之间的路由传递到对端PE。这个传递过程不再详细描述,有兴趣的小伙伴可以去搜索第一期华为悦读汇有关BGP/MPLS IP ×××的介绍。这里值得指出的是,PE之间是通过MP-BGP协议传递的路由信息。那这又跟我们这里OSPF多实例有什么关系呢?

从多实例的定义中,PECE之间运行路由协议,相互学习路由。其实这里可以使用的路由协议有很多,诸如静态路由、RIPOSPFBGP等协议。在OSPF多实例场景中,PEOSPF路由引入BGP,从而传递到对端PE;当然,对端PE发过来的BGP路由,也会引入OSPF中。这样,在两端的PE设备上,分别存在一个OSPF区域,Domain ID则用于区分这两个区域是否属于同一个OSPF域。如果属于同一个OSPF域,PE则把BGP传来的远端路由通过Type3 OSPF路由发布给CE,否则发布Type5Type7OSPF路由。

这里插播一下: PECE之间运行路由协议虽然有很多,但是最常用的还是EGBP。那么为什么还要有OSPF ×××多实例呢?也许是因为其他路由协议都支持了,OSPF不能不支持的心理在作祟;也许是网络发展进程中,PECE已经习惯使用OSPF了吧。对这一点感兴趣的小伙伴不妨跟帖回复你认为的原因,可能有意想不到的惊喜哟!

2 巧破OSPF多实例路由环路

showp_w_picpath-10150663-10132081-708a2a73e2a7

1 OSPF多实例典型组网

上图是典型的OSPF多实例组网,从前面的原理我们知道,PE1通过BGPPE2收到关于CE2OSPF路由,将这些路由的产生者的地址修改成自己,然后发布相关的Type3Type5Type7OSPF路由给CE1CE1再向其他区域发布这些路由时,会将PE1作为ASBR,这样就能实现跨越MPLS骨干网的两个私网之间进行路由互通了。

2.1 遇到问题

路由协议最怕的就是产生路由环路。不过OSPF天赋异禀,为保证区域间传递的路由不会产生环路而制定了规则:

1. 所有的非0区域必须与骨干区域直接相连,区域间路由需经由骨干区域中转。

2. 使用SPF算法。

在实践中,OSPF的确达到了无环的目的。以至于一提到OSPF,就会提到OSPF能够计算出无环的路由。

但是,自从加入了OSPF多实例功能之后,由于BGP/MPLS IP ×××网络改变了原有的拓扑结构,使得第一条规则不再有效。而且在跨越了MPLS/IP骨干网之后一般都是Type3Type5Type7类型的OSPF路由,这三种LSA实际上在OSPF计算产生路由的时候和距离矢量算法很接近,在某些场景中很有可能产生路由环路。比如下图所示的场景:

showp_w_picpath-10150664-10132081-6230921e3de1

2 OSPF ×××路由环路

PE1OSPF引入了目的地址为10.1.1.0/24BGP路由,产生5类或7LSA发布给CE1CE1上学到一条目的地址为10.1.1.0/24,下一跳为PE1OSPF路由,并发布给PE2,这样PE2上就学到一条目的地址为10.1.1.0/24,下一跳为CE1OSPF路由。

同理,CE1上也会学到一条目的地址为10.1.1.0/24,下一跳为PE2OSPF路由,PE1上学到一条目的地址为10.1.1.0/24,下一跳为CE1OSPF路由。

此时,CE1上存在两条等价路由,分别指向PE1PE2,而PE1PE2上到10.1.1.0/24的下一跳也都指向CE1,环路就产生了。

2.2 巧计破环

既然产生了环路,总要有个破环方法。要知道,OSPF多实例场景中,PE将路由发送给CE时,使用的是Type3Type5Type7类型的OSPF路由。那我们就分别针对这三类路由指定破环之策。

2.2.1 破环良策之一——DN-bit

PE在生成Type3Type5Type7 LSA发布给CE时,都将DN位置位(值为1),其他类型LSADN位不置位(值为0)。

PEOSPF多实例进程在进行计算时,忽略DN置位的LSA。这样就防止了PE又从CE学到发出的LSA而引起的环路。

2.2.2 破环良策之二——××× Route Tag

×××路由标记(××× Route Tag),PE根据收到的BGP的私网路由产生的Type5Type7类型LSA中必须包含这个参数。

PE发现LSA×××路由标记(LSATag值)和自己的一样,就会忽略这条LSA,因此避免了环路。

至此,CE双归属场景下的路由环路的问题消失的无影无踪。

3 破环虽好,偶有误伤

虽然OSPF多实例场景下路由破环获得奇效。不过,待看完下面这个案例,你又有什么样的想法呢?

3.1 案例

showp_w_picpath-10150665-10132081-57d1ab19a128

3 MCE组网图

3.1.1 组网需求

如上图所示,某公司需要通过MPLS ×××实现总部和分支间的互通,同时需要通过×××隔离多种不同的业务。为节省开支,希望分支通过一台MCE设备接入PE(此处仅以其中一个vpna为例说明问题)。

3.1.2 场景描述

1PE1PE2MPLS ×××骨干网。CE1MCE同属于vpna,通过骨干网进行私网互通。

2PE1CE1通过OSPF交互私网路由。

3PE2MCE通过OSPF多实例交互私网路由。

4、在PEOSPF视图下引入BGP路由,发布PE的私网路由给CE或者MCE;在PEBGP视图下引入该OSPF进程,发布私网路由信息给对端PE

3.2 关键配置

PE1的关键配置:

#

ip vpn-instance vpna

ipv4-family

route-distinguisher 100:1

vpn-target 200:1 export-extcommunity

vpn-target 200:1 import-extcommunity

#

interface GigabitEthernet0/0/1

ip binding vpn-instance vpna

ip address 10.1.1.2 255.255.255.0

#

bgp 100

peer 2.2.2.2 as-number 100

peer 2.2.2.2 connect-interface LoopBack1

#

ipv4-family vpnv4

policy vpn-target

peer 2.2.2.2 enable

#

ipv4-family vpn-instance vpna

import-route ospf 100

#

ospf 1

area 0.0.0.0

network 1.1.1.1 0.0.0.0

network 172.1.1.0 0.0.0.255

#

ospf 100 vpn-instance vpna

import-route bgp

area 0.0.0.0

network 10.1.1.0 0.0.0.255

#

PE2的关键配置:

#

ip vpn-instance vpna

ipv4-family

route-distinguisher 100:1

vpn-target 200:1 export-extcommunity

vpn-target 200:1 import-extcommunity

#

interface GigabitEthernet0/0/1

ip binding vpn-instance vpna

ip address 10.2.1.2 255.255.255.0

#

bgp 100

peer 1.1.1.1 as-number 100

peer 1.1.1.1 connect-interface LoopBack1

#

ipv4-family vpnv4

policy vpn-target

peer 1.1.1.1 enable

#

ipv4-family vpn-instance vpna

import-route ospf 100

#

ospf 1

area 0.0.0.0

network 2.2.2.2 0.0.0.0

network 172.1.1.0 0.0.0.255

#

ospf 100 vpn-instance vpna

import-route bgp

area 0.0.0.0

network 10.2.1.0 0.0.0.255

#

CE1的关键配置:

#

ospf 1

area 0.0.0.0

network 10.1.1.0 0.0.0.255

#

 

MCE的关键配配置:

#

ip vpn-instance vpna

ipv4-family

route-distinguisher 100:1

vpn-target 200:1 export-extcommunity

vpn-target 200:1 import-extcommunity

#

interface GigabitEthernet0/0/1

ip binding vpn-instance vpna

ip address 10.2.1.1 255.255.255.0

#

ospf 100 vpn-instance vpna

area 0.0.0.0

network 10.2.1.0 0.0.0.255

#

2.1 故障现象

按照上述配置完成以后发现MCE侧学习不到对端的私网路由,但是存在OSPFLSDB

1MCE侧的×××实例里面学习不到CE侧的10.1.1.0/24网段的私网路由。

showp_w_picpath-10150666-10132081-1e2a6f4fc52d

2CE1上能正常学习到MCE10.2.1.0/24网段的私网路由。

showp_w_picpath-10150667-10132081-ef3bde45fd37

3MCEOSPF LSDB信息中存在External类型的10.1.1.0网段路由。

showp_w_picpath-10150668-10132081-16c0ea6ea1e7

3.3 根因分析

由于防环检测机制的存在,所以我们在PE经常会发现存在LSA但路由计算不出来。

特别是在PEMCE对接的场景下,PE在生成Type3Type5Type7 LSA发布给MCE时,都将DN位置位(值为1),其他类型LSADN位不置位(值为0)。MCEOSPF多实例进程在进行计算时,忽略DN置位的LSA。所以就会出现OSPF邻居状态是Full的,也存在LSDB,但是无法计算出路由的现象。

验证一下,检查MCE上这条LSA是否存在DN-Bit

showp_w_picpath-10150669-10132081-997638123701

E DN”表示LSADN-Bit,正常时候显示“(DC)”。可以确认是由于OSPF的防环机制,导致这个LSA设置DN-Bit标志位,从而导致这条LSA不会参与到路由计算中,所以最终MCE侧学习不到CE侧的10.1.1.0网段的路由。

3.4 解决方法

由于MCE设备并不是PE设备,所以可以不检查DN-Bit而直接计算出所有OSPF路由。

MCEOSPF视图下输入vpn-instance-capability simple即可禁止路由环路检测。

showp_w_picpath-10150670-10132081-b3d0369e7327

上述命令配置完以后,查看MCE上,学习到了CE侧的10.1.1.0网段的路由了。

showp_w_picpath-10150671-10132081-4b50ed348f0c

需要注意的是,这个命令只建议配置在MCE设备上,因为配置这个命令后OSPF将不再能够引入IBGP路由(import from IBGP)