gpt4 book ai didi

ubuntu - 了解Ryu OpenFlow Controller,mininet,WireShark和tcpdump

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:19 26 4
gpt4 key购买 nike

我是OpenFlow和SDN的新手。我需要在Ubuntu或Debian机器上设置Ryu OpenFlow控制器的帮助,并且了解基本的Ryu应用程序。

注意:这个问题已经有答案。

最佳答案

这可能是我在Stack Overflow上写的最长的文章之一。我一直在学习有关OpenFlow,SDN和Ryu的知识,并希望在这里为初学者记录我的知识。如果需要,请更正/编辑我的帖子。

本简短指南假定您已经了解计算机网络和主要的网络协议。本指南将帮助您从系统设置程序开始使用OpenFlow。

1.什么是OpenFlow和SDN?

请阅读SDN / OpenFlow | Flowgrammable

进一步阅读:The Future of Networking, and the Past of Protocols by Scott Shenker and Software-defined Networking, IEEE INFOCOM 2009

在你开始之前:

基础设施层包括网络核心内的路由器和交换机。

控制层包括运行OpenFlow控制器以及其本身的PC。

应用程序层包括在该控制器之上运行的应用程序。在Ryu中,这些应用程序是用Python编写的。

OpenFlow是一种协议,基础结构和控制层使用该协议进行交互。 OpenFlow本身不提供API。它是一种开放源代码协议,供开发支持OpenFlow的交换机的供应商以及编写控制器的开发人员(如Ryu)使用。 API由控制器提供。

2.在Debian 8上设置Ryu OpenFlow控制器

先决条件

您需要上网。如果您在虚拟机中运行Debian,请发出以下命令以通过NAT自动配置以太网接口:

su  
dhclient eth0


启用sudo

Debian默认不带有sudo。您稍后将使用的某些Ryu应用程序需要sudo。您可以安装sudo并将自己添加到sudo'ers列表中,如下所示:

su
apt-get install sudo # you might need to do apt-get update first!
nano /etc/sudoers


找到说%sudo ALL =(ALL:ALL)ALL的行,并在其下面添加一个条目:

yourusername ALL=(ALL:ALL) ALL


按CTRL + X,然后按Y将更改保存到sudoers文件。现在,您可以以root用户身份注销以返回自己的shell

exit


启用最佳屏幕分辨率(仅VM)

如果您在Virtual Box中运行Debian,则默认安装不会为Virtual Box启用全屏分辨率支持。在第3节的后面,您将需要一个更大的屏幕。现在启用它是一个好主意。

在虚拟机的窗口中,单击设备>插入来宾添加CD映像...

然后cd到包含文件的目录

cd /media/cdrom


由于权限问题,Debian不允许您运行脚本。将文件复制到您的主目录,更改权限,然后运行它:

mkdir ~/VBOXGUEST  
cp * ~/VBOXGUEST
cd ~/VBOXGUEST
chmod 755 *
sudo ./VBoxLinuxAdditions.run


重启

sudo shutdown -r now


安装Git

sudo apt-get install git


安装Mininet

Mininet允许您虚拟模拟笔记本电脑/ PC上的各种网络接口。使用Git安装它:

cd ~  # if you are in some other directory
git clone git://github.com/mininet/mininet
cd mininet
git tag # this will list available versions
git checkout -b 2.2.1 2.2.1 # replace 2.2.1 with the version you wish to install
cd ..
mininet/util/install.sh -a # default installation, includes all components, recommended


我建议您安装OpenFlow Wireshark Dissector。您以后可以安装Wireshark来分析数据包。 OpenFlow Wireshark Dissector帮助Wireshark从OpenFlow数据包中获取尽可能多的信息。

mininet/util/install.sh -h


运行以下命令以检查您的mininet安装:

sudo mn --test pingall


安装Ryu OpenFlow控制器

OpenFlow控制器使用OpenFlow协议在控制层和基础结构层之间进行通信。同样,它是提供API来开发在应用程序层(位于控制层顶部)运行的SDN应用程序的API的控制器。有许多OpenFlow控制器。 Ryu OpenFlow控制器是一种使用Python脚本作为其应用程序的控制器。再次,使用Git安装它:

cd ~
git clone git://github.com/osrg/ryu.git


安装Wireshark

sudo apt-get install wireshark


安装支持的Python模块

Debian 8.3确实默认安装了Python 2.7和3.4。但是,您需要安装一些Ryu应用程序(Python脚本)使用的Python模块。您可以使用pip安装Python模块:

cd ~/ryu  
sudo apt-get install python-dev python-pip python-setuptools
sudo pip install .


上面的命令将自动运行此目录中的setup.py并从Python软件包索引中获取缺少的Python模块。该脚本将自动安装所有相关模块。但是,请执行以下操作以确保以后不会丢失任何模块:

sudo pip install webob  
sudo pip install eventlet
sudo pip install paramiko
sudo pip install routes


启动

使用以下命令启动mininet以模拟3台主机和一台交换机:

sudo mn --topo single,3 --mac --switch ovsk --controller remote


您将看到一个微型网络提示。此提示可用于ping主机,在主机之间发送数据包等。

打开另一个终端窗口以运行Ryu。在此示例中,我们将运行一个应用程序(simple_switch_13.py),该应用程序将模拟一个简单的第2层交换机,该交换机将把所有接收到的数据包转发到除接收到一个端口之外的所有端口。

cd ~/ryu  
PYTHONPATH=. ./bin/ryu-manager ryu/app/simple_switch_13.py


运行此命令时,请确保您位于主目录中。

你们都准备好了。要ping主机并分析数据包传输,请转到下一部分。

3.试用Wireshark和tcpdump

在本节中,我们将使用mininet将数据包从一台主机发送到另一台主机,并使用tcpdump和Wireshark分析产生的传输。

数据包的传输方式正是我们可以在软件定义网络中控制的方式。为此,我们编写了运行在控制器顶部的不同应用程序。这些应用程序构成SDN控制平面的应用程序层。

设置拓扑并运行控制应用程序

注意:在前面的部分中,您使用mininet创建了拓扑,并启动了Ryu应用程序来控制传输。如果您重新启动或退出了其中的任何一个,我将重复命令以创建拓扑并在此处启动Ryu应用程序:

cd ~
sudo mn --topo single,3 --mac --switch ovsk --controller remote


并在单独的终端窗口中:

cd ~/ryu
PYTHONPATH=. ./bin/ryu-manager ryu/app/simple_switch_13.py


玩小包

在mininet提示符下,发出以下命令以为您创建的拓扑中的三台主机中的每一个打开控制台窗口:

mininet> xterm h1 h2 h3


堆叠这些控制台,以便您可以同时看到它们!然后在h2和h3的xterm中,运行tcpdump,该实用程序可打印主机看到的数据包:

tcpdump -XX -n -i h2-eth0  
tcpdump -XX -n -i h3-eth0


注意:如果您以前使用过Wireshark,那就像分别在这两个主机的eth0接口上捕获数据包一样。

创建拓扑时,mininet为以下三个主机分配了以下IP地址:

h1: 10.0.0.1  
h2: 10.0.0.2
h3: 10.0.0.3


在主机1的外壳上,对主机2和主机3进行ping操作,并在每个命令之后观察对其他两个控制台的影响:

ping 10.0.0.2  
ping 10.0.0.3


尝试对无法访问的主机(不存在的主机)执行ping操作,然后在控制台上查看效果:

ping 10.0.0.7


您应该已经在本节中观察到了ICMP(ping)和ARP(具有此IP地址)协议!您也可以使用Wireshark代替tcpdump进行上述操作。这是tcpdump的图形替代。

注意:所有转发数据包的方式取决于在Ryu之上运行的应用程序。您可以编写一个应用程序以丢弃所有数据包。在这种情况下,您的ping操作不会对其他两个控制台产生影响。

4.了解基本的第2层交换机应用程序

在本节中,我们将分析第2节中控制数据包传输的第2层交换机应用程序简化版本的工作。

学习桥(或第2层交换机)的工作

前面我提到过,如果您正在阅读本指南,则假定您已经具备基本的网络协议知识(包括第2层交换机,学习桥或以太网交换机的工作!),我将在其中进行总结。不管下面几行。

一个“学习”桥根据其端口存储与其连接的主机的数据库。主机由其网卡的MAC地址标识,如下所示: ab:cd:ef:12:34:56(以十六进制表示)。仅通过端口号识别端口。例如,具有4个端口的交换机具有端口1、2、3和4。

如果交换机在其端口2上收到一个数据包,它将查看该数据包的目标MAC地址(目标主机)。然后,它查看其数据库,以查看是否知道该主机连接到哪个端口。如果找到它,则仅将该数据包转发到该特定端口。但是,如果它的数据库中还没有条目,它将把该数据包泛洪到所有端口,并且主机可以自行检查该数据包是否发往它们。

同时,交换机查看该数据包的源MAC地址,并立即知道主机X位于端口2。它将该条目存储在该数据库中。因此,现在您知道,如果目标主机答复源主机,则交换机将不必洪泛答复包!

Ryu API Python代码简介

让我们选择一个没有“学习”功能的非常简单的程序,而不是直接转到simple_switch_13.py。目前,没有转发数据库。下面的程序只是一个简单的第2层交换机,它将接收到的数据包传输到所有端口(使数据包充满):

    from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls

class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser

actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions)
dp.send_msg(out)


进口

我不会深入研究导入语句。我们将在分析使用导入的代码时分别讨论它们。

基本应用框架

以下代码是一个完美的Ryu应用程序。实际上,您也可以执行它!它不会做任何事情:

    from ryu.base import app_manager

class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)


作为类的参数,我们传递 ryu.base.app_manager.RyuApp import(在第一行中导入)。在Ryu API手册中, app_manager类是Ryu应用程序的中央管理。它加载Ryu应用程序,为其提供上下文并在Ryu应用程序之间路由消息。

EventOFPPacketIn事件

将新方法 packet_in_handler添加到 L2Switch类。当Ryu收到OpenFlow packet_in消息时调用此方法。当Ryu收到 packet_in消息时,将引发 ofp_event.EventOFPPacketIn事件。 set_ev_cls装饰器告诉Ryu何时应调用相关函数 packet_in_handler

set_ev_cls装饰器的第一个参数表示使函数调用的事件。如您所料,每次引发 ofp_event.EventOFPPacketIn事件时,都会调用此函数。

当您要允许Ryu处理事件时,第二个参数指示开关的状态。可能您想在Ryu和交换机之间的握手完成之前忽略OpenFlow packet_in消息。使用 MAIN_DISPATCHER作为第二个参数表示仅在协商完成后才调用此函数。 MAIN_DISPATCHER表示开关的正常状态。在初始化阶段,开关处于 HANDSHAKE_DISPATCHER状态!

现在让我们看一下函数的主体。我们将其分为两部分。

    msg = ev.msg  
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser


ev.msg是包含接收到的数据包的数据结构。

msg.dp是该数据结构内的一个对象,代表一个数据路径(开关)。

dp.ofprotodp.ofproto_parser是代表Ryu和交换机协商的OpenFlow协议的对象。

    actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]  
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions)
dp.send_msg(out)


OFPActionOutput类与 packet_out消息一起使用,以指定要从中发送数据包的交换机端口。由于在此简化的应用程序中没有转发数据库,​​因此我们将数据包泛洪到所有端口,因此使用常量 OFPP_FLOOD

OFPPacketOut类用于构建 packet_out消息。

通过使用 datapath类的 send_msg方法,可以将OpenFlow消息对象发送到action变量中定义的端口。在这种情况下,我将重复进行操作,以使目标包括所有端口。

大事记

您在上面的代码中反复看到了术语事件。在事件驱动的编程中,程序的流程由事件控制,事件由系统接收到的消息引发(例如,当Ryu从(OpenFlow enabled)开关接收到 EventOFPPacketIn消息时引发 packet_in)。前面我们讨论了OpenFlow是一种协议,控制器(Ryu,PC)和基础结构(或交换机)使用该协议进行通信。像 packet_in这样的消息正是使用OpenFlow协议实现两者之间的通信的样子!

下一步

您可能要继续构建自己的Ryu应用程序。学习Ryu API(或Python语言,如果您还不熟悉的话)可能是一个不错的起点。祝好运!

关于ubuntu - 了解Ryu OpenFlow Controller,mininet,WireShark和tcpdump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37998065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com