本帖最后由 泰克教育 于 2022-8-2 11:38 编辑
在写完《深入讨论OSPF环路问题一》后其实一直想着尽快把这文章给完结,公众号后台也收到了很多朋友的私信,希望能快点更新完这篇文章,但无奈手头事情实在太多,很难抽空静下心来写作,故迟迟都没有一个完结版。近日越来越意识到了不能再拖延,所以利用晚上闲暇时间更新完了这篇文章,文章写的略微有些匆忙,如果有写的不对的地方,欢迎各位留言指正,也希望通过此篇文章能帮助大家更好的理解OSPF。
场景四:OSPF选路规则导致的环路(RFC2328、RFC1583)
OSPF的选路规则对于每一个网络工程师来说都应该能说出几点,选路规则的设计原本是为了让路由器能选择出更好的路由,那为什么会产生环路呢,在探讨这个问题之前,我们先来复习一下OSPF的选路规则有哪些:
1、域内路由优于域间路由:即由1类或者2类lsa生成的路由是优先于3类lsa生成的路由的。 2、域间路由优于外部路由:即由3类lsa产生的路由是优于5类或者是7类产生的路由。 3、如果同为外部路由,则先比较路由的Type,Type1优于Type2 4、如果同为Type1:则比较路由的外部cost与内部cost之和,选择选小的。 5、如果同为Type2:则先比较路由的外部cost值,相同再比较路由的内部cost值,不一样就选择小的。(详情见上篇文章的场景二)。
知道如上选路规则后,再给你们介绍一下OSPF的开发历史:OSPF由IETF在20世纪80年代末期开发,最初的OSPF规范体是在RFC1131中描述的,这称为OSPF的第一个版本,但因为这个OSPF版本1有很多不成熟的地方,所以很快就被新开发的标准所替代,这个新的标准在RFC1247文档中进行描述,RFC1247在稳定性和功能性方面都有了实质性的改进,所以称为OSPF版本2,在后续的发展中,又针对了这个OSPF版本有许多更新文档出现,每一个更新都是对是OSPF的精心改进,这些更新文档包括RFC1583、2178和2328中。目前我们所学习与使用的OSPF版本2中的各种特性都在RFC2328中进行了描述。
有了以上历史知识后,回到我们这个场景主要讨论的两个标准:RFC1583与RFC2328,RFC1583与RFC2328存在着诸多的不一样,这里我们主要讨论下这两个RFC标准中选路规则所涉及的问题:
RFC1583规定:外部路由选路时只需要对比cost值,cost值小的优先,如果cost值相同则负载。
RFC2328规定:外部路由选路时只需要对比区域号大小,而不需要对比cost值,区域号大的将优先使用。
有了以上理论知识后,我们来分析一个拓扑图:
如图五所示:假设R2上运行的OSPF是执行RFC2328的选路规则,其它路由器执行RFC1583选路规则。
1、R3上有一个loopback接口,地址为10.1.3.3,引入进OSPF,产生5类LSA,ASBR为R3。 2、当R2收到这条5类LSA后,经计算会有3条路径去往ASBRR3,分别为: A、R2-R1-R3:经过区域0,内部cost值为11(如果不清楚内部cost与外部cost区域,请参考场景二) B、R2-R3:经过区域0,内部cost值为1。 C、R2-R4-R3:经过区域1,内部cost值为21。 3、根据RFC2328的选路规则,只比较路径的区域号大小,不比较cost值,所以R2会优先C路径去往R3。此时R2会将数据发送给R4。 4、R4也需要计算到达ASBRR3的路径,此时R4上也有两条路径可达到R3。 A、R4-R1-R3:经过区域0,内部cost值为11。 B、R4-R3:经过区域1,内部cost值为20。 5、根据RFC1583的选路规则,只比较路径的cost值,不比较区域号,所以R4会优选cost值小的路径A。此时R4将数据发送给R1。 6、R1也需要计算到达ASBRR3的路径,此时R1上也有两条路径可达到R3。 A、R1-R3:经过区域0,内部cost值为10。 B、R1-R2-R3:经过区域0,内部cost值为2。 7、根据外部路由选路规则,如果从同一区域收到,则直接比较cost,cost值小的优先,所以R4会优选B路径到达R3,此时数据包会转发给R2。
8、此时环路产生:R2-R4-R1-R2。 由环路现象可知,此环路产生的原因是由于R2上执行的是RFC2328选路规则,而R4上执行的是RFC1583选路规则所致,有环路就必须要有解决此环路的办法,针对此处我们能想到的最简单的办法应该是修改ospf路由器的选路规则,使全网保持一致。这样修改完成后确实可以解决此问题,但是你到底是修改成2328呢还是1583,因为他们都有各自的特点,2328考虑到了骨干区域的负载问题,但没有考虑到cost,而1583考虑到了cost,又没有考虑到区域的问题。如果有一种技术能把这两种选路规则结合起来,那肯定就是最完美的解决方案。其实协议开发者早就想到了这个问题,并且也确实设计了这种完美的解决方案,那就是RFC1583的兼容模式。
默认情况下,华为的设备启用OSPF后都工作在RFC1583兼容模式,此模式的特点为:当一台路由器收到能从不同的路径去往目标外部路由,会先比较路径的cost值,只有在cost值相同的情况下才会进一步比较区域号。如果cost值与区域号都相同,才会形成负载。
华为设备上面可以设置关闭RFC1583的兼容模式:命令为:undo rfc1583 compatible。关闭后将执行RFC2328的选路标准,在上述拓扑中,R2上就是执行了此条命令,所以才出现了环路。 场景五:OSPF在MPLS_VPN中的环路(DN位,Domain-tag)
要看明白此场景,需要各位对MPLS_VPN有一定的认识,MPLS_VPN作为数通的一个难点内容,学习起来确实有一定的难度,我这里尽量会使用一些通俗的语言去解释MPLS_VPN中的技术名词,因篇幅有限,所以不能非常详细的讲解MPLS_VPN中的技术,下次我会写一篇MPLS_VPN的专题,在文章中再详细的介绍相关技术。 对MPLS_VPN熟悉的人都知道,PE与CE之间可运行多种路由协议,如RIP、OSPF、ISIS、BGP并且静态路由也可以使用,在如此多的协议之间到底选择何种协议进行部署,是每个网络工程师都需要慎重考虑的问题,而在众多的协议之中,OSPF因为大众对它的熟悉,及在部署时有非常完善的防环特性而受到广泛的使用,所以我们这个场景就来讨论一下,在PE与CE之间运行OSPF所遇到的环路问题,及解决方法。
如上图所示:这是一个双PE的组网环境,整个网络已经提前配置好了MPLS_VPN的基础配置,两台PE的关键配置如下:
1、R3与R4连接的实例为site1,在site1里添加一条静态路由:ip route-static vpn-instance site1 30.30.30.30 255.255.255.255 NULL0 preference 200,下一跳指向Null0,优先级修改为200。此时路由表显示如下:
2、进入R3的BGP配置下,把30网段network进vpn-instance,配置如下:bgp 10ipv4-familyvpn-instance site1network30.30.30.30 255.255.255.255import-route ospf1
3、因为R3与R4建立了vpnv4邻居,所以此时30网段的vpnv4路由会传递给R4,在R4上经过路由交叉(mpls-vpn技术名词,简单说是把路由接收进实验路由表)后可以R4的实例路由表查看到此条路由,下一跳为10.1.3.3,通过IBGP学到。
4、进入R4的实例OSPF中,输入命令:import-route bgp permit-ibgp,默认情况下在PE设备上引入IBGP路由是不需要加入permit-ibgp,但此时我们的设备上配置了一条:vpn-instance-capability simple,此条命令会导致运行OSPF的PE设备丧失PE特性(具体命令细节稍后会介绍),因为在非PE设备上,import-route bgp只能引入ebgp路由(为了防环,有机会再给大家整理一篇BGP环路介绍),所以此处在引入时一定要加入permit-ibgp参数。命令如下:
5、因R4与R7建立了ospf邻居,所以此时在R7上查看路由表,可查看到R7已经学习到了一条30网段的路由,下一跳指向R4,并为ase路由。
6、因R7与R6建立了ospf邻居,继续前往R6上查看路由表,发现R6也学习到了一条30网段路由,下一跳指向R7:
7、因R6与R3建立了OSPF邻居,继续前往R3上查看site1实例路由表,可发现此时实例表中出现的一条ase的30网段路由,优先级为150。回顾第一步的路由表显示可知,此时R3会有两条去往30网段的路由,一条是通过OSPF学习到的优先级为150的ase路由,另外一条是第一步添加的优先为200的静态路由。所以此时R3会优先选择优先级小的ospf路由。
8、此时就需要了一个R3-R4-R7-R6-R3的路由环路,数据环路则是R3-R6-R7-R4-R1-R3
从以上分析可知,此环路形成的原因为R3使用了本来就属于R3发送出去的30网段路由,从而形成了环路,为了解决此种路由回灌的问题,OSPF协议开发者在开发协议时设计了两种防环机制:DN位与Route tag。
DN位位于ospf lsa头部的option中,主要用于mpls_vpn场景中3类,5类,7类Lsa的防环,OSPF规定当一条路由从PE发往CE时,LSA中的DN位就会被置位,当一条LSA的DN位被置位了,PE设备将会忽略此条LSA。在以上场景中R4通过vpnv4从R3学习到30网段路由,并且发送给CE-R7,此时DN位就会被置位,当30网段的这条lsa发送回给R3时,R3发现此LSA的DN被置位,所以不会使用此条LSA,从而避免了环路的产生。在上述场景中因为在PE上面配置了vpn-instance-capability simple命令,所以此时PE设备将忽略DN检测,也就导致了上述环路的产生。
Route tag同样位于ospf lsa里,但只存在于5类与7类lsa中,即Route tag只能用于5类与7类的防环。当PE给CE发送LSA时,会在5类与7类lsa中添加tag值,此tag值会以PE设备上BGP的AS号来计算,当此条填充的tag值的lsa传入对端PE时,PE设备会检测此tag中的AS号与本地的AS号是否一致,如一致则会忽略此lsa条目。在上述场景中PE上面配置的vpn-instance-capabilitysimple命令也同样会使PE设备忽略Route tag的检测,从而导致了上述的环路。 当PE与CE之间运行了ospf时,会自动启用这两种防环机制,默认情况下PE设备是会检测DN位与Route-tag的,也就是说默认情况下vpn-instance-capability simple命令并未使能,即默认情况就不会有环路产生。
vpn-instance-capabilitysimple命令详细介绍: A、在PE上配置vpn-instance-capabilitysimple命令后,如果OSPF没有配置骨干区域0,则该MCE不会成为ABR。(关于此问题需要重新写文章才能详细介绍) B、配置vpn-instance-capability simple命令后,OSPF进程不可以引入IBGP路由。(所以需要在引入时加入permit-ibgp参数) C、配置vpn-instance-capability simple命令后,BGP引入的OSPF路由中不会携带OSPFDomain ID、OSPF Route-tag和OSPFRouter ID。(所以在CE上面看到的路由都是以ase的外部路由存在,关于OSPF的RT属性,也需要重新写文章才能详细介绍)
此外要在PE上面关闭DN位检测还可以用如下命令: dn-bit-checkdisable summary 关闭3类lsa中的dn位检查 dn-bit-checkdisable ase 关闭5类lsa中的dn位检查 dn-bit-checkdisable nssa 关闭7类lsa中的dn位检查
全国咨询电话:029-88825053泰克官方微信:taikejiaoyu
|