4 軟件定義安全綜合:使用c/s模式進行控制器數據安全交互管理

在SDN三層結構中,我們通過OpenFlow 協議可以控制數據轉發設備的相關行為(包括收集設備的信息),那么控制器上的數據能否通過應用層的程序進行管理調用呢?
SDN(軟件定義網絡)的北向開發是指通過編寫應用程序或API來與SDN控制器進行交互,以實現網絡管理、配置和控制性。實際上就是解決:ryu控制器如何實現與應用層(如web、app等)的通信,利用SDN的北向接口的功能就是和其他軟件實體之間的通信。
本文將展示控制器與應用層如何通信,所以為了便于理解,本次以上博文中編寫的控制器為例子(packet_statics.py)結合mininet模塊創建的網絡拓撲(3_2_topo.py),然后在另外一個應用程序中開啟數據收集(另外一個應用進程app_server.py),獲取在SDN環境中每次通信的dpid和port,并傳輸給應用層(app_server.p),開發環境結構如下。
在這里插入圖片描述 圖1 框架
數據轉發層面和控制層面都是在Ubuntu虛擬機下面開發,在ryu環境中運行編寫好的程序,在宿主機(本文也放在ubuntu)中運行編寫好的server端程序。

(1)server程序編寫

server端主要用于接收控制器的連接,并接收由控制器發送過來的信息(如dpid和port信息),也可以收集控制器其他的數據,原理一樣。

import socket
import redef main():server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCPhost = '127.0.0.1'  # ubuntu地址,開啟服務功能,用來給ryu主動連接提交數據port = 12345  # 開放端口,自主定義一般大于1024server1.bind((host, port))server1.listen(5)while True:conn, addr = server1.accept()print("----------------------------")print("Success connect from ", addr)try:count = 0while True:data = conn.recv(1024)data = re.split(r'[, :]', data.decode('utf-8'))  # 對收到的信息進行解析,包括dpid和portcount += 1print("from {0}:dpid={1}, in_port={2}".format(addr, data[0], data[1]))conn.close()except Exception as error:  # 當控制器和應用層斷開連接后,輸出統計信息print('共接收{}條信息。'.format(count - 1))print(error)exit()if __name__ == '__main__':main()

(2)ryu控制器程序


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, CONFIG_DISPATCHER
from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet, ethernet, ipv6, icmp, icmpv6
import socket
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):super(L2Switch, self).__init__(*args, **kwargs)self.mac_port_table = {}self.protocol_stats = {}# 開啟client,并連接serverself.client1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)dst_host = '127.0.0.1'dst_port = 12345# 防止server端連接不上影響hub的使用try:self.client1.connect((dst_host, dst_port))except Exception as error:print('Connect error:', error)@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_features_handler(self, ev):datapath = ev.msg.datapathofproto = datapath.ofprotoparser = datapath.ofproto_parsermatch = 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_handler(self, ev):msg = ev.msgdp = msg.datapathofp = dp.ofprotoofp_parser = dp.ofproto_parserin_port = msg.match['in_port']dpid = dp.idprint(dpid)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.dstsrc = 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)if msg.buffer_id != ofp.OFP_NO_BUFFER:self.add_flow(dp, 1, match, actions, msg.buffer_id)returnelse:self.add_flow(dp, 1, match, actions)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)# send to serverinfo = str(dpid) + ',' + str(in_port)self.client1.send(info.encode()) #把信息傳送到應用程序端

(3) 轉發層程序
轉發層層序主要是負責網絡拓撲環境搭建

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 pltclass NoIPv6Host(Host):def config(self, **kwargs):super(NoIPv6Host, self).config(**kwargs)self.cmd('sysctl -w net.ipv6.conf.all.disable_ipv6=1')self.cmd('sysctl -w net.ipv6.conf.default.disable_ipv6=1')def create_network():net = Mininet(host=NoIPv6Host)# 創建單個OVS交換機switch1 = net.addSwitch('s1', cls=OVSSwitch,protocols='OpenFlow13')switch2 = net.addSwitch('s2', cls=OVSSwitch,protocols='OpenFlow13')switch3 = net.addSwitch('s3', cls=OVSSwitch,protocols='OpenFlow13')switch4 = net.addSwitch('s4', cls=OVSSwitch,protocols='OpenFlow13')switch5 = net.addSwitch('s5', 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, switch5)net.addLink(host3, switch5)net.addLink(host4, switch5)
#交換機連接交換機net.addLink(switch1, switch2)net.addLink(switch2, switch5)net.addLink(switch1, switch3)net.addLink(switch3, switch5)net.addLink(switch1, switch4)net.addLink(switch4, switch5)# 指定控制器的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()

(4)實驗測試
按照以下順序:
1) 運行app_server.py 應用程序監聽
2)運行RYU控制器,觀察與app_server.py 應用連接
3)運行轉發層網絡
可以觀察到數據之間的交互
在這里插入圖片描述 圖2 app_server 數據接收
在這里插入圖片描述
圖3 packet_statics控制器運行后,數據轉發層面截圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12752.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12752.shtml

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

相關文章

ASUS Zenbook PE重裝系統后一直轉圈不斷重啟

問題描述: ASUS Zenbook PE重裝系統后一直轉圈不斷重啟 問題原因: RST驅動問題 解決辦法: 使用U盤安裝原版系統,安裝過程中,發現磁盤頁面沒有不識別硬盤,此時選擇加載驅動,加載RST驅動。一…

二進制搭建k8s

實驗環境: k8s集群master01:192.168.1.11 k8s集群master02:192.168.1.22 master虛擬ip:192.168.1.100 k8s集群node01:192.168.1.33 k8s集群node01:192.168.1.44 nginxkeepalive01(master):192.168.1.55 nginxkeepalive02&a…

渲染農場是什么意思?瑞云渲染為你解答

渲染農場是一種通過集合多臺計算機的計算能力來加速圖像渲染過程的系統。它尤其適用于動畫、電影特效和高端視覺效果的制作,這些領域通常需要處理非常復雜和計算密集型的渲染任務。 渲染農場就是一大群電腦,他們一起可以快速渲染出漂亮的圖像。在做動畫片…

客觀需求驗證的常見5大步驟(實施版)

我們在挖掘用戶需求時,往往容易犯偽需求或需求錯位等問題,因此需要進行客觀需求驗證。通過客觀的驗證,我們可以有效減少主觀判斷誤差問題,確保需求的準確性,從而降低需求變更和項目風險的概率,減少開發成本…

LeetCode算法題:11. 盛最多水的容器(Java)(雙指針問題總結)

給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器可以儲存的最大水量。 提示&#xff1a; n height.length2 <…

第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組 數三角

//枚舉頂點。 //不存在等邊三角形 #include<bits/stdc.h> using namespace std; #define int long long const int n2e311; int a,b,c,l[n],r[n]; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a;for(int i1;i<a;i){cin>>…

UE4_環境_局部霧化效果

學習筆記&#xff0c;不喜勿噴&#xff01;侵權立刪&#xff01;祝愿大家生活越來越好&#xff01; 本文重點介紹下材質節點SphereMask節點在體積霧中的使用方法。 一、球體遮罩SphereMask材質節點介紹&#xff1a; 球體蒙版&#xff08;SphereMask&#xff09; 表達式根據距…

【筆記】Android Studio 版本信息

Android Studio Jellyfish | 2023.3.1 | Android Developers Android Studio 是開發 Android 應用的官方 IDE&#xff0c;包含構建 Android 應用所需的所有功能。 AS與AGP版本適用關系 AGP(Android Gradle plugin) Android gradle插件 Androdi Studio versionRequired AG…

2024紅帽全球峰會:CEO行業洞察分享

作為全球IT領域一年一度的行業盛宴&#xff0c;2024紅帽全球峰會于近日盛大召開。生成式AI與大模型是當前IT行業最受關注的熱點話題&#xff0c;而紅帽在生成式AI與大模型領域的最新動作&#xff0c;也理所當然地成為了本屆峰會觀眾目光聚集的焦點。 作為世界領先的開源解決方案…

使用vcpkg與json文件自動安裝項目依賴庫

說明 本文記錄自己使用vcpkg.json文件自動安裝依賴庫并完成編譯的全過程。 關于vcpkg是什么這里就不多詳細解釋&#xff0c;可以看一下專門的介紹及安裝的文章&#xff0c;總之了解這是一個C的包管理工具就可以了。 流程 下面介紹從GitHub上克隆C項目以及為這個項目安裝所需…

二叉樹的常見操作

建立樹 復制二叉樹 計算深度 計算總結點數 計算葉子結點數

OpenHarmony標準設備應用開發(二)——布局、動畫與音樂

本章是 OpenHarmony 標準設備應用開發的第二篇文章。我們通過知識體系新開發的幾個基于 OpenHarmony3.1 Beta 標準系統的樣例&#xff1a;分布式音樂播放、傳炸彈、購物車等樣例&#xff0c;分別介紹下音樂播放、顯示動畫、動畫轉場&#xff08;頁面間轉場&#xff09;三個進階…

AI工具的熱門與卓越:揭示AI技術的實際應用和影響

文章目錄 每日一句正能量前言常用AI工具創新AI應用個人體驗分享后記 每日一句正能量 我們在我們的勞動過程中學習思考&#xff0c;勞動的結果&#xff0c;我們認識了世界的奧妙&#xff0c;于是我們就真正來改變生活了。 前言 隨著人工智能&#xff08;AI&#xff09;技術的快…

深度剖析MyBatis的二級緩存

二級緩存的原理 MyBatis 二級緩存的原理是什么&#xff1f; 二級緩存的原理和一級緩存一樣&#xff0c;第一次查詢會將數據放到 緩存 中&#xff0c;然后第二次查詢直接去緩存讀取。但是一級緩存是基于 SqlSession 的&#xff0c;二級緩存是基于 mapper 的 namespace 的。也就是…

關于API接口的自述

在實際工作中&#xff0c;我們需要經常跟第三方平臺打交道&#xff0c;可能會對接第三方平臺API接口&#xff0c;或者提供API接口給第三方平臺調用。 那么問題來了&#xff0c;如果設計一個優雅的API接口&#xff0c;能夠滿足&#xff1a;安全性、可重復調用、穩定性、好定位問…

Qt運行時,如何設置第一個聚焦的控件

問題&#xff1a;Qt第一個聚焦的控件&#xff0c;如何自行設置&#xff1f; 嘗試&#xff1a; 1.在代碼中設置 lineEdit->setFocus() 。無效&#xff01; 2.Qt Designer–打開form1.ui–菜單欄下一行–Edit Tab Order–按順序點擊–菜單欄下一行–Edit Widgets–退出。無效…

為什么做了功能測試還要做接口測試

接口測試與功能測試不是重復的測試,而是互為補充的測試策略。 在軟件測試領域,接口測試和功能測試被視為質量保證過程中至關重要的組成部分。盡管它們之間存在部分重復,但更多的情況下,它們相輔相成,各自發揮著獨特的作用。本文將探討接口測試與功能測試之間的關系,以及它…

【easyX】動手輕松掌握easyX 1

01 簡單繪圖 在這個程序中&#xff0c;我們先初始化繪圖窗口。其次&#xff0c;簡單繪制兩條線。 #include <graphics.h>//繪圖庫頭文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640?480繪圖屏幕line(200, 240, 440, 240);//畫線(200,240)…

MySQL是如何選擇索引的?

2.3.5. 索引選擇 MySQL是如何選擇索引的&#xff1f; 優化器決定了具體某一索引的選擇&#xff0c;也就是常說的執行計劃。而優化器的選擇是基于成本&#xff08;cost&#xff09;&#xff0c;哪個索引的成本越低&#xff0c;優先使用哪個索引。 SQL 優化器會分析所有可能的執…

Python操作鼠標鍵盤和爬蟲

一.pyautogui 庫 pyautogui 是一個 Python 庫&#xff0c;允許控制鼠標和鍵盤。可以通過它編寫 Python 腳本來自動執行各種任務&#xff0c;例如點擊按鈕、輸入文本、移動鼠標等。這個庫非常適合用來編寫自動化腳本來完成重復性的工作&#xff0c;比如網頁表單填寫、屏幕截圖、…