MPLS virtual private network PE-CE之间的路由协议(OSPF)

基础配置:

OSPF 协议是PE和CE之间路由协议的另一种选择,如果要将VPN用户路由传递到其他PE,那么需要在PE上把OSPF路由引入到MP-BGP,在远端PE上需要将MP-BGP的VPNv4路由引入到OSPF。

在远端站点的PE上将OSPF路由导出到VPN实例后,这些路由变成了OSPF外部路由,导致路由的优先级变低,这样会带来以下两个问题。

如果此时客户站点之间拥有备份链路(后门链路),如图所示,这会导致远端站点优先选择后门链路的路由,而不是穿MPLS VPN骨干的路由。这不符合用户起初的期望。另外,从网络设计角度考虑,这种情况下使得同个VPN用户的不同站点被MPLS VPN骨干分割了。
MPLS virtual private network PE-CE之间的路由协议(OSPF)
为避免在远端PE上将引入的OSPF中的路由变成外部路由,MPLS VPN采取了相应的解决办法。在远端PE上将MP-BGP传递过来的 VPNv4路由引入到OSPF时,以LSA3的形式通告出来(常规的做法是以LSA5的形式通告出来,PE是ASBR),如上图所示。这样的设计就让MPLS VPN骨干网看起来像一个OSPF的骨干区域(PE成了ABR)。对于OSPF 来说,我们称之为超级骨干区域。从网络设计角度看,这就由中间的一个超级骨干区域将多个站点的OSPF区域连接在了一起,从而形成了一个整体。
MPLS virtual private network PE-CE之间的路由协议(OSPF)
对于OSPF来说,有了这个超级骨干区域后,用户各站点内的OSPF区域设计需要注意以下几点。用户站点内如果是单区域,各站点可以使用相同或不同的区域,如图所示:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
用户站点内如果是单区域,各站点可以使用相同或不同的区域,如图所示:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
用户站点内部如果采用多区域,要确保骨干区域(Area 0)连接在PE上,如下图所示:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
如果用户站点内部采用多区域,而骨干区域(Area 0)没有连接在PE上,如下图所示,那么会导致什么问题?
MPLS virtual private network PE-CE之间的路由协议(OSPF)
这样会导致用户站点Area 0学不到其他站点的路由,因为PE路由器能够收到LSA3信息,但是不会计算出该路由,这是由域间路由防环机制所决定的。该机制描述了从非骨干区域学到的LSA3是不能再传递给骨干区域的,因为骨干区域认为该LSA3是从这里传递出去的,但是现在又传递回来了,则认为环路产生了。那如何在不改变网络拓扑的情况下解决这个问题呢?这就需要用到OSPF的虚链路,只需要利用虚链路将PE和ABR相连就可以了,如图上图所示。

前文中提到过,如果本端站点内的路由通告到远端站点后变成了区域间路由,如果这时用户的站点之间还有后门链路,那么本端站点的内部路由通过后门链路传递过去的还是内部路由,而此时通过MPLS VPN骨干接收到的路由是区域间路由,根据OSPF的路由优先顺序,远端站点还是优选后门链路的路由。要避免这种情况,必须在PE之间配置一条特殊的链路 Sham-Link(伪链路),关于此内容后面再详细介绍。

用于OSPF的 BGP扩展团体属性:

要想OSPF路由能无缝地穿越MPLS VPN骨干网络,就必须使MP-BGP协议携带OSPF路由的特征,比如路由类型、进程号等,这些特征可以帮助远端PE决定向CE端通告什么类型的LSA,这样就使得OSPF路由可以在远端PE处得以完全重建。

MPLS VPN体系结构中使用BGP的扩展团体属性来传递OSPF路由的特征,这些特征包括:

  1. 路由类型。
  2. 区域号。
  3. OSPF路由器ID。
  4. 域ID。
  5. OSPF外部路由的度量值类型1或2。

路由类型使用的是LSA的类型值,如果路由类型是LSA1、LSA2、LSA3,那么远端PE会以区域间路由(LSA3)的形式通告给OSPF区域。

OSPF进程的域ID包含在此进程生成的路由中,在将OSPF路由引入到BGP中时,域ID被附加到VPNv4路由上,作为 BGP的扩展团体属性传递。

每个OSPF进程可以配置两个域ID,不同进程的域ID相互没有影响。PE上不同VPN的OSPF进程域ID配置没有限制。但同一VPN的所有OSPF进程应配置相同的域ID,以保证路由发布的正确性。

域ID用来告诉远端PE路由器,通告的路由是否是一条外部OSPF路由。在远端PE路由器上通过比较VPN路由中的域ID和本端的域ID值是否一样,如果是一样,则以内部路由引入到OSPF 区域,否则以OSPF外部路由引入到OSPF区域。域ID可以通过命令修改,华为VRP系统缺省情况下,域ID为0。

如下输出显示了PE上一条VPNv4路由(1.1.5.0/24)的路由更新,以及为该路由所关联的BGP扩展属性:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
关于上面的输出内容,BGP扩展团体属性的解释如下:

  1. RT<1:1>:这个值表示VPN路由的RT值,注意这里不是表示路由类型(route-type),而是vpn-target。
  2. OSPF DOMAIN ID<0.0.0.0:0>:冒号前面部分0.0.0.0表示域ID值,后面部分表示可选项,默认为0。
  3. OSPF RT<0.0.0.0:1:0>:这个值表示OSPF路由类型,共分成3部分,第1部分表示区域号,第2部分表示路由类型,第3部分表示外部路由的度量值类型1或2。后两个部分(路由及度量值类型)取值及其解释如下。
    • 1:0 or :2:0表示内部路由(LSA1或LSA2)
    • 3:0表示区域间路由(LSA3)。
    • 5: 0 or 5:1表示外部路由(LSA5),度量值类型分别是1或2。
    • 7:0 or 7:1表示外部路由(LSA7),度量值类型分别是1或2。
    • 129:0表示sham-link端点。
  4. OSPF Router-ID<172.16.1.1:0>表示发送该路由的VPN实例的Router-ID。

OSPF路由穿越MPLS VPN骨干网的Metric传递:

在PE上将OSPF内部路由或外部路由引入到BGP后,使用OSPF路由的Cost值来设置BGP路由的MED值。当远端的PE把 BGP路由引入到OSPF区域时,又将MED值复制回来给OSPF路由的Cost值,具体过程分为以下几种情况:

  1. 两端PE的域ID设置相同的情况,OSPF内部和外部路由的Cost传递的情况如图示:
    MPLS virtual private network PE-CE之间的路由协议(OSPF)
    如图所示,PE1收到CE1的路由后,因为要累加入口链路的开销,所以引入到BGP后的MED值为2。远端的PE2将BGP路由引入到OSPF 区域时,直接用MED值代替OSPF路由的开销值。这种情况下,由于PE1和 PE2的域ID相同,所以在PE2上会根据路由的类型来产生相应的LSA给CE2。

  2. 两端PE的域ID设置不相同的情况,OSPF内部和外部路由的Cost传递的情况如图所示:
    MPLS virtual private network PE-CE之间的路由协议(OSPF)
    如图所示,因为PE1和 PE2的域ID不同,所以在PE2上把BGP路由引入到OSPF区域的路由都是OSPF 外部路由,而Cost值仍然是复制BGP路由的MED值。

以上两种情况中,如果BGP路由中没有MED值,则OSPF外部路由使用默认的开销值。华为设备的DOMAIN-ID值默认为0,它和VPN实例中的OSPF进程ID大小没有关系。

防止OSPF站点间的路由环路:

在对网络健壮性要求较高的应用中,可以采用CE双归属方式组网,如图所示:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
但是在CE双归属场景中,用户的VPN路由有可能通过多个PE传播到公网,导致潜在路由环路的产生,下面是产生环路的案例。

MPLS virtual private network PE-CE之间的路由协议(OSPF)
如图所示,PE1、PE2、PE3都已建立 iBGP连接,PE和CE之间使用OSPF路由协议。这时假设由于链路质量问题,PE1先接收到来自PE3的VPNv4路由(2.2.2.2/32),PE1会将BGP路由引入到左侧站点的OSPF区域,PE2从 OSPF中学习到该路由,下一跳指向CE1。然后又在PE上做了双向引入,所以PE2会将该OSPF路由引入到BGP形成 VPNv4路由,同时将该路由通告给PE1。这时,PE1从 PE2和 PE3接收到了同一条VPN路由,在链路开销相等的情况下,假设PE2的Router-ID小于PE3的 Router-ID,那么PE1会优选 PE2为下一跳,环路就产生了。

为避免潜在的路由环路问题,需要使用到OSPF报文头部选项中的DN 比特位。DN 比特位于LSA 3/LSA.5/LSA7中的 Option字段,用于表明路由是由PE向CE方向传递的,也就是说一条路由如果由PE发布给CE,这条路由的DN 比特位就会被置位为1。同一用户站点的其他PE在收到带有置了DN比特位的LSA3时,不会进行SPF路由计算,更不会将其引入到BGP中。如下图示,显示了一台PE路由器在接收到置了DN比特位的LSA时,不会再将其通告进BGP中。
MPLS virtual private network PE-CE之间的路由协议(OSPF)
但是在CE双归属场景中,用户的VPN路由有可能通过多个PE传播到公网,导致潜在路由环路的产生,下面是产生环路的案例。

按照RFC2547 BGP/MPLS VPNs中的定义,DN比特位只会出现在LSA 3,但是华为在 LSA5和 LSA7中也设置了DN比特位。如下输出所示,显示了LSA3中是否设置了DN比特位的方法。
MPLS virtual private network PE-CE之间的路由协议(OSPF)
在某些特定场景下,DN位也无法避免上述的环路问题,如上图图所示的场景:
MPLS virtual private network PE-CE之间的路由协议(OSPF)
CE双归属,CE1连接PE1的链路在Area 0中,CE1连接PE2的链路放在Area 1 中;当PE1以LSA3的形式向CE1发送OSPF路由时,这时 DN比特置位;由于CE是ABR,当这条LSA 3经过CE再传递到Area 1时,DN比特位置为0,当PE2接收后,仍然会计算该路由,从而造成环路隐患。

有些场景下需要关闭DN比特位的功能,否则会导致路由无法学习,比如下面这两种情况:

  1. OSPF应用在VPN-OptionA场景时,本端ASBR路由器把BGP路由引入到OSPF区域中,以置了DN位的LSA3,在发送到对端ASBR时,该对端ASBR检查到DN置位了,所以无法把OSPF 路由引入到BGP中。

  2. 当PE设备连接MCE 设备场景时,MCE设备需要计算PE设备发布的某些路由。如果PE设备发送的LSA 的 DN比特有置位,会导致MCE设备无法计算路由。

华为VRP系统禁用DN置位的命令是: dn-bit-set disable { summary | ase | nssa }o参数介绍:

  1. summary:指定不设置Summary LSA的 DN位。
  2. ase:指定不设置AS-external LSA 的 DN位。
  3. nssa:指定不设置NSSA LSA的DN位。

但是在实际组网中,使用dn-bit-set disable命令用来禁止设置OSPF LSA的 DN位,可能会产生路由环路。如果设置了ase参数或nssa参数,即对于AS-external-LSA或NSSALSA,这两种LSA也可以通过Route-tag命令配置相同的Tag值来防止路由环路。所以,dn-bit-set disable命令只推荐在上面描述的两种场景中使用。

配置 dn-bit-set disable ase命令后,即使Type7 LSA设置了DN位,由Type7 LSA转化的Type5 LSA也不会随之设置DN位。

说明:

  1. dn-bit-set disable命令仅支持在OSPF 私网进程下配置,并且只在PE上生效。
  2. 执行dn-bit-check disable命令可以控制对端PE路由器接收OSPF路由是否检查DN位。

按照IETF的标准定义,在CE双归属环境中,通过在LSA3中设置DN位来避免潜在的路由环路,在华为设备中,LSA 5和LSA 7也可以通过另外的一种方式来阻止路由环路。除了使用DN来防止潜在的环路之外,这两种LSA (LSA 5和 LSA 7)也可以使用Route-tag来防环。如果一台PE路由器设置了Route-tag,当它将OSPF外部路由发布给CE之前会使路由带上Route-tag。如果在同一站点的另一台PE路由器发现在接收到的OSPF 外部路由中的Route-tag 跟本端配置的一样那么就会忽略该路由。

在华为VRP系统中可以通过 Route-tag命令来设置路由域标记,缺省情况下,Tag值可以根据BGP
的AS号计算得到(默认D000+AS 号)。
MPLS virtual private network PE-CE之间的路由协议(OSPF)

如图所示的场景中,PE1和 PE2为该用户站点设置的Route-tag都是100,当PE1将OSPF外部路由通告出来时携带了该标记,在 PE2接收到该OSPF外部路由后,通过比较Route-tag,发现跟本端设置的一样,就不会再将该路由引入到 BGP中,以避免环路隐患。

VPN客户的后门链路:

通过MPLS VPN骨干网将运行OSPF 协议的用户站点连接起来后,用户的业务通过骨干网进行传送。为增强网络的健壮性,现在很多大型的MPLS VPN场景中都会部署备份路径,这些备份路径我们称之为后门链路。通过后门链路将各站点的OSPF 区域打通后,所有的LSA将会保持原样从一个站点传递到另一个站点,也就是说,OSPF 内部路由(LSA 1和LSA 2)通过后门链路传递到远端的站点还是内部路由,而内部路由穿过MPLS VPN骨干传递过去后变成了区域间路由(LSA3),这就导致两个站点之间永远选择的是后门链路,而用户期望站点之间的数据流默认以MPLS VPN骨干为主路径,后门链路作备用路径。

如图所示,显示了用户站点之间拥有后门链路的简单的网络:MPLS virtual private network PE-CE之间的路由协议(OSPF)

如图所示,用户各站点都配置在相同的区域中,后门链路使得这些区域连接在一起,从而形成了一个区域。在右侧站点中接收到通过MPLS VPN骨干来的是LSA3(假设PE1和PE2的域ID相同),而另外一边接收到通过后门链路来的是LSA1和LSA2,这时CE2会优先选择来自后门链路的内部路由,而忽略来自MPLS VPN骨干的区域间路由,这就意味着,站点之间的数据流需要经过后门链路,当后门链路不可用后数据流才切换到MPLS VPN骨干网络。这种情况导致的另一个问题就是,PE2是不会将从PE1接收到的BGP路由安装至VRF 的路由表中,因为此时VRF 的路由表里面已经通过CE2学习到了OSPF路由,而OSPF的优先级要高于BGP路由。

为解决这个问题,引入了一种OSPF 的特殊链路——sham-link。sham-link就像一条正常的OSPF链路一样,有自己的接口,可以在其上建立OSPF邻居关系,能够传递OSPF中所有报文,同步LSDB等,但是不能传递数据报文。sham-link可以被视为一个无编号、点到点的链路,它也会参与SPF的路由计算。当LSA在伪装链路中进行泛洪时,所有的OSPF 路由类型都不会改变,不会转换成LSA 3或者LSA 5的类型。如果sham-link断掉,那么又恢复成前面所讲的机制。但LSA在 sham-link是不会周期性地泛洪的。

并不是所有Site之间都需要配置sham-link,OSPF伪连接仅应用在属于同一个OSPF区域的两个Site之间存在后门链路的情况。如果Site之间没有后门链路,则不需要配置OSPF伪连接;如果Site不属于同一区域的情况,则不需要配置OSPF伪链路。

sham-link建立在两台PE路由器之间,要求两台PE路由器分别在对应的VRF中建立一个32位掩码的环回接口来充当sham-link的端点,并且需要将这个地址宣告进iBGP,BGP使用Route-type值129的扩展团体属性将sham-link的端点地址通告给其他PE。以下是sham-link 的配置:

Sysname PE1

Interface LoopBack1
Ip binding vpn-instance VPN-A
Ip address 1.1.1.1255.255.255.255

bgp 100
ipv4-family vpn-instance VPN-A
import-route direct

Ospf 2 vpn-instance VPN-A
area 0.0.0.0
sham-link 1.1.1.13.3.3.3

Sysname PE2

Interface LoopBack1
Ip binding vpn-instance VPN-A
Ip address 3.3.3.3255.255.255.255

bgp 100
Ipv4-family vpn-instance VPN-A

network 3.3.3.3255.255.255.255import-route direct

ospf 2 vpn-instance VPN-A
area 0.0.0.0
sham-link 3.3.3.3 1.1.1.1

在区域视图下使用sham-link 命令建立sham-link,后面加上源和目标端点环回口地址。在 sham-link建好后,注意,不能把 sham-link的端点地址宣告进VRF下的OSPF进程,否则会导致sham-link抖动。具体原因是,PE 如果同时通过 iBGP和 OSPF学习到端点地址的路由,由于OSPF 路由的优先级高于BGP路由,所以PE会选择OSPF路由,导致sham-link 中断,因为建立sham-link用的路由必须是BGP路由。

sham-link的Cost 默认为1,也通过设置 sham-link的开销值来保证数据流走的是骨干网链路而非后门链路,如下输出所示,查看sham-link信息的方法。

如上输出显示出sham-link的邻居ID及源和目标端点地址, sham-link 作为P2P链路特性运行,默认开销是1,在数据库也可以观察到相关信息,如下输出信息所示:MPLS virtual private network PE-CE之间的路由协议(OSPF)

另外需要注意的是,因为一台PE路由器会优选通过sham-link 收到的OSPF 路由,而不会选择BGP传递过来的路由,在PE上又做了OSPF和 BGP双向引入,这时会不会导致通过sham-link学习到的路由又再引入回给 BGP
呢?答案是不会的,因为对端PE已经通过BGP将路由通告过来,再将这些路由通告回去给对端PE是没必要的。至此,总结一下在PE上部署sham-link的几点注意事项。

  1. 用于建立sham-link 用的端点地址的掩码必须是32位的。
  2. 必须将端点地址宣告进BGP,不能宣告到VPN实例的OSPF中。用于sham-link端点的接口必须属于特定的VRF。

整理资料来源:《华为HCIE路由交换学习指南》

上一篇:MPLS virtual private network PE-CE之间的路由协议(静态、RIP、IS-IS)


下一篇:git reset 版本回退命令