《图解OpenFlow》读书笔记(2)——Openflow的动作示例
此处,介绍三种常用简单的OpenFlow动作示例,当然这些都是通过设置流表实现的,感觉挺有意思的,可用于启发之后的一些研究需要。
书中主要介绍了3种功能,分别是流表对数据包的转发控制、复制、修改等三个操作。
1. 流表实现转发功能
图1中所示的是由IPv4地址为192.168.0.1的PC和IPv4地址为192.168.0.2的PC构成的OpenFlow网络。
假设PC A的IPv4地址为196.168.0.1, OpenFlow 交换机B上连接的PC B的IPv4地址为198.168.0.2。 在该示例中,我们要将来自PC A的ICMP Echo Request和来自PC B的ICMP Echo Reply通过不同的路径转发出去。
这种动作很好实现,场景中,PC A 发送ICMP包给 PC B。
实现该动作的设置方法有多种,例如下面的这个设置方法,例如,控制器通过流表给3个交换机下发如下流表:
(1)在交换机A中,将发往192.168.0.2 的数据包转发至OpenFlow交换机B,将发往192.168.0.1 的数据包转发至PC A;
(2)在交换机B中,将发往192.168.0.2的数据包转发至PC B,将发往192.168.0.1的数据包转发至OpenFlow交换机C;
(3)在交换机C中,将发往192.168.0.1的数据包转发至OpenFlow交换机A;
Opinion:流表实现转发功能是最基本的功能,也是最常用的功能,用于控制交换机对数据流的转发处理。
2. 流表实现数据包复制功能
在图2的示例中,OpenFlow 交换机A复制来自PC A的ICMP EchoRequest,同时将其发往OpenFlow交换机B和OpenFlow交换机C。OpenFlow交换机B将ICMP Echo Request转发至PC B, OpenFlow 交换机C则将其转发至PC C。PC B和PC C分别返回ICMP Echo Reply,因此PCA每发送1个ICMP Echo Request后,将收到2个响应。
要想实现该示例动作需将PCB和PCC的以太网地址设置为相同的,这是因为如果PC A发送数据时的目标以太网地址与接收方地址不同的话,接收方的PC将无法收到数据包。
如上所示,,强行设置多个相同IPv4地址的方法虽然略显极端,但通过使用OpenFlow,可构建以往很难实现的网络。
Opinion:流表实现数据包的复制功能,是一个比较有意思的操作。此功能可被恶意攻击者利用来进行数据包重放攻击,或者数据包端口洪泛攻击,当然,也可以为自己所用做一些有趣的SDN操作。
3. 流表实现数据包修改功能
图3与图1的示例相似,但如图3所示,该示例中PC B和PC C的以太网地址不同。
与此前的示例相同,PC A向192. 168.0.2发送ICMP Echo Request。同样,OpenFlow交换机A复制ICMP Echo Request,并将其发送到OpenFlow交换机B和C。OpenFlow 交换机B和PC B也完成与此前相同的动作。
与此前示例完成不同动作的是OpenFlow交换机C。在该示例中,OpenFlow交换机C更改以太网首部中的目标地址或发送源地址。通过改变该设置,使PC C可以接受来自PC A的数据包(此处实际还需要对ARP进行一些处理,但暂不展开说)。
通过使用OpenFlow的数据包变更功能,也可实现类似动作。
Opinion:利用流表修改数据包的功能可以进行的操作很多,例如攻击者可以借助流表修改数据包,而好的方面想,也可以控制交换机动态修改数据包。
4. 关于如何实现
目前还在继续学习中,后续会专门介绍实现的方式,并进行实验。
5. 关于如何通过流表实现交换机对控制器packet_out包的修改或者转发控制
网上有一篇博客说可以通过设置流表修改控制器的packet_out包,链接如下:https://www.sdnlab.com/15425.html,作者在方案中写到通过控制器给交换机下发流表实现交换机对LLDP包的修改,我在mininet中尝试过,即使把一台交换机的所有流表都删除了,虽然可以控制交换机不把从其他交换机收到的LLDP包上发给控制器,但并不影响它把从控制器收到的LLDP包转发出去。另外,在《图解OpenFlow》的32页的2.4.1节中说到,交换机与控制器的连接是不受流表项的影响的,而作者写到可以通过流表项控制packout包,有违Openflow的协议,这两者是有冲突的。图4是该博客作者在ryu控制器中设置的流表,图5是《Openflow》的原文。
因为科研需要,很希望能够通过流表修改Packout数据包,但是尝试了几天都失败了,也一直怀疑流表到底能不能影响控制器与交换机的数据转发,因为自己在实验中即使删除一台交换机上的所有流表,LLDP包还是能够正常工作的,但又看到博客上的实验,一直在尝试,直到看到书中说到流表项是无法影响到控制器与交换机之间的通信的。
因此,个人觉得,流表可以实现交换机对从其他交换机/主机收到的数据的处理,但无法通过流表控制交换机与控制器的通信数据包,这应该是行不通的。
如果今后发现能够实现,后面再更新,欢迎留言。