一.写在前面

  唉,被分配到sdn安全方向,顶不住,顶不住,感觉搞不出来什么有搞头的东西。可若是让我水水的应付,我想我也是做不到的,世上无难事只怕有心人。好了,进入正题,本次要讨论的时一个比较细节的东西,在流表项中的有关ip掩码的问题。对了,本文适合于,有一定基础的openflow使用者,一点点就行。

二、问题描述

  若不是机缘巧合,我甚至完全不会注意到这个问题,为什么,咱来看一个平时实验环境中最为常见的流表项长啥样,如图1

  

                                                           图1 常见的流表项

  当我刚开始学习openflow的时候,我看到的就是这样的流表项,当时我一度以为“喔,这和路由表中的表项是不同的,连掩码都没有,sdn是新型网络的架构设计,应该抛弃了原来的网络架构,可能连掩码都不用使用了”。其实稍微深入想一想就可以发现这个想法根本占不住脚,从实际运用的角度,现在ip网根深蒂固,sdn若想要商业化,必须是要以融入ip网为前提,那么就肯定要考虑在传统网络中具有重大作用的ip掩码了,其次流表项里都有ip地址了,怎么可能不去考虑ip掩码的问题,若不考虑,跨网段通信如何解决?

  直到我在学习ryu防火墙的时候,这个问题的再次出现,才让我恍然大悟,也顺理成章的解决了它。现在来看一下在ryu的防火墙应用中看到的流表项,如图2:

  

                                                         图2 ryuf防火墙中的流表

  有没有觉得流表中的ip地址有些奇怪,对,确实挺奇怪的,但真正奇怪的点在于,这条流表项的产生使用的curl命令为:curl -X POST -d ’{“nw_src”:"10.0.0.1/8","nw_dst:"10.0.0.2/8"}‘ http://localhost:8080/firewall/rules/0000000000000001。没错,你没有看错curl命令中的10.0.0.1/8到达流表项后变为10.0.0.0/8了。先别急这考虑为什么,咱再做个实验,这次curl 的命令为curl -X POST -d curl -X POST -d ’{“nw_src”:"10.0.0.1/32","nw_dst:"10.0.0.2/32"}‘ http://localhost:8080/firewall/rules/0000000000000001,这个curl也是ryu官方文档中的样例,实验后流表项为图3

  

                 图3 ryuf防火墙中的流表

  图3中的流表项和curl中表达的一致,等等图3中的流表项是不是在哪见过?对,和最开始图1中的一样,接下来我们开始根据这三张图的内容进行分析

三、猜想与实验论证

  首先图3中的实验,我们使用的掩码是32位的,我是从未见过有32位的掩码,所以从这点可以看出这里的掩码与我们常见的路由表中的掩码肯定在概念上是有不同。其次我们再来看这个流表的效果,图1、3可以匹配的仅为源ip为10.0.0.1,目的ip为10.0.0.2的ip,而图2可以匹配的为10.0.0.0整个网段的主机,再考虑这是防火墙的应用,肯定是既需要同时考虑整个网段也需要考虑单独的主机。现在再来看看图2的流表是怎么得到的,curl中写的是10.0.0.1/8 再流表中变为10.0.0.0/8,是不是很像10.0.0.1与255.0.0.0想与得到的结果?

对,就是这样的,通过查看ryu的源码发现,就是将你所输入的ip源码和掩码做了与操作。在数据包到达ovs之后也是先与掩码做与操作,再和ip匹配。因此如果在防火墙应用阶段如果你想表达整个网段的的ip地址,就是用低于32的掩码即可,也就是说照常用,如果你仅仅只想表达两个主机间的禁止或允许,有两种表达方式,分别就是图1和图3,图1中是在curl中写的“10.0.0.1”,没有写掩码的位数,图3中是在curl中写的“10.0.0.1/32”,写的32位掩码,32位的掩码与任何ip与的结果都是其本身。

  能读到这的都是勇士。到现在不知你心里是否有个疑惑,不管你有没有,反正我是有。疑惑在于图1与图3,图1的curl语句没有写掩码在流表中的效果却和图3中写了32位掩码效果一样,这是不是意味着如果不写掩码,那么默认的掩码就是32位的?

不是这样的,如何证明这个结论,抓包。wireshark 抓取图1和图3控制器下发的flow-mod信息如图4和图5:使用的curl命令的ip地址分别位10.0.0.0和10.0.0.0/32

图4 无掩码的情况

    图5 32位掩码的情况

从图4和图5可以看出,是有个字段has mask 控制着是否使用掩码,在不使用掩码的时候,也是没有默认掩码这一说法,此时就是精确匹配。比如说在不使用掩码时curl中的ip地址你写的是10.0.0.0,就意味者只能匹配一台ip地址为10.0.0.0的主机,而不是匹配整个网段!

四、结论

1.掩码匹配的情况,总体可分为两种,使用掩码或者不使用,不使用掩码,并不是有默认掩码的存在。

2.在不使用掩码的时候,就是完全精确匹配,IP地址要一摸一样。

3.使用掩码时,无论是使用curl下发流表还是ovs中的流表匹配都是单纯的ip地址与掩码的与操作,所以会有32掩码的存在,32位的掩码就是想表达单个主机,若想表达网段就使用低于32位的掩码。

openflow流表项中有关ip掩码的匹配的问题(控制器为ryu)的更多相关文章

  1. Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  2. 软件定义网络基础---OpenFlow流表

    一:流表 (一)流的概念 我们把同一时间经过同一网络中,具有某种共同特征或属性的数据,抽象为一个流 比如:我们将访问同一个地址的数据视为一个流 流一般是由网络管理员定义的,可以根据不同的流执行不同的策 ...

  3. [ovs] 编写openflow流表的文档指引

    首先,openflow流表都是使用ovs-ofctl命令进行添加的. 1. 看 ovs-ofctl 的man手册 man ovs-ofctl 或者,这个地方也有:http://www.openvswi ...

  4. openflow流表分析(草稿)

    OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...

  5. js中的IP格式正则匹配校验详解~

    IPV4的格式为x:y:z:w,其中{x,y,z,w}属于{0~255}的正整数: 下面是其校验的正则表达式: function isIP(ip) { var re =  /^(\d{1,2}|1\d ...

  6. openvswitch datapath 内核态流表创建过程(ovs_flow_cmd_new)

    datapath流表更新的入口函数都定义在dp_flow_genl_ops中,流表创建的入口函数是ovs_flow_cmd_new函数,通过该函数,我们可以一窥流表相关信息的建立. 1.ovs_flo ...

  7. OpenFlow协议中如何提高交换机流表的匹配成功率

    写在前面 这段时间一直在研究如何提高流表空间的利用率.一直没能想到好的idea.有一篇文献中比较了现有研究中提到的手段,在这里记录一下都有哪些类型的手段以及这些手段存在的不足.这些手段不仅局限于如何提 ...

  8. Openvswitch原理与代码分析(5): 内核中的流表flow table操作

      当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行acti ...

  9. Floodlight中的临时流表

    运行Floodlight,在Mininet中新建一个拓扑之后,并未添加相关的流表项,但是主机之间却可以相互通信.执行pingall操作,任意两个主机之间都能通.相当于没有任何路由表的路由器,它是怎么让 ...

随机推荐

  1. Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    # 什么是 Room ? 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Archit ...

  2. [sonarqube的使用] sonarqube安装

    一 . SonarQube代码质量检查工具简介 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量 Sonar 不只是一个质量数据报告工具,更是代码质量管理平台 支持Java, C ...

  3. 从零开始使用 Webpack 搭建 Vue 开发环境

    创建项目 先创建一个空目录,在该目录打开命令行,执行 npm init 命令创建一个项目(无法执行 npm 命令?需要先安装 Node),这个过程会提示输入一些内容,随意输入就行,完成后会自动生成一个 ...

  4. python高级—— 从趟过的坑中聊聊爬虫、反爬以及、反反爬,附送一套高级爬虫试题

    前言: 时隔数月,我终于又更新博客了,然而,在这期间的粉丝数也就跟着我停更博客而涨停了,唉 是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋气一点. 那么最近到底咋不更新博客了呢?说 ...

  5. flask+layui+echarts实现前端动态图展示数据

    效果图: 该效果主要实现一个table展示数据,并在下方生成一个折线图. 实现方式: 1.首先需要对表格进行一个数据加载,这里用到了layui的table.render,具体用法可以参考 https: ...

  6. JAVA线程基础概念及使用

    一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...

  7. Maven 梳理 -聚合与继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  8. 每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM

    # 由来 在我们编写 Android 程序的时候,几乎永远逃避不了图片压缩的难题.除了应用图标之外,我们所要显示的图片基本上只有两个来源: 来自网络下载 本地相册中加载 不管是网上下载下来的也好,还是 ...

  9. .Net Core 商城微服务项目系列(五):使用Polly处理服务错误

    项目进行微服务化之后,随之而来的问题就是服务调用过程中发生错误.超时等问题的时候我们该怎么处理,比如因为网络的瞬时问题导致服务超时,这在我本人所在公司的项目里是很常见的问题,当发生请求超时问题的时候, ...

  10. Hbase入门(四)——表结构设计-RowKey

    Hbase的表结构设计与关系型数据库有很多不同,主要是Hbase有Rowkey和列族.timestamp这几个全新的概念,如何设计表结构就非常的重要. 创建 Hbase就是通过 表 Rowkey 列族 ...