需求:

现有拓扑结构如下的网络结构(s1-s4为交换机,h1-h9为主机),现欲让单数主机(h1、h3、h5、h7、h9)之间互相能ping通,双数主机之间互相能够ping通,但单数和双数主机之间不能访问。

# 拓扑结构:
------------------------------------------------------
-------------------------s1---------------------------
---------------------/---|---\-------------------------
-----------------/-------|------\---------------------
--------------/----------|---------\------------------
------------/------------|------------\---------------
---------s2--------------s3--------------s4-----------
-------/--|--\---------/--|--\---------/--|--\--------
------h1--h2--h3------h4--h5--h6------h7--h8--h9------
------------------------------------------------------
------------------------------------------------------

OpenvSwitch实现分组

第一步,打开mininet 连接控制器

打开控制器

这里选择任意控制器均可,但是控制器要支持openflow1.3协议

打开mininet

mn --controller=remote,ip=127.0.0.1--mac --nat --topo=tree,depth=2,fanout=3 --switch ovs,protocols=OpenFlow13
  • –controller=remote,ip=127.0.0.1。指定了控制器为本地控制器
  • –topo=tree,depth=2,fanout=3。创建深度为2,度为3的树形结构的拓扑结构网络
  • –switch ovs,protocols=OpenFlow13。指定交换机为ovs,协议为OpenFlow1.3

第二步:

先在mininet里面pingall

用来生成初始流表

然后删除除了s1以外 其它控制器的流表

ovs-ofctl -O OpenFlow13 del-flows s2
ovs-ofctl -O OpenFlow13 del-flows s3
ovs-ofctl -O OpenFlow13 del-flows s4

第三步,添加流表:

自定义转发规则,单数主机和双数主机分别添加进入不同的VLAN组内,交换机分发报文时根据来源的组判断发往的端口。

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

含义:
从sx的in_port对应的机器分到set_field/vlan_id,通过4号口(对应s1)发出去
来自dl_vlan的数据包发送给output端口。

测试

目前存在的问题:

同一个交换机内部的组内总是ping不通,例如s2下的h1和h3 ping不通
可以通过继续添加流表(交换机内部节点之间的转发规则)解决

改进:实现VLAN

经过分析可知上述方法会阻断不同组之间的所有流量,而VLAN的目的是阻断广播流量而不阻断单播流量。
故对上述方法进行改进:增加流表的过滤条件的dl_dst字段,过滤出dl_dst=FF:FF:FF:FF:FF:FF的分组即广播分组,对此类分组做处理使其只能转发给特定的组。

操作步骤:

和上述方法类似,只是不用删除原始流表。

要添加的流表如下:


# s1
ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=1,actions=output:1,output:2,output:3
ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=2,actions=output:1,output:2,output:3
ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=3,actions=output:1,output:2,output:3# s2
ovs-ofctl -O OpenFlow13 add-flow s2 priority=10,in_port=1,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4,output:3
ovs-ofctl -O OpenFlow13 add-flow s2 priority=10,in_port=2,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4
ovs-ofctl -O OpenFlow13 add-flow s2 priority=10,in_port=3,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4,output:1
ovs-ofctl -O OpenFlow13 add-flow s2 priority=10,dl_vlan=0,actions=pop_vlan,output:1,output:3
ovs-ofctl -O OpenFlow13 add-flow s2 priority=10,dl_vlan=1,actions=pop_vlan,output:2# s3
ovs-ofctl -O OpenFlow13 add-flow s3 priority=10,in_port=1,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4,output:3
ovs-ofctl -O OpenFlow13 add-flow s3 priority=10,in_port=2,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4
ovs-ofctl -O OpenFlow13 add-flow s3 priority=10,in_port=3,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4,output:1
ovs-ofctl -O OpenFlow13 add-flow s3 priority=10,dl_vlan=1,actions=pop_vlan,output:1,output:3
ovs-ofctl -O OpenFlow13 add-flow s3 priority=10,dl_vlan=0,actions=pop_vlan,output:2# s4
ovs-ofctl -O OpenFlow13 add-flow s4 priority=10,in_port=1,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4,output:3
ovs-ofctl -O OpenFlow13 add-flow s4 priority=10,in_port=2,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:4
ovs-ofctl -O OpenFlow13 add-flow s4 priority=10,in_port=3,dl_dst=FF:FF:FF:FF:FF:FF,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:4,output:1
ovs-ofctl -O OpenFlow13 add-flow s4 priority=10,dl_vlan=0,actions=pop_vlan,output:1,output:3
ovs-ofctl -O OpenFlow13 add-flow s4 priority=10,dl_vlan=1,actions=pop_vlan,output:2

测试

首先安装Scapy用于发送报文

sudo apt-get install scapy -y
# 或者去官网下载源码安装

连接mininet测试连通性

见下图

添加流表并测试VLAN

添加流表,然后pingall测试,可见节点之间仍然是通的。

后台打开h5,h6的xterm,启动wireshark对h1抓包(s2-eth1)。

# mininet输入:
h5 xterm &
h6 xterm &

h5,h6分别利用scapy发送arp报文,内容如下:

# sendp()来构造二层报文
# 这里构造了一个源MAC地址为00:00:00:00:00:05, 源IP地址为10.0.0.5, 目标MAC地址为ff:ff:ff:ff:ff:ff,目标IP地址为10.0.0.88(不存在),payload为i am cheney的ARP报文,该报文将从h5-eth0网卡发出。
sendp(Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc = '00:00:00:00:00:05', psrc = '10.0.0.5', hwdst = 'ff:ff:ff:ff:ff:ff', pdst = '10.0.0.88') / 'i am cheney', iface='h5-eth0')
# 下面类似
sendp(Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc = '00:00:00:00:00:06', psrc = '10.0.0.6', hwdst = 'ff:ff:ff:ff:ff:ff', pdst = '10.0.0.88') / 'i am cheney', iface='h6-eth0')   

可见h1能够收到h5的arp报文,但是收不到h6 的,可见VLAN起了作用,测试结束。

OpenvSwitch实现简单VLAN相关推荐

  1. 网络管理员比赛回顾01-基本操作和简单vlan

    目录 一.模拟器eNSP 二.基本操作 三.配置IP地址 四.VLAN 一.模拟器eNSP 使用eNSP模拟器,来源于网络上的安装包,学习一个.基本操作就不多说了,在实践里慢慢记录 二.基本操作 认识 ...

  2. Openvswitch手册(5): VLAN and Bonding

    我们这一节来看Port 一般来说一个Port就是一个Interface,当然也有一个Port对应多个Interface的情况,成为Bond VLAN Configuration Port的一个重要的方 ...

  3. 单主机Docker容器VLAN划分

    2 单主机Docker容器VLAN划分 pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分.下面,就来简单 ...

  4. Docker(二十三)-Docker使用pipework配置本地网络

    需求 在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求.要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了. 下 ...

  5. 网络编程(三)数据链路相关知识

    数据链路,指OSI参考模型中的数据链路层,有时也指以太网.无线局域网等通信手段. 各个设备之间在数据传输时,数据链路层和物理层都是必不可少的.数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范 ...

  6. Try kolla-ansible (by quqi99)

    版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (作者:张华 发表于:2021-07-18) 1, virt-manager中创建一个名为cloud的netwo ...

  7. vlan的简单配置(附图)

    目录 一 VLAN是什么? vlan实现的原理 vlan的划分方式 vlan id的范围和数量 二 静态vlan的创建步骤 先对三台PC配置IP和子网掩码 IP不可重复 配置交换机 三条必打命令 创建 ...

  8. VLAN是什么?VLAN基础知识精讲简单易懂

    VLAN简介 定义: VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术.VLAN内的主机间可以直接通信,而VLAN间 ...

  9. 构建简易网络与网络设备的简单配置(Cisco Packet Tracer)第一弹:交换机VLAN配置

    配置简单的网络,作为网络实验课的内容,虽然很简单,我觉得也是有必要把它写下来的(况且实验报告册还没写呢).这也就当做实验报告的前奏了... 对网络以及交换机的配置都是在思科的Cisco Packet ...

  10. Openstack组件实现原理 — OpenVswitch/Gre/vlan

    目录 目录 前文提要 Neutron 管理的网络相关实体 OpenVswitchOVS OVS 的架构 VLan GRE 隧道 Compute Node 中的 Instance 通过 GRE 访问 P ...

最新文章

  1. AI一分钟|美团确认收购摩拜;特斯拉今年第一季度产量创历史新高
  2. JavaXml教程(一)简介
  3. 【PAT甲级 链表去重】1097 Deduplication on a Linked List (25 分) C++ 全部AC
  4. 云+X案例展 | 电商零售类:WakeData助力叁拾加数字化变革
  5. JavaScript的Array对象使用(1)
  6. 区块链java开发教程,JAVA区块链项目实战视频课程
  7. 试简述smtp通信的三个阶段的过程_POP3_SMTP_IMAP初步介绍
  8. 线性地址转换物理地址
  9. HTMLdiv标签滑条
  10. 第二期腾讯AI加速器将面向全球招募AI创业者
  11. 台式计算机启动时 每次按f1,开机按f1的解决方法_电脑开机每次都要按F1,怎么解决...
  12. GWAS研究和多基因评分
  13. Java微服务+分布式+全栈项目(一)---->项目介绍+MyBatis-Plus入门
  14. ELK7.1.1之插件安装
  15. 【软件】[Qt\C++] 冒泡、希尔、堆排、基数、快排 5种排序Gui界面带对比——使用Qt实现
  16. redux和react-redux
  17. 如何将项目使用docker分块部署
  18. 解决LVM和硬盘PVID问题
  19. 头歌实训平台Python
  20. exit status 1: ‘D:\Program’ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���

热门文章

  1. 【转载】快逸报表问题
  2. 父与子学编程python_Python入门《父与子的编程之旅第2版》+《教孩子学编程Python语言版》...
  3. Excel数据转化为sql脚本
  4. 让chrome浏览器支持ajax跨域
  5. 推荐系统实践--第七章:推荐系统实例 第八章:评分预测问题
  6. 畅管进销存管理系统 v6.0
  7. 阿里java高级面试题
  8. fseek函数与ftell函数使用例程
  9. 【英雄联盟动画-双城之战】10点首播!6亿召唤师快来
  10. 用python做计算器(超级版)