EVPN 与 VXLAN(二)_ _动态分布式网关VXLAN
前言
分布式网关无论在配置上,还是在实现原理上都比集中式网关要复杂很多,仅仅依靠华为PPT上的内容很难完全理解VXLAN分布式网关的配置和通信原理,大家如果想好好的学习一下分布式的VXLAN,还是建议买几本系统的书籍系统的学习一下,我们这里面仅仅是把实验效果做出来了,至于分布式网关当中的细节,本文并没有过多涉及到。
集中式网关回顾
二层实例
# 集中式网关时,CE1和CE2都生成了二层的EVPN实例,如下所示:
[CE1]dis evpn vpn-instance
Total EVPN-Instances configured : 2
EVPN-Instance Name RD Address-family
10 10:10 evpn
20 20:20 evpn
# 网关设备也同样存在二层的EVPN实例
[CE3]dis evpn vpn-instance
Total EVPN-Instances configured : 2
EVPN-Instance Name RD Address-family
10 10:10 evpn
20 20:20 evpn
[CE2]dis evpn vpn-instance
Total EVPN-Instances configured : 2
EVPN-Instance Name RD Address-family
10 10:10 evpn
20 20:20 evpn
注意呀,我们并没有刻意去配置EVPN的实例,我们仅仅是启用了EVPN,这个EVPN实例是CE设备自动创建的,会将通过type-2路由信息获取的MAC地址放到这个二层的VPN实例当中。
三层实例
集中式网关上有三层路由吗?存放在哪里?
集中式网关上当然有三层路由,否则怎么转发呢?这与VLAN-IF一样,路由是直接存放在根实例当中,即存放在全局当中。当你的集中式网关上查看三层实例的时候会发现EVPN并没有产生三层实例,就是因为路由表没有存放在三层实例当中,是直接存放在了全局当中,如下所示:
# 在集中式网关上查看三层实例是空的,里面啥都没有
[CE3]dis ip vpn-instance
# 三层路由直接存放在全局了,注意看后面的VBD-IF接口
[CE3]dis ip routing-table
192.168.10.0/24 Direct 0 0 D 192.168.10.1 Vbdif10
192.168.10.1/32 Direct 0 0 D 127.0.0.1 Vbdif10
192.168.10.255/32 Direct 0 0 D 127.0.0.1 Vbdif10
192.168.20.0/24 Direct 0 0 D 192.168.20.1 Vbdif20
192.168.20.1/32 Direct 0 0 D 127.0.0.1 Vbdif20
192.168.20.255/32 Direct 0 0 D 127.0.0.1 Vbdif20
我们为什么要讨论关于二层实例和三层实例的问题呢?主要是为接下来分布式网关的VXLAN做准备,分布式网关当然也需要三层的路由信息,但与集中式网关不同之处在于,分布式网关的路由信息不是存放在全局当中的,而是存放在VPN实例当中的,几层VPN实例当中?当然是三层了,路由信息是三层信息,当然要存放在三层的VPN实例当中。所以当我们在配置分布式网关的时候,就需要在分布式网关所在设备上创建三层的VPN实例,并将网关配置到VPN实例当中,只有将网关配置到实例当中,路由信息才会在实例当中生成呀!
这个地方有个问题,为什么集中式网关当中就不需要三层VPN实例,而在分布式网关当中就需要三层VPN实例呢?这是个好问题!其实也很好回答,那在MPLS-VPN当中为什么是三层实例,而不是二层实例呢?是因为MPLS-VPN当中要传递的信息是三层的路由信息,而不是二层信息,同样的道理,在集中式网关当中,集中式网关上的EVPN只需要通过type-2的路由信息传递MAC信息给CE1和CE2,而在三层分布式网关当中,分布式网关会涉及到传递三层信息(IRB路由信息),所以我们需要创建三层VPN实例。
二三层NVI与二三层实例的关系:
集中式网关仅仅用到了二层实例,那分布式网关当中不仅会用到二层实例,而且还会用到三层实例,并且每一种实例当中还会对应一个VNI,二层实例当中配置的VNI是二层NVI,在同网段通信的时候会使用的;三层实例当中使用的VNI是三层VNI,会在跨网段通信的时候使用的。
基础配置_Underlya
理论
我们还是以这张图为例来说明,分布式网关位于CE1和CE2上,CE3上并不存在网关,如果在CE3上存在网关,那岂不是成了集中式网关,所以,我们首先要明确一点,CE3上并不需要设置网关。
CE3并不需要设置网关,但CE3的位置还是非常重要的,为什么呢?因为CE3要做为路由反射器,虽然CE1在配置BGP的时候虽然与CE3建立BGP的邻居关系,type3的路由经过CE3的转发,但CE3不再使用type3的信息建立vxlan隧道,最终的VXLAN隧道还是在CE1和CE2之间形成,CE3仅仅是路由反射的作用,所以CE3要配置路由反射器
在分布路的VXLAN当中,华为使用的是IRB路由,RIB路由即同时拥有二层VNI、三层VNI以及主机MAC地址,RIB路由与单纯的MAC路由同时都是有type-2来承载,但BGP想要承载IRB路由得需要特殊声明,就在三台CE配置BGP的时候需要声明可以承载IRB路由的能力。
由于我们仅希望CE1和CE2建立tunnel隧道,不希望CE3参与进来,也就是说不需要CE3产生type-3的路由信息,再进一步也就是说不需要配置BD、VNI、RT,也可以说可以根本不用配置示例。但问题又来了,如果CE3上没有示例配置RT,那CE3就不会信任CE1或CE2向其传递的路由信息,不信任的话,那又如何反射呢?所以我们需要在CE3配置BGP的时候关闭默认校验RT的功能。
CE3的配置
# CE3基础配置
sys i
int l0
ip add 10.0.3.3 32
vlan batch 13 23
int vlan 13
ip add 10.0.13.3 24
int vlan 23
ip add 10.0.23.3 24
ospf 1 router-id 10.0.3.3
a 0
network 10.0.3.3 0.0.0.0
network 10.0.13.3 0.0.0.0
network 10.0.23.3 0.0.0.0
int g1/0/0
undo shutdown
port link-ty trunk
port trunk all vlan 13
int g1/0/1
undo shutdown
port link-ty trunk
port trunk all vlan 23
# 第二步:EVPN的配置,关键配置
evpn-overlay enable
bgp 100
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack0
#
ipv4-family unicast
peer 10.0.1.1 enable
peer 10.0.2.2 enable
#
l2vpn-family evpn
# 关闭RT校验功能
undo policy vpn-target
peer 10.0.1.1 enable
y
# 反射器的配置
peer 10.0.1.1 reflect-client
# 声明通告IRB路由的功能,直接刷的话,这一条有可能刷不上
peer 10.0.1.1 adver irb
peer 10.0.2.2 enable
y
# 反射器的配置
peer 10.0.2.2 reflect-client
peer 10.0.2.2 adver irb
quit
# 第三步:VXLAN的配置
# CE不需要任何VXLAN的配置,NVE接口也不用
CE1的配置
# 第一步:CE1的基础配置
sys i
sysn CE1
# 创建互联VLAN
vlan 13
int l0
ip add 10.0.1.1 32
int vlan 13
ip add 10.0.13.1 24
ospf 1 router-id 10.0.1.1
a 0
network 10.0.1.1 0.0.0.0
network 10.0.13.1 0.0.0.0
# 物理接口要放行
int g1/0/0
undo shutdown
port link-ty trunk
port trunk a v 13
quit
# 第二步:EVPN的配置
evpn-overlay enable
bgp 100
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack0
#
ipv4-family unicast
peer 10.0.3.3 enable
#
l2vpn-family evpn
policy vpn-target
peer 10.0.3.3 advertise irb
peer 10.0.3.3 enable
y
quit
# 检查一下,没问题
[CE1-bgp]dis bgp peer
BGP local router ID : 10.0.1.1
Local AS number : 100
Total number of peers : 1
Peers in established state : 1
Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pr
efRcv
10.0.3.3 4 100 5 4 0 00:00:18 Established
0
[CE1-bgp]dis bgp evpn peer
BGP local router ID : 10.0.1.1
Local AS number : 100
Total number of peers : 1
Peers in established state : 1
Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pr
efRcv
10.0.3.3 4 100 5 4 0 00:00:21 Established
0
CE2的配置
# 第一步:基础配置
sys i
sysn CE2
int l0
ip add 10.0.2.2 32
vlan 23
int vlan 23
ip add 10.0.23.2 24
ospf 1 router-id 10.0.2.2
a 0
network 10.0.2.2 0.0.0.0
network 10.0.23.2 0.0.0.0
int g1/0/0
undo shutdown
port link-ty trunk
port trunk all vlan 23
qu
# 第二步:EVPN的配置
evpn-overlay enable
bgp 100
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack0
#
ipv4-family unicast
peer 10.0.3.3 enable
#
l2vpn-family evpn
policy vpn-target
# 声明IRB路由
peer 10.0.3.3 advertise irb
peer 10.0.3.3 enable
y
quit
验证
我们当前仅仅是把EVPN部署作完了,VXLAN完全没有做,当我们查看通过EVPN传递的路由数量时,目前都是0,如下所示:
[CE3]dis bgp evpn peer
BGP local router ID : 10.0.3.3
Local AS number : 100
Total number of peers : 2
Peers in established state : 2
Peer V AS MsgRcvd MsgSent OutQ Up/Down State Pr
efRcv
10.0.1.1 4 100 12 15 0 00:06:41 Established
0
10.0.2.2 4 100 7 7 0 00:02:14 Established
0
VXLAN配置
说明
在VXLAN部分的配置当中,就没有CE3的事儿了,全都是在CE1和CE2进行配置。不得不说,VXLAN部署的配置还是挺复杂的,那都需要配置一些什么内容呢?
-
配置思路
-
第一步:创建三层的VPN实例,配置RD、RT,配置三层VNI
-
第二步:创建BD10和BD20分别对应VLAN10和VLAN20、配置二层VNi和RT
-
第三步:在三层的VPN实例当中创建三层网关
-
CE1的配置
# CE1
# 创建一个三层实例
ip vpn-instance yeslab
route-dist 10:10
vpn-target 10:10
# 声明evpn,意为让EVPN携带本实例当中的信息
vpn-target 10:10 evpn
# 三层的VNI,后续还会出现二层的VNI,跨网段的时候使用三层VNI
vxlan vni 5010
# 在三层实例当中创建两个BD
bridge-domain 10
# 二层的VNI,同网段通信使用二层VNI,注意上面还有三层的VNI
vxlan vni 10
# 这里面的RT与三层的RT必须得一样,强行要求,具体原因未知
evpn
# RD必须得写,直接配置RT会报错
route-distinguisher 10:100
vpn-target 10:10
bridge-domain 20
vxlan vni 20
evpn
route-distinguisher 10:1000
vpn-target 10:10
一个三层实例,却配置两个BD?这是怎么回事?我们可以把两个BD理解为一个租户的两个BD,后续我们在做campus实例的时候就会发现一个三层实例其实就代表了一个VN网络,同一个租户内的BD是能互通的,互通肯定还是依赖三层网关,下面我们把三层的网关配置一下;
# CE1
interface vbdif 10
ip binding vpn-instance yeslab
ip add 192.168.10.1 24
# 两端的MAC地址要保证一样,否则PC会混乱,MAC地址前面8位数也是固定的
mac-address 0000-005e-0001
# 声明通过网关要收集ARP表项,进而产生IRB路由发送到对方
arp collect host enable
# 声明这是分布式网关,本意为了解决两端IP和MAC冲突的问题
vxlan anycast-gateway enable
interface vbdif 20
ip binding vpn-instance yeslab
arp collect host enable
ip add 192.168.20.1 24
mac-address 0000-005e-0002
arp collect host enable
vxlan anycast-gateway enable
# CE1
int nve 1
source 10.0.1.1
# 先配置的通,后配置的不通,type-3路由会产生,可以去对端看一下;
# 不仅把NVE接口的IP传过去了,而且type-2也出来了,针两个网关的MAC也传递到对方了
vni 10 head-end peer-list proto bgp
vni 20 head-end peer-list proto bgp
当把这一步配置完成之后,那就有了产生type-3路由信息的条件,这时就可以去对端查看一下是否有三类路由信息了,三类路由信息一旦生效,那CE1到CE2之间的vxlan隧道也就会随之建立。
CE2的配置
CE2与CE1的配置基本相同
# CE2
# 创建一个三层实例
ip vpn-instance yeslab
route-dist 10:10
vpn-target 10:10
vpn-target 10:10 evpn
# 三层的VNI,跨网段的时候使用三层VNI
vxlan vni 5010
# 在三层实例当中创建两个BD
bridge-domain 10
# 二层的VNI,同网段通信使用二层VNI
vxlan vni 10
# 这里面的RT与三层的RT必须得一样
evpn
route-distinguisher 10:100
vpn-target 10:10
bridge-domain 20
vxlan vni 20
# 这里面的RT与三层的RT必须得一样
evpn
route-distinguisher 10:1000
vpn-target 10:10
interface vbdif 10
ip binding vpn-instance yeslab
ip add 192.168.10.1 24
# 两端的MAC地址要保证一样,所以这里面要声明绑定一个
mac-address 0000-005e-0001
# 声明通过收集ARP表项,进而产生IRB路由
arp collect host enable
# 声明这是分布式网关,其实解决了两端IP和MAC冲突的问题
vxlan anycast-gateway enable
interface vbdif 20
ip binding vpn-instance yeslab
ip add 192.168.20.1 24
mac-address 0000-005e-0002
arp collect host enable
vxlan anycast-gateway enable
int nve 1
source 10.0.2.2
# 先配置的通,后配置的不通,type-3路由会产生,可以去对端看一下;
# 不仅把NVE接口的IP传过去了,而且type-2也出来了,针两个网关的MAC也传递到对方了
vni 10 head-end peer-list proto bgp
vni 20 head-end peer-list proto bgp
验证
# 我们会发现CE1和CE2已经能正常建立隧道了
[CE1]dis vxlan tunnel
Number of vxlan tunnel : 1
Tunnel ID Source Destination State Type Uptime
-----------------------------------------------------------------------------------
4026531841 10.0.1.1 10.0.2.2 up dynamic 00:03:26
[CE2]dis vxlan tunnel
Number of vxlan tunnel : 1
Tunnel ID Source Destination State Type Uptime
-----------------------------------------------------------------------------------
4026531841 10.0.2.2 10.0.1.1 up dynamic 00:00:11
同网段通信测试
# CE1引入流量
interface GE1/0/1
undo shutdown
port link-type trunk
interface GE1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
interface GE1/0/1.20 mode l2
encapsulation dot1q vid 20
bridge-domain 20
# CE2引入流量
interface GE1/0/1
undo shutdown
port link-type trunk
interface GE1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
interface GE1/0/1.20 mode l2
encapsulation dot1q vid 20
bridge-domain 20
# LSW1的配置
sys
sysn LSW1
vlan batch 10 20
int g0/0/1
port link-type trunk
port trunk allow vlan 10 20
int g0/0/2
port link-type access
port default vlan 10
int g0/0/3
port link-type access
port default vlan 20
# LSW2的配置
sys
sysn LSW2
vlan batch 10 20
int g0/0/1
port link-type trunk
port trunk allow vlan 10 20
int g0/0/2
port link-type access
port default vlan 10
int g0/0/3
port link-type access
port default vlan 20
PS:跨地址的同网段通信使用的二层的VNI
不同的网网段通信测试
不同网段的通信比较有意思,当我们把上述配置都做完之后,你会发现在CE1和CE2的yeslab的实例当中会生成IBGP的主机路由,如下所示:
[CE1]dis ip vpn-instance
Total VPN-Instances configured : 1
Total IPv4 VPN-Instances configured : 1
Total IPv6 VPN-Instances configured : 0
VPN-Instance Name RD Address-family
yeslab 10:10 IPv4
[CE1]dis evpn vpn
[CE1]dis evpn vpn-instance
Total EVPN-Instances configured : 3
EVPN-Instance Name RD Address-family
10 10:100 evpn
20 10:1000 evpn
__RD_1_10_10__ 10:10 evpn
[CE1]dis ip routing-table vpn-instance yeslab
192.168.10.0/24 Direct 0 0 D 192.168.10.1 Vbdif10
192.168.10.1/32 Direct 0 0 D 127.0.0.1 Vbdif10
# 看这里
192.168.10.3/32 IBGP 255 0 RD 10.0.2.2 VXLAN
192.168.10.255/32 Direct 0 0 D 127.0.0.1 Vbdif10
192.168.20.0/24 Direct 0 0 D 192.168.20.1 Vbdif20
192.168.20.1/32 Direct 0 0 D 127.0.0.1 Vbdif20
192.168.20.4/32 IBGP 255 0 RD 10.0.2.2 VXLAN
192.168.20.255/32 Direct 0 0 D 127.0.0.1 Vbdif20
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
[CE2-bgp-af-evpn]dis ip routing-table vpn-instance yeslab
192.168.10.0/24 Direct 0 0 D 192.168.10.1 Vbdif10
192.168.10.1/32 Direct 0 0 D 127.0.0.1 Vbdif10
192.168.10.2/32 IBGP 255 0 RD 10.0.1.1 VXLAN
192.168.10.255/32 Direct 0 0 D 127.0.0.1 Vbdif10
192.168.20.0/24 Direct 0 0 D 192.168.20.1 Vbdif20
192.168.20.1/32 Direct 0 0 D 127.0.0.1 Vbdif20
192.168.20.2/32 IBGP 255 0 RD 10.0.1.1 VXLAN
192.168.20.255/32 Direct 0 0 D 127.0.0.1 Vbdif20
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
这个效果可能在做实验的时候不太容易做出来,是因为你是提前把配置写到记事本上然后把配置刷进CE设备的话,peer IP adver irb这条命令会报错,所以最好要在三台CE上都敲一下,这样相互之间才能正常的传递irb路由,这个路由其实就是包含了三台VNI和主机IP地址。
测试效果如下所示:
PS:注意,跨地区的三台通信使用的是三层VNI。
不知道你发现没有,这种所谓的跨地区三层通信其实原理并不难,其实还是路由转发,只不过是IBGP的主机路由更优秀,所谓直接优选一条直接三台VNI封装扔到对面。
结尾
如果是分布式网关的所有知识点有十层,那么我也就仅仅理解了四台,还有六台都没有完全理解,对于分布式网关我们后续还会深入讨论的,因为还有一些EVPN路由信息、以及转发过程的细节还没来得及分析。