zoukankan      html  css  js  c++  java
  • OpenvSwitch系列之四 ovs-ofctl命令使用

    Open vSwitch系列之一 Open vSwitch诞生 

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

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

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

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

    Open vSwitch系列之六 vlan隔离

    Open vSwitch系列之七 meter表限速

    ovs-ovofctl 命令是对流表的操作,包括对流表的增,删,改,查等命令。简单来说流表类似于交换机的MAC地址表,路由器的路由表,是ovs交换机指挥流量转化的表。

      

    说到流表就不得不说控制器。控制器是给交换机下发流表的设备,最常见的控制器是OpenDaylight,简称ODL,下面首先安装一个ODL控制器,看看控制器给交换机下发的原汁原味的流表是怎么样的。

    一、安装 ODL控制器

    1.安装java

    apt install openjdk-8-jdk

    2.配置环境

    vim /etc/environment ,进入环境变量配置文件,在第二行加入java的环境变量。

    JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

     

    3.下载ODL编译好的文件   

    wget https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.6.4-Carbon/distribution-karaf-0.6.4-Carbon.tar.gz

     

     

     4.解压文件

    tar zvxf distribution-karaf-0.6.4-Carbon.tar.gz

    5.配置文件

    简单配置ODL的运行文件

     /etc/org.apache.karaf.management.cfg 

    6.开启ODL控制器 

     7. 安装必要的插件。

    全新的ODL只有核心插件,还需要web 页面,openflow支持等插件。 

    opendaylight-user@root>feature:install odl-restconf
    opendaylight-user@root>feature:install odl-l2switch-switch-ui
    opendaylight-user@root>feature:install odl-openflowplugin-flow-services-ui
    opendaylight-user@root>feature:install odl-mdsal-apidocs
    opendaylight-user@root>feature:install odl-dluxapps-applications
    opendaylight-user@root>feature:install odl-faas-all

     

    8.查看端口验证ODL是否启动成功

    当ODL启动成功之后会监听在6633端口,监听交换机的连接。如果6633端口有监听,那就说明ODL启动是正常的

    sudo netstat -anput | grep 6633

    二、连接控制器   

    这个命令是不是很熟悉呢?对的,这个命令就是上一篇 ovs-vsctl 命令 中最后一个命令,交换机连接控制器的命令。

     ovs-vsctl set-controller br-test tcp:127.0.0.1:6633

    连接上控制器之后我们来看看有什么变化。在网桥br-test下多了一个controller设备信息,包括一个状态 is_connected:true,这个状态标志这连接成功,如果没有这个状态说明交换机并没正真的连接到控制器上。

    当交换机连接上控制器之后,有没有好奇控制器会给交换机发送什么流表呢?发送的流表就是如下啦:

     

    上面的命令是交换机查看流表的命令  ovs-ofctl dump-flows br-test ,这个命令和ovs-vsctl show 命令是使用频率最高的两个命令,一定要记住的。那么这两条流表是什么意思呢?我们逐个分析:

    在分析之前简单介绍一个流表的组成,一个最简单的流表由3部分组成,分别是:匹配项  ,动作 ,计数器。

    匹配项:用来匹配流量的特征,例如传统交换机能够根据mac地址转发,路由器能够根据ip地址转发。mac,ip都是流量的特征。

    动作:动作是匹配项匹配到数据之后采取的动作,包括转发和丢弃这两个最常见的动作。

    在OpenStack的ovs交换机中,流表是这样的:

     可以看到in_port=1是一种匹配项,actions指明了转发动作。

     对于以上两条流表来说转发动作分别是CONTROLLER:65535 转发给控制器,drop 丢弃流表。那么这两个动作是怎么执行呢?以上两个流表都没有匹配项就是说默认匹配进入的所有的流量。一个转发,一个丢弃,到底执行谁呢?这个根据优先级来选择,priority 是优先级,作用是优先级越高,流表越先执行。所有第一条:actions=CONTROLLER:65535 发挥效果。其实这也符合常识,交换机里没有流表,所以进入的流表都要交给控制器,让控制器去完成计算和流表下发。

    三、手动下发流表

    流表(低版本)可以匹配OSI模型的1层至4层,如下图所示,对匹配到的流表做转发、丢弃或者更复杂的操作。具体的匹配项如下图所示:

     

    下发流表的命令,需要加上匹配项和动作,可以匹配到上面提到1~4层。

    ovs-ofctl add-flow 

    1.第一层:入端口

    in_port 表示入端口,匹配到之后的actions是output:2, 意思是从2端口转发出去。

    使用命令来查看刚刚下发的流表,可以在交换机中找到。 

    ovs-ofctl dump-flows br-test

    2.第二层:匹配MAC地址

    匹配mac地址的关键字是:

    dl_src :源mac地址

    dl_dst :目的mac地址

    然后转发actions=output:2 从2端口转发出去

     

    查看流表下发是否成功: 

     

     3.第三层:匹配IP地址 

    匹配网络层ip地址比匹配入端口和mac地址要复杂一些。因为网络层中除了IP协议外还有ICMP,IGMP等,所以需要指定匹配的是网络层中的哪一种协议。

    匹配方式:

    协议: dl_type=0x0800 或者 ip   表明是用于匹配哪一种协议

    nw_src: 源ip地址

    nw_dst: 目的ip地址

    dl_type = 0x0800 

    ip

     

    更多匹配字段:

    字段名称  说明
     in_port=port 传递数据包的端口的 OpenFlow 端口编号
    dl_vlan=vlan 数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包
    dl_vlan_pcp=priority VLAN 优先级,改值取值区间为[0-7]。数字越大,表示优先级越高。

    dl_src=<MAC>
    dl_dst=<MAC>  

    匹配源或者目标的 MAC

    地址01:00:00:00:00:00/01:00:00:00:00:00 代表广播

    地址00:00:00:00:00:00/01:00:00:00:00:00 代表单播

    dl_type=ethertype 

    匹配以太网协议类型,其中:
    dl_type=0x0800 代表 IPv4 协议
    dl_type=0x086dd 代表 IPv6 协议
    dl_type=0x0806 代表 ARP 协议

    nw_src=ip[/netmask]

    nw_dst=ip[/netmask]

    当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址,可以使 IP 地址或者域名 
    nw_proto=proto  和 dl_type 字段协同使用。

    当 dl_type=0x0800 时,匹配 IP 协议编号
    当 dl_type=0x086dd 代表 IPv6 协议编号

    table=number

    指定要使用的流表的编号,范围是 0-254。

    在不指定的情况下,默认值为 0 通过使用流表编号,可以创建或者修改多个 Table 中的 Flow

    reg<idx>=value[/mask]

    交换机中的寄存器的值。

    当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值 

    tp_src=number TCP/UDP/SCTP 源端口
    tp_dst=number  TCP/UDP/SCTP 目的端口
     

    四、删除流表

    流表不仅要会添加,同时也要会删除。删除流表的命令是:ovs-ofctl del-flows  + 网桥 + 匹配条件

    匹配条件一:入端口

    匹配条件二:源ip地址。删除去往 114.114.114.114 的流表 

    想要使用ovs交换机,知道了vsctl以及ofctl这两个命令之后基本上就能上手了,但作为对ovs交换机的深入学习到现在为止也才入门而已,下面还会有更复杂但更强大的命令使用介绍和原理介绍。更复杂,更强大?怎么感觉是在说:我变强了,也变秃了!

  • 相关阅读:
    438. Find All Anagrams in a String
    406. Queue Reconstruction by Height
    581. Shortest Unsorted Continuous Subarray
    416. Partition Equal Subset Sum
    124. Binary Tree Maximum Path Sum
    240. Search a 2D Matrix II
    160. Intersection of Two Linked Lists
    6. ZigZag Conversion
    iOS tableView 数据处理,数据分类相同数据整合、合并计算总数总价
    iOS 讯飞语音测试没问题,一上线就用不了了
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/11720310.html
Copyright © 2011-2022 走看看