Hub-Spoke MPLS
Hub-Spoke MPLS VPN
预备知识点:AS-PATH冲突问题
我们在做HUB_SPoke实验的时候很有可能会出现AS-PATH冲突的问题,即分支与总部的的AS-PATH是一样的情况,按照BGP规则,如果是AS-PATH冲突代表有环路,不会接受对方传递的信息,如果不接受对方的传递的信息,那我们的实验肯定会失败的,怎么解决这个问题呢?
AS-PATH问题
如上图所示,如果两端和中间全都是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上配置的时候允许重复一个,那就不会接收了,我们修改成允许重复两次,就又可以了。
问题并没有完全解决
上文当中我们因站点间的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)来解决
- 修改AS或强行信任
Hub-Spoke
基础理论回顾
为什么要使用Hub-Spoke结构做分支间的互联呢?
Hub-Spoke就是一种总部+分支的结构,特点是分支的所有的流量都走总部的CE;分支与分支之间直接互联不可以吗?为什么要这么搞呢?所有的分支之间如果直接互联的话那流量不好管控的,如果所有的流量都流经总部,我们统一在总部做管控就可以了,如下图所示:
我们看一下路由控制层面是如何形成的:
- A1-PE中的VRF通过路由协议学到A-CE宣告的网段放到自己的路由表中,B-PE中的VRF通过路由协议学到B-CE所连接的网段放到自己的路由表中。
- MP-BGP引入VRF的路由条目将之通过UPDATE发送到B端的PE,B端PE通过RT将此路由条目到B端的某个VRF,最终通过VRF再给到B端的某个CE,这样B-CE就能学习到A端的路由了;同样的,另一端也是如此,这样双方就能得到对方的路由条目了。
关于内层与上层的标签:假如说数据从A-A1站点出发
- A1的能通过FIB表查询将数据发给了PE上的VRF,VRF会在此附加一层内层标签
- 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的路由,最终发现下一跳;
实验
ISP的基础配置
- IP地址的配置
- OSPF的配置
- 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