3-3 基于RYU的流量风暴事件原理与响应策略

news2024/9/22 19:43:15

在传统网络中,存在着一定的广播流量,占据了一部分的网络带宽。同时,在有环的拓扑中,如果不运行某些协议,广播数据还会引起网络风暴,使网络瘫痪。
如有以下的一个网络拓扑结构(3_2_topoplus.py)

from mininet.net import Mininet
from mininet.node import OVSSwitch, Host
from mininet.cli import CLI
from mininet.link import Link
from mininet.node import RemoteController
#import networkx as nx
#import matplotlib.pyplot as plt

def create_network():
    net = Mininet()
        # 创建单个OVS交换机
    switch1 = net.addSwitch('s1', cls=OVSSwitch,protocols='OpenFlow13')
    switch2 = net.addSwitch('s2', cls=OVSSwitch,protocols='OpenFlow13')
    
    
    # 创建2个主机
    host1 = net.addHost('h1', cls=Host, ip='192.168.0.1/24', defaultRoute='via 192.168.0.254')
    host2 = net.addHost('h2', cls=Host, ip='192.168.0.2/24', defaultRoute='via 192.168.0.254')
    host3 = net.addHost('h3', cls=Host, ip='192.168.0.3/24', defaultRoute='via 192.168.0.254')
    host4 = net.addHost('h4', cls=Host, ip='192.168.0.4/24', defaultRoute='via 192.168.0.254')

   
    
    # 连接主机到交换机
    net.addLink(host1, switch1)
    net.addLink(host2, switch1)
    net.addLink(host3, switch2)
    net.addLink(host4, switch2)
#交换机连接交换机
    net.addLink(switch1, switch2)
    net.addLink(switch1, switch2)#环路
     
    
    # 指定控制器的IP地址和端口
    #可以先使用ss -tlnp | grep ryu-manager查看ryu运行后的监听端口
    controller_ip = '127.0.0.1'
    controller_port = 6633

# 创建Mininet网络,并指定控制器和OpenFlow协议版本
  
    net.addController('controller', controller=RemoteController, ip=controller_ip, port=controller_port,protocols='OpenFlow13')
  
    # 启动网络
    net.start()
      
    # 打开命令行界面
    CLI(net)
    
    # 关闭网络
    net.stop()

if __name__ == '__main__':
    create_network()

结合上一篇文章中已经实现的控制器应用程序,我们进行测试,并观察产生的数据交互信息,因产生广播风暴(瞬间达到千万级别的包)导致资源崩溃,无法ping通
在这里插入图片描述
在软件定义网络中,要解决以上安全问题,我们可以在控制器应用程序中进行编程实现。下文将实现在控制器RYU应用程序上开发ARP代理功能模块,以解决目前的网络广播风暴安全隐患。

进入/etc/sysctl.conf修改linux内核配置,关闭icmpv6功能
root@zmq-virtual-machine:/etc# vi sysctl.conf
root@zmq-virtual-machine:/etc# nano sysctl.conf
root@zmq-virtual-machine:/etc# nano sysctl.conf
在这里插入图片描述
在文件的末尾添加以下行来禁用 ICMPv6:
复制
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6=1
这将禁用所有接口(all)和默认接口(default)的 IPv6 功能。
然后保存并重新加载配置文件并应用更改:
在这里插入图片描述
以上关闭后最后,重启一下linux系统会重启ipv6
在这里插入图片描述
经过以上操作后,如果生成的host中仍然还有ipv6因为我们在构建网络中比有IP协议的支撑,即使关掉HOST的IPv6 后仍然有ovs生成的虚拟交换机发送相关信息(即使禁用所有设备的ipv6相关你握手包,也还会有IPv4的包,如果都没有握手包,IP协议将因无法正常协商而出现异常)
因此,需要使用编程的办法在ryu控制器APP上进行数据包剔除,把相关的促发信息改为ARP(ping的先行数据包)才进行响应,包括下发流表和mac地址学习等。

解决问题: 前面的packet_in数据包是没有ip地址的?只有ARP才开始有?
1 在packet_in_handler函数中剔除ICMP

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import set_ev_cls
from ryu.controller.handler import  MAIN_DISPATCHER
from ryu.controller.handler import CONFIG_DISPATCHER
from ryu.ofproto import  ofproto_v1_3
from ryu.lib.packet import  packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ipv6
from ryu.lib.packet import icmp
from ryu.lib.packet import icmpv6


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

 @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
 def switch_features_handler(self, ev):
     datapath = ev.msg.datapath
     ofproto = datapath.ofproto

     #msg = ev.msg    #features阶段的数据包没有封装承载其他的协议,因此没有data字段 
     parser=datapath.ofproto_parser
     #pkt = packet.Packet(msg.data)#features阶段的数据包没有封装承载其他的协议,因此没有data字段 
     #icmp_pkt = pkt.get_protocol(icmp.icmp)#features阶段的数据包没有封装承载其他的协议,因此没有data字段 
     #icmp6_pkt = pkt.get_protocol(icmpv6.icmpv6)#features阶段的数据包没有封装承载其他的协议,因此没有data字段 
     #if not icmp_pkt and not icmp6_pkt:  #无需判断
     match = parser.OFPMatch()
     actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER, ofproto.OFPCML_NO_BUFFER)]
     self.add_flow(datapath, 0, match, actions)



 def add_flow(self, datapath, priority,match, actions):

     ofproto = datapath.ofproto
     parser = datapath.ofproto_parser

     inst=[parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,actions)]
     mod=parser.OFPFlowMod(datapath=datapath, priority=priority,match=match, instructions=inst)
     datapath.send_msg(mod)



 @set_ev_cls(ofp_event.EventOFPPacketIn,MAIN_DISPATCHER)
 def packet_in_hander(self,ev):
     msg = ev.msg
     dp = msg.datapath
     ofp = dp.ofproto
     ofp_parser = dp.ofproto_parser
     in_port = msg.match['in_port']

     dpid=dp.id
     pkt = packet.Packet(msg.data)
     icmp_pkt = pkt.get_protocol(icmp.icmp)
     icmp6_pkt = pkt.get_protocol(icmpv6.icmpv6)
     if not icmp_pkt  and not icmp6_pkt:
         self.mac_port_table.setdefault(dpid, {})
         pkt = packet.Packet(msg.data)
         eth_pkt = pkt.get_protocols(ethernet.ethernet)[0]

         dst = eth_pkt.dst
         print(dst)
         src = eth_pkt.src
         self.mac_port_table[dpid][src] = in_port
         if dst in self.mac_port_table[dpid]:
             out_port = self.mac_port_table[dpid][dst]
         else:
             out_port = ofp.OFPP_FLOOD
         actions = [ofp_parser.OFPActionOutput(out_port)]

         if out_port != ofp.OFPP_FLOOD:
             match = ofp_parser.OFPMatch(in_port=in_port, eth_dst=dst, eth_src=src)
             # verify if we have a valid buffer_id, if yes avoid to send both
             # flow_mod & packet_out
             if msg.buffer_id != ofp.OFP_NO_BUFFER:
                 self.add_flow(dp, 1, match, actions, msg.buffer_id)
                 print("1")
                 return
             else:
                 self.add_flow(dp, 1, match, actions)
                 print("2")

         data = None
         if msg.buffer_id == ofp.OFP_NO_BUFFER:
             data = msg.data

         out = ofp_parser.OFPPacketOut(datapath=dp, buffer_id=msg.buffer_id,
                                       in_port=in_port, actions=actions, data=data)
         dp.send_msg(out)

在这里插入图片描述

本代码运行后,因为剔除了icmp,因此不会因为因为icmp直接产生风暴风险,但是在mininet中执行ping后将产生ARP风暴,效果如下图所示。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

素数筛详解c++

一、埃式筛法 代码 二、线性筛法(欧拉筛法) 主要的思想就是一个质数的倍数(倍数为1除外)肯定是合数,那么我们利用这个质数算出合数,然后划掉这个合数,下次就可以不用判断它是不是质数,节省了大量的时间。 …

python使用opencv实现手势识别并控制ppt

需要使用到的包 from collections import dequeimport cv2 import numpy as np import math import shutilimport sys import os import time#这个求出现频率最高的太慢了,所以把它放弃了 from collections import Counter准备好安装包后需要获取图片 def star():…

解决找不到msvcr100.dll,无法继续执行代码的5种方案

当你在使用电脑过程中,系统突然弹出一个提示框,显示“找不到msvcr100.dll,无法继续执行代码”,msvcr100.dll是Microsoft Visual C Redistributable Package的一部分,它是一个至关重要的动态链接库文件,许多…

从零入门激光SLAM(十六)——卡尔曼滤波基础

一、卡尔曼滤波简介KF 卡尔曼滤波器(Kalman Filter)是一种用于估计动态系统状态的递归算法。它通过结合系统的动态模型和噪声观测数据,提供对系统状态的最优估计。卡尔曼滤波器广泛应用于信号处理、控制系统、导航、计算机视觉等领域。 卡尔…

视频智能检测AI智能分析网关V4告警消息推送:公众号消息推送的配置步骤介绍

TSINGSEE青犀智能分析网关V4属于高性能、低功耗的软硬一体AI边缘计算硬件设备,目前拥有3种型号(8路/16路/32路),支持Caffe/DarkNet/TensorFlow/PyTorch/MXNet/ONNX/PaddlePaddle等主流深度学习框架。硬件内部署了近40种AI算法模型…

极越07来了, 要把特斯拉ModelS 拉下马?

文 | AUTO芯球 作者 | 雷慢 喵了个咪的!国内智能驾驶汽车圈下半年要杀出个大黑马, 它就是极越07! 自北京车展亮相引起央视报道之后,工信部近日公式了它的产品信息, 这意味着,极越07真的要量产了&#…

国内用户如何免费抢先体验GPT-4o(国内如何免费使用各类GPT产品,包含chatgpt、claude、Gemini等)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 GPT-4o抢先体验 📒📝 方法介绍🎈 永久免费🎈 其他工具⚓️ 相关链接 ⚓️📖 介绍 📖 “OpenAI的最新突破——GPT-4o已经到来,国内用户如何免费体验这一AI革命性产品?” 随着OpenAI的GPT-4o模型的发布,全球AI领域…

搭建Prometheus+grafana监控系统

1. 项目目标 (1)熟练部署安装node_exporter (2)熟练部署安装prometheus (3)熟练部署安装grafana 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 prometheus-server 10.0.1.10 server prome…

怎么批量下载视频?DY视频爬虫在线提取采集工具

短视频批量下载工具,具有多种模块和功能,方便用户快速批量下载短视频。该软件的详细介绍: 功能模块介绍: 一. 搜索词批量搜索下载 视频关键词添加:支持添加多个视频关键词Q530269148进行全平台视频搜索。历史去重&a…

STM32最小系统

组件描述主控芯片STM32F103C8T6等时钟源外部晶体振荡器或者陶瓷谐振器,通常在4MHz到25MHz之间复位电路包括复位按钮和复位电路,用于将单片机置于初始状态电源电路提供稳定的电压,通常为3.3V或5V编程/调试接口SWD接口或JTAG接口等,…

继承,多态,封装以及对象的打印

前言: 我们都知道Java是一种面向对象的编程语言,面向对象语言的三大特性就是继承,多态,封装,而这些特性正好的Java基础的一个主体内容。在学到这之前,我们肯定已经学习过了类和对象,所以这部分…

白酒:低酒精度白酒的消费特点与市场前景

低酒精度白酒的消费特点与市场前景是酒类市场的一个重要话题。随着品质意识的提高和消费者口味的多样化,低酒精度白酒逐渐受到越来越多的关注。云仓酒庄豪迈白酒作为白酒的品牌之一,其消费特点和市场前景值得深入探讨。 首先,从消费特点来看…

SQLserver - 笔记

1 SQLserver - 用户管理 4、SQL SERVER数据库用户管理_哔哩哔哩_bilibili 创建用户 - user 2.选择用户,修改属性

MIRO时,修改页签“采购订单参考”的数量时,金额不自动计算

MIRO 发票校验时,进入到如下界面,系统参考采购订单自动带出已经收货的金额和数量。 此时如果想要修改数量时,有些用户账号下,金额不自动计算,但是有些用户账号下,数量更改时,系统自动计算和建议…

互联网上的IP地址定位的应用及意义

在当今高度互联的数字时代,IP地址定位技术发挥着重要作用,帮助企业、机构和个人在多种应用场景中提高效率、保障安全和优化服务。IP数据云将深入探讨IP地址定位技术的具体应用及其实际意义。 什么是IP地址定位? IP地址定位IP数据云 - 免费IP…

效率提升80%!苏州金龙国际贸易数字提单试点成功

日前,江苏苏州自贸片区基于星火链网融合型基础设施和通商互信(TradeTrust)标准的数字提单试点成功,该批数字提单业务为苏州金龙客车对菲律宾的整车出口,由全球最大的集装箱运输公司马士基承运。随着车辆的成功交付&…

搭建Kubernetes v1.20二进制集群——单Master和Node组件

前言 本文将介绍如何使用二进制文件手动搭建 Kubernetes v1.20 集群。通过这种方法,我们可以更好地理解 Kubernetes 的内部工作原理,并具备更大的灵活性和控制权。下面将逐步构建 Kubernetes 集群,并进一步了解其各个组件之间的交互和配置。…

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转 1. 源由2. 视频效果2.1 整体刷新率不高2.2 网络延迟可接受2.3 带宽增加丢包明显2.4 实测效果流畅 3. 总结 1. 源由 上一次,由于ZeroTier使用了国外服务器,延迟~ 569 ms,花屏、卡顿。 本着…

如何在湖师大官网找到考研真题

今天学弟问我怎么找真题,我必须告诉他怎么找湖师大的真题,身为考研学子,这是必须要知道滴,尤其是自命题,是吧,话不多说,言归正传,我们开始吧! 1 打开湖师大官网 什么&a…

酷开科技不断赋能电视,致力于为消费者带来更好的娱乐体验!

在这个快节奏的现代社会,我们总是忙忙碌碌奔波在外,期冀找寻一份温馨和陪伴,但与其在外寻寻觅觅不如把目光放回到身边来,或许在家里你也能收获一份安宁与陪伴呢! 人类不断增长的信息、心理和感官需求是媒体发展进步的…