OpenFlow Tutorial (1)

对于OpenFlow的理解总是停留在概念阶段,看了些许paper,有想法却不知如何去实现?   
先做一下小的实验,跟着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的命令忘了。

 

首先第一步是起拓扑,拓扑如下:

OpenFlow <wbr>Tutorial(1)


命令很简单: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:  s1-eth1:h1-eth0 s1-eth2:h2-eth0 s1-eth3:h3-eth0
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 <wbr>Tutorial(1)
这样就比较方便了。
下面看一下如何控制OpenFlow交换机,在本地OpenFlow127.0.0.1开了端口6634,然后通过dpctl就可以控制OpenFlow交换机了。dpctl is a utility that comes with the OpenFlow reference distribution and enables visibility and control over a single switch's flow table. It is especially useful for debugging, by viewing flow state and flow counters. Most OpenFlow switches can start up with a passive listening port (in your current setup this is 6634), from which you can poll the switch, without having to add debugging code to the controller.

通过下面的命令可以查看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)
  cookie=0, duration_sec=35s, duration_nsec=480000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=60,hard_timeout=0,in_port=1,actions=output:2
  cookie=0, duration_sec=30s, duration_nsec=976000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1
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:~$

OpenFlow <wbr>Tutorial(1)

端口选择loopback,开启抓包,可以看到很多数据包。但是我们只想看OpenFlow的,就在filter里输入‘of’来过滤一下,因为现在controller还没有起来,所以过滤完后暂时没有数据包。

 

启动controller。

mininet@mininet-vm:~$ controller ptcp:
可以看到wireshark开始显示数据包了:

OpenFlow <wbr>Tutorial(1)

交互过程感觉很复杂的样子,看来得看看OpenFlow的specification了,实验今天就暂停了,过几天继续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值