实战录 | 基于openflow协议的抓包分析

2023-05-16

《实战录》导语

云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益。本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于openflow协议的抓包分析。


一、什么是openflow协议

OpenFlow起源于斯坦福大学的Clean Slate项目组 ,使用类似于API进程配置网络交换机的协议。OpenFlow的思路很简单,网络设备维护一个FlowTable,并且只通过FlowTable对报文进行处理,FlowTable本身的生成、维护、下发完全由外置的Controller来实现。

OpenFlow交换机将原来完全由交换机/路由器控制的报文转发过程转化为由OpenFlow交换机(OpenFlow Switch)和控制服务器(Controller)来共同完成,从而实现了数据转发和路由控制的分离。控制器可以通过事先规定好的接口操作来控制OpenFlow交换机中的流表,从而达到控制数据转发的目的。


OpenFlow交换机与控制器交互图


OpenFlow交换机包含安全通道,多级流表和组表。通过安全通道,OpenFlow交换机可以和控制器建立OpenFlow连接;流表用来匹配OpenFlow交换机收到的报文;组表用来定义流表需要执行的动作。

本文从搭建实验环境并整合OpenFlow、Mininet、ONOS等开源软件,通过使用wireshark抓包为新手讲解OpenFlow1.3协议的报文交互过程。

二、搭建环境


2.1.ONOS环境

2.1.1.环境依赖


硬件环境:


  • Centos 7  3.10.0-123.e17.x86_64

  • 10G MEM

  • 8 CPUS


软件依赖:


  • Java 8 JDK (Oracle Java recommended; OpenJDK is not as thoroughly tested)

  • Apache Maven 3.3.9

  • Apache Karaf 3.0.5

  • Git

  • bash (for packaging & testing)


2.1.2.安装启动流程


  • 源码下载: git clone https://gerrit.onosproject.org/onos

  • 配置全局参数:vi ~/.bashrc

  • 添加此行: export ONOS_ROOT=~/Applications/onos      

  • 设置启动参数:source $ONOS_ROOT/tools/dev/bash_profile

  • 编译安装: mvn clean install        

  • 第一次启动ok clean 或 onos-karaf clean              

  • 后续启动ok       


2.2.mininet环境

2.2.1.环境依赖


  • 硬件环境:VMWare、Ubuntu、3G Mem  4CPUS  50G硬盘

  • 软件依赖:无


2.2.2.安装


  • 源码下载:git clone git://github.com/mininet/mininet

  • 建立编译目录:mkdir mini-build

  • 编译安装所有功能(-a):./mininet/util/install.sh -s mini-build –a

  • 测试安装是否成功:sudo mn --test pingall

  • 在ONOS上建立拓扑:sudo mn –topo single,2 –-mac –switch ovsk,

  • protocols=OpenFlow13 –controller remote,ip=192.168.6.253,port=6633

  • 打通链路:pingall


2.3.实验步骤 

2.3.1.启动ONOS


编译安装完ONOS之后,在ONOS根目录下执行ok clean,然后进入如下界面,就表示ONOS已经启动。




2.3.2.启动mininet




2.3.3.实验拓扑环境


当ONOS和mininet都启动之后,打开链接http://IP:8181/onos/ui(IP为ONOS的IP地址),账号密码是karaf/karaf。可以看到如下建立的拓扑。




2.3.4.在ONOS上抓包


在ONOS虚拟机上面使用以下命令进行抓包
tcpdump -i ens3 -w centec.pcap
把抓到的报文取出,放到windows系统的目录下,使用Wireshark打开文件,输入openflow_v4 (openflow1.3版本)进行筛选。

三、报文分析


OpenFlow协议支持三种消息类型:controller-to-switch,asynchronous(异步)和symmetric(对称)。OpenFlow通过这三种消息,来保持controller和OpenFlow交换机之间的通信。每种类型包含的消息如下图所示:



常用的消息主要是Hello消息、Feature消息,Echo消息,以及Packet_in、Packet_out和Flow_mod等。其中Hello、Feature、Echo消息分别包含REQUEST与REPLY消息,每一个消息REQUEST与REPLY的Transaction ID相同。


3.1.hello消息

控制器与交换机建立连接时由其中某一方发起OFPT_HELLO消息给对方,该消息携带支持的最高协议版本号,接受方将采用双方都支持的最低协议版本进行通信。一旦发现共同支持的协议版本,则连接建立,否则发送OFPT_ERROR消息,描述失败原因,并中断连接。

hello消息

3.2.Echo消息

交换机和控制器均可以向对方发出OFPT_ECHO_REQUEST,OFPT_ECHO_REQUEST只有OpenFlow报文头部。接收者需要回复OFPT_ECHO_REPLY。该消息用来测量延迟、是否连接保持等。

OFPT_ECHO_REQUEST消息


OFPT_ECHO_REPLY消息


3.3.Feature消息

Features消息是由控制器发送给OpenFlow交换机,OpenFlow交换机需要应答自身支持的功能。OFPT_FEATURES_REQUEST消息类型是5,只有OpenFlow报文头,没有报文实体。



OFPT_FEATURES_REQUEST消息


OFPT_FEATURES_REPLY消息类型是6,消息体如下图所示。其中n_buffers表示一次最多缓存的数据包数量;n_tables表示交换机支持的流表数量;capabilities表示交换机所支持的功能。



OFPT_FEATURES_REPLY消息


3.4.Packet-in消息 

交换机发送Packet_in消息给控制器有以下两种情况:

报文没有匹配到流表项;

流表项的action要求发给控制器。

一般将数据包缓存在交换机中,把有效的数据包信息(默认的128字节)和缓存id发送给控制器,不过,如果交换机不支持缓存或者内存用光了,那么就把整个数据包放在数据部分发给控制器,并且缓存id设置为-1。


Packet_in的TABLE_MISS消息


Packet_in的ACTION消息


3.5.Packet-out消息 

当控制器希望交换机发送某个数据包,就使用Packet_out消息。例子:arp在广播的时候,在交换机中不能直接将arp广播,而是,将其封装在Packet_out里面,交换机泛洪的是Packet_out。



Packet_out消息


3.6.Flow_mod消息


Flow_mod这个消息是OpenFlow中最重要的消息,用来添加、删除、修改OpenFlow交换机的流表信息。当交换机收到一个无法处理的数据包,封装到Packet_in消息转发给控制器后,控制器可以发送一个Flow_mod消息下发一个流表到交换机,并且指定该数据包按照此流表项的action处理。


Flow_mod消息包含四个部分:OpenFlow报文头、Flow_mod固定字段、Match字段和Instruction字段。分别用来标识该消息的类型、流表项的内容等。


Flow_mod消息

四、总结

OpenFlow通过网络创新开启了一条新道路。如果OpenFlow得到广泛的应用和推广,则未来的网络将如曾经的计算机一样取得日新月异的发展。本文通过搭建环境并抓包,展示了常用的OpenFlow报文消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战录 | 基于openflow协议的抓包分析 的相关文章

  • C#中Invoke 和 BeginInvoke的涵义和区别

    BeginInvoke 方法真的是新开一个线程进行异步调用吗 xff1f 参考以下代码 xff1a public delegate void treeinvoke private void UpdateTreeView MessageBox
  • C# 理解lock

    一 为什么要lock xff0c lock了什么 xff1f 当我们使用 线程 的时候 xff0c 效率最高的方式当然是 异步 xff0c 即各个线程同时运行 xff0c 其间不相互依赖和等待 但当不同的线程都需要访问某个资源的时候 xff
  • excel操作的几种方法

    using System using System Collections Generic using System Text using System Data using System Windows Forms using Syste
  • c#中如何实现拷贝对象

    大家都知道 xff0c 在C 中变量的存储分为值类型和引用类型两种 xff0c 而值类型和引用类型在数值变化是产生的后果是不一样的 xff0c 值类型我们可以轻松实现数值的拷贝 xff0c 那么引用类型呢 xff0c 在对象拷贝上存在着一定
  • 深入了解Windows句柄到底是什么

    总是有新入门的Windows程序员问我Windows的句柄到底是什么 xff0c 我说你把它看做一种类似指针的标识就行了 xff0c 但是显然这一答案不能让他们满意 xff0c 然后我说去问问度娘吧 xff0c 他们说不行网上的说法太多还难
  • 句柄概念

    句柄 xff08 handle xff09 xff0c 有多种意义 xff0c 其中第一种是指程序设计 xff0c 第二种是指Windows编程 现在大部分都是指程序设计 程序开发这类 第一种解释 xff1a 句柄是一种特殊的 智能指针 当
  • 腾讯云大数据发布最新产品矩阵,助力企业整合打通海量数据

    9月11日 xff0c 主题为 释放数字经济发展的新动能 的腾讯全球数字生态大会大数据专场在线上拉开帷幕 腾讯大数据领域的多位顶级专家 xff0c 与包括 Hadoop 创始人 Doug Cutting 在内的业内顶级大咖 xff0c 以及
  • C/C++中函数参数传递

    看了内存管理的有关内容 xff0c 有一点了解 xff0c 但不是很深入 xff0c 发现之前写代码时有很多细节问题没有注意到 xff0c 只知道这样做可以实现功能 xff0c 却不知道为什么可以这样 xff0c 对于采用自己的方法造成的隐
  • Windows窗口刷新机制详解

    1 Windows的窗口刷新管理 窗口句柄 xff08 HWND xff09 都是由操作系统内核管理的 xff0c 系统内部有一个z order序列 xff0c 记录着当前窗口从屏幕底部 xff08 假象的从屏幕到眼睛的方向 xff09 x
  • C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

    BSS段 xff08 bss segment xff09 通常是指用来存放程序中 未初始化 的 全局变量 的一块内存区域 BSS是英文Block Started by Symbol的简称 BSS段属于静态内存分配 数据段 xff1a 数据段
  • C# 窗体Show和ShowDialog 方法的区别详解

    CenterParent 窗体在其父窗体中居中 CenterScreen 窗体在当前显示窗口中居中 xff0c 其尺寸在窗体大小中指定 Manual 窗体的位置由 Location 属性确定 WindowsDefaultBounds 窗体定
  • c# 窗口句柄问题 。

    1 如何获得一个窗口的句柄 xff1f 例如获取窗口PictureBox控件 xff08 其他控件也可以 xff09 的句柄 xff0c csharp view plain copy IntPtr handle 61 pictureBox
  • c#中已知一个外部窗口的句柄,怎么关闭

    已知一个外部窗口的句柄 xff0c 怎么关闭它 怎么给这个窗口的一个文本框设置内容 public void Test Handle windowhandle string TextBoxName System windws froms fr
  • 数组内存分配概念

    在这里解答一下 xff1a int arr 4 amp arr 1 61 arr 0 43 sizeof int 静态分配 xff0c 即普通数组 xff0c 由于在栈中分配 xff0c 而栈的生成方向是自高地址向低地址生成 所以有 xff
  • 静态数组和动态数组 内存分布

    数组是程序设计中是一个非常重要的概念 数组是一个用于收集大量类似数据的容器 xff0c 以及其每一个元素能被相同处理过程迭代来处理的一个抽象体 创建数组一般有三种方式 xff1a 全局 静态范围的数组 xff0c 局部变量数组 xff0c
  • C语言 内存分配 地址 指针 数组 参数 解析

    指针简介 指针式保存变量地址 的变量 增加阅读难度 指针 和 goto 语句会增加程序的理解难度 容易出现错误 ANSI C American National Standards Institute 美国国家标准学会 即标准C 通用指针类
  • C++数组与指针概念

    指向数组元素的指针 一个变量有地址 xff0c 一个数组包含若干元素 xff0c 每个数组元素都在内存中占用存储单元 xff0c 它们都有相应的地址 指针变量既然可以指向变量 xff0c 当然也可以指向数组元素 xff08 把某一元素的地址
  • [代码实例][C]Linux实现线程池

    ThreadPool h span class token macro property span class token directive keyword ifndef span THREADPOOL H span span class
  • C语言中指针的初始化和赋值

    1 指针的初始化 指针初始化时 xff0c 61 的右操作数必须为内存中数据的地址 xff0c 不可以是变量 xff0c 也不可以直接用整型地址值 但是int p 61 0 除外 xff0c 该语句表示指针为空 此时 xff0c p只是表示
  • Aspose.Cells使用总结大全

    使用到 Aspose Cells 插件 xff0c 整理一下 一 xff1a 新建解决方案 xff0c 目录如下 目录说明 xff1a Program cs 入口类 ExcelGenerator cs Aspose Cells 操作类 As

随机推荐

  • C#图像处理基础概念知识

    图像是人类获取和交换信息的主要来源 xff0c 因此 xff0c 图像处理的应用领域必然涉及到人类生活和工作的方方面面 随着人类活动范围的不断扩大 xff0c 图像处理的应用领域也将随之不断扩大 xff08 1 xff09 航天和航空技术方
  • c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte 与图片image之间的转化 字节数组转换成图片 span class hljs keyword style color 0088 public span span class hljs keyword style colo
  • C/C++ 文件操作之CreateFile、ReadFile和WriteFile

    1 CreateFile 这个函数的功能是创建或者打开一个文件或者I O设备 xff0c 通常使用的I O形式有文件 文件流 目录 物理磁盘 卷 终端流等 如执行成功 xff0c 则返回文件句柄 INVALID HANDLE VALUE 表
  • String到底是值类型还是引用类型(C#)

    MSDN 中明确指出 String 是引用类型而不是值类型 xff0c 但 String 表面上用起来却像是值类型 xff0c 这又是什么原因呢 xff1f 首先从下面这个例子入手 xff1a span class hljs comment
  • VS2013 MFC基于对话框编程(创建工程)

    一 新建MFC项目 选择 xff1a 基于对话框MFC的使用 xff1a 在共享DLL中使用MFC xff08 程序运行需要dll xff09 在静态库中使用MFC xff08 程序较大 xff0c 运行时不需要dll xff09 设置MF
  • MFC中画直线和曲线的几种方法

    一 画直线 要想在MFC中画出有颜色的线条 xff0c 首先就要设置DC的画笔 xff0c 我们可以按如下方法来设置画笔 xff1a 第一步 xff1a 在View类中添加一个COLORREF类型的数据成员m Color xff08 用来保
  • C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值 xff0c 需要使用变量类型的指针作为参数或者变量的引用 如果变量是一般类型的变量 xff0c 例如int xff0c 则需要使用int 类型的指针类型int 作为参数或者int的引用类型int amp 但是如果变量类型是指
  • 零基础学习WinCE开发

    在接触WinCE时候的基础 xff1a 软件语言基础 xff1a C C 43 43 C 我不是计算机专业的 xff0c 所以这些语言基础也是比较业余的 经验不丰富 xff0c 遇到问题就是查MSDN或者到网上查找相关解决方案即可 xff0
  • SD-WAN为什么备受欢迎?

    SD WAN即软件定义广域网 xff0c 通过集中控制器 xff0c 将广阔地理范围内的计算机 云服务 数据中心集中起来统一管理 比较多地用于企业组网场景 xff0c 那么为什SD WAN如此受欢迎呢 xff1f 近年来 xff0c 企业的
  • C#实现缩放和剪裁图片的方法示例

    C 实现缩放和剪裁图片的方法 分享给大家供大家参考 xff0c 具体如下 xff1a 1 2 3 4 5 6 7 8 9 10 11
  • 虚拟内存解疑

    虚拟内存别称 虚拟存储器 xff08 Virtual Memory xff09 电脑 中所运行的 程序均需经由 内存执行 xff0c 若执行的程序占用内存很大或很多 xff0c 则会导致内存消耗殆尽 为解决该问题 xff0c Windows
  • windows内存结构概述

    13 1 Windows的虚拟地址空间安排 13 1 1虚拟地址空间的分区 xff08 即虚拟地址空间布局 xff09 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Windows X64 64位
  • 变量名和内存地址及符号表

    1 变量名是给编译器看的 xff0c 编译器根据变量是局部还是全局分配内存地址或栈空间 xff0c 所谓的变量名在内存中不存在 xff0c 操作时转换成地址数存放在寄存器中了 其实可以理解为是符号表起到了连接作用 2 符号表 xff08 此
  • C/C++编译和链接过程详解 概述 (重定向表,导出符号表,未解决符号表)

    详解link 有 些人写C C 43 43 以下假定为C 43 43 程序 xff0c 对unresolved external link或者duplicated external simbol的错误信息不知所措 xff08 因为这样的错误
  • 编译器构造概述(详细)

    一 编译器简介 前面谈到静态链接器构造的基本流程 xff0c 最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器 xff0c 本文构造一个符合这种具体格式要求编译器 但是编译器的直接编译的结果一般是
  • nm命令中符号类型详解

    nm命令介绍的很多 xff0c 但大多不介绍其函数符号标志的含义 最近在调试动态库时常用到 xff0c 其中用的最多的用法 nm A grep aaa c 43 43 filt A 为了显示文件 xff0c c 43 43 filt转换为可
  • 电脑怎样执行编程语言的?

    链接 xff1a https www zhihu com question 29227521 answer 154819061 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 这个问题
  • 汇编中的标号概念

    地址标号和数据标号 地址标号 1 assume cs code 2 code segment 3 a db 1 2 3 4 5 6 7 8 4 b dw 0 5 start mov si offset a 6 mov bx offset b
  • 汇编语言不带冒号标号的用法

    汇编语言中 xff0c 有一种编程方法 xff1a 直接定址表 这种方法和高级语言 xff0c C语言中的数组有类似的思想 xff0c 就是将参数编排在一起 xff0c 然后通过数组名的调用 xff0c 得到需要的数值 汇编语言中 xff0
  • 实战录 | 基于openflow协议的抓包分析

    实战录 导语 云端卫士 实战录 栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧 xff0c 希望对于关注我们的朋友有所裨益 本期分享人为云端卫士安全SDN工程师宋飞虎 xff0c 将带来基于openflow协议的抓包分析 一 什么是