Open vSwitch系列之一 Open vSwitch诞生

Open vSwitch系列之二 安装指定版本ovs

Open vSwitch系列之三 ovs-vsctl命令使用

Open vSwitch系列之四 ovs-ofctl命令使用

Open vSwitch系列之五 网桥特性功能配置

Open vSwitch系列之六 vlan隔离

Open vSwitch系列之七 meter表限速

OpenvSwitch系列之八 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的封装格式

本篇文章使用ovs搭建vxlan网桥,连接两个mininet构建的局域网。

实验环境:两台虚拟机 ubuntu1804桌面版+ubuntu1604桌面版+mininet

安装mininet

分别在两台机器上安装mininet

安装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

从github上拉取mininet源码

root@openlab:~# git clone git://github.com/mininet/mininet
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.

安装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!

验证安装

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

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

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

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

第一台机器配置

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

root@openlab:~/mininet/util# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.175.130 netmask 255.255.255.0 broadcast 192.168.175.255
inet6 fe80::20c:29ff:fe45:a8b7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:45:a8:b7 txqueuelen 1000 (Ethernet)
RX packets 247144 bytes 344597431 (344.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 74937 bytes 6024181 (6.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::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 0
TX packets 993 bytes 76788 (76.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@openlab:~/mininet/util# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.175.2 0.0.0.0 UG 100 0 0 ens33
192.168.175.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
192.168.175.2 0.0.0.0 255.255.255.255 UH 100 0 0 ens33

第二台机器配置

同样,记录第二台机器的ip地址和路由信息。

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.0
inet6 addr: fe80::b933:b350:fe27:b89a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:56351 errors:0 dropped:0 overruns:0 frame:0
TX packets:14943 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:76128903 (76.1 MB) TX bytes:1464272 (1.4 MB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:404 errors:0 dropped:0 overruns:0 frame:0
TX packets:404 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33728 (33.7 KB) TX bytes:33728 (33.7 KB)
root@ubuntu:~/mininet/util# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.175.2 0.0.0.0 UG 100 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
192.168.175.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33

创建隧道网桥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-ee1c0259472d
Bridge br-tun
Port br-tun
Interface br-tun
type: internal
ovs_version: "2.9.5"

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

root@openlab:~/mininet/util# ifconfig -a
br-tun: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 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 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.175.130 netmask 255.255.255.0 broadcast 192.168.175.255
inet6 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 0
TX packets 75331 bytes 6070686 (6.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::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 0
TX packets 993 bytes 76788 (76.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ovs-system: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 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 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

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

root@ubuntu:~/mininet/util# ifconfig -a
br-tun Link encap:Ethernet HWaddr 1e:66:43:f2:04:43
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions: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.0
inet6 addr: fe80::b933:b350:fe27:b89a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:56569 errors:0 dropped:0 overruns:0 frame:0
TX packets:15061 errors:0 dropped:0 overruns:0 carrier:0
collisions: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.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:404 errors:0 dropped:0 overruns:0 frame:0
TX packets:404 errors:0 dropped:0 overruns:0 carrier:0
collisions: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:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

转移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

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

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

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

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

ovs-vsctl add-port br-tun ens33

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

ovs-vsctl add-port br-tun ens33

启动mininet

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

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

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

修改主机IP地址

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

创建vxlan隧道

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

ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.175.128

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



查看创建好的隧道

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

ovs-vsctl add-port s1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.175.130



查看创建好的隧道

验证通信

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

在终端中ping 10.0.0.1



在终端中ping 10.0.0.2

抓取vxlan数据包

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

打开具体的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数据包。

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

总结

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

OpenvSwitch系列之八 vxlan隧道的更多相关文章

  1. OpenvSwitch系列之七 meter表限速

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  2. Open vSwitch系列实验(三):Open vSwitch的VxLAN隧道网络实验

    1 实验目的 该实验通过Open vSwitch构建Overlay的VxLAN网络,更直观的展现VxLAN的优势.在实验过程中,可以了解如何建立VxLAN隧道并进行配置,并实现相同网段和不同网段之间的 ...

  3. Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程

    原文:Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程 Red Gate系列之八 SQL Connect 1.1.1.19 ...

  4. 单元测试系列之八:Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

  5. OVS-----CentOS7上搭建基于Open vSwitch的VxLAN隧道实验

    一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...

  6. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  7. mongo 3.4分片集群系列之八:分片管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  8. WPF编游戏系列 之八 银行界面及金额校验

    原文:WPF编游戏系列 之八 银行界面及金额校验        在前面<WPF编游戏系列 之四 用户控件>一文中通过用户控件创建了"My Shop"中物品列表框.本篇继 ...

  9. OVS DPDK VXLAN隧道处理

    原文链接: OVS DPDK VXLAN隧道处理

随机推荐

  1. Python监控你的女朋友/男朋友每天都在看哪些网站

    需求: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提 ...

  2. 仅需1秒!搞定100万行数据:超强Python数据分析利器

    前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...

  3. 节点操作 - DOM编程

    1. 获取节点 1.1 直接获取节点 父子关系: element.parentNode element.firstChild/element.lastChild element.firstElemen ...

  4. Spring Boot 集成 Elasticsearch 实战

    最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES. 可以在 ES 官方文 ...

  5. java中ThrealLocal的理解

    目录 java中threadlocal的理解 一.threadlocal的生命周期和ThreadLocalMap的生命周期 二.ThreadLocal的作用 三.threadlocal示例 四.Inh ...

  6. C#LeetCode刷题之#441-排列硬币(Arranging Coins)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3995 访问. 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状 ...

  7. Android Studio Gradle build 报错:Received status code 400 from server: Bad Request

    错误提示如下 Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/ ...

  8. 精灵小巧的 Jsonpath 万精油:Snack3

    前几天和一个群里的朋友交流一个需求:在 Json 里像 XPath 一样找出节点,并修改值,然后输出新的Json. 很多人马上就会说,Jsonpath 啊. 是的 Jsonpath 确实能快速找出节点 ...

  9. 【源码】RocketMQ如何实现获取指定消息

    概要 消息查询是什么? 消息查询就是根据用户提供的msgId从MQ中取出该消息 RocketMQ如果有多个节点如何查询? 问题:RocketMQ分布式结构中,数据分散在各个节点,即便是同一Topic的 ...

  10. unity探索者之支付宝支付,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...