OSPF多实例路由防环检测功能介绍
普通OSPF防环功能
一、区域防环
为了避免区域间的环路,ospf规定不允许直接在两个非骨干区域之间发送路由信息,只允许在一个区域内部或者骨干区域和非骨干区域之间发布路由信息。因此,每个区域边界路由器都必须连接到骨干区域。
二、区域间水平分割
ABR只会将三类LSA转发到骨干区域,如果始发的是本区域的路由是不会被再次注入进来的,目的是为了阻止环路。
三、LSA三类防环
ABR不会向区域0传播它在区域0中学习到的类型为三类LSA的路由,因为这本来就是从区域0传来的,ABR不会计算从非骨干区域来的三类LSA,防止次优路径。
新的改变,引入新的问题
上图所示用户的某一个VPN site采用PE双归属,CE设备分别与PE1和PE2之间运行OSPF路由协议,这是PE n向VPN内引入一条直连路由至BGP4+中发布,PE1学习到以后,会将这了路由告诉给下面的CE。思考这种组网中会有环路么?
首先可以确认PE1会将BGP路由转换成LSA发送给CE,CE又通过LSA传递给PE2,PE2一旦通过LSA计算出路由,那么就会形成路由环路,并且造成路由震荡。出现这种情况后,通过OSPF原有的防环路机制是无法解决的,由此OSPF多实例中新加了相关特性来解决这个问题。
BGP/MPLS/VPN组网环境
在BGP协议产生之后,OSPF要求BGP将OSPF路由从用户的一个SITE穿越骨干网传到另外一个SITE的时候,要保留OSPF的拓扑信息。
属性OSPF协调的我们知道OSPF的拓扑信息包含在OSPF的intra-LSA里面,要想保留拓扑信息,BGP最好就是能够将OSPF的LSA传到对端,而不是将OSPF路由传到对端。BGP4+的RT属性是作为BGP的扩展属性放在BGP的一个叫Extended Community的地方,其实BGP的Extended Community不只是用来放RT属性,还可以用来携带OSPF的LSA信息,我们可以将他称为OSPF属性,下面以一个BGP路由举例说明:
[h3c]display bgp routing-table ipv4 vpn-instance vpn 1.1.1.5
BGP local router ID: 1.1.1.2
Local AS number: 100
Paths: 1 available, 1 best
BGP routing table information of 1.1.1.5/32:
From : 1.1.1.4 (1.1.1.4)
Rely nexthop : 11.1.1.2
Original nexthop: 1.1.1.4
OutLabel : 1277
==Ext-Community== : <OSPF Domain Id: 0.0.0.0:0>, <OSPF ==Router Id:1.1.1.4:0:0==>,
<OSPF ==AreaNum: 0.0.0.0== ==RouteType: 5== Option: 1>, <RT: 1:1>
AS-path : (null)
Origin : incomplete
Attribute value : MED 2, localpref 100, pref-val 0
State : valid, internal, best
IP precedence : N/A
QoS local ID : N/A
Traffic index : N/A
1、 Domain ID
什么是Domain ID?
Domain ID是一个用来表示OSPF域标识符。不同的域之间属于不同的OSPF进程管理范围,不同的域之间的OSPF路由以外部路由形式交互。OSPF Domain Identifier扩展团体属性,OSPF进程被绑定到VRF后就有一个Domain ID,该ID在PE将OSPF路由引入到BGP时,域标识符被附加到BGP VPNv4路由上,作为BGP的扩展团体属性传递给对端PE。对端PE接收到BGP路由后,将本地配置的OSPF域标识符和路由中携带的OSPF域标识符进行比较, 判断是否是一个域的路由,不是一个域(即Domain ID不同)则直接转换成AS-External路由。该属性可以更灵活的控制站点间的路由是AS-External 路由还是Type3路由
h3c设备默认该Domain ID为0,可以通过domain-id命令用来配置OSPF域标识符。
[h3c]display ospf verbose
OSPF Process 1 with Router ID 1.1.1.4
OSPF Protocol Information
RouterID: 1.1.1.4 Router type: ABR ASBR
Route tag: 3489661028 PE Router, Multi-VPN-Instance is enabled
Ext-community type: Domain ID 0x5,
Route Type 0x306, Router ID 0x107
Domain ID: 0.0.0.0
BGP传这个值有什么用?
用他来判断用户同一VPN的不同SITE是否属于同一个域。当BGP将OSPF路由从一个SITE传到另一个SITE时,如果两端SITE的OSPF的Domain ID值相同,那么这条路由将作为OSPF的intra(内部)路由;当BGP将OSPF路由从一个SITE传到另一个SITE时,如果两端SITE的OSPF的Domain ID值不相同,那么这条路由将作为OSPF的inter(外部)路由。
这个值如何得来?
Domain ID(共8个字节)一般采用如下得格式:
类型 | Global administrator | Local administrator |
---|---|---|
2 | 4 | 2 |
其中最前面2个字节表示Domain ID的类型,缺省我司采用类型0x0005
2、 OSPF 路由类型
这个部分包含三个内容,格式如下:
(1) 区域(Area)号: 4字节
区域号的来源非常简单,如果这条路由是OSPF的外部路由,区域号统一填写0;OSPF的内部路由,
填写这条路由所属的OSPF区域号即可。
(2) OSPF路由类型:
** 1 or 2 | intra-area routes |
---|---|
** 3 | summary routes |
** 5 | external routes (area number must be 0) |
** 7 | NSSA routes |
注:――OSPF的1和4类LSA不会通过BGP携带至远端,所以所有的1和4类LSA都会直接被过滤掉不会引入BGP。
(3) Option选项:
目前用来表示5类LSA和7类LSA选用type1还是type2的metric度量方式。
3、 OSPF Router ID:
这部分是一个可选项,可传可不传,目的就是用来让接收者知道这条路由的发送者是谁。
OSPF如何从BGP接收路由
上述就是BGP协议在MPLS VPN实现中为OSPF特别作出的贡献,多携带了一些属性,那么OSPF是如何从BGP接收这样的路由的呢?这就是下一部分我们要给大家讲的内容。
当OSPF从BGP得到一条带着OSPF属性的路由,他会做如下的处理:
1. 判断OSPF路由类型属性,如果是5类或者7类外部路由:
那么将其用5类LSA作为ASE路由发给他的OSPF邻居(CE设备),并且将LSA的tag位改成VPN-route-TAG
[h3c]display ospf lsdb ase 1.1.1.5
OSPF Process 1 with Router ID 1.1.1.2
Link State Database
Type : External
LS ID : 1.1.1.5
Adv Rtr : 1.1.1.2
LS Age : 1371
Len : 36
Options : O E
Seq# : 80000002
Checksum : 0x24b
Net Mask : 255.255.255.255
TOS 0 Metric: 2
E Type : 2
Forwarding Address : 0.0.0.0
Tag : 3489661028
2. 判断OSPF路由类型属性,如果是1/2/3类内部路由:
那么判断Domain ID属性是否与本地相同,判断方法如下:
1) 本地Domain ID为非空值,则收到的路由Domain ID与本地完全一致是认为相同(不能为空),否则认为不同;
2) 本地Domain ID为空,则收到任意Domain ID值认为与本地相同(也可以为空)。
如果Domain ID属性与本地不相同,则将其用5类LSA作为ASE路由发给他的OSPF邻居(CE设备),并且将LSA的tag位改成VPN-route-TAG;
[h3c]display ospf lsdb ase 100.1.1.1
OSPF Process 1 with Router ID 1.1.1.2
Link State Database
Type : External
LS ID : 100.1.1.1
Adv Rtr : 1.1.1.2
LS Age : 22
Len : 36
Options : O E
Seq# : 80000001
Checksum : 0x16d9
Net Mask : 255.255.255.255
TOS 0 Metric: 1
E Type : 2
Forwarding Address : 0.0.0.0
Tag : 3489661028
[h3c]display ospf routing
OSPF Process 1 with Router ID 1.1.1.3
Routing Table
Routing for network
Destination Cost Type NextHop AdvRouter Area
3.3.3.0/24 2 Transit 2.2.2.2 1.1.1.2 0.0.0.0
2.2.2.0/24 1 Transit 0.0.0.0 1.1.1.3 0.0.0.0
Routing for ASEs
Destination Cost Type Tag NextHop AdvRouter
99.1.1.1/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
4.4.4.0/24 1 Type2 3489661028 2.2.2.2 1.1.1.2
100.1.1.1/32 1 Type2 3489661028 2.2.2.2 1.1.1.2
88.1.1.1/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
1.1.1.5/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
如果Domain ID属性与本地相同,则将其用3类LSA作为Summary路由发给他的OSPF邻居(CE设备),并将LSA的DN位置位。
[h3c]display ospf lsdb summary 100.1.1.1
OSPF Process 1 with Router ID 1.1.1.2
Area: 0.0.0.0
Link State Database
Type : Sum-Net
LS ID : 100.1.1.1
Adv Rtr : 1.1.1.2
LS Age : 341
Len : 28
Options : O E DN
Seq# : 80000001
Checksum : 0xcb63
Net Mask : 255.255.255.255
Tos 0 Metric: 1
[h3c]display ospf routing
OSPF Process 1 with Router ID 1.1.1.3
Routing Table
Routing for network
Destination Cost Type NextHop AdvRouter Area
100.1.1.1/32 2 Inter 2.2.2.2 1.1.1.2 0.0.0.0
4.4.4.0/24 2 Inter 2.2.2.2 1.1.1.2 0.0.0.0
3.3.3.0/24 2 Transit 2.2.2.2 1.1.1.2 0.0.0.0
2.2.2.0/24 1 Transit 0.0.0.0 1.1.1.3 0.0.0.0
Routing for ASEs
Destination Cost Type Tag NextHop AdvRouter
99.1.1.1/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
88.1.1.1/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
1.1.1.5/32 2 Type2 3489661028 2.2.2.2 1.1.1.2
什么是VPN-route-TAG和DN位?
看了上面的介绍,大家对哪一类路由转变成3类LSA,哪一类路由转变成5类LSA,OSPF将用户的同一VPN的多个SITE整合成一个整体应该没有太大的异议和困惑了,但是我们提出了两个新的概念那就是:VPN-route-TAG和DN位。他们从何而来,又因何而来呢?
其实这两个概念都是OSPF为了适应MPLS VPN的特殊组网而新提出来的东西,他们的目的基本一致,都是为了防止路由环路。
VPN-route-TAG
首先是VPN-route-TAG,他的概念是:当一个VPN实例与某个OSPF绑定以后,设备就要给这个VPN实例分配一个Tag值,称为VPN-route-TAG。从它的概念我们可以看出这个值属于某一个VPN实例,无论OSPF有没有用到这个值这个值固定存在。
OSPF什么时候用这个值呢?当PE设备作为ASBR始发一条外部路由给CE设备时,要将VPN-route-TAG放在5类或7类LSA的tag位置再发给CE设备(注意包含了上述的加VPN-route-TAG的情况,也就是说从BGP4+重分布到OSPF,经过判断为5类。也包含在PE上引入其他类型的路由);
这个值又如何发挥防止路由环路的作用呢?这一点非常重要,OSPF规定,当PE设备的某一OSPF实例从其ospf邻居收到一条5类LSA时,则比较这条LSA所携带的tag值,如果这个值与本OSPF实例所绑定的VPN实例的VPN-route-TAG值相同则在SPF计算期间忽略该LSA,并不把这条LSA重发布到BGP4+中去。
VPN-route-TAG的值是多少呢?我们可以先看一看他的格式:
1 | 1 | 0 | 1 | 任意标记 | 自治系统号 |
---|---|---|---|---|---|
1bit | 1bit | 1bit | 1bit | 12bit | 16bit |
前面4bit是表示tag类型;
中间12bit的任意标记缺省为0;
后面16bit为自治系统号。
DN位
另外一个类似的可以起到防止环路的新名词被成为DN位,他的概念是:它用来表示一个方向(down),当DN位被置位时说明这条LSA由PE发给CE。值得注意的是DN位只存在于3类LSA中;
OSPF什么时候将DN位置位呢?当PE路由器向CE路由器产生3类LSA时,将这种LSA的DN位置位(注意包含了上述的DN置位的情况,也就是说从BGP4+重分布到OSPF,经过判断以3类);
这个置位的动作又如何发挥防止路由环路的作用呢?OSPF规定,PE在接收到DN位已经置位了的LSA之后,PE路由器在OSPF路由的SPF计算期间忽略该LSA,并不把这条LSA重发布到BGP4+中去。
举例说明
为了更好的理解VPN-route-TAG和DN位,以一个简单的组网看一看他们是如何发挥作用的:
上图所示用户的某一个VPN site采用PE双归属,CE设备与PE1和PE2之间运行ospf路由协议,这是PEn向VPN内引入一条直连路由至BGP4+中发布,PE1学习到以后,会将这了路由告诉给下面的CE。
第一种情况:
假设CE学习到一条5类的OSPF路由10.0.0.1/24,CE又会将这条路由告诉给PE2,PE2也从PEn学到了一条10.0.0.1/24的BGP路由,但是因为ospf路由的优先级高,PE2会优选CE发给他的10.0.0.1/24的路由,并将这条由引入BGP发不给PE1和PEn。当然大家也看出来这时候有次优路由的问题,PE2会从CE绕一圈去访问PEn,但是更严重的问题是,如果这时候PEn处的10.0.0.1/24网段断开了,这是PEn会发一条BGP路由撤销消息给PE1和PE2,但是这时候PE1发现PEn的10.0.0.1/24路由是撤销了,但是自己还从PE2学到10.0.0.1/24的路由,所以PE1认为10.0.0.1/24网段仍然可达,当然PEn也会认为这个网段可达,那么我们想象PE2会不会撤销这条路由呢,PE2的这条路由是从CE学过来的CE的这条OSPF路由是从PE1学过来的,PE1认为10.0.0.1/24网段仍然可达,所以这条路由在CE上没有任何变化,这时候就造成了路由环路,甚至有的时候在PEn处的10.0.0.1/24还没有断开的时候,PE1可能会优选PE2的10.0.0.1/24路由,一开始就造成了环路。
这是大家一定很担心我们在很多项目里面都用了PE双归属,会不会有环路存在呢?其实我们采用ospf多实例是不会有这种问题的,在上述的情况下起作用的就是VPN-route-TAG,当PE1再将从PEn处收到的10.0.0.1/24以ospf 5类路由形式发给CE的时候,会给他加上一个VPN-route-TAG,这个值再不做任何改动的时候只与AS号相关,PE2收到这条路由的时候自然得到结果是和自己的VPN-route-TAG一样,这条路由PE2根本不会加入自己的SPF计算,也不会引入BGP4+,上面的次优路由,成环的问题将都不会发生。
第二种情况:
假设PEn引入的这条路由,PE1在导入ospf的时候被认为是一个3类OSPF的路由,那么这个次优和环路的问题就有DN位来解决,因为CE发给PE2的10.0.0.1/24 的DN位被置位了,导致PE2根本不会加入自己的SPF计算,也不会引入BGP4+,也就不会出现次优和环路的问题。