openflow流表项中有关ip掩码的匹配的问题(控制器为ryu)
一.写在前面
唉,被分配到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)的更多相关文章
- Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 软件定义网络基础---OpenFlow流表
一:流表 (一)流的概念 我们把同一时间经过同一网络中,具有某种共同特征或属性的数据,抽象为一个流 比如:我们将访问同一个地址的数据视为一个流 流一般是由网络管理员定义的,可以根据不同的流执行不同的策 ...
- [ovs] 编写openflow流表的文档指引
首先,openflow流表都是使用ovs-ofctl命令进行添加的. 1. 看 ovs-ofctl 的man手册 man ovs-ofctl 或者,这个地方也有:http://www.openvswi ...
- openflow流表分析(草稿)
OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...
- js中的IP格式正则匹配校验详解~
IPV4的格式为x:y:z:w,其中{x,y,z,w}属于{0~255}的正整数: 下面是其校验的正则表达式: function isIP(ip) { var re = /^(\d{1,2}|1\d ...
- openvswitch datapath 内核态流表创建过程(ovs_flow_cmd_new)
datapath流表更新的入口函数都定义在dp_flow_genl_ops中,流表创建的入口函数是ovs_flow_cmd_new函数,通过该函数,我们可以一窥流表相关信息的建立. 1.ovs_flo ...
- OpenFlow协议中如何提高交换机流表的匹配成功率
写在前面 这段时间一直在研究如何提高流表空间的利用率.一直没能想到好的idea.有一篇文献中比较了现有研究中提到的手段,在这里记录一下都有哪些类型的手段以及这些手段存在的不足.这些手段不仅局限于如何提 ...
- Openvswitch原理与代码分析(5): 内核中的流表flow table操作
当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行acti ...
- Floodlight中的临时流表
运行Floodlight,在Mininet中新建一个拓扑之后,并未添加相关的流表项,但是主机之间却可以相互通信.执行pingall操作,任意两个主机之间都能通.相当于没有任何路由表的路由器,它是怎么让 ...
随机推荐
- [Design Patterns] 01. Creational Patterns - Abstract Factory
设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...
- [C++]面向对象的程序设计——重要概念
1.面向对象程序设计的核心思想是数据抽象.继承和动态绑定.通过使用数据抽象可以将类的接口与实现分离:使用继承,可以定义相似的类型并对其相似的关系建模:使用动态绑定,可以在一定程度上忽略相似类型的区 ...
- 使用 .gitignore 忽略 Git 仓库中的文件
.gitignore 在Git中,很多时候你只想将代码提交到仓库,而不是将当前文件目录下的文件全部提交到Git仓库中,例如在MacOS系统下面的.DS_Store文件,或者是Xocde的操作记录,又或 ...
- shell判断文件目录或文件是否存在
1.文件描述符 -e 判断对象是否存在 -d 判断对象是否存在,并且为目录 -f 判断对象是否存在,并且为常规文件 -L 判断对象是否存在,并且为符号链接 -h 判断对象是否存在,并且为软链接 -s ...
- java通过代理创建Conncection对象与自定义JDBC连接池
最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...
- Git很麻烦?不存在的!掌握这几招就够了
废话不多说,下面直接开始了! 查看原文 确保代码库是最新的,先用这条命令把你的代码拉取到本地 git clone -- 修改完代码后,按顺序执行下面四个命令 git pull git add * /r ...
- jQuery常用方法(六)-jQuery 工具
JQuery Utilities 方法说明 jQuery.browser .msie 表示ie jQuery.browser.version 读取用户浏览器的版本信息 jQuery.boxModel ...
- 长短时记忆神经网络(LSTM)介绍以及简单应用分析
本文分为四个部分,第一部分简要介绍LSTM的应用现状:第二部分介绍LSTM的发展历史,并引出了受众多学者关注的LSTM变体——门控递归单元(GRU):第三部分介绍LSTM的基本结构,由基本循环神经网络 ...
- Gin框架介绍及使用
Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...
- ieTESTER浏览器使用ie6崩溃问题
打开浏览器在选项--internet属性--连接--局域网设置--将自动检测设置的对勾勾掉就可以 重启下浏览器