先做一下小的实验,跟着OpenFlow官网教程慢慢学习!
以下是转载内容,经测试无问题。
原文地址:http://blog.sina.com.cn/s/blog_4b5039210102e1og.html
前些日子把Nick Mckeown, Martin Casado,Scott Shenker三个牛逼人物在Youtue上的视频看了一些,还浏览了一些ONS 2012的视频,发现自己对SDN/OpenFlow的理解老停留在概念上,比如什么“control plane和data plane的分离”,比如“controller通过OpenFlow protocol来和OpenFlow Switch通信”,比如“OpenFlow Switch里会有一些Flow entry”,估计和Netflow类似? match的几元组,然后对于特定match的flow采用什么特定action,还有一些statistic。但是所有这些我还都没见过真东西。最后发现,他们斯坦福大学这些人还开发了一个“SDN仿真器”——Mininet,这是个好东西,可以在本地创建SDN网络,而且Mininet是用Python写的,开源并且提供了一些Python API可以调用,可做一些定制化,可调用外部controller等。
下面是根据OpenFlow官网的tutorial尝试的。http://www.openflow.org/wk/index.php/OpenFlow_Tutorial
这个tutorial提供了一个build好的了虚机,但是是VDI格式的,用virtualBox可以直接用,但是Vmware就不行了,得通过工具转成VMDK的格式。我的是从Mininet的官网上下的,然后通过ovf工具转的VMX。应该都是一样的,都是ubuntu。发现搞科研的都喜欢用ubuntu,我在学校的时候也喜欢用,工作了以后,发现Centos好像运行起来更稳定和流畅,就是界面丑了点,但是很少再用ubuntu里,于是就发现很多ubuntu的命令忘了。
首先第一步是起拓扑,拓扑如下:
命令很简单:mininet@mininet-vm:~$ sudo mn --topo single,3 --mac --switch ovsk --controller remote
表明拓扑有三个虚机host,h1,h2,h3分别有独立的IP地址,三个host分别连接到本地kernel里的OpenFlow交换机的三个端口,然后OpenFlow交换机连接到remote的controller,其实就是在本地。
通过mininet net命令可以查看拓扑:
mininet> net
c0
s1 lo:
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
h3 h3-eth0:s1-eth3
mininet>
如果配置好Xterm,并且做好x11转发,可以打开启用xterm,为每一个host起一个terminal,例如:
mininet> xterm h1 h2
这样就比较方便了。
下面看一下如何控制OpenFlow交换机,在本地OpenFlow127.0.0.1开了端口6634,然后通过dpctl就可以控制OpenFlow交换机了。“dpctl
通过下面的命令可以查看OpenFlow的flow table:
mininet@mininet-vm:~$ dpctl dump-flows tcp:127.0.0.1:6634
stats_reply (xid=0x32b73e8e): flags=none type=1(flow)
mininet@mininet-vm:~$
controller没有起来,现在flow table是空的。
另外,在h1上ping h2 10.0.0.2发现ping不通,这也可以解释通,因为OpenFlow switch里的flow table是空的,所有ICMP数据包到达OpenFlow switch,交换机没有匹配的flow,也就不可能知道采用何种action,于是都drop掉了。
在OpenFlow上通过dpctl加两条flow:
mininet@mininet-vm:~$ dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
mininet@mininet-vm:~$ dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
mininet@mininet-vm:~$
再通过dump-flows看一下:
mininet@mininet-vm:~$ dpctl dump-flows tcp:127.0.0.1:6634
stats_reply (xid=0xca454587): flags=none type=1(flow)
mininet@mininet-vm:~$
然后我们在h1上ping h2,发现还是ping不通,为啥?
因为上面加的两条流,有一个idle_timeout = 60, 就是说过了60秒没有流过来,这条flow就timeout失效了,重新加入后,再ping,发现可以了。
监控数据包,不能不抓包,这个mininet虚机,安装了wireshark,也可以通过xterm打开,还是很方便的,只是用root打开老报错,通过这个http://securityblog.gr/1195/run-wireshark-as-a-user-rather-than-root-ubuntu/解决了。
打开wireshark准备着,可以看到OpenFlow Switch上的三个接host的端口以及接controller的本地回环都能看到。
mininet@mininet-vm:~$ wireshark &
[1] 26973
mininet@mininet-vm:~$
端口选择loopback,开启抓包,可以看到很多数据包。但是我们只想看OpenFlow的,就在filter里输入‘of’来过滤一下,因为现在controller还没有起来,所以过滤完后暂时没有数据包。
启动controller。
mininet@mininet-vm:~$ controller ptcp:
可以看到wireshark开始显示数据包了: