3-3 基于RYU的流量風暴事件原理與響應策略

在傳統網絡中,存在著一定的廣播流量,占據了一部分的網絡帶寬。同時,在有環的拓撲中,如果不運行某些協議,廣播數據還會引起網絡風暴,使網絡癱瘓。
如有以下的一個網絡拓撲結構(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 pltdef 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 icmpv6class 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.datapathofproto = 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.ofprotoparser = datapath.ofproto_parserinst=[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.msgdp = msg.datapathofp = dp.ofprotoofp_parser = dp.ofproto_parserin_port = msg.match['in_port']dpid=dp.idpkt = 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.dstprint(dst)src = eth_pkt.srcself.mac_port_table[dpid][src] = in_portif dst in self.mac_port_table[dpid]:out_port = self.mac_port_table[dpid][dst]else:out_port = ofp.OFPP_FLOODactions = [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_outif msg.buffer_id != ofp.OFP_NO_BUFFER:self.add_flow(dp, 1, match, actions, msg.buffer_id)print("1")returnelse:self.add_flow(dp, 1, match, actions)print("2")data = Noneif msg.buffer_id == ofp.OFP_NO_BUFFER:data = msg.dataout = 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.pswp.cn/web/12939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12939.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

零基礎學Java第十四天之枚舉

枚舉 1、理解 枚舉(Enumeration,通常簡寫為enum)在編程語言中是一種特殊的數據類型,它允許你為變量定義一組命名的常量。這些常量通常表示一組有限的值,比如一周的七天、顏色的集合或者狀態的集合等。枚舉類型的主要目…

es 分詞器(五)之elasticsearch-analysis-jieba 8.7.0

es 分詞器(五)之elasticsearch-analysis-jieba 8.7.0 今天咱們就來講一下es jieba 8.7.0 分詞器的實現,以及8.x其它版本的實現方式,如果想直接使用es 結巴8.x版本,請直接修改pom文件的elasticsearch.version版本號即可…

再談畢業論文設計投機取巧之IVR自動語音服務系統設計(信息與通信工程專業A+其實不難)

目錄 舉個IVR例子格局打開,萬物皆能IVR - 把《民法典》搬上IVR IVR系統其實可鹽可甜。還能可圈可點。 戎馬一生,歸來依然IVR。 舉個IVR例子 以下是IVR系統的一個例子。 當您撥打電話進入IVR系統。 首先檢驗是否為工作時間。 如是,您將被送入…

基于51單片機的自動澆花器電路

一、系統概述 自動澆水灌溉系統設計方案,以AT89C51單片機為控制核心,采用模塊化的設計方法。 組成部分為:5V供電模塊、土壤濕度傳感器模塊、ADC0832模數轉換模塊、水泵控制模塊、按鍵輸入模塊、LCD顯示模塊和聲光報警模塊,結構如…

垃圾分類管理系統java項目

文章目錄 垃圾分類管理系統一、項目演示二、項目介紹三、系統部分功能截圖四、部分代碼展示五、底部獲取項目(9.9¥帶走) 垃圾分類管理系統 一、項目演示 垃圾分類管理系統 二、項目介紹 系統角色:管理員、用戶 1、登錄、注冊功能…

機器人非線性系統反饋線性化與解耦

機器人非線性系統的反饋線性化和解耦是控制理論中的兩個重要概念,它們分別用于簡化系統分析和設計過程,提高控制系統的性能。 首先,反饋線性化是一種將非線性系統轉化為線性系統的技術。在機器人控制中,由于機器人本身是一個強耦…

?python使用selenium進行Web自動化測試?

什么是selenium Selenium 是 ThoughtWorks 提供的一個強大的基于瀏覽器的 Selenium 是一個用于 Web 應用程序測試的工具,測試直接自動運行在瀏覽器中,就像真正的用戶在手工操作一樣。支持的瀏覽器包括 IE、Chrome 和 Firefox 等。這個工具的主要功能包…

2024042001-計算機網絡 - 物理層

計算機網絡 - 物理層 計算機網絡 - 物理層 通信方式帶通調制 通信方式 根據信息在傳輸線上的傳送方向,分為以下三種通信方式: 單工通信:單向傳輸半雙工通信:雙向交替傳輸全雙工通信:雙向同時傳輸 帶通調制 模擬信號…

C++基礎——繼承(下)

一、繼承與靜態成員 基類定義了static 靜態成員,則整個繼承體系里面只有一個這樣的成員。無論派生出多少個子 類,都只有一個 static 成員實例 。 class person { public:person(const char* name "lisi"):_name(name){} public:string _name;…

那些年我與c++的叫板(一)--string類自實現

引子:我們學習了c中的string類,那我們能不能像以前數據結構一樣自己實現string類呢?以下是cplusplus下的string類,我們參考參考! 廢話不多說,直接代碼實現:(注意函數之間的復用&…

Nacos+GateWay 搭建微服務架構

文章目錄 1.當前項目架構分析1.請求多個模塊的方式1.請求renren-fast模塊開發環境生產環境 2.請求sunliving-commodity模塊1.使用環境變量資源路徑的方式2.開發環境 dev.env.js3.生產環境 prod.env.js 3.文件上傳請求 sunliving-service模塊1.請求后端接口(開發環境…

當服務實例出現故障時,Nacos如何處理?

當服務實例出現故障時,Nacos的應對策略 在微服務架構日益盛行的今天,服務之間的穩定性與可靠性成為了我們架構師們不得不面對的重要課題。尤其是在面對服務實例出現故障時,如何確保整個系統的穩定運行,成為了我們首要考慮的問題。…

匯聚榮科技:拼多多上架商品后需要做頁面推廣嗎?

在電商平臺上,商品的曝光率和銷量往往成正比。那么,當您在拼多多上架了新品,是不是就意味著坐等訂單呢?答案顯然是否定的。商品一旦上架,接下來需要做的就是通過有效的頁面推廣來增加商品的可見度,吸引潛在買家的注意…

在亞馬遜上賣燈具需要什么認證,亞馬遜燈飾產品需要審核與認證嗎

LED燈具在亞馬遜美國站銷售,需要有UL認證或者UL報告、FCC,如果是帶消毒滅菌的燈,需要做EPA,歐洲站,日本站,認證只需要CE和ROHSR認證。 UL認證:本認證主要針對充電器、移動電源、手機電池、燈具…

Rust的NLL特性:讓生命周期管理更靈活

Rust的NLL特性:讓生命周期管理更靈活 Rust語言以其獨特的內存安全和并發性能受到開發者的青睞。而在Rust中,一個關鍵的概念就是“生命周期”。為了進一步優化生命周期的管理和借用檢查,Rust引入了NLL(Non-Lexical Lifetime&#…

html基礎(全)

html簡介 目錄 什么是網頁 什么是 HTML 常用瀏覽器 WebE標準的構成 基本語法概述 第一個HTML頁面 文檔類型聲明標簽 lang 語言種類 字符集 標題標簽 段落和換行標簽 文本格式化標簽 div和span標簽 圖像標簽和路徑 超鏈接標簽 表格的主要作用 表頭單元格標簽 列…

純血鴻蒙APP實戰開發——Web獲取相機拍照圖片案例

介紹 本示例介紹如何在HTML頁面中拉起原生相機進行拍照,并獲取返回的圖片。 效果預覽圖 使用說明 點擊HTML頁面中的選擇文件按鈕,拉起原生相機進行拍照。完成拍照后,將圖片在HTML的img標簽中顯示。 實現思路 添加Web組件,設置…

【SpringBoot】SpringBoot整合jasypt進行重要數據加密

📝個人主頁:哈__ 期待您的關注 目錄 📕jasypt簡介 🔥SpringBoot使用jasypt 📂創建我需要的數據庫文件 📕引入依賴 🔓配置數據庫文件(先不進行加密) 🌙創…

Anaconda安裝-超詳細版(2024)

掃盲:先裝Python還是先裝anaconda? 安裝anaconda即可,不需要單獨裝python anaconda 是一個python的發行版,包括了python和很多常見的軟件庫, 和一個包管理器conda。 一、下載Anaconda 安裝包(官網和國內鏡像資源) …