• Juniper路由器中BGP和MPLS网络中的下一跳方式


    一些学习和翻译,搬运自国外博客,翻译水平有限,99%依靠谷歌翻译,1%靠自己理解。仅用于记录和学习,欢迎讨论和指出错误
    原文链接:https://www.networkfuntimes.com/junos-routers-what-does-the-inet-3-table-actually-do/
    原文链接二:https://www.networkfuntimes.com/moving-lsps-between-inet-3-and-inet-0-on-a-juniper-router/


    图例

    几个基础概念

    一、inet.0

    1、这是我们常规理解的,“正常”的路由表,静态和直连路由都包含在里面,当我们通过IGP学习路由时,通过这些路由器的下一跳来学习路由

    2、BGP学到的路由也会进入到inet.0表里,但是BGP的下一跳工作方式不太一样

    • 比如说IBGP回环口建立邻居,虽然两台设备之间有很多其他的路由器,但是IBGP路由器还是把自己作为他们通告的任意路由的下一跳
    • 总的来说,接受路由的路由器需要进行第二次查找路由表,来计算出实际下一跳是谁




        以上是一般情况下的IGP和BGP一起运行,查找inet.0表的情况,但是当mpls介入之后,就不太一样了


    二、标签交换路径(LSP)

        LSP是网络中两个路由器之间预先商定的路径,数据包将通过该路径到达目的地。路由器进行通信以指示他们希望为该路径的流量,接收什么标签。并且链接的路由器在发送数据包之前,将该标签添加到数据包中。接收数据的路由器剥离标签,并可能在它这条路径上进一步转发数据包时,打上一个新的标签。

        比如说,通过RSVP去创建LSP,指向的是回环地址,无论我们选择使用LDP还是RSVP,有关LSP的信息都存储在以下两个位置之一,mpls.0或者inet.3。在Juniper设备里,跟常见厂商的设备不同,他有多个不同的路由表,每个路由表存储的信息都不相同,在寻路时根据不同情况会查找不同的路由表。



    1、如果说路由器是LSP的入口,或者说是隧道的起点,那么就要到inet.3表中找LSP的另一端(隧道的出口),比如说,在路由器的所有接口上都打开了LDP,这就意味着有了一个LSP到我网络中每个路由器的回环口。然后手动创建了一个RSVP LSP指向Router3(3.3.3.3)




    2、从路由表里可以看出,RSVP的路由优先级是7,LDP的路由优先级是9,默认情况下选择RSVP的路径。但是去往3.3.3.3的路径,是通过LDP学到的标签(push 299952)

    3、路由表中,我们可以看到在数据包离开接口时,会给数据包打上标签。

    • 由于空间位置不够,RSVP路由没有显示标签,但是如果添加了 extensive关键字,就可以看到这个标签,但是2.2.2.2和4.4.4.4的标签没有看到
    • 由于Router2和Router4都是直连Router1的,默认情况下MPLS不会为目的地是直连的路由器的数据包添加标签,这个行为被成为 Penultimate-Hop Popping(PHP)
      • 如果你是LSP中的倒数第二跳路由,那么在发送数据包之前,通过“弹出”标签来帮助充当LSP出口的路由器
      • 如果有标签,出口路由器必须做两倍的工作,业务他必须查找标签,如果查看数据包的目的地是自己,就弹出标签,然后对IP地址进行第二次查找

    三、inet.3


        在Junos中,inet.3表用来解析BGP下一跳。每当路由器通过BGP学到路由时,Junos需要决定如何到达协议的下一跳。为了得到答案,**会同时查看inet.0和inet.3**,它同时考虑两个表,但默认情况下RSVP和LDP的路由优先级比OSPF或者ISIS低很多,所以始终会选择标签路径

        注意,这个寻路原则仅适用于查找通过BGP学习到的路由条目,如果是访问3.3.3.3(对端的回环口地址),不会采用标签交换路径,它只会作为常规数据包从路由器发出。但是,当同时满足以下所有情况的时候,流量还是会选择采用标签交换路径:

    • 常规inet.0表中有一个路由前缀
    • 这个路由前缀是通过BGP学习到的
    • 协议的下一跳为3.3.3.3
    • 如果BGP的下一跳(3.3.3.3)在inet.3表中存在

        简单来说,因为路由器会同时查看inet.3和inet.0,其实就是如果inet.3里有下一跳的路由,就走标签转发,如果没有,就走普通的路由转发。

    1. 先查看一个路由,在全局表里看到路由是通过BGP从3.3.3.3学到的,3.3.3.3通过RSVP写了一条LSP,然后通过LDP被上一级分发了标签299904。说明,要去往这个目的地的数据包里,要push进去一个标签,然后发给10.10.12.2,走的是TO_ROUTER_3这条路径。


    2. 然后到Router2上面查看标签表,看到下一跳要发给10.10.23.3,而且还能看到配置的LSP的名称。另外,Router2在发送数据包时,业务下一跳是R3,也就是目的地。所以在R2上会把标签弹出,因为倒数第二跳弹出,数据包发送时不带标签。

    3. 另外,(S=0)指的是MPLS头中是否设备了“bottom-of-stack”位,如果S=1,则标签为栈底。如果S=0,则这个“下面”还有一个或者多个标签。目前测试下来,在倒数第二跳的时候查看标签表,会出现S=0的这个。中间的转发路由器都不显示。






    inet.3和inet.0的区别和联系

    一、为什么只有通过BGP学习的路由才查询inet.3表?


    • 首先,OSPF和ISIS都是通过直连来获取他们的下一跳,所以不需要使用LSP
    • 因为默认情况下路由器不给物理接口通告标签,指给回环接口通告标签。BGP一般通告回环接口作为下一跳,所以一般情况下目的地址是通过BGP获取的,我们往往也只想沿着标签交换路径去发现路由
    • 另外,在大型ISP中,实际运行具有无BGP核心的网络是很常见的。换句话说,并非每个路由器都会实际运行BGP。MPLS允许流量通过核心网络,而核心网络实际上完全不知道如何到达数据包中的IP地址。但是OSPF和ISIS不会出现指给情况,这两种协议看到是在网络中全网运行的。
    • 最后一个例子是MPLS VPN,本身就是由BGP发布的。这些标签用于区分两个不同的客户,甚至可能使用相同私网IP的客户。此外,标签的使用意味着我们的核心路由器不需要了解我们的VRF的任何信息。我们可以在网络边缘运行三层VPN,二层VPN,VPLS等,而我们的核心路由器可以完全不知道。
    • 所以,大多数情况下,inet.3表只被BGP需要,但是指给也是可以调整的,比如 导表

    二、在inet.3和inet.0之间,移动LSP


        前面说了,基本上因为只有BGP的情况才查询inet.3表,为了让其他情况下也能够查询标签交换路径,所以可以把inet.3的数据复制到inet.0中。**其实也就方式五靠谱,现网也是用的方式五,前面其他方法都是过渡学习用的。**

    方式一:在inet.3中设置路由前缀,并将其与RSVP LSP关联

        还是使用上文的拓扑,所有设备都开启了LDP,此外还有一个从R1直接到R3的RSVP LSP,R3到R1的LSP。R3与R6之间运行了EBGP,并通过BGP学到了一条路由前缀69.69.69.0/24。





        流量走向:R3通过IP地址为10.10.36.0/24的直连到R6,意味着当R3接收到69.69.69.0/24的通告后,通过IBGP把他扩散给AS12345里的其他路由器时,R3不会更改下一跳,下一跳仍然时10.10.36.6(R6的互联地址)。如果左边这些路由器都有这个地址的路由,那就没问题。但是如果一些ISP没有学过这条路由,流量就过不去。为此,可以使用next-hop-self,在R3将路由通告给其他路由器之前,他会把下一跳变更为自己,也就是3.3.3.3。这就可以使用RSVP LSP,R1看到3.3.3.3的下一跳,看到inet.3中有这个BGP下一跳的条目,于是将数据包封入标签,进行标签交换。


        但是,如果以上流程,我们不执行next-hop-self,但是通过OSPF或者ISIS把互联地址10.10.36.6重分布进IBGP里,让左边这些路由器学到这个路由条目,流量也可以到达。但是因为R3与R6之间没有运行LDP或者RSVP,这就意味着inet.3表中没有10.10.36.6的条目(inet.0里有)。这个情况下,流量只会进行正常的IP转发。


        所以,对于通过LSP的流量,默认情况下,BGP协议的下一跳必须位于inet.3中,并且R1的IBGP邻居的EBGP邻居的接口IP地址10.10.36.6肯定不会在inet.3中。
        但是,这个我们也可以手动配置,让他出现在inet.3中,只需要通过install进行关联即可。现在10.10.36.6/32会出现在inet.3表中,所有我们通过BGP学习的任何路由前缀,下一跳为10.10.36.6的,都会通过LSP。





        但是,这个方式基本上等同于一个静态路由,扩展性并不好。只是把10.10.36.66强制指向了3.3.3.3而已。

    方式二:将RSVP LSP宣告到IGP中

        如果我们愿意,可以让OSPF或者ISIS相信我们的LSP是一条实际的链路,直连两端的两台路由器。你所要作的就是在两个方向上创建LSP,然后将LSP添加到IGP中。


    set protocols isis label-switched-path TO_ROUTER_3 level 2 metric 1
    或者
    set protocols ospf area 0.0.0.0 label-switched-path TO_ROUTER_3 metric 1


    现在查看ISIS的邻接关系里,能看到位于LSP另一端的路由器了



        查看ISIS在SPF计算中使用的LSP,红色的是引入ISIS中的LSP,蓝色的是原来计算的路由器。主要看 VIA,下一跳。正常情况下,下一跳就是邻接的路由器。我们引入的LSP被是为一条可用链路,我们设置的metric为1,所以总的metric为11(10+1)。正常从R1到R3的总metric为20,所以会选择使用LSP的路径。



        但是,这个方式的缺点在于,低效路径可能会优于最短路径,具体取决于LSP的形成方式

    方式三:将所有内容迁移至inet.0

        R1有到R3的LSP,这意味着BGP下一跳为3.3.3.3的流量将沿LSP下行。但是,如果你还希望所有发往3.3.3.3这个地址的网络流量也通过LSP怎么办?
        这个命令,是移动不是复制。吧inet.3的内容移动到inet.0中。LSP仍将用于解析BGP下一跳。要记住,BGP可以同时使用inet.3和inet.0这两个表,它只是更喜欢用inet.3。但是现在,所有其他流量也都可以使用LSP了(包括ospf,isis等)


    set protocols mpls traffic-engineering bgp-igp


        所以,现在查看inet.3的时候,会发现这个表是空的



        这就相当于把两个表给合并了,所有内容都在inet.0中,因为RSVP和LDP的路由有优先级比ISIS高,所以我们的路由器选择这些路由,而非IGP。



        虽然只通过一个命令就可以让每个非VRF前缀都访问使用LSP,但是,如果把所有内容都移出inet.3,会破坏运行MPLS VPN的能力。

    方式四:将所有内容从inet.3复制到inet.0


        把inet.3的内容复制一份到inet.0中,这意味着你的普通前缀可以使用LSP,并且你可以继续使用MPLS VPN。

    set protocols mpls traffic-engineering bgp-igp-both-ribs

        如果我们在R1的路由表中查找R2的回环口,我们会在inet.0和inet.3中看到一个LDP条目


        当使用这个命令后并将LSP设置为inet.0表中的首选路由时,这可能会严重破坏正常的IGP。因为优先级的问题,此时的IGP路由不再是active路由,这可能会阻止条目被正确分配。相当于,IGP的选路基本上是废了

    方式五:仅将LSP用于转发,将你的IGP仅用于宣告路由(现网是使用这个方案,在PE上做的,P节点上没做)


        将LSP复制到inet.0中进行转发,这个命令允许路由器选择LSP来转发流量,但在涉及路由器将前缀通告到IGP的方式时忽略他们。

    set protocols mpls traffic-engineering mpls-forwarding

        主要注意下图里出现的新符号,如 @ 和 # 符号。这向我们表明,流量将沿着 LSP 转发,但 IS-IS 仍然使用自己的“最佳”路径来实现一致的 IS-IS 拓扑。

            @ : 仅路由使用
            # : 仅转发使用
            + : 活动路由
            - : 最后一个活动
            * : 最优路由




        比如现网环境下,查看另一个设备的回环口地址,在inet.0里流量转发时使用RSVP的LSP路径,路由学习宣告时使用ISIS的直连接口。inet.3里,就只有通过RSVP写的LSP路径


    但是,这个命令是把inet3.0里的所有数据都复制到inet.0中,没法做太多的认为控制。

    方式六:解决路由反射器(RR)的问题


        假设你有一个不在流量转发路径中的路由反射器,并且你正在向该路由反射器通告MPLS VPN前缀。但是,假设你没有在此路由器上允许MPLS,那么他的inet.3表将是空的。如果我们的路由反射器无法解析inet.3表中的MPLS VPN前缀的下一跳,它也不会反射我们的前缀(毕竟,当路由器实际上不转发任何流量时,它为什么还要让路由反射器分配标签呢?)

        一个很容易被忘记的前提,路由反射器不会自动反射他们学到的所有东西。如果路由反射器收到一个它认为无效的前缀,例如它无法解析的下一跳,他就不会反射该前缀。

        对此,有很多种解决方案,其中许多涉及到告诉路由器使用哪个路由表来解析这些前缀。例如,使用rib-group或者resolution rib,就可以操作路由器使用不同的表来解析前缀,或者告诉它从inet复制少量的下一跳IP.0到inet.3。

        现在梳理一下,一般来说当我们在inet.3中查找下一跳时,该下一跳会带有某种标签。因此,如果我们将下一跳从inet.0复制到inet.3时,时没有任何标签的,如果RR实际上在转发流量,那么这个方案就行不通。

        但是,我们的RR并不会转发流量,实际上,这是一种欺骗路由器的方式。我们让它认为,它可以“解析”下一跳,而实际上它并不能。但没关系,下一跳在inet.3中,这足以让我们的RR将路由反射到实际上可以转发此流量的路由器上。

  • 相关阅读:
    Button 样式设置
    WPF 运行报错:在使用 ItemsSource 之前,项集合必须为空。
    c# List 按条件查找、删除
    c# WPF DataGrid设置一列自增一
    C# WPF DataGrid去掉最左侧自动生成一列
    int 转换成定长的 byte数组
    字节数组 byte[] 与 int型数字的相互转换
    [ c# ] int 类型转换为固定长度的字符串
    ListView 绑定 字典
    不能引用的文件,却需要在程序底层使用的文件 的存放位置
  • 原文地址:https://www.cnblogs.com/ycll/p/15880422.html
Copyright © 2020-2023  润新知