Hub-Spoke MPLS

Hub-Spoke MPLS VPN

预备知识点:AS-PATH冲突问题

我们在做HUB_SPoke实验的时候很有可能会出现AS-PATH冲突的问题,即分支与总部的的AS-PATH是一样的情况,按照BGP规则,如果是AS-PATH冲突代表有环路,不会接受对方传递的信息,如果不接受对方的传递的信息,那我们的实验肯定会失败的,怎么解决这个问题呢?

AS-PATH问题

image-20230610193158966

如上图所示,如果两端和中间全都是BGP,那AS-PATH在传递的时候AS-PATH会叠加,要命的是两个站点的AS号是一样的,这就会导致一个站点收到另一个站点的报文时认为发生了环路,那这样就会拒绝报文!有问题出现就有相应的办法,我们来看一下应该如何解决这个问题。

在PE上做手脚

第一个办法是在PE上下功夫,当PE2把报文发给CE2的时候,PE2会做一个判断,判断PE2与CE2之间的AS-PATH号,如果冲突了那PE2就会将其替换成ISP自己的AS-PATH号再发送给CE2.

在CE上做手脚

第二办法是在CE上下功夫,比如说在CE2上允许CE1接收与本地AS-PATH号重复的个数,就像上图当中站点2当中的CE2,如果配置了此功能,那当站点一的报文过来的时候AS-PATH里面就一个65001与CE2自己本身的AS重叠,我们就可以允许一次,这样CE2就能学到路由了;此时,那如果报文里面有两个65001,而我们在CE上配置的时候允许重复一个,那就不会接收了,我们修改成允许重复两次,就又可以了。

问题并没有完全解决

image-20230610193208742

上文当中我们因站点间的AS-PATH重合修改了AS-PATH或是允许它重合,这不,这就又出现问题了,如上图所示,PE1连接了两台CE,CE1和CE3之间如果想相互学习路由,假如说他采取的措施是在PE1上部署AS-PATH替换,这一替换可不得了,CE1的路由通告给PE1,而PE1由于把AS-PATH替换了,又把此条路由交给CE3,CE3还是接收的,就有可能导致环路的风险。

避免这个问题的方法是CE1向外发送路由的时候带一个标识,CE3也带同样的标识,这个标识PE无法拆除,如果收到带有与自己同样标识的报文,说明环了,那就丢包

配置了BGP邻居的SoO后
接收到该邻居的BGP路由时,会在路径属性中携带该SoO属性并通告给其他BGP邻居。
向该邻居通告BGP路由时,会检查路由中的SoO属性是否与配置的SoO值相同,若相同则不通告,避免引起环路。

总结

总结:

  • 如果两端都是EBGP连接且AS号一样,AS号叠加导致双方互相丢包
    • 修改AS或强行信任
      • PE上替换AS号
      • CE上允许AS重复
    • 修改AS号又可能会导致环路风险
      • soO(site of origin)来解决

Hub-Spoke

基础理论回顾

为什么要使用Hub-Spoke结构做分支间的互联呢

Hub-Spoke就是一种总部+分支的结构,特点是分支的所有的流量都走总部的CE;分支与分支之间直接互联不可以吗?为什么要这么搞呢?所有的分支之间如果直接互联的话那流量不好管控的,如果所有的流量都流经总部,我们统一在总部做管控就可以了,如下图所示:

image-20230610193218521

我们看一下路由控制层面是如何形成的

  1. A1-PE中的VRF通过路由协议学到A-CE宣告的网段放到自己的路由表中,B-PE中的VRF通过路由协议学到B-CE所连接的网段放到自己的路由表中。
  2. MP-BGP引入VRF的路由条目将之通过UPDATE发送到B端的PE,B端PE通过RT将此路由条目到B端的某个VRF,最终通过VRF再给到B端的某个CE,这样B-CE就能学习到A端的路由了;同样的,另一端也是如此,这样双方就能得到对方的路由条目了。

关于内层与上层的标签:假如说数据从A-A1站点出发

  1. A1的能通过FIB表查询将数据发给了PE上的VRF,VRF会在此附加一层内层标签
  2. VRF通过查FIB表发现隧道ID,意味着要交给根实例的MPLS进程,压入标签,于是再附加一层MPLS-LDP标签

相关问题

  • 通过上文我们知道,总部的PE当中需要两个VRF分别来承载入和出的流量,那CE上是不是也得有两个VRF与之对接呢?

    必须的。

  • 总部的PE与CE之间必须是两个物理链路吗?

    不是的,如果只有一根物理链路,也可以使用子接口的方式

  • 总部的PE上有两个VRF,当分支机构的流量到达时,到底是哪个VRF去接收呢?

    这是通过入方向的RT来控制的,负责接收的VRF的入方向RT就正好等于两个分支机构VRF当中的出方向RT。

  • 始发于总部的流量走的是哪个VRF?

    当总部想与该PE通信时,总部的数据会通过此路由交给入方向对应的VRF,而不是出方向的。

  • 始发于总部的流量从总部的PE出来之后,到底给哪个分支的PE呢?这一点怎么做的?

    当被转换成VPNV4路由之后就查找vpn-instance IN的路由,最终发现下一跳;

实验

image-20230610193240589

image-20230610193229787

ISP的基础配置

  1. IP地址的配置
  2. OSPF的配置
  3. MPLS-LDP的配置
  • R1、R2、R3、R4、R5路由器的IP地址配置

    # 先把设备上所有的IP地址配置好
    # AR1
    sys
    sysn R1
    int l0
            ip add 10.0.1.1 32
    int l1
            ip add 192.168.10.1 32
    int g0/0/0
            ip add 10.0.12.1 24
            quit
    # AR2
    sys
    sysn AR2
    int l0
            ip add 10.0.2.2 32
    int g0/0/0
            ip add 10.0.12.2 24
    int g0/0/1
            ip add 10.0.25.2 24
            quit
    
    # AR3
    sys
    sysn AR3
    int l0
            ip add 10.0.3.3 32
    int g0/0/0
            ip add 10.0.34.3 24
    int l1
            ip add 192.168.20.1 24
            quit
    
    # AR4
    sys
    sysn AR4
    int l0
            ip add 10.0.4.4 32
    int g0/0/0
            ip add 10.0.34.4 24
    int g0/0/1
            ip add 10.0.45.4 24
            quit
    
    # AR5
    sys
    sysn AR5
    int l0
            ip add 10.0.5.5 32
    int g0/0/0
            ip add 10.0.25.5 24
    int g0/0/1
            ip add 10.0.45.5 24
    
  • ISP上,即R2、R4、R5上IGP-OSPF的配置

    # ISP的OSPF的配置
    ## AR2
    ospf 1 router-id 10.0.2.2 
    a 0
    	network 10.0.2.2 0.0.0.0
    	network 10.0.25.2 0.0.0.0
    	quit
    
    ## AR4
    ospf 1 router-id 10.0.4.4
    a 0
    	network 10.0.4.4 0.0.0.0
    	network 10.0.45.4 0.0.0.0
    	quit
    
    ## AR5
    ospf 1 router-id 10.0.5.5
    a 0
    network 10.0.5.5 0.0.0.0
    network 10.0.25.5 0.0.0.0
    network 10.0.45.5 0.0.0.0
    
  • ISP上,即R2、R4、R5的MPLS-LDP配置

    # MPLS-LDP
    ## AR2
    mpls lsr-id 10.0.2.2
    mpls
    mpls ldp
    int g0/0/1
    mpls
    mpls ldp
    quit
    
    ## AR4
    mpls lsr-id 10.0.4.4
    mpls
    mpls ldp
    int g0/0/1
    mpls
    mpls ldp
    quit
    
    ## AR5
    mpls lsr-id 10.0.5.5
    mpls
    mpls ldp
    int g0/0/1
    mpls
    mpls ldp
    int g0/0/0
    mpls
    mpls ldp
    quit
    

MP-BGP的配置

两个分支的机构的PE都与总部的PE建立连接,分支之间不相互建立MP-BGP对等体。

  • AR2、AR4、AR5的MP-BGP配置

    # AR2
    bgp 100
    undo default ipv4-unicast
    router-id 10.0.2.2
    peer 10.0.5.5 as-number 100
    peer 10.0.5.5 connect-interface l0
    ipv4-family vpnv4
    	peer 10.0.5.5 enable
    
    # AR4
    bgp 100
    undo default ipv4-unicast
    router-id 10.0.4.4
    peer 10.0.5.5 as-number 100
    peer 10.0.5.5 connect-interface l0
    ipv4-family vpnv4
    	peer 10.0.5.5 enable
    
    # AR5
    bgp 100
    undo default ipv4-unicast
    router-id 10.0.5.5
    peer 10.0.2.2 as-number 100
    peer 10.0.2.2 connect-interface l0
    peer 10.0.4.4 as-number 100
    peer 10.0.4.4 connect-interface l0
    ipv4-family vpnv4
    	peer 10.0.2.2 enable
    	peer 10.0.4.4 enable
    
  • 验证

    [AR5]dis bgp vpnv4 all peer
    
     BGP local router ID : 10.0.5.5
     Local AS number : 100
     Total number of peers : 2		  Peers in established state : 2
    
      Peer            V          AS  MsgRcvd  MsgSent  OutQ  Up/Down       State Pre
    fRcv
    
      10.0.2.2        4         100        2        2     0 00:00:04 Established    
       0
      10.0.4.4        4         100        2        2     0 00:00:02 Established    
       0
    

Spoke-PE配置(关键)

我们为了测试环路问题,两个分支的CE与PE之间全都使用EBGP进行连接;

  • 分支AR2和AR4实例的配置,注意观察RT的设置

    # AR2
    ip vpn-instance to-r1
    	route-dist 111:1
    	vpn-target 100:1 export
    	vpn-target 100:2 import
    int g0/0/0
    	ip binding vpn-instance to-r1
    	ip add 10.0.12.2 24
    bgp 100
    ipv4-family vpn-instance to-r1
    	peer 10.0.12.1 as-number 65410
    	peer 10.0.12.1 connect-interface g0/0/0
    
    # AR4
    ip vpn-instance to-r3
    	route-dist 222:1
    	vpn-target 100:1 export
    	vpn-target 100:2 import
    int g0/0/0
    	ip binding vpn-instance to-r3
    	ip add 10.0.34.4 24
    bgp 100
    ipv4-family vpn-instance to-r3
    	peer 10.0.34.3 as-number 65410
    	peer 10.0.34.3 connect-interface g0/0/0
    

Spoke-CE配置

分支的CE直接就在根实例上配置即可,我们让两个分支t和总部里面的AS号一样,这样可以随便看一下AS-PATH冲突的处理方式;

  • R1和R3的配置,与各自的PE完成基础的对接

    # R1 AS-65410
    bgp 65410
    	router-id 10.0.1.1
    	peer 10.0.12.2 as-number 100
    	peer 10.0.12.2 connect-interface g0/0/0
    	network 192.168.10.1 32
    
    # R3 AS-65410
    bgp 65410
    	router-id 10.0.3.3
    	peer 10.0.34.4 as-number 100
    	peer 10.0.34.4 connect-interface g0/0/0
    	network 192.168.20.1 24
    

在这个地方很容易产生一个疑问,那就是我们在spoke的虚拟机也就是VRF当中做了RD和RT,但在CE上却没有写RT和RD,这样难道不影响邻居的建立嘛?

这个问题仔细思考一下,就会发现特别简单,PE上配置的RD和RT并不是为了与CE对接使用的,而是当根实例当中的BGP主进程引入VRF当中的路由时携带的,这个RD和RT是分支PE的BGP主进程用来向总部的PE传递路由时使用的。

HUB-PE配置(关键)

  • 在R5上配置两个VRF,分别对应着IN和OUT

    # AR5-PE
    ip vpn-instance IN
    	route-dist 55:55
    	vpn-target 100:1 import
    ip vpn-instance OUT
    	route-dist 555:555
    	vpn-target 100:2 export
    
    int g0/0/2
    	ip binding vpn-instance IN
    	ip add 10.0.56.5 24
    int g4/0/0
    	ip binding vpn-instance OUT
    	ip add 10.0.65.5 24
    
  • 在R5上验证一下是否能正常收到分支发送过来的路由

    [AR5]dis bgp vpnv4 vpn-instance IN routing-table 
     *>i  192.168.10.1/32    10.0.2.2        0          100        0      65410i
     *>i  192.168.20.0       10.0.4.4        0          100        0      65410i
    
  • 下面的操作是通过EBGP将HUB的PE与CE连接起来

    # AR5
    bgp 100
    ipv4-family vpn-instance IN
    	peer 10.0.56.6 as-number 65410
    	peer 10.0.56.6 connect-interface g0/0/2
    ipv4-family vpn-instance OUT
    	peer 10.0.65.6 as-number 65410
    	peer 10.0.65.6 connect-interface g4/0/0
    	quit
    

HUB-CE配置(关键)

  • R6-CE与PE的两个VRF对接,我们这一端可以不用是VRF,直接在根实例上用多个peer就可以

    sys
    sysn HUB-CE-R6
    int l0
    	ip add 10.0.6.6 32
    int g0/0/0
    	ip add 10.0.56.6 24
    int g0/0/1
    	ip add 10.0.65.6 24
    int l1
    	ip add 192.168.100.1 24
    bgp 65410
    	peer 10.0.56.5 as-number 100
    	peer 10.0.56.5 connect-interface g0/0/0
    	peer 10.0.65.5 as-number 100
    	peer 10.0.65.5 connect-interface g0/0/1
    	network 192.168.100.1 24
    
  • 验证

    搞完之后我们会发现在HUB-CE上查看BGP邻居,发现CE与PE已经正常建立了邻居状态,如下所示:

    <HUB-CE-R6>dis bgp peer
      10.0.56.5       4         100        6        5     0 00:02:28 Established    
       0
      10.0.65.5       4         100        2        4     0 00:00:25 Established
    
  • 总部问题出现:UB的CE没有收到两个分支的路由条目

    # 但问题也随之出现了,我们会发现HUB的CE没有收到两个分支的路由条目,如下所示:
    <HUB-CE-R6>dis bgp routing-table 
    # 只有自己本地的
     *>   192.168.100.0      0.0.0.0         0                     0      i
    
  • 总部问题解决

    其实原因就是因为两上分支的AS号与总部的AS号是一样的,我们在CE上允许AS重复

    [HUB-CE-R6-bgp]peer 10.0.56.5 al	
    [HUB-CE-R6-bgp]peer 10.0.56.5 allow-as-loop 1
    # 能收到了,成了!成了!
    [HUB-CE-R6-bgp]**dis bgp routing-table**
     *>   192.168.10.1/32    10.0.56.5                             0      **100 65410i**
     *>   192.168.20.0       10.0.56.5                             0      **100 65410i**
     *>   192.168.100.0      0.0.0.0         0                     0      i
    
  • 分支问题出现与解决:分支无法收到总部的路由

    总部确实是能收到分支的路由条目,但分支无法收到总部的路由,原因还是一样因有AS-PATH的原因。
    我们先查看一下总部的PE的VPNv4里面有没有总部PE通过vpn-instance OUT传的,如下如示:

    # 也没有,也是因为环路,所以我们也搞一下
    [AR5]dis bgp vpnv4 vpn-instance OUT routing-table 
     *>   192.168.100.0      10.0.65.6       0                     0      65410i
    [AR5]bgp 100
    [AR5-bgp]ipv4-family vpn-instance OUT
    [AR5-bgp-OUT]peer 10.0.65.6 allow	
    # 这样就OK了!
    [AR5-bgp-OUT]peer 10.0.65.6 allow-as-loop 
     *>   192.168.10.1/32    10.0.65.6                             0      65410 100 
    65410i
     *>   192.168.20.0       10.0.65.6                             0      65410 100 
    65410i
     *>   192.168.100.0      10.0.65.6       0                     0      65410i
    

    那好,那接下来我们去看一下两上分支机构的PE上有没有相互的路由和总部的路由呢?

    # 有的
    <AR2>dis bgp vpnv4 vpn-instance to-r1 routing-table 
     Total Number of Routes: 4
          Network            NextHop        MED        LocPrf    PrefVal Path/Ogn
    
     *>   192.168.10.1/32    10.0.12.1       0                     0      65410i
     * i                     10.0.5.5                   100        0      65410 100 
    65410i
     *>i  192.168.20.0       10.0.5.5                   100        0      65410 100 
    65410i
     *>i  192.168.100.0      10.0.5.5        0          100        0      65410i
    <AR2>
    

    最后,那接下来我们去看一下两上分支机构的CE上有没有相互的路由和总部的路由呢?

    # 发现没有
    <AR3>dis ip routing-table protocol bgp 
    <AR3>sys
    Enter system view, return user view with Ctrl+Z.
    [AR3]bgp 65410
    [AR3-bgp]peer 10.0.34.4 al	
    [AR3-bgp]peer 10.0.34.4 allow-as-loop 1
    [AR3-bgp]dis ip routing-table protocol bgp
     192.168.100.0/24  EBGP    255  0          RD   10.0.34.4       GigabitEthernet
    0/0/0
    
    # 另一个分支的有两个65410,所以得允许重复2个,如下所示:
    [AR3-bgp]peer 10.0.34.4 allow-as-loop 2
    [AR3-bgp]dis ip routing-table protocol bgp
    192.168.10.1/32  EBGP    255  0          RD   10.0.34.4       GigabitEthernet
    0/0/0
    192.168.100.0/24  EBGP    255  0          RD   10.0.34.4       GigabitEthernet
    0/0/0
    es : 0
    
  • 还没完,我们还试下是否通信正常:

    [AR3-bgp]ping -a 192.168.20.1 192.168.100.1
      PING 192.168.100.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.100.1: bytes=56 Sequence=1 ttl=253 time=20 ms
        Reply from 192.168.100.1: bytes=56 Sequence=2 ttl=253 time=40 ms
     
    # 原因是对方还没做允许AS-APTH 重叠
    [AR3-bgp]ping -a 192.168.20.1 192.168.10.1
      PING 192.168.10.1: 56  data bytes, press CTRL_C to break
        Request time out
        Request time out
    
    
    # 做完之后就OK了!
    [R1]dis ip routing-table protocol bgp
    [R1]bgp 65410
    [R1-bgp]peer 10.0.12.2 al	
    [R1-bgp]peer 10.0.12.2 allow-as-loop 2
    [R1-bgp]dis ip routing-table protocol bgp
       192.168.20.0/24  EBGP    255  0          RD   10.0.12.2       GigabitEthernet
    0/0/0
      192.168.100.0/24  EBGP    255  0          RD   10.0.12.2       GigabitEthernet
    0/0/0
    
  • 测试

    [AR3-bgp]ping -a 192.168.20.1 192.168.10.1
      PING 192.168.10.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.10.1: bytes=56 Sequence=1 ttl=250 time=70 ms
        Reply from 192.168.10.1: bytes=56 Sequence=2 ttl=250 time=60 ms
    
    [AR3-bgp]ping -a 192.168.20.1 192.168.100.1
      PING 192.168.100.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.100.1: bytes=56 Sequence=1 ttl=253 time=50 ms
        Reply from 192.168.100.1: bytes=56 Sequence=2 ttl=253 time=30 ms
    
    [R1-bgp]ping -a 192.168.10.1 192.168.20.1
      PING 192.168.20.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.20.1: bytes=56 Sequence=1 ttl=250 time=50 ms
        Reply from 192.168.20.1: bytes=56 Sequence=2 ttl=250 time=50 ms
    
    [R1-bgp]ping -a 192.168.10.1 192.168.100.1
      PING 192.168.100.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.100.1: bytes=56 Sequence=1 ttl=253 time=40 ms
        Reply from 192.168.100.1: bytes=56 Sequence=2 ttl=253 time=40 ms
    
    <HUB-CE-R6>ping -a 192.168.100.1 192.168.10.1
      PING 192.168.10.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.10.1: bytes=56 Sequence=1 ttl=253 time=50 ms
        Reply from 192.168.10.1: bytes=56 Sequence=2 ttl=253 time=40 ms
    
    <HUB-CE-R6>ping -a 192.168.100.1 192.168.20.1
      PING 192.168.20.1: 56  data bytes, press CTRL_C to break
        Reply from 192.168.20.1: bytes=56 Sequence=1 ttl=253 time=40 ms
        Reply from 192.168.20.1: bytes=56 Sequence=2 ttl=253 time=30 ms
    
posted @ 2021-06-27 21:43  张贺贺呀  阅读(167)  评论(0编辑  收藏  举报