【SDN】探究Ryu

366 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

方法一

graph TD;
	虚拟机搭建拓扑-->配置成为OVS交换机-->某个虚拟机安装ryu作为控制器-->使用命令将tyu指定为OVS所用的控制器;
	

相当于将Ubuntu作为ovs的交换机了,好处:更加模拟现实环境,直接用linux系统。可能存在的问题:这个拓扑在清零的时候可能会有问题,比如arp表清除等(不能做到像mininet仿真的时候每次运行拓扑就从零开始。)

Ubuntu安装ovs配置

Ubuntu安装Open vSwitch

ryu RESTAPI

RYU核心源码解读:

RYU入门

RYU官方文档(其中有对模拟arp的介绍,并且可以查看guide1.dox)

RYU:OpenFlow协议源码

方法二

使用mininet搭建整个拓扑,ryu也是直接作为这个拓扑网络的控制器

优点:方便调试、更新,使用wireshark抓包,ping和tcpdump进行流量创建(这一点方法一也可以做到)

缺点:都是在一个虚拟机上进行的,互联互通有可能成为问题

Ryu+mininet+Wireshark

一个mininet+ryu逐步控制的例子

Mininet与真实网络连接

Mininet中host与外网通信

一个抓包例子

正式开始

ryu源码分析之packet类

ryupacket源码

ryu packet文档

结合这个例子学习构造包下发

逐级封装:

e = ethernet.ethernet(dst='ff:ff:ff:ff:ff:ff',
                      src='08:60:6e:7f:74:e7',
                      ethertype=ether.ETH_TYPE_ARP)
a = arp.arp(hwtype=1, proto=0x0800, hlen=6, plen=4, opcode=2,
            src_mac='08:60:6e:7f:74:e7', src_ip='192.0.2.1',
            dst_mac='00:00:00:00:00:00', dst_ip='192.0.2.2')
p = packet.Packet()
p.add_protocol(e)
p.add_protocol(a)

添加action事件下发包

actions = [parser.OFPActionOutput(port=port)]
out =parser.OFPPacketOut(datapath=datapath,buffer_id=ofproto.OFP_NO_BUFFER,in_port=ofproto.OFPP_CONTROLLER,actions=actions,data=data)
datapath.send_msg(out)

跨网段通信所需

OFPMatch 607行

OFPActinOutput 4682行

OFPInstructionActions 4550行

pkt = packet.Packet(msg.data)

eth = pkt.get_protocols(ethernet.ethernet)[0]
arp_pkt = pkt.get_protocol(arp.arp)

if eth:
    eth_dst = eth.dst
    eth_src = eth.src

其实昨天所做的就是成功实现了虚拟地址10.1.1.77的ping回复,只不过debug花了很长时间,今天继续实现其它功能。