建立ovs接口连接两个namespace组成二层网络

环境搭建拓扑

          br0
+--------------------------------------+
+--+ +--+
+---+ | tap1 tap2| +---+
| +--+ +--+ |
| | | |
| +--------------------------------------+ |
| |
| |
| |
| |
+------------------+ +-------------------+
| tap1 | | tap2 |
|192.168.1.102/24 | | 192.168.1.102/24 |
| | | |
| | | |
| | | |
| namespace ns1 | | namespace ns1 |
| | | |
+------------------+ +-------------------+

  

实现脚本:

ip netns add ns1
ip netns add ns2 ovs-vsctl add-br br0
ovs-vsctl add-port br0 tap1 -- set Interface tap1 type=internal ip link set tap1 netns ns1
ip netns exec ns1 ip link set dev tap1 up ovs-vsctl add-port br0 tap2 -- set Interface tap2 type=internal
ip link set tap2 netns ns2
ip netns exec ns2 ip link set dev tap2 up ip netns exec ns1 ip addr add 192.168.1.102/24 dev tap1
ip netns exec ns2 ip addr add 192.168.1.101/24 dev tap2 ip netns exec ns1 ip link set lo up
ip netns exec ns2 ip link set lo up
ip netns exec ns1 ping -c 4 192.168.1.102
ip netns exec ns1 ping -c 4 192.168.1.101

 

建立vlan二层网络

环境搭建拓扑

             br0                trunk vlan tag 10,11           br1
+------------------------+ +------------------------+
| | tag10 tag10 | |
| trunk_br0 +-----------------------+trunk_br1 |
| +-----------------------+ |
| | tag11 tag11 | |
|tap1 tap2 | | tap3 |
+------------------------+ +------------------------+
|tag 10 tag11| tag10|
| | |
| | |
192.168.1.101/24 | | 192.168.1.102/24 | 192.168.1.103/24
+-------+ +-------+ +-------+
| tap1 | | tap2 | |tap3 |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+-------+ +-------+ +-------+
ns1 ns2 ns3

  

环境实现脚本

ip netns add ns1
ip netns add ns2 ovs-vsctl add-br br0
ovs-vsctl add-port br0 tap1 -- set Interface tap1 type=internal ovs-vsctl set Port tap1 tag=10 ip link set tap1 netns ns1
ip netns exec ns1 ip link set dev tap1 up ovs-vsctl add-port br0 tap2 -- set Interface tap2 type=internal
ovs-vsctl set Port tap2 tag=11 ip link set tap2 netns ns2
ip netns exec ns2 ip link set dev tap2 up ip netns exec ns1 ip addr add 192.168.1.101/24 dev tap1
ip netns exec ns2 ip addr add 192.168.1.102/24 dev tap2 ip netns exec ns1 ip link set lo up
ip netns exec ns2 ip link set lo up ovs-vsctl add-br br1
ovs-vsctl add-port br1 tap3 -- set Interface tap3 type=internal ovs-vsctl add-port br0 trunk_br0 trunks=10,11 -- set Interface trunk_br0 type=patch options:peer=trunk_br1
ovs-vsctl add-port br1 trunk_br1 trunks=10,11 -- set Interface trunk_br1 type=patch options:peer=trunk_br0 ip netns add ns3
ip link set tap3 netns ns3
ip netns exec ns3 ip addr add 192.168.1.103/24 dev tap3
ip netns exec ns3 ip link set dev tap3 up
ovs-vsctl set Port tap3 tag=10 ip netns exec ns3 ping -c 4 192.168.1.101
ip netns exec ns3 ping -c 4 192.168.1.102

  

说明:

  • br0和br1两个交换机之间连接使用的是patch口,在创建时候需要指明peer(对端口)选项

  • ovs-vsctl add-port br0 trunk_br0 trunks=10,11  -- set Interface trunk_br0 type=patch options:peer=trunk_br1
    ovs-vsctl add-port br1 trunk_br1 trunks=10,11 -- set Interface trunk_br1 type=patch options:peer=trunk_br0

    br0和br1两个交换机之间连接在trunk口附加上tag10和tag11

  • 结论

    ns3:tap3:vlan10 能ping通ns1:tap1:vlan10 因为ns3和ns1属于同一个vlan;同时无法ping通ns2

ovs vlan报文转发原理探究

环境搭建拓扑

       first_ns         second_ns       third_ns
+-----------+ +-----------+ +-----------+
| | | | | |
| | | | | |
| | | | | |
| first_br | second_br | third_br|
+-----------+ +-----------+ +-----------+
10.0.0.4/24 10.0.0.5/24 | 10.0.0.6/24
| | |
| | |
|tag 10 | 无 tag | trunk 11,12
+------------------------------------------+
| first_br second_br third_br
| |
| br0 |
| |
+------------------------------------------+
| tag 10
|
|
|
|
|10.0.0.1/24
+------------+
| |
| |
| |
| |
+------------+
ns1

  

搭建网络脚本

ovs-vsctl add-br br0

ovs-vsctl add-port br0 first_br -- set Interface first_br type=internal
ovs-vsctl set Port first_br tag=10 ip netns add first
ip link set first_br netns first
ip netns exec first ip addr add 10.0.0.4/24 dev first_br
ip netns exec first ip link set dev first_br up ip netns add ns1
ovs-vsctl add-port br0 tap1 -- set Interface tap1 type=internal
ovs-vsctl set Port tap1 tag=10
ip link set tap1 netns ns1
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set dev tap1 up
ip netns exec ns1 ip addr add 10.0.0.1/24 dev tap1 ovs-vsctl add-port br0 second_br -- set Interface second_br type=internal ip netns add second
ip link set second_br netns second
ip netns exec second ip addr add 10.0.0.5/24 dev second_br
ip netns exec second ip link set dev second_br up ovs-vsctl add-port br0 third_br trunks=11,12 -- set Interface third_br type=internal ip netns add third
ip link set third_br netns third
ip netns exec third ip addr add 10.0.0.6/24 dev third_br
ip netns exec third ip link set dev third_br up

  

实验过程:
进入netns1,一直ping 10.0.0.4,在netns first、second、third分别抓包

实验记录

    • first抓取报文
    • root@controller-VirtualBox:~# ip netns exec first tcpdump  -n -e -i first_br arp
      tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
      listening on first_br, link-type EN10MB (Ethernet), capture size 262144 bytes
      15:47:54.636790 9a:03:f1:61:48:9d > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.4 tell 10.0.0.1, length 28
      15:47:54.636808 4e:cc:d6:5a:53:f4 > 9a:03:f1:61:48:9d, ethertype ARP (0x0806), length 42: Reply 10.0.0.4 is-at 4e:cc:d6:5a:53:f4, length 28

        

    • 抓到arp广播包

     second抓取报文

root@controller-VirtualBox:~# ip netns exec second tcpdump  -n -e -i second_br arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on second_br, link-type EN10MB (Ethernet), capture size 262144 bytes
15:49:40.345271 9a:03:f1:61:48:9d > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 46: vlan 10, p 0, ethertype ARP, Request who-has 10.0.0.4 tell 10.0.0.1, length 28

  

抓到arp广播包

third抓取报文

root@controller-VirtualBox:~# ip netns exec third tcpdump  -n -e -i third_br arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on third_br, link-type EN10MB (Ethernet), capture size 262144 bytes

  

没有抓到arp广播

结论

    • trunk port
      (1)这个port不配置tag,配置trunks,如果trunks为空,则所有的VLAN都trunk,也就意味着对于所有的VLAN的包,本身带什么VLAN ID,就是携带者什么VLAN ID,
      (2)如果没有设置VLAN,就属于VLAN 0,全部允许通过。
      (3)如果trunks不为空,则仅仅带着这些VLAN ID的包通过。
    • access port
      (1)这个port配置tag,从这个port进来的包会被打上这个tag,
      (2)从其他的trunk port中进来的本身就带有VLAN ID的包,如果VLAN ID等于tag,则会从这个port发出,
      (3)从其他的access port上来的包,如果tag相同,也会被forward到这个port。
      (4)从access port发出的包不带VLAN ID。
      (5)如果一个本身带VLAN ID的包到达access port,即便VLAN ID等于tag,也会被抛弃。

openvswitch概念补充

几个重要的概念

  • Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。
  • Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。
  • Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。
  • Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。
  • datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。
  • Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

openvSwitch 基本命令的更多相关文章

  1. Mongodb学习笔记二(Mongodb基本命令)

    第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...

  2. Linux基本命令(一)

    Linux基本命令 编辑器 vim编译器 Gnu工具链-gcc调试器 GDB操作系统是用C来写的 系统编程 (核心骨架 80%) 文件I/O 文件系统 进程{ 进程控制原语.进程间通信.进程间关系 信 ...

  3. vim基本命令

    vim基本命令     1.vim#在命令行中输入vim,进入vim编辑器2.i#按一下i键,下端显示 --INSERT--#插入命令,在vim中可能任意字符都有作用3.Esc#退出i(插入)命令进行 ...

  4. 使用openvswitch 和dnsmasq来实现虚拟机网络隔离

    openvswicth : 开源的网络虚拟化软件,可以划分vlan隔离虚拟机,做流量控制 dnsmasq:小心的dns,dhcp服务器 安装openvswicth wget  http://openv ...

  5. 【adb】adb基本命令总结

    adb常用基本命令如下: adb devices           列出你的devices aapt dump badging <file_path.apk>     查看包名 adb ...

  6. mysql 查看数据库、表的基本命令

    1:show databases; 查看所有的数据库,等同于select schema_name from information_schema.schemata\G.\G 替换;,以纵向报表的形式输 ...

  7. 用openvswitch配置跨节点的docker网络环境

    在一篇随笔中,我们已经尝试了在不依赖工具的情况下设置docker的ip,连我都想吐槽,MD单机都这么麻烦,在多机的环境中岂不是要了我的小命! 本文就是为了多机环境中各个节点的容器通信而做的,网络拓朴如 ...

  8. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  9. redis sentinel基本命令与参数

    1.redis基本命令1)获取sentinel的状态(1)info查看sentinel的状态(2)sentinel masters 获取sentinel中监控的所有master的节点(3)sentin ...

随机推荐

  1. firefox 之 event兼容写法

    event 在 IE 和 FF(Firefox) 中是不兼容的,IE 中可以直接使用 event 对象,而 FF 中则不可以,解决方法之一如下: var event = window.event || ...

  2. 2017/2/16:自己ajax+json习惯性写法 代码拼接的写法 +json用post提交乱码的原因

    1.先导入jquery的包 2.ajax的写法跟注意点 返回一个list的写法 代码拼接写法: html层: 2.script处 4:在你前面传递参数的时候没有遇到乱码问题的情况下,你使用json并且 ...

  3. 2016年3月31日_应化所群体Review

    Review目的: Phonegap的ble插件可以接收到设备发送的信息,但接收并在控制台显示的数据夏一鸣不知道是正确的数据,还是由于编码解码问题导致的乱码问题.此次Review要解决的问题即判断接收 ...

  4. sql相同项求和

    select (SELECT O2.ORG_NAME           FROM OUTSOURCE_ORG O2          where o2.org_id = oo.parent_id) ...

  5. 通用Mapper

    原理是:拦截器 1.假设:使用MyBatis只需要定义Mapper接口,无需编写Mapper.xml文件 如果实现无需编写Mapper.xml文件,我们必须要实现动态拼接SQL 如何实现动态拼接SQL ...

  6. java.lang.SuppressWarnings的注解简介

    简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告, ...

  7. 2018.12.31 NOIP训练 czy的后宫6(线性dp)

    传送门 题意简述:给一个nnn个数的数列,你可以把它最多分成mmm段,求每段数之和的最大值的最小值,以及满足这个最小值的时候划分数列的方案数. 思路:第一个问题是二分经典问题,不妨设其答案为limli ...

  8. mybatis LIKE

    <sql id="selectId"> `ID` AS id, `NAME` AS name, `DESCRIPTION` AS description, `TYPE` ...

  9. mysql重装之后 复制data

    (哇,编程小白的第一篇博客丫,激动) Q one:mysql需要重装,数据该怎么办. 方法一:数据表最好是导出成.sql文件,这样才比较安全. 方法二:直接copy了data文件:在mysql安装盘下 ...

  10. 在vue中没有数据的渲染方法

    1.例如在评论区中,评论一般分为两种形式,一种是有评论,一种是没有评论, 用v-if进行判断,判断的是评论的长度,此时评论的数据应为数组 2.可以computed中记性计算后进行数据的返回在用v-if ...