VXLAN间通信

本文探讨了数据中心中VXLAN间通信的需求,解释了VXLAN如何通过VBDIF(类似SVI)实现跨VNI互访,并介绍了集中式Layer3网关的优缺点。此外,还详细阐述了分布式同步IRB与异步IRB的工作原理,特别是如何通过配置减少冗余VNI信息,提高网络效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、VXLAN间通信的需求以及集中式layer 3网关部署架构
对于数据中心,基本对外提供访问服务,最初不同虚拟机之前是不需要相互通信的,随着业务扩展,可能也存在不同VNI之间的互访。
VLAN VLAN间通信 需要创建SVI
VXLAN VXLAN间通信 VBDIF(华为) 类似于SVI(思科,锐捷)
配置相同的IP地址,MAC地址,启用VXLAN anycast gateway功能
举例:
PCA-----VTEP1-----Internet-----VTEP2-----PCB
① PCA: VNI 10 PCB: VNI 10
为了保证PCA B可以访问其他的VNI成员,需要在VTEP1 和VTEP2上都创建一致的VBDIF,如果IP地址,MAC地址不一致,会对虚拟机迁移存在问题,导致前后网关不一致,比如PCA迁移到VTEP2,可能导致PCA丧失了不同VNI之间通信的功能。
② PCA: VNI 10 PCB: VNI 20
通信流程:
PCA访问PCB,发现IP地址不属于一个网关,会请求网关。
SIP:A.IP DIP:B.IP
SMAC: A.MAC DMAC: VTEP1的VBDIF接口的MAC地址

VTEP1查看三层报文目标IP,查看IP路由表(Mac路由解决VNI内通信,IP路由解决VNI间通信)
SIP:A.IP DIP:B.IP
SMAC:VTEP1的VBDIF接口的MAC地址 DMAC:VTEP2的NVE接口的MAC地址
VXLAN:VNI layer3
UDP
SIP:VTEP1的tunnel source DIP:VTEP2的tunnel source
SMAC:北向接口MAC地址 DMAC:下一跳MAC地址
集中式网关
spine交换机作layer 3 gateway,集中式网关部署
在这里插入图片描述

优点:部署简单
缺点:
数据层面压力增大
MAC路由,IP路由,ARP路由条目过多
出现了发卡流量hair pin(次优路径,比如server1与server3之间的通信)

二、分布式同步IRB与分布式异步IRB
IRB leaf交换机即作二层网关,又作三层网关
异步:
PCA——SW1——trunk——SW2——PCB
比如有vlan 10 20 30,希望这三个之间彼此通信,需要启用SVI,如何启用?
1、SW1 SW2创建SVI,A——B先路由,后交换,B——A先交换后路由
2、当SW1与SW2之间为三层链路,来回都为路由即同步
对于VXLAN而言,如何理解?
来回交换路由机制不一致,本路由,对端交换机,本交换,对端路由。
缺陷:创建域内所有VNI以及VNI对应的VBDIF,比如VTEP1身后仅仅有VNI 10,但是还是需要创建其他的VNI信息。
分布式同步IRB
两端VTEP都配置layer 3 VNI,建立BGP EVPN邻居关系,设置RT值将layer2 VNI路由导入到对端,基于layer3 VNI
进行转发,无需创建多余的VNI。

VXLAN (Virtual eXtensible Local Area Network) 是一种用于构建虚拟网络的技术,它通过封装二层网络流量并在第三层 IP 网络上进行传输,实现了数据中心内的跨物理网络连接。在三层通信中,VXLAN 使用隧道技术来实现在两个网络设备间的数据传输。以下是实现 VXLAN 三层通信的基本步骤和涉及的关键代码片段(假设使用 Linux 开发环境): 1. 创建 VNI(Virtual Network Identifier):这是 VXLAN 隧道的独特标识符,用于区分不同的虚拟网络。在 Linux 中,可以使用 `ip link` 或 `vconfig` 命令创建并配置 VXLAN 接口。 ```bash sudo ip link add name vxlan0 type vxlan id <VNI> ``` 2. 设置路由转发:为了允许数据包通过 VXLAN 隧道,需要启用 IP 路由表对 VXLAN 地址段进行转发。这通常通过修改 `sysctl.conf` 文件或设置 net.ipv4.ip_forward 的值为 1 来实现。 3. 数据包封装与解封装:应用程序或协议栈在发送数据前会将二层帧封装到一个带有 VNI 的 UDP 包中,接收端再解封装回原始二层报文。在用户空间(如 QEMU),你可以使用 libnl 或其他库来处理这个过程。 ```c #include <linux/if_packet.h> struct sk_buff *skb = ...; // 获取原始二层帧 struct ethhdr eth; memcpy(&eth, skb->data, ETH_ALEN); struct vxlan_vni_header vni; vni.vni = <VNI>; // 封装到新的 UDP 包 struct udphdr udp; udp.src = <UDP_SRC>; udp.dst = <UDP_DST>; udp.check = htons(cksum(udp, sizeof(udp))); ... ``` 4. 发送和接收:在应用层面,你需要使用 socket API 来发送和监听封装后的 UDP 报文。 ```c int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sendto(sock, ...); // 发送 UDP 包 struct sockaddr_in addr; recvfrom(sock, ..., &addr, ...); // 接收 UDP 包 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值