基于OVS的VLAN虚拟化简易实践方案

前言

本实验基于ovs的vlan流表匹配,根据端口进行vlan标签插入。手工配置ovs,使其具有vlan虚拟化方案。

实验拓扑

 ----                                               ----
| h1 |---- ---------- ---------- ----| h4 |
---- |__1| | | |1__| ----
---- | | | | ----
| h2 |------2| s1 |4-----4| s2 |2------| h5 |
---- __3| | | |3__ ----
---- | | | | | | ----
| h3 |---- ---------- ---------- ----| h6 |
---- ----

实验目标

在给定实验拓扑情况下,用vlan得到下列虚拟网段

  • h1--h4为一个vlan_id 0 网段
  • h2--h5为一个vlan_id 1 网段
  • h3--h6为一个vlan_id 2 网段

实验工具

  • mininet
  • 控制器RYU
  • OVS

实验过程

实验拓扑的搭建

from mininet.topo import Topo

class MyTopo(Topo):

    def __init__(self):

        # initilaize topology
Topo.__init__(self) # add hosts and switches
host1 = self.addHost('h1')
host2 = self.addHost('h2')
host3 = self.addHost('h3')
host4 = self.addHost('h4')
host5 = self.addHost('h5')
host6 = self.addHost('h6') switch1 = self.addSwitch('s1')
switch2 = self.addSwitch('s2')
# add links
self.addLink(host1, switch1, 1, 1)
self.addLink(host2, switch1, 1, 2)
self.addLink(host3, switch1, 1, 3)
self.addLink(switch1, switch2, 4, 4)
self.addLink(host4, switch2, 1, 1)
self.addLink(host5, switch2, 1, 2)
self.addLink(host6, switch2, 1, 3) topos = {'mytopo': (lambda: MyTopo())}

mininet的启用

sudo mn --custom your_topo.py --topo mytopo --mac --switch ovsk,protocols=OpenFlow13 --controller remote

ryu收集数据包的应用及启动(可以帮忙做debug)

#-*- coding: UTF-8 -*-
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.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
import logging class PeiQiaoWang_controller(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] def __init__(self, *args, **kwargs):
super(PeiQiaoWang_controller, self).__init__(*args, **kwargs) @set_ev_cls(ofp_event.EventOFPFeaturesRequest)
def switch_features_handle(self, ev):
logging.debug("ing")
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
print msg, datapath, ofproto, parser #handshake系列 #OFPFeaturesRequest_由控制器发送 #OFPSwitchFeatures
@set_ev_cls(ofp_event.EventOFPSwitchFeatures)
def switch_switch_feature_handle(self, ev):
print "go"
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
print "msg=", msg
# print "msg.datapath_id=", msg.datapath_id
# print "datapath=", datapath
# print "ofproto=", ofproto
# print "parser=", parser #Switch Configuration系列 #OFPSetConfig @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handle(self, ev):
logging.info("packetin")
msg = ev.msg
print ev.msg
in_port = msg.match['in_port']
pkt = packet.Packet(msg.data)
print pkt.protocols
print type(pkt.protocols)
# print pkt.data
# print type(pkt.data)
# print pkt.ethernet.dst_ip
print type(pkt[1])

启动:ryu-manage --obeserve-links ./your_app.py

OVS流表手动下发

s1:

sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=3,actions=push_vlan:0x8100,set_field:4098-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=2,actions=pop_vlan,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=0,actions=output:controller

s2:

sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=3,actions=push_vlan:0x8100,set_field:4098-\>vlan_vid,output:4
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=2,actions=pop_vlan,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=0,actions=output:controller

tip:

上述流表有一个较坑的地方,就是下发添加vlan标签的地方。我们可以看一下vlan标签的构造:

而我们的下发的流表

sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4中set_field确是指定的4096

原因:其实这里的set_field的值是设置TCI的值,并不是VLAN ID的值,4096其实它的VLAN ID就为0,其中CFI位要置位1,这是由于OVS规定该位一定要为1,而OpenFlow标准并没有指示,其为一个保留字段,但是也有很多OpenFlow交换机指定了该位一定要为1才能生效。

实验结果

可观察得mininet中的pingall情况

ryu中收到的未匹配的包情况,收到了几个莫名其妙的ipv6包,我也迷茫

实验总结

感受到了普通网工,一台台机器配置过去的麻烦。

基于OVS的VLAN虚拟化简易实践方案的更多相关文章

  1. 基于 koajs 的前后端分离实践

    一.什么是前后端分离? 前后端分离的概念和优势在这里不再赘述,有兴趣的同学可以看各个前辈们一系列总结和讨论: 系列文章:前后端分离的思考与实践(1-6) slider: 淘宝前后端分离实践 知乎提问: ...

  2. 干货 | 博云基于OVS自研容器网络插件在金融企业的落地实践

    本文根据博云在dockerone社区微信群分享内容整理 过去几年博云在企业中落地容器云平台遇到了很多痛点,其中一个比较典型的痛点来自网络方面,今天很高兴跟大家聊聊这个话题并介绍下我们基于OVS自研的C ...

  3. 基于Github Actions + Docker + Git 的devops方案实践教程

    目录 为什么需要Devops 如何实践Devops 版本控制工具(Git) 学习使用 配置环境 源代码仓库 一台配置好环境的云服务器 SSH远程登录 在服务器上安装docker docker技术准备工 ...

  4. 容器网络插件那么多,博云为什么基于OVS深度自研?

    背景 从2015年开始,博云开始基于Kubernetes和容器帮助客户交付应用管理平台.在开始阶段,博云选择了业界使用度非常广泛且成熟稳定的calico作为默认的网络方案并在calico方面积累了大量 ...

  5. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  6. 【原】【BG】-一次虚拟化环境实践简要记录

    部分涉及到Linux.Nginx.tomcat.MySQL等的点滴操作记录,时间长了,就忘掉了,偶尔整理一下操作的history,就此简要备份一下: [原][BG]-一次虚拟化环境实践简要记录: ht ...

  7. 网易云基于 Kubernetes 的深度定制化实践

    本文由  网易云发布. 2017 年,Kubernetes 超越 Mesos 和 Docker Swarm成为最受欢迎的容器编排技术.网易云从 2015 下半年开始向 Kubernetes 社区贡献代 ...

  8. 阿里云基于OSS的云上统一数据保护方案2.0技术解析

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...

  9. 阿里云基于OSS的云上统一数据保护方案2.0正式发布

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源.阿里云基于O ...

随机推荐

  1. vue2.0模拟锚点

    在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...

  2. android 登录效果

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  3. Postman-自动化传参

    一,自动化传参 在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要 ...

  4. 打印lua中全局变量的一段代码

    function printTableItem(k, v, level) , level do io.write(" ") end io.write(tostring(k), &q ...

  5. Python2.7-gzip

    gzip模块,提供了简单的压缩和解压缩文件的接口,和 GNU 程序的 gzip 和 gunzip 类似,数据压缩是通过 zlib 模块实现的 1.模块的类: gzip.GzipFile([filena ...

  6. 《Java程序设计》第2周学习总结(Markdown语法修改版)

    20175105 2018-2019-2 <Java程序设计>第2周学习总结 Vim操作的一些总结 这些天通过学习,对于vim的操作有了很大的提升,下面我把vim的比较常见的操作方式做了归 ...

  7. 浅谈 MVC 和 MTV

    浅谈 MVC 和 MTV 一.MVC M:model,模型,就是数据模型,负责数据的存取: V:view,视图,负责页面的展示逻辑: C:controller,控制器,负责业务逻辑的处理: 二.MTV ...

  8. “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生

    错误提示: “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理. 发现不明确的匹配. 问题原 ...

  9. 【甘道夫】CDH5.2的Maven依赖

    之前一直结合Maven开发Hadoop2.2.0的程序.环境换成CDH5.2后报错,发现是Maven依赖库的问题. 之前一直使用 http://mvnrepository.com/ 查找maven依赖 ...

  10. 领域驱动设计理解&总结

    领域驱动设计理解&总结 这篇文章主要是通读<实现领域驱动设计>之后自己的理解和总结(同时也参照一些博文的分析来加深自己的理解): 有些疑问是自定义内容,虽然有自己的理解,但依然感觉 ...