VXLAN技术了解

news2025/1/12 16:01:56

VXLAN是使用隧道技术的封装协议,常用于在物理层之上创建overlay网络,赋能虚拟网络。同时支持数据中心网络的虚拟化,并通过提供必要的分段满足多租户的需求。

优势在于

  • 可伸缩性和灵活性:理论上可以使用1600万xlans,但是vlans只能有4094个
  • 分块与多租户:分块网络更加安全,且允许虚拟机在存在于单独的第2层域中的服务器之间迁移。
  • 基于软件的网络(SDN): 实现了中心网络控制器(虚拟网络)与数据平面(物理网络)的解耦

结构

基本概念

在这里插入图片描述

  • VNI(VXLAN network identifier): 标识vxlan
  • VTEP(VXLAN tunnel end point):VXLAN的相关处理都在VTEP进行。比如识别以太网帧所属vxlan、封装解包等
  • Tunnel:逻辑隧道
  • vsi(VXLAN switing instance):VSI可以看作是VTEP上的一台基于VXLAN进行二层转发的虚拟交换机,它具有传统以太网交换机的所有功能,包括源MAC地址学习、MAC地址老化、泛洪等。VSI与VXLAN一一对应。
  • VSI-interface:用来处理跨VNI即跨VXLAN的流量。VSI-Interface与VSI一一对应,在没有跨VNI流量时可以没有VSI-Interface。
    在这里插入图片描述

帧格式

在这里插入图片描述

  • outer mac header: 外层mac header。14字节,如果有VLAN TAG则为18字节。其中,源MAC地址(Outer Source MAC Address)为源VM所属VTEP的MAC地址,目的MAC地址(Outer Destination MAC Address)为到达目的VTEP的路径上下一跳设备的MAC地址。类型字段为0x0800,指示内层封装的是IP报文。
  • outer ip header: 外层ip header。20字节。其中,源IP地址(Outer Source IP Address)为源VM所属VTEP的IP地址,目的IP地址(Outer Destination IP Address)为目的VM所属VTEP的IP地址(也可以是多播ip地址)。协议字段为0x11,指示内层封装的是UDP报文。
  • UDP header: UDP header。其中目的端口固定为4789,指示内层封装为VXLAN报文;源端口随机,建议使用来自内部数据包的字段散列来计算 UDP 源端口号,可用于VTEP之间多路径负载负担计算
  • VXLAN header
    • Flags: 8bit,I flag必须为有效VNI设置为1,其余7bit保留位,必须设置为0
    • VXLAN ID: 24bit,VXLAN标识符
  • Reserved: 分别为24 bit和8 bit。保留位
  • Original L2 Frame: 原始以太网报文

默认MTU为1500Bytes,在经过VTEP时会封装50字节的VXLAN报文头,那么可能会达到1550字节。所以这要求要买VTEP之间网络设备MTU设为1550字节,要买让终端机器设为1450

流程

Spine-Leaf underlay

spine-leaf是由spine和leaf交换机组成的两层网络拓扑结构,有助于数据中心网络减少网络延迟和跳数,提高网络效率。
在这里插入图片描述

  • Spine: 只用于通过leaf交换机传输信息,它们不知道 VxLAN
  • Leaf: 连接Spine和endpoint。leaf交换机创建 VxLAN 隧道、封装,并将 VLAN 映射到 VNI。执行 VxLAN 功能的叶交换机称为 VTPE

spine-leaf拓扑好处在于每两个目的地最多两跳,并且可以在不影响overlay网络架构的情况下进行动态扩展

工作过程

大概过程是

  1. VTPE通过三层IP地址与底层网络相连。vtpe可以关联一个或多个vni
  2. 当有相同VNI的第二层帧到达入口VTEP时,VTEP为帧封装VXLAN和UDP/IP报头
  3. 帧通过底层网络传输到出口VTPE进行解包
  4. 出口VTPE去掉IP、UDP头发送原来二层帧到目标主机

在同vxlan内一个主机A上的虚拟机vm1向另一个主机B上的虚拟机B发送报文的关键在于

  • 如何获取虚拟机B所在的实际ip?通过广播,主机B收到了报文,之后在主机内部再进行广播找到目的ip所对应的虚拟机ip。并在找到之后储存到vsi mac表中
  • 如何获取虚拟机B所在的mac地址?也是通过上述的广播过程,并在找到后储存到arp表中

同vxlan arp请求广播过程

以下是一个详细arp请求报文发送过程

在这里插入图片描述

  1. vm1发现与vm3在同一网段,但没有vm3的mac地址,于是发起对vm3的arp请求。

    arp请求源ip在vm ip,目的ip是vm3 ip,源mac是vm 1的mac,目的mac是全0字段,表示希望获取vm3 mac。

  2. vtep leaf A收到vm 1 arp请求,根据入端口和vlan信息判断应该匹配vxlan 10,

  3. leaf A接着发现arp请求是广播,于是将这个报文在本地和远端所有vxlan 10的端口进行广播

  4. spine C收到leaf A发来的报文,发现目的ip是自己,于是将其解封装。而后发现UDP的目的端口是4789,于是将UDP的上层报文进行VXLAN解封装处理。接着发现是广播报文于是在VXLAN 10进行广播

  5. leaf B收到leaf A报文,解包。由于报文是从Tunnel 1中收到的,所以端口信息为Tunnel 1。根据VXLAN 10的映射关系表,将原始二层报文在本地所有VXLAN 10端口进行广播

  6. vm3收到vm1,写入vm1 ip和mac对应关系到arp表项,并准备arp应答

广播过程中leaf、spine都会顺便将vxlan、mac、入端口和vlan信息写入相应vsi mac表。vsi mac记录了VETP ip、vm mac、vni,那么之后在接受到目的mac为该vm mac的时候就能直接找到对应的VETP ip和所在的vxlan

跨VXLAN请求发送过程

在这里插入图片描述

  1. VM_A发送包到网关。报文的源MAC为MAC_A,目的MAC为网关BDIF 10的MAC_10,源IP地址为IP_A,目的IP为IP_B。
  2. VTEP 1收到包后,识别VNI。封装外层源ip为本地VTEP1的ip(IP_1),外层目的ip为对端VETP ip(IP_3);外层源MAC地址为本地VTEP的MAC地址(MAC_1),而外层目的MAC地址为去往目的IP的网络中下一跳设备的MAC地址
  3. VETP 3收到包后,进行解包
    1. 发现目的mac为本地BDIF 10接口的mac,而目的地址则是IP_B,就会根据路由表找到通往IP_B的下一跳
    2. 发现下一跳属于出接口BDIF 20,则根据查询到的ARP表项,将原始报文的源MAC修改为BDIF 20接口的MAC(MAC_20),将目的MAC修改为VM_B的MAC(MAC_B)
    3. 报文到BDIF 20接口时,识别到需要进入VXLAN隧道(VNI 6000),所以根据MAC表对报文进行封装。这里封装的外层源IP地址为本地VTEP的IP地址(IP_3),外层目的IP地址为对端VTEP的IP地址(IP_2);外层源MAC地址为本地VTEP的MAC地址(MAC_3),而外层目的MAC地址为去往目的IP的网络中下一跳设备的MAC地址。
  4. VETP 2收到包后,解包,并传递给VM_B

实践

多播vxlan

# 在一台虚拟机上添加vxl0的vxlan interface,其中vni为11,dstport是linux默认的8472端口,并将vtep加入到group 239.1.1.1多播组
ip link add vxl0 type vxlan id 11 dstport 4789 group 239.1.1.1 dev eth0

# 查看是否成功添加
ip link show

# 添加ip地址
ip addr add 10.20.1.2/24 dev vxl0

# 启动vtep
ip link set vxl0 up

# 查看fdb表项
bridge fdb

多播:多播地址能让源设备将分组发送给一组设备。属于多播组的设备将被分配一个多播组ip地址,多播地址范围为224.0.0.0~239.255.255.255

fdb表:arp是三层转发,而fdb是二层转发。所以对于fdb来说就算没配ip,也能通过fdb转发数据。FDB表的作用就在于告诉设备从某个端口出去就可以到某个目的MAC。

那么FDB表是怎么形成的呢?很简单,交换机会在收到数据帧时,提取数据帧中的源MAC、VLAN和接收数据帧的端口等组成FDB表的条目。当下次有到该VLAN中的该MAC的报文就直接从该端口丢出去就OK了。

组合通信实体

在实际生产中,每台主机上都有几十台甚至几百台虚拟机或者容器需要通信,因此需要一些机制将这些通信实体组织起来,然后通过隧道vtep转发出去

一个常见的方案就是通过Linux bridge将多个虚拟网卡连接
在这里插入图片描述

# 在主机添加vxl0的vxlan interface,其中vni为12,dstport是linux默认的8472端口,并将vtep加入到group 224.1.1.1多播组
ip link add vxl0 type vxlan id 12 dstport 4789 local 192.168.3.107 group 224.1.1.1

# 添加连接的bridge
ip link add vxbr0 type bridge

# 将vxl0作为vxbr0的主设备
ip link set vxl0 master vxbr0

# 启动vxlan和bridge
ip link set vxl0 up
ip link ser vxbr0 up

# 新增网络命名空间
ip netns add vxns0

# 添加主机与vxns0之间的veth peer,并连接vxbr0
ip link add vxve0 type veth peer name eth1 netns vxns0
ip link set vxve0 master vxbr0
ip link set vxve0 up

# 在命名空间内,设置loopback,添加eth1设备地址,并启动
ip -n vxns0 link set lo up
ip -n vxns0 addr add 174.17.1.2/24 dev eth1
ip -n vxns0 link set eth1 up

所以容器怎么办呢?怎么将一个主机的多个容器纳入到一个vxlan管理呢?难道是在容器内建立与bridge之间veth peer?那这和netns有什么关系呢?为什么要有这个netns?

手动维护

在overlay网络中,网段范围分布多个主机,因此传统arp报文广播无法直接使用,所以引入了多播

但多播的不利之处在于不是所有网络支持多播,而且要事先规划多播组和vni对应关系,同时也会导致大量无用报文

因此我们可以采用自动化方式

# nolearning 告诉vtep不要通过收到的报文来学习fdb表项内容
# proxy 告诉vtep承担arp代理功能。收到arp请求,在知道结果的情况就直接应答
ip link add vxl1 type vxlan id 13 dstport 4789 local 192.168.3.107 nolearning proxy 

# 告诉vtep 容器mac对应主机ip地址。
# 默认(全0)表项可以在不知道ip和mac对应关系时通过arp报文查询对方的mac地址
bridge fdb append 00:00:00:00:00:00 dev vxl1 dst 192.168.3.105
bridge fdb append 00:00:00:00:00:00 dev vxl1 dst 192.168.8.106
bridge fdb append 52:5e:55:58:9a:ab dev vxl1 dst 192.168.8.105
bridge fdb append d6:d9:cd:0a:a4:28 dev vxl1 dst 192.168.8.106

# 添加arp表项
ip neigh add 174.17.1.3 lladdr d6:d9:cd:0a:a4:28 dev vxl1
ip neigh add 174.17.1.4 lladdr 52:5e:55:58:9a:ab dev vxl1

动态更新

在提前添加所有可能通信容器到arp、fdb表项,但不是所有容器都会互相通信。所以Linux提供了能够动态通知节点要和哪个容器通信,应用可以订阅这些事件。若内核发现需要arp、fdb不存在,就会发送给订阅的应用,这样应用从中心化控制拿到这些来更新表项,做到更精确控制

# l2miss 若设备找不到mac需要的vtep地址就发送事件
# l3miss 若设备找不到ip对应mac地址就发送事件
ip link add vxl2 type vxlan id 14 dstport 4689 dev en0 nolearning proxy l2miss l3miss

# 监听vxl2事件
ip monoitor all dev vxl2

# 若发现l3 miss [nsid current]miss 10.20.1.3  STALE
# 添加arp记录
# nud reachable 就是有一个超时事件。若系统发现无效一段时间后会自动删除
# nud是neighbour unreachability detection, permanet 代表记录永远不会过时
ip neigh replace 10.20.1.3 lladdr b2:ee:aa:42:8b:0b dev vxl2 nud reachable

# 若发现l2miss [nsid current]miss lladdr b2:ee:aa:42:8b:0b STALE
# 手动添加fdb记录
bridge fdb add b2:ee:aa:42:8b:0b dst 192.168.8.101 dev vxl2

Ref

  1. http://www.h3c.com/cn/d_201811/1131076_30005_0.htm
  2. https://www.pcwdld.com/vxlan
  3. https://www.rfc-editor.org/rfc/rfc7348
  4. https://www.juniper.net/us/en/research-topics/what-is-vxlan.html#:~:text=VXLAN%20is%20an%20encapsulation%20protocol,the%20use%20of%20virtual%20networks.
  5. https://cizixs.com/2017/09/28/linux-vxlan/
  6. https://www.cnblogs.com/yougewe/articles/9516786.html
  7. https://www.cnblogs.com/wuyuegb2312/articles/3293218.html
  8. https://icloudnative.io/posts/vxlan-linux/
  9. https://support.huawei.com/enterprise/zh/doc/EDOC1100087027

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记——《when breath becomes air》《超越自卑》

为啥要两本书一起写读后感? 读完这两本书本来应该分开来写点东西的,不过我认为这两本书应该写不了太多内容。虽然我也看了几本英文原著(也写了点东西),但是我明显低估了《when breath becomes air》的难度&#xff0c…

SpringBoot学习之集成JWT(二十八)

一、什么是JWT WT (全称:Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 比如我们常见的登录流程如下: 流程描述一下: 用户使用账号、密码登…

机器学习-3 K最近邻算法

K最近邻算法 算法概述分类什么是分类?分类需要什么? k近邻(KNN)分类 KNN算法关键问题k近邻模型的两个关键问题相似性度量——欧氏距离K值的选取 KNN算法流程算法原理算法步骤 数据标准化离差标准化数据标准差标准化数据小数定标标…

文献阅读-A Survey on Transfer Learning

期刊会议:IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 时间:2010 级别:CCF A 1、为什么需要迁移 许多机器学习和数据挖掘算法的一个主要假设是,训练数据和未来数据必须在相同的特征空间中,并且具有相同…

CSS的z-index属性

之前以为z-index越大,它的层级就越高,从我遇到的bug来看很显然不是这样。重新回顾一下z-index的知识: 1、z-index只对定义了position属性的,且属性值是非static元素有效。它的默认值是auto,auto的意思是游览器自动进行…

配置工具篇(tmux+ranger+lazygit)

Tmux 简介 官网解释:tmux是一个终端多路复用器:它允许在单个屏幕上创建、访问和控制多个终端。tmux可以从屏幕上分离出来,继续在后台运行,然后再重新连接。 此版本在Open BSD、Free BSD、Net BSD、Linux、mac OS和Solaris上运行…

数据结构 --- 堆

1、堆的基本概念 之前在学习优先级队列的时候&#xff0c; 学习到了堆的概念&#xff0c;现在重新回忆一下&#xff1a; 堆在逻辑上&#xff0c;是一颗完全二叉树堆在物理上&#xff0c;是存储在数组中的任意根节点值>子树节点值&#xff0c;叫做大顶堆。任意根节点值<…

学习RabbitMQ高级特性

目标&#xff1a; 了解熟悉RabbitMQ的高级特性 学习步骤&#xff1a; 高级特性主要分为以下几点, 官网介绍 1、消息可靠性投递 【confirm 确认模式、return 退回模式】 2、Consumer ACK 【acknowledge】 3、消费端限流 【prefetch】 4、TTL过期时间 【time to live】 5、死信队…

SQL注入 - Part 3(带外)

1、DNSLog注入 &#xff08;一种注入新思路&#xff09; 可以看到DNS的解析日志中包含了用户名。 基于此原理&#xff0c;可以手工构造注入点&#xff0c;让DNSlog显示库名、表名等&#xff0c;也可以使用自动化脚本Dnslogsqlinj进行获取。 2、SQL注入的防御 基于关键字&…

rollup打包react组件

这次主要简单实现用rollup打包react组件&#xff0c;组件的话简单写了一个弹窗组件&#xff0c;效果如下&#xff1a; 点击打开弹框&#xff0c;点击关闭按钮关闭弹框 首先创建react项目&#xff0c;这边还是用mfex-project脚手架创建 mfex-project create react-demo 然后编…

Linux·深入理解IO复用技术之epoll

目录 1.写在前面 2.初识复用技术和IO复用 3. Linux的IO复用工具概览 4. 初识epoll 5. epoll的底层细节 6.LT模式和ET模式 7.epoll的惊群问题 1.写在前面 今天一起来学习一下高并发实现的的重要基础&#xff1a;I/O复用技术 & epoll原理。 通过本文你将了解到以下内容…

【JavaScript】ES6,Proxy,Reflect,Promise,生成器,async/await

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 ES6模板字符串&#xff0c;标签模板字符串函数的默认参数函数的剩余参数剩余参数和arguments有什…

为什么要学习C++软件调试技术?掌握调试技术都有哪些好处?

目录 1、为什么要学习C软件调试技术&#xff1f; 1.1、IDE调试手段虽必不可少&#xff0c;但还不够 1.2、通过查看日志和代码去排查异常崩溃问题&#xff0c;费时费力&#xff0c;很难定位问 1.3、有的问题很难复现&#xff0c;可能只在客户的环境才能复现 1.4、开发联调工…

使用git远程上传github

如果你不是很熟悉git&#xff0c;在使用git前请先对你的项目进行备份 进入本地文件目录&#xff0c;打开git的cmd界面&#xff08;Git Bash Here&#xff09;如果当面目录使用过git&#xff0c;有.git隐藏文件&#xff0c;则跳过第二步&#xff0c;没有则输入以下命令 git ini…

零基础如何自学网络安全?

第一阶段&#xff1a;学习一种或几种编程语言。 网络安全也属于计算机范畴&#xff0c;涉及到IT行业的&#xff0c;编程语言是不可难免的。 《Head First Python(第2版)》 作为一种高级编程语言&#xff0c;Python越来越受到网络专家的欢迎。它之所以吸引人&#xff0c;主要…

【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)

文章目录 1 写在前面2 C语言与Java语言的互相调用2.1 C语言调用Java语言2.2 Java语言调用C语言 3 友情推荐4 更多分享 1 写在前面 众所周知&#xff0c;C语言和Java语言是两种不同的编程语言&#xff0c;它们的关系可以描述为Java语言是在C语言的基础上发展而来的一种高级编程…

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联网&#x…

Springboot +spring security,使用过滤器方式实现验证码功能

一.简介 在前面文章章节通过自定义认证器实现了验证码功能&#xff0c;这篇文章使用过滤器来实现验证码功能。 二.思路分析 实现逻辑和通过过滤器实现json格式登录一样&#xff0c;需要继承UsernamePasswordAuthenticationFilter&#xff0c;所以文档这块主要记录下代码实现…

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注&#xff1a;本题只采用暴力解法&#xff0c;时间复杂度为O(n2)&#xff0c;如果采用哈希表&#xff0c;可以将时间复杂度降到O(n)&#xff0c;但由于笔者还未对哈希表展开学习&#xff0c;故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意&#xff1a;本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本&#xff0c;有以下两种推荐&#xff1a; 官方版本&#xff1a; https://github.com/mastodon/mastodonGlitch 版本&#xff1a; https://github.com/glitch-soc/mastodon 项目包含一个 Doc…