【Docker】vxlan的原理与实验

news/2024/4/28 18:48:21/文章来源:https://blog.csdn.net/u022812849/article/details/134898675

VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。

VXLAN介绍

VXLAN是在底层物理网络(underlay)之上使用隧道技术,借助UDP层构建的Overlay的逻辑网络,使逻辑网络与物理网络解耦,实现灵活的组网需求。它对原有的网络架构几乎没有影响,不需要对原网络做任何改动,即可架设一层新的网络。也正是因为这个特性,很多容器的网络才会选择VXLAN作为通信网络。

VXLAN不仅支持一对一,也支持一对多,一个VXLAN设备能通过像网桥一样的学习方式学习到其他对端的IP地址,还可以直接配置静态转发表。

VXLAN基本概念

  • VNI(VXLAN Network Identifier,VXLAN网络标识符):VXLAN通过VXLAN ID来标识,其长度为24比特。一般每个VNI对应一个租户,也就是说使用VXLAN理论上可以支撑千万级别的租户。

  • VTEP(VXLAN Tunnel End Point,VXLAN隧道端点):VXLAN网络的边缘设备,用来进行VXLAN报文的处理(封包和解包)。VXLAN的相关处理都在VTEP上进行,例如识别以太网数据帧所属的VXLAN、基于VXLAN对数据帧进行二层转发、封装/解封装报文等。VTEP可以是一台独立的物理设备,也可以是虚拟机所在服务器的虚拟交换机。

  • VXLAN Tunnel:两个VTEP之间点到点的逻辑隧道。VTEP为数据帧封装VXLAN头、UDP头、IP头后,通过VXLAN隧道将封装后的报文转发给远端VTEP,远端VTEP对其进行解封装。隧道是一个逻辑上的概念,在VXLAN模型中并没有具体的物理实体向对应。隧道可以看做是一种虚拟通道,VXLAN通信双方认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个VXLAN网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。

    上图所示为VXLAN的工作模型,它创建在原来的IP网络(三层)上,只要是三层可达(能够通过IP相互通信)的网络就能部署 VXLAN。在VXLAN网络的每个端点都有一个VTEP设备,负责VXLAN协议报文的解包和封包,也就是在虚拟报文上封装VTEP通信的报文头部。

物理网络上可以创建多个VXLAN网络,可以将这些VXLAN网络看成一个隧道,不同节点上的虚拟机/容器能够通过隧道直连。通过VNI标识不同的VXLAN网络,使得不同的VXLAN可以相互隔离。

VXLAN的报文格式


VXLAN Header:在原始二层帧的前面增加8字节的VXLAN的头部,其中最主要的是VNID,占用3个字节(即24bit),类似VLAN ID,可以具有2^24个网段。

UDP Header:在VXLAN和原始二层帧的前面使用8字节UDP头部进行封装(MAC IN UDP),目的端口号缺省使用4789,源端口按流随机分配(通过MAC,IP,四层端口号进行hash操作),这样可以更好的做ECMP。

在上面添加的二层封装之后,再添加底层网络的IP头部(20 字节)和MAC头部(14 字节),这里的IP和MAC是宿主机的IP地址和 MAC地址。

VXLAN通讯过程

总的来说,VXLAN报文的转发过程就是:原始报文经过VTEP,被VTEP添加上VXLAN头部以及外层的UDP头部,再发送出去,对端 VTEP接收到VXLAN报文后拆除外层UDP头部,并根据VXLAN头部的VNI把原始报文发送到目的服务器。但这里有一个问题,第一次通信前双方如何知道所有的通信信息?这些信息包括:

  • 哪些VTEP需要加到一个相同的VNI组?
  • 发送方虚拟机怎么知道对方的MAC地址?
  • VTEP怎么知道目的虚拟机在哪一台宿主机上?

这三个问题可以归结为同一个问题:VXLAN网络怎么感知彼此的存在并选择正确的路径传输报文?

第一个问题简单,VTEP通常由网络管理员来配置。要回答后面两个问题,还得回到VXLAN协议的报文上,看看一个完整的VXLAN报文需要哪些信息:

  • 内层报文:通信双方的IP地址已经明确,只需要VXLAN填充对方的MAC地址,因此需要一个机制来实现ARP功能。
  • VXLAN头部:只需要知道VNI。一般直接配置在VTEP上,要么提前规划,要么根据内层报文自动生成。
  • UDP头部:需要知道源端口和目的端口,源端口由系统自动生成,目的端口默认是4789。
  • IP头部:需要知道对端VTEP的IP地址,这个是最关键的部分。

实际上,VTEP也会有自己的转发表,转发表通过泛洪和学习机制来维护,对于目标MAC地址在转发表中不存在的未知单播,广播流量,都会被泛洪给除源VTEP外所有的VTEP,目标VTEP响应数据包后,源VTEP会从数据包中学习到MAC,VNI和VTEP的映射关系,并添加到转发表中,后续当再有数据包转发到这个MAC地址时,VTEP会从转发表中直接获取到目标VTEP地址,从而发送单播数据到目标VTEP。

点对点的VXLAN通信

点对点的VXLAN通信,在这个实验中使用两台虚拟机构成一个VXLAN网络,每台机器的网卡作为vtep,通过设置的ip互相通信。

主机规划:

  • node1:172.20.160.13/20
  • node2:172.20.161.221/20

实验结构图如下图所示。

对于,两台主机的网卡之间的通信,如果不使用vxlan,就需要设置路由表,此时两个网卡的ip不能是同一个网段。接下来,进行点对点的vxlan的通信。

在node1上创建一个名字为vxlan-ethd,类型为vxlan的网卡,后面是vxlan-ethd网卡需要的参数:

  • id 1:指定VNI的值,这个值可以在1到2^24之间
  • dstport:vtep通信的端口
  • remote 172.20.161.221:对方vtep的地址,类似于点对点协议
  • local 172.20.160.13:当前节点vtep要使用的IP地址
$ sudo ip link add vxlan-ethd type vxlan id 1 dstport 4789 remote 172.20.161.221 local 172.20.160.13

启动vxlan-ethd网卡并为其分配IP;

$ sudo ip link set vxlan-ethd up
$ sudo ip addr add 10.0.1.1/24 dev vxlan-ethd

在node2上也进行同样的操作:

$ sudo ip link add vxlan-ethd type vxlan id 1 dstport 4789 remote 172.20.160.13 local 172.20.161.221
$ sudo ip link set vxlan-ethd up
$ sudo ip addr add 10.0.1.2/24 dev vxlan-ethd

接下来,这两个位于不同虚拟机上的网卡就可以通过vxlan隧道进行通信了,在node1中尝试访问node2的10.0.1.2

$ ping -I 10.0.1.1 10.0.1.2 -c 3
PING 10.0.1.2 (10.0.1.2) from 10.0.1.1 : 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.899 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.934 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=64 time=1.53 ms--- 10.0.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2022ms
rtt min/avg/max/mdev = 0.899/1.124/1.539/0.293 ms

跨主机的容器通信

上面最简单的点对点VXLAN实验只是个简单的演示,没有太多实际工程意义,本节用容器通信来演示一个更加完整的场景。

场景描述:在node1和node2上各部署一个docker容器,默认情况下,一个容器宿主机上的容器能够直接用私网IP地址通信,因为它们利用一个网桥接在一起。而不同宿主机上的容器无法直接用私网IP地址通信。使用自建的vxlan网络接口,来打通不同宿主机上容器,让它们可以直接利用内网IP通信。

准备容器

在node1上创建app1容器,指定IP为172.18.0.2:

$ sudo docker network create --subnet 172.18.0.0/16 my-network
04a3be456f01099cb18818fa50804cc69a359ee77ba8d8d3e3bb12cf06e52434$ sudo docker container run -d --rm --name app1 --network my-network --ip 172.18.0.2 busybox ping 8.8.8.8
c7fbfe06fb871d88d3fc9224636c25da78d61cf8aaa98b87df65403e771437be

在node2上创建app2容器,指定IP为172.18.0.3:

$ sudo docker network create --subnet 172.18.0.0/16 my-network
09fb688212d956ebbb5e775f8d8847d9cf2705c7ed96127dc411648383ba839f$ sudo docker container run -d --rm --name app2 --network my-network --ip 172.18.0.3 busybox ping 8.8.8.8
745c98439680ecc9ef97b02aabda3dcc8fb19bd76f73b2e79d9134f858b17fbd

在node1中的容器app1上访问node2中的容器app2,和预期一致,是无法ping通的:

$ sudo docker container exec -it app1 ping -c 3 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes--- 172.18.0.3 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

创建VXLAN接口接入docker网桥

在两个容器宿主机上各创建一个VXLAN接口,并且将VXLAN接口接入docker网桥的端口上,如下图:

有了VXLAN接口的连接后,从node1上容器app1发出的包到达docker网桥后,可以从网桥的VXLAN接口出去,从而报文在VETP(VXLAN接口)处被封装成VXLAN报文,再从物理网络上到达对端VETP所在的主机node2。对端VTEP能正确解包VXLAN报文的话,随后即可将报文通过node2上的docker网桥送到上层的docker容器app2中。

在node1上配置如下:

$ sudo ip link add vxlan_docker type vxlan id 200 remote 172.20.161.221 dstport 4789 dev eth0$ sudo ip link set vxlan_docker up$ sudo brctl addif br-04a3be456f01 vxlan_docker

在node2上配置如下:

$ sudo ip link add vxlan_docker type vxlan id 200 remote 172.20.160.13 dstport 4789 dev eth0$ sudo ip link set vxlan_docker up$ sudo brctl addif br-09fb688212d9 vxlan_docker

此时再在node1中的容器app1上访问node2中的容器app2,结果如下,ping可以通。

$ sudo docker container exec -it app1 ping -c 3 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=1.841 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.562 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=1.615 ms--- 172.18.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.562/1.339/1.841 ms

FDB表

FDB(Forwarding Database entry,即转发表)是Linux网桥维护的一个二层转发表,用于保存远端虚拟机/容器的MAC地址,远端VTEP IP,以及VNI的映射关系,可以通过bridge fdb命令来对FDB表进行操作:

$ sudo bridge fdb
02:42:ac:12:00:03 dev vxlan_docker master br-e4fbde69f952
ca:d7:ea:37:0a:b2 dev vxlan_docker vlan 1 master br-e4fbde69f952 permanent
ca:d7:ea:37:0a:b2 dev vxlan_docker master br-e4fbde69f952 permanent
00:00:00:00:00:00 dev vxlan_docker dst 172.20.161.221 via eth0 self permanent
02:42:ac:12:00:03 dev vxlan_docker dst 172.20.161.221 self
33:33:00:00:00:01 dev br-e4fbde69f952 self permanent
01:00:5e:00:00:01 dev br-e4fbde69f952 self permanent
02:42:f7:03:fb:17 dev br-e4fbde69f952 vlan 1 master br-e4fbde69f952 permanent
02:42:f7:03:fb:17 dev br-e4fbde69f952 master br-e4fbde69f952 permanent

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『 MySQL数据库 』聚合统计

文章目录 前言 🥑🥝 聚合函数🍓 COUNT( ) 查询数据数量🍓 SUM( ) 查询数据总和🍓 AVG( ) 查询数据平均值🍓 MAX( ) 查询数据最大值🍓 MIN( ) 查询数据最小值 🥝 数据分组GROUP BY子句…

【Linux】cat 命令使用

cat 命令 cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。 可以使用cat连接多个文件、创建新文件、将内容附加到现有文件、查看文件内容以及重定向终端或文件中的输出。 cat可用于在不同选项的帮助下格式化文件的输出…

网络攻击(一)--安全渗透简介

1. 安全渗透概述 目标 了解渗透测试的基本概念了解渗透测试从业人员的注意事项 1.1. 写在前面的话 在了解渗透测试之前,我们先看看,信息安全相关的法律是怎么样的 中华人民共和国网络安全法 《中华人民共和国网络安全法》由全国人民代表大会常务委员会…

Qt提升绘制效率,绘制加速。

在我们绘制一些复杂逻辑且数据量巨大的图形时,经常会出现流畅性问题,本文就是来进行讲解如何提升绘制效率的。 实现思路: 场景1:我们绘制多个静态图形和绘制一张图片哪个更快。很明显绘制多个图形的时候要慢很多。所以我们将多个图…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(一)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者的反馈中发现许多小伙伴对方言…

Mybatis XML 多表查询

这篇需结合 <<Mybatis XML 配置文件>>那一篇博客一起看 工作中尽量避免使用多表查询,尤其是对性能要求非常高的项目 我们之前建了个用户表(代码在Mybatis XML配置文件那篇博客里),这次再建一个文章表,代码如下 : -- 创建⽂章表 DROP TABLE IF EXISTS articleinf…

【EI征稿倒计时3天】第四届IEEE信息科学与教育国际学术会议(ICISE-IE 2023)

第四届IEEE信息科学与教育国际学术会议(ICISE-IE 2023) 2023 4th International Conference on Information Science and Education&#xff08;ICISE-IE 2023&#xff09; ICISE-IE2024已上线岭南师范学院官网&#xff08;点击查看&#xff09; 第四届IEEE信息科学与教育国…

【代码随想录】刷题笔记Day34

前言 考过概率论&#xff0c;发过一场烧&#xff0c;兜兜转转又一月&#xff0c;轻舟已撞万重山&#xff0c;赶紧刷题 贪心算法理论基础 贪心的本质&#xff1a;局部最优→全局最优无套路&#xff0c;常识性推导 举反例 455. 分发饼干 - 力扣&#xff08;LeetCode&#xf…

某音上很火的圣诞树分享

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 效果截图&#xff08;这里不给动态了&#xff0c;某音到处都是了&#xff09;&#xff1a; 源代码&#xff1a; <script src"…

3GPP标准查看、下载和几个UE相关系列标准

由于一直做终端侧协议。最近以UE为核心重新下载了一系列文档。 总结并举例一下分类标准。 如何查看3GPP标准列表 实际上在3GPP网站如下链接&#xff1a;Specifications by Series&#xff0c;每个系列以及分类都说的很清楚。 几个系列分类举例 和终端协议层工作比较关系密切…

【100天精通Python】Day76:Python机器学习-第一个机器学习小项目_鸾尾花分类项目,预测与可视化完整代码(下)

目录 5 模型实现 5.1 分离出评估数据集 5.2 创建不同的模型来预测新数据 5.3 采用10折交叉验证来评估算法模型 5.4 生成最优模型 6 实施预测 7 模型评估 8 完整代码 &#xff08;1&#xff09;鸾尾花分类的完整代码 &#xff08;2&#xff09;可视化不同模型预测的评…

文献计量学方法与应用、主题确定、检索与数据采集、VOSviewer可视化绘图、Citespace可视化绘图、R语言文献计量学绘图分析

目录 一、文献计量学方法与应用简介 二、主题确定、检索与数据采集 三、VOSviewer可视化绘图 四、Citespace可视化绘图 五、R语言文献计量学绘图分析 六、论文写作 七、论文投稿 更多应用 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉…

vue3移动端脚手架(纯净,集成丰富)

概述 一个纯净的移动端框架 &#xff0c;用到了 Vue3 vuex Vite3 Vant3 sass eslint stylelint htmlhint husky commitlint axios axios-adapter VConsole 自定义全局 loading &#xff0c;自定义函数式 dialog &#xff08;api模仿微信小程序&#xff09;&#x…

小程序定制开发收费价目表

小程序定制开发是一种根据客户的需求和业务场景&#xff0c;为其量身打造专属的小程序的服务。小程序定制开发的收费价目表一般包括以下几个方面&#xff1a; 开发周期&#xff1a;开发周期是指从需求分析到上线测试的整个过程所需的时间。开发周期的长短会影响开发成本和项目…

SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案

Maven项目的Jar包打包问题-没有主清单属性&&ClassNotFoundException 与 NoClassDefFoundError 文章目录 Maven项目的Jar包打包问题-没有主清单属性&&ClassNotFoundException 与 NoClassDefFoundError1、问题出现1.1、Jar包运行&#xff1a;没有主清单属性解决方…

ubuntu18.04配置cuda+cudnn+tensorrt+anconda+pytorch-gpu+pycharm

一、显卡驱动安装 执行nvidia-smi查看安装情况 二、cuda安装 cuda官网下载cuda_11.6.2_510.47.03_linux.run&#xff0c;安装执行 sudo sh cuda_11.6.2_510.47.03_linux.run提升安装项&#xff0c;驱动不用安装&#xff0c;即第一项&#xff08;Driver&#xff09;&#xff…

Vue3拖拽功能【VueDraggablePlus】

一、介绍 由于 Sortablejs 的 vue3 组件一直没有更新&#xff0c;已经跟 vue3 严重脱节&#xff0c;所以诞生了这个项目&#xff0c;这个组件是基于 Sortablejs 的&#xff0c;所以如果你想了解更多关于 Sortablejs 的信息&#xff0c;可以查看Sortablejs 官网。VueDraggableP…

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

Vue3 使用图片涂鸦插件

一、安装插件 npm i toast-ui/vue-image-editor npm i tui-code-snippet npm i tui-image-editor Image-editor | TOAST UI :: Make Your Web Delicious! 官网介绍说是“凭借简单和美观的完美结合&#xff0c;图像编辑器是一个功能齐全的编辑器&#xff0c;非常适合日常使…

第五章---创建个人中心页面(下)

1. 整体框架 2. 前端页面布局 使用 bootstrap 的 grids system 进行布局。页面规划如下&#xff1a; 在 bootstrap 的网址搜索 grids system。 一行分为12份&#xff0c;左边3份&#xff0c;为头像&#xff1b;右边9份&#xff0c;白色区域 cards&#xff0c;加上按钮创建 bo…