1. VXLAN+EVPN控制平面和数据平面分析
1.1 vxlan节点动态发现隧道动态建立过程(type3路由
Type3路由的作用:用于自动建立vxlan隧道和自动生成头端复制列表
Type3路由什么时候发送:BGP-EVPN对等体和二层广播域及evpn实例配置完成之后发送。
控制平面
- 首先在leaf1,leaf2之间建立BGP EVPN对等体关系,然后在leaf1和leaf2分别建立二层广播 域,并配置关联二层vni,在二层广播域下创建evpn实例,配置本端EVPN实例的RD,ERT,IRT。然后配置本端VTEP地址和对应vni从bgp evpn路由获取形成头端复制列表的命令之后。leaf1和leaf2会相互发送BGP-EVPN路由给对端。路由包括本端EVPN实例的ERT,和type3路由,用于形成BUM流量转发表
- Leaf1和Leaf2在收到对端发来的BGP EVPN路由后,首先检查该路由携带的EVPN实例的出方向VPN-Target,如果与本端EVPN实例的入方向VPN-Target相等,则接收该路由,否则丢弃该路由。在接收该路由后,Leaf1和Leaf2将获取其中携带的对端VTEP IP地址和二层VNI,如果对端VTEP IP地址是三层路由可达的,则建立一条到对端的VXLAN隧道;同时,如果对端二层VNI与本端相同,则创建一个头端复制表,用于后续BUM报文转发。
type3报文截图
1.2 Type2路由-同子网通信通告MAC路由
跨Leaf同子网场景
控制平面:
- 当vm1 ping vm2时,同子网发送arp广播请求去请求192.168.1.2的mac地址,
- arp报文到达leaf1,leaf1判断其收到报文的接口所属vsi(bd域实例),leaf1学习到vm1的mac地址 1b69与对应的vsi实例进行绑定,并且生成BGP-EVPN的type2路由通告给对端evpn邻居。
- leaf2收到type2路由,根据type2路由中的出方向RT和本端evpn实例的入方向RT比较,一致则接受该路由,不一致则丢弃该路由。一致情况下,提取mac地址和二层vni信息,记录到本地的l2vpn实例下的mac地址表中。
数据平面:
- Leaf1收到的arp广播报文从ge2/0口收到,该接口绑定了二层vsi实例,对应的vni是10,根据vni10,找到对应的头端复制列表,将这个BUM报文复制分别往头端复制列表的各个VTEP对端发送。
- Leaf3收到该vxlan隧道报文,解封装,根据vni编号10在其关联的二层接口广播,vm2收到该arp广播报文,发现其请求的IP是本机,那么学习将该arp报文的源MAC地址和IP记录到本地,并作出arp响应。目的mac是vm1的mac,响应报文到达leaf2,
- leaf2根据先前通过arp广播报文学习到的l2vpn的mac地址表项进行转发,发现去往vm1出接口是tunnel0,是个vxlan隧道,通过vxlan进行封装。
- 报文到达Leaf1,解封装,发现其arp响应报文的目的MAC是16b9,动态学习到的,不是通过EVPN学习到的,那么找到对应的接口转发出去。
- vm1收到arp响应报文,构建icmp报文源IP 192.168.1.1,目的IP 192.168.1.2,源MAC为 vm1,目的MAC vm2
到达leaf1,通过查询mac地址表进行对应的vxlan封装
1.3 Type2路由-跨子网通告MAC/ARP/IP路由(IRB路由)
跨Leaf跨子网场景
控制平面
- VM1去ping VM2,跨网段通信,需要发送arp请求网关的MAC,VM1首次与leaf1通信,因其目的mac是leaf1,leaf1通过arp报文学习到VM1的ARP表项,根据VM1所在的二层广播域(vsi实例)找到绑定vbdif接口(vsi接口)的L3VPN实例,获取关联的三层VNI。然后leaf1上的EVPN实例根据上述信息生成IRB路由。
- Leaf1向Leaf2发送BGP EVPN路由,该路由携带本端EVPN实例的ERT、扩展团体属性、路由下一跳和IRB路由。扩展团体属性携带了隧道类型(取值是VXLAN);路由下一跳属性携带的是本端的VTEP IP。
- Leaf2收到Leaf1发来的BGP EVPN路由后,同时进行如下处理:
检查该路由携带的ERT,如果与本端EVPN实例的IRT一致,那么接受路由,EVPN实例获取IRB类型路由后,还可以从中提取ARP类型路由,用于本端vpn实例的arp表项。(ensp vpn实例的arp表项没有?华三模拟器实验vpn实例里也没有对端的arp表项)
检查该路由携带的ERT,如果与本端L3VPN实例的eIRT一致,那么接受路由。本端L3VPN实例收到该IRB路由,从中提取PC1的主机IP地址、三层VNI,在其路由表中保存PC1的主机路由,并根据路由的下一跳迭代出接口,最终迭代结果是指向Leaf1的VXLAN隧道。 - MAC地址的学习
上一节的type2的mac路由
上面的控制平面数据交互只是leaf1收到了vm1的请求网关的arp报文触发的。
数据平面:
- leaf1收到了vm1的请求网关的arp广播报文请求,做出arp响应,vm1收到之后构建icmp报文,将请求交给网关leaf1 192.168.1.254,leaf1收到icmp报文之后查对应l3vpn实例的路由表。192.168.2.0网段的路由交给vsi接口的192.168.2.254,由2.254进行arp广播请求192.168.2.2的mac,通过vsi2 vni封装arp报文到达对端。
- Leaf2收到报文解封装,根据二层vni 20 在其管理的本地接口中广播。
- vm2收到arp广播报文,做出arp响应。源MAC为VM2的mac,目的MAC是2.254的MAC,leaf2也会学习到vm2的mac地址表项,然后发布type2mac路由通告。
Leaf2收到响应报文查mac地址表,目的MAC为2.254的mac需要从vxlan 隧道发出。封装 - Leaf1收到响应报文,解封装,将vm2的IP和mac记录到本地对应vpn实例下的arp表项中。
- 网关Leaf1构建ICMP请求,目的MAC为VM2的MAC,源MAC是网关MAC。网关根据MAC地址转发表查找对应的目的MAC,发现出口是vxlan隧道,进行封装。通过vpnb二层实例的vni找到对应的头端复制列表,进行发送。
- Leaf2收到ICMP报文,解封装,查找MAC地址转发表,根据其对应接口发出到达VM2。
- VM2收到报文之后发现其目的MAC是自己,拆掉帧头,处理报文,回复ICMP响应。目的地址192.168.1.1,源地址192.168.2.2,源MAC为VM2的MAC,目的MAC是Leaf1网关的MAC。
- ICMP响应报文到达Leaf2,查MAC地址转发表进行转发,发现目的MAC的出接口为vxlan隧道,根据vpnb实例关联的二层vni找到对应的头端复制列表进行转发。
- 报文到达Leaf1,Leaf1收到之后,对vxlan报文进行解封装,发现请求目的IP地址为192.168.1.1,查询arp表项对应的MAC地址为vm1MAC地址,查询MAC地址转发表选择对应出接口发出。报文最终到达vm1,完成ICMP的响应。
VTEP两端MAC地址一致情况下(分布式网关 网关mac一致),如何判断Leaf1节点请求VM2的ARP报文回给了Leaf2还是Leaf1,抓包看没有回给Leaf1,因为Leaf2有相同MAC,Leaf2处理了。
Leaf1是通过Leaf2通告的VM2 MAC路由继续进行ICMP构建的。
注意:本地初次通信且Leaf没有明细主机路由时且两端VTEP网关MAC没有配成一致情况下通信封装的是二层vni
本地有明细主机路由并且两端VTEP网关的MAC是一致情况下才会封装三层VNI
- 对于两端MAC没有配置成一致情况下客户端学习到的关于网关的MAC 是对端VTEP的MAC地址。下次客户端跨网段通信时本端VTEP因为目的MAC不是自己,不会接受会查表转发。
- 对于两端MAC配置成一致情况下客户端学习到的关于网关的MAC,虽然是对端VTEP发送的,但是两边的MAC一致。所以下次通信时本端VTEP会接受,不会转发,查本地vpn实例路由表。
1.4 type5-通告外部路由
什么时候需要Type5路由?
- a. vxlan网络中的主机想要访问外网,需要spine节点下发其连接的外部网段路由,从而使其他Leaf节点学习到去往外部网络的路由。
- b. 减少leaf节点的路由条目,leaf节点下连接的网段必须是在整个vxlan网络中是唯一的,不然会冲突。
控制平面:
- Spine节点本身public实例下有一条缺省路由,下一跳是24.1.1.2,在BGP对应的vpn实例下发布缺省路由,引入静态路由。
- 其他Leaf节点会收到Spine节点通告的BGP-EVPN路由,路由包括L3VPN实例的出方向RT和Type5IP前缀路由。会比较收到的路由中的出方向RT是否和本地的L3VPN实例中的 入方向RT一致,一致则接受路由,不一致则丢弃。一致的情况下,提取三层VNI、IP地址和下一跳保存在对应的vpn实例的路由表中。
数据平面:
- VM1访问4.4.4.4,跨网段请求,arp请求网关的MAC,网关回复arp响应,VM1构建ICMP请求,源IP192.168.1.1,目的IP4.4.4.4,源MAC是VM1设备MAC,目的MAC是网关MAC,请求报文到达Leaf1网关设备。
- Leaf1设备判断其接受接口,查找接口关联的vpn实例的路由表,匹配缺省路由,下一跳是2.2.2.2,出接口是vsi3,使用三层vni 1000封装。
- 通过查询arp表项,找到2.2.2.2的MAC,查找MAC地址转发表,出接口是tunnel1,隧道对端地址是2.2.2.2
- 构建ICMP报文,源IP是192.168.1.1,目的IP 4.4.4.4,源MAC是网关MAC(VSI接口),目的MAC是2.2.2.2的MAC。使用三层vni 1000封装。
- 报文到达Spine节点,解封装,Spine根据三层VNI找到关联的vpn实例,查找目的地址为4.4.4.4的路由表,匹配缺省路由,下一跳是24.1.1.4。
- 报文到达bdr节点,目的请求地址是本机的地址,返回ICMP响应沿源路径返回。
1.5 同子网同Leaf
- pc1 ping pc5,发起arp广播请求获取pc5的mac地址
- 从子接口vlan10收到的广播报文会将vlantag去掉,替换为对应的BD域的VNI,根据对应VNI10的头端复制列表将arp报文转发到对端VTEP,对端VTEP收到VXLAN封装的ARP请求报文之后,解封装,也会广播该报文,但因为arp请求IP不在该leaf2下,所以不会有arp响应。ensp模拟器到达CE3就没有往下广播了(BUG)。
- PC5也会收到arp广播报文,发现请求目的IP是本机,直接回复arp响应报文。
- PC1构建ICMP请求,直接访问PC5
1.6 跨子网同Leaf
- pc1 ping pc2,跨网段访问,首先发送ARP请求网关的MAC,网关收到之后回复arp响应。
- PC1构建ICMP请求,源IP 10.1.1.1,目的IP 10.1.2.1 ,源MAC PC1的MAC,目的MAC为vbdif10的MAC。
- Leaf1收到ICMP请求报文,判断其接受接口,查找该接口关联的VPN实例的路由表,发现10.1.2.0/24网段的下一跳是10.1.2.254,出接口是vbdif20。交给vbdif20处理。
- vbdif20网关发起arp广播报文请求10.1.2.1的MAC地址,广播报文会通过vni20对应的头端复制列表中发出去,也会广播到vni20关联的接口发出。
- PC2会收到arp广播报文,做出响应。源MAC是PC2MAC,目的MAC是 vbdif20的MAC。
- Leaf1收到响应报文之后记录arp表项和MAC地址表项,然后构建ICMP报文,目的IP 10.1.2.1 源IP 10.1.1.1,目的MAC为PC2的MAC,源MAC为vbdif20的MAC。查看MAC地址转发表从对应接口发出。
- ICMP报文到达PC2,发现请求IP为本机,回复ICMP reply报文,按照上述步骤发给网关最后到达PC1。