SDN 实现 vxlan隧道

SDN vxlan隧道

官方介绍
VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,是对传统VLAN协议的一种扩展。VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。VXLAN本质上是一种隧道技术,在源网络设备与目的网络设备之间的IP网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。

vxlan 是一种网络协议,将原始数据封装到UDP数据包中传输。vxlan被广泛应用到云计算网络环境中,耳熟能详的云计算框架openstack主要的网络架构就是vxlan,kubernetes也有vxlan的网络插件。vxlan 有许多优点,诸如:

  1. 连接两个局域网,可以将局域网内主机之间流量互通。就像是在局域网之间架起桥梁
  2. 支持隔离。vlan最多支持4096个隔离,而vxlan支持2的次方数32即 4294967296据隔离

vxlan的封装格式
img

本篇文章使用ovs搭建vxlan网桥,连接两个mininet构建的局域网。
实验环境:两台虚拟机 ubuntu1804桌面版+ubuntu1604桌面版+mininet

img

一、安装mininet

分别在两台机器上安装mininet

1.1安装git工具

root@ubuntu:~# apt install git
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:git-man liberror-perl
Suggested packages:git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs git-mediawiki git-svn
The following NEW packages will be installed:git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 406 not upgraded.
Need to get 3,932 kB of archives.
After this operation, 25.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

1.2从github上拉取mininet源码

root@openlab:~# git clone https://github.com/mininet/mininet.git
Cloning into 'mininet'...
remote: Enumerating objects: 9752, done.
remote: Total 9752 (delta 0), reused 0 (delta 0), pack-reused 9752
Receiving objects: 100% (9752/9752), 3.03 MiB | 1.35 MiB/s, done.
Resolving deltas: 100% (6472/6472), done.

1.3 安装mininet

mininet的安装是进入mininet/util目录中,然后执行 ./install -a-a表示安装全部的组件。mininet的安装可以有很多备选项。

root@openlab:~/mininet/util# ./install.sh -a
Detected Linux distribution: Ubuntu 18.04 bionic amd64
sys.version_info(major=3, minor=6, micro=7, releaselevel='final', serial=0)
Detected Python (python3) version 3
Installing all packages except for -eix (doxypy, ivs, nox-classic)...
Install Mininet-compatible kernel if necessary
.......
.......
.......
libtool: install: /usr/bin/install -c cbench /usr/local/bin/cbench
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/root/oflops/cbench'
make[1]: Leaving directory '/root/oflops/cbench'
Making install in doc
make[1]: Entering directory '/root/oflops/doc'
make[1]: Nothing to be done for 'install'.
make[1]: Leaving directory '/root/oflops/doc'
Enjoy Mininet!

1.4验证安装

安装完成之后,ovs会安装好,使用ovs-vsctl show命令,查看ovs版本

root@openlab:~/mininet/util# ovs-vsctl show
58cc7b02-ef48-4de7-a96b-ee1c0259472dovs_version: "2.9.5"

使用命令 mn 创建一个最小拓扑的环境。包括一个控制器,一个交换机,两个主机。
img

root@openlab:~/mininet/util# mn
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> 

二、配置vxlan

2.1第一台机器的配置信息(10.0.5.14)

记录下第一台机器的ip地址和路由信息,后面会使用这些信息。

在这里插入图片描述

2.2第二台机器的配置信息(10.0.5.15)

同样,记录第二台机器的ip地址和路由信息。
在这里插入图片描述

2.3创建隧道网桥br-tun

使用ovs创建一个网桥,叫做br-tun,该网桥后面会作为vxlan隧道的端点。两个虚拟机都需要创建。

root@openlab:~/mininet/util# ovs-vsctl add-br br-tun
root@openlab:~/mininet/util# 
root@openlab:~/mininet/util# ovs-vsctl show
58cc7b02-ef48-4de7-a96b-ee1c0259472dBridge br-tunPort br-tunInterface br-tuntype: internalovs_version: "2.9.5"

创建好br-tun之后,可以用ifconfig -a查看到这个设备

root@openlab:~/mininet/util# ifconfig -a
br-tun: flags=4098<BROADCAST,MULTICAST>  mtu 1500ether 26:c9:1f:49:4e:4e  txqueuelen 1000  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.175.130  netmask 255.255.255.0  broadcast 192.168.175.255inet6 fe80::20c:29ff:fe45:a8b7  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:45:a8:b7  txqueuelen 1000  (Ethernet)RX packets 247744  bytes 344644771 (344.6 MB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 75331  bytes 6070686 (6.0 MB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 993  bytes 76788 (76.7 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 993  bytes 76788 (76.7 KB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ovs-system: flags=4098<BROADCAST,MULTICAST>  mtu 1500ether 62:da:79:d8:d4:d3  txqueuelen 1000  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

img

第二台机器创建好的设备。

root@ubuntu:~/mininet/util# ifconfig -a
br-tun    Link encap:Ethernet  HWaddr 1e:66:43:f2:04:43  BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)ens33     Link encap:Ethernet  HWaddr 00:0c:29:a6:71:34  inet addr:192.168.175.128  Bcast:192.168.175.255  Mask:255.255.255.0inet6 addr: fe80::b933:b350:fe27:b89a/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:56569 errors:0 dropped:0 overruns:0 frame:0TX packets:15061 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:76151455 (76.1 MB)  TX bytes:1479464 (1.4 MB)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:404 errors:0 dropped:0 overruns:0 frame:0TX packets:404 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:33728 (33.7 KB)  TX bytes:33728 (33.7 KB)ovs-system Link encap:Ethernet  HWaddr 8e:fb:8e:a0:0c:e5  BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

img

2.4转移ens33 网卡的ip地址到br-tun上

将网卡上的ip地址转交给br-tun。从上一步可以看出br-tun和网卡其实是非常类似的,将其赋值ip地址就可以当做网卡使用。现在要做的是把虚拟机网卡的ip地址给br-tun。
增加路由信息。将ip地址转交给br-tun之后,路由信息也需要更新。ip地址和路由信息都要以实际的信息,在复制实验时不可直接使用我的。这也是为什么在前面记录ip信息和路由信息的原因。

ifconfig ens33 0 up
ifconfig br-tun 192.168.175.130/24 up
route add default gw 192.168.175.2

img

同样在第二台机器上完成同样的操作。

ifconfig ens33 0 up
ifconfig br-tun 192.168.175.128/24 up
route add default gw 192.168.175.2

img

2.5将网卡ens33作为端口添加到br-tun

因为ens33是流量出虚拟机的接口,所以最后流量还是肯定走ens33网卡出去。br-tun只是一个虚拟机的设备,要将ens33作为端口加入br-tun中

ovs-vsctl add-port br-tun ens33

img

同样在第二台机器上完成同样的操作。

ovs-vsctl add-port br-tun ens33

img

2.6启动mininet

使用命令mn启动一个最小拓扑的实验。创建的设备包括两个主机,h1,h2;一个交换机 s1

10.0.5.14:mn --mac --switch ovsk --controller remote
10.0.5.15:mn --mac --switch ovsk --controller=remote,ip=10.0.5.14,port=6653

img

使用ovs-vsctl show 可以看到环境中新增了一个交换机s1
img

同样在第二台机器上完成同样的操作。

2.7修改主机IP地址

上一步创建的mininet中两个主机的默认地址都是10.0.0.110.0.0.2,需要将第一台虚拟机中的mininet的主机的地址修改10.0.0.310.0.0.4。构建的环境如下:

img

img

2.8创建vxlan隧道

在交换机s1创建vxlan隧道。这一步是最关键的一步。

10.0.5.14:ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=10.0.5.15 options:key=flow

其中s1是创建隧道的网桥,remote_ip就是隧道另外一端机器的ip地址。
img
查看创建好的隧道
img

在第二台虚拟机上做同样的操作

10.0.5.15:ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=10.0.5.14 options:key=flow

img
查看创建好的隧道
img
15:ovs-vsctl add-port s1 vx1 – set interface vx1 type=vxlan options:remote_ip=10.0.5.14 options:key=flow

2.8Ryu控制器下发流表代码

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ether
from ryu.lib.packet import packet, ethernetclass FlowController(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super(FlowController, self).__init__(*args, **kwargs)@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_features_handler(self, ev):datapath = ev.msg.datapathofproto = datapath.ofprotoparser = datapath.ofproto_parser# 构建第一个流表项,匹配输入端口为1的数据包,设置tunnel ID为10,输出到端口4match1 = parser.OFPMatch(in_port=1)actions1 = [parser.OFPActionSetField(tunnel_id=10), parser.OFPActionOutput(4)]self.add_flow(datapath, match1, actions1)# 构建第二个流表项,匹配输入端口为4且tunnel ID为10的数据包,输出到端口1match2 = parser.OFPMatch(in_port=4, tunnel_id=10)actions2 = [parser.OFPActionOutput(1)]self.add_flow(datapath, match2, actions2)def add_flow(self, datapath, match, actions):ofproto = datapath.ofprotoparser = datapath.ofproto_parser# 构造流表项inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=match, instructions=inst)# 发送流表项到交换机datapath.send_msg(mod)if __name__ == '__main__':from ryu.cmd import managerimport syssys.argv.append('--ofp-tcp-listen-port')sys.argv.append('6653')manager.main()

2.10验证通信

在第一台虚拟机上打开h2。使用命令xterm h2可以打开mininet中h2的操作终端。
img

在终端中ping 10.0.0.1
img
img

在终端中ping 10.0.0.2
img

2.11抓取vxlan数据包

打开wireshark,监听br-tun隧道端点上的流量。可以看到目前流量就是ICMP
img

打开具体的icmp查看,与普通icmp有什么不同之处。正常icmp流量是icmp+网络层+数据链路层,而使用vxlan的icmp则是 icmp + 网络层 + 数据链路层 + vxlan报文头 + udp + 网络层 + 数据链路层。内层是10.0.0.3 ping 10.0.0.1的流量,这些流量被vxlan封装之后有外层包 192.168.175.130到192.168.175.128的UDP数据包。

img

最后看一下vxlan报文头的具体信息。里面包含了一个 vxlan network identity 即vni,就是类似与vlan tag的ID号。不同的ID号之间不可以通信。
img

三、总结

在两个交换机上配置了vxlan之后,就像是在s1和s1之间打通了隧道,跨越局域网的限制传输数据。逻辑上是如上,实际是流量是从 h1 -->s1-->br-tun -->ens33 -->ens33 -->br-tun -->s1 -->h1

img

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

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

相关文章

中途离开项羽投奔刘邦的那些名将谋臣,最后的结果怎么样?

刘邦夺取天下后&#xff0c;说&#xff1a;我自己没什么能力&#xff0c;之所以击败项羽&#xff0c;都是大家的功劳。带兵横扫强敌&#xff0c;我不如韩信&#xff1b;筹措粮草物资&#xff0c;源远不断地给前线供应粮饷&#xff0c;我不如萧何&#xff1b;坐在帐中&#xff0…

地平线旭日X3开发板编译USB网卡驱动 AX88772B

由于使用的激光雷达是网口输出的&#xff0c; 为了不占用X3派已有的网口&#xff0c;接上去了一个绿联的usb网卡&#xff0c; 发现系统没有驱动&#xff0c;所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B&#xff0c;去官网看了一下&#x…

记录用python跑csdn点赞接口

代码如下 # 导入request包 import requests # 请求URL URL3https://blog.csdn.net//phoenix/web/v1/article/like # 入参 data3{articleId:109552419} # 请求头 headers3{cookie:uuid_tt_dd10_30308678820-1713771851124-190368; loginbox_strategy%7B%22taskId%22%3A349%2C%2…

社交时代的象征:探索Facebook的文化影响

在当今社交媒体盛行的时代&#xff0c;Facebook作为其中的巨头之一&#xff0c;不仅是一个网络平台&#xff0c;更是社交文化的象征。本文将深入探讨Facebook在社交时代的文化影响&#xff0c;从用户行为到社会互动&#xff0c;从信息传播到文化交流&#xff0c;揭示其在塑造当…

穿越网络界限:探索NAT IPv4的神秘面纱

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 穿越网络界限&#xff1a;探索NAT IPv4的神秘面纱 前言NAT IPv4概述NAT IPv4的类型NAT IPv4的工作流程NAT IPv4的局限性和挑战 前言 在我们日常的网络使用中&#xff0c;我们或多或少都会遇到NAT&…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff0c;每套四十题选择题&#xff09;获取&#xff08;WX:…

计算机发展史故事【15】

PC 新霸主 IBM PC 个人电脑&#xff0c;为IBM 公司创造了本世纪最辉煌的业绩。想当初&#xff0c;IBM 公司仰仗PC 电脑的“开放”政策&#xff0c;公开技术标准&#xff0c;鼓励同业仿照&#xff0c;其目的当然是想尽快以PC 机取代苹果电脑的主流地位&#xff0c;占领全球市场。…

Java(二)——方法与数组

文章目录 方法与数组方法方法的定义方法的执行实参与形参方法重载方法签名 数组创建与初始化数组的类型数组应用转字符串排序查找&#xff08;二分&#xff09;填充拷贝判等 二维数组创建及初始化遍历本质和内存分布不规则二维数组 方法与数组 方法 什么是方法&#xff1f; …

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握&#xff0c; 一般编辑大文件&#xff0c;比较复杂的情况下&#xff0c; 我们还是使用Xftp工具&#xff0c; down下来再恢复回去。

AI绘画入门指南:完备的AI绘画学习路线,十分钟把你领进门

2024新风口大揭秘&#xff01;不是直播&#xff0c;也不是短视频&#xff0c;而是AI绘本&#xff01; 有一句话说得好&#xff1a;站在风口上&#xff0c;猪都能飞起来&#xff01;想要用AI拿到大结果&#xff0c;一定要选对大的垂类赛道。 那么&#xff0c;为什么是AI绘本呢…

第二证券股市策略:股票st连续跌停卖不出怎么办啊?

对于接连跌停的st股票买不出&#xff0c;投资者只能早早地挂出跌停托付单等着成交&#xff0c;在当天没有成交&#xff0c;其托付单会被撤销&#xff0c;投资者能够挑选进行隔夜托付卖出时&#xff0c;最好在证券公司清算之后&#xff0c;再进行托付卖出&#xff0c;否则&#…

低空经济之无人机

朋友们&#xff0c;今天来聊聊个超酷的话题——低空经济之无人机&#xff01; 无人机不仅让天空变得触手可及&#xff0c;还带来了无尽的商业可能&#xff0c;简直就是新时代的“空中小助手”啊&#xff01; 说到无人机&#xff0c;你们是不是也和我一样&#xff0c;脑海里立马…

详解JS的URL()和URLSearchParams() API接口

两个 API 接口定义 URL() 构造函数返回一个新创建的 URL 对象&#xff0c;表示由一组参数定义的 URL。 URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。 快速了解两个 API 在哪里用 以前我们要对地址栏中的 URL 地址进行分析处理&#xff0c;需要自己进…

【Mac】如何解决打开PD虚拟机后Mac无法上网的问题?

问题描述 部分用户在运行Parallels Desktop并打开Windows 11后&#xff0c;发现Windows上网没有问题&#xff0c;但是Mac主机不能访问带域名的网站&#xff0c;而访问带IP的网站没问题&#xff0c;退出Parallels虚拟机以后&#xff0c;Mac网络又恢复正常。 解决办法 退出 Pa…

在哪些地方能用到PMP认证?参加PMP培训怎么选择靠谱?

PMP认证在实际运用中比我们想象的作用要大得多&#xff0c;甚至涉及到了工作、生活各个方面&#xff0c;这其中主要是在工作方面发挥作用&#xff0c;帮助我们在项目管理相关岗位发挥更大的作用。 因为PMP认证是项目管理协会发起&#xff0c;考试也是针对专业项目管理人员的测…

Linux服务器中了病毒后的清理方法

病毒的基础排查 1. 检查计划任务 黑客入侵服务器后&#xff0c;为了让病毒脚本持续执行&#xff0c;通常会在计划任务配置文件里面写入定时执行的脚本任务。 检查命令说明ls -l /var/spool/cron/*查看用户级计划任务配置。有的人喜欢用 crontab -l 命令来排查&#xff0c;这…

探索设计模式的魅力:机器学习赋能,引领“去中心化”模式新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;机器学习赋能&#xff0c;引领“去中心化”模式新纪元 ✨欢迎加入…

商业银行总分支数据分发的核心问题是什么?如何解决?

银行业对一个国家至关重要&#xff0c;关乎国计民生。银行为我国经济建设分配资金&#xff0c;是社会再生产顺 利进行的纽带&#xff0c;它能掌握和反应社会经济活动的信息&#xff0c;为企业和政府作出正确的经济决策提供 必要的依据。通过银行&#xff0c;可以对国民经济各部…

三、安装node_exporter

目录 一、简介 二、下载安装 一、简介 Exporter是Prometheus的指标数据收集组件。它负责从目标Jobs收集数据&#xff0c;并把收集到的数据转换为Prometheus支持的时序数据格式。 和传统的指标数据收集组件不同的是&#xff0c;他只负责收集&#xff0c;并不向Server端发送数据…

Redis:常用数据结构

文章目录 常用数据结构Redis的编码方式查看方式 常用数据结构 Redis当中常用的数据结构如下所示&#xff1a; Redis在底层实现上述数据结构的过程中&#xff0c;会在源码的角度上对于上述的内容进行特定的优化&#xff0c;这样的优化的主要目的是为了实现出节省时间和节省空间…