溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

發(fā)布時(shí)間:2021-09-28 09:32:27 來(lái)源:億速云 閱讀:165 作者:iii 欄目:系統(tǒng)運(yùn)維

這篇文章主要介紹“如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制”,在日常操作中,相信很多人在如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

應(yīng)用場(chǎng)景

我們?cè)谶M(jìn)行安全性監(jiān)控、測(cè)試的過(guò)程中,難免會(huì)遇到這樣的問(wèn)題:需要部署大量基于鏡像流量的安全設(shè)備,如IPS,異常流量,數(shù)據(jù)庫(kù)審計(jì),流量分析等,可是交換機(jī)上可以做鏡像流量的端口數(shù)量有限制,購(gòu)買專業(yè)的設(shè)備又太昂貴。

本文就針對(duì)此種情況,從Linux內(nèi)核模塊對(duì)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)包進(jìn)行處理,解決上述問(wèn)題。這里也感謝“白金PT”給予的幫助。

架構(gòu)設(shè)計(jì)

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

內(nèi)核模塊的流程比較簡(jiǎn)單,轉(zhuǎn)發(fā)配置從用戶態(tài)提交給內(nèi)核模塊,如”eth2@eth3_eth2@eth4_eth2/eth5@eth6“,這段的配置是:

來(lái)自eth2的流量,復(fù)制給eth3和eth4

來(lái)自eth2和eth5的流量,聚合給eth6

MIRROR內(nèi)核模塊中,只需要實(shí)現(xiàn)參數(shù)讀取,配置分析,網(wǎng)卡判斷(源,目的)即可。

算法、代碼實(shí)現(xiàn)

參數(shù)輸入

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

這段代碼的功能是,將前面提到的如“eth2@eth3_eth2@eth4_eth2/eth5@eth6“這樣的參數(shù),按照”_”進(jìn)行拆分,分段提交給參數(shù)設(shè)置函數(shù)”option_setup”

參數(shù)設(shè)置

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

這里我們把得到的參數(shù)”eth0@eth2”進(jìn)行進(jìn)一步的拆分,分出了源網(wǎng)卡eth0,目的網(wǎng)卡eth2,在內(nèi)核模塊的全局變量中,有一個(gè)結(jié)構(gòu)

”__read_mostly __u8 ethout_bits[MAX_OUT] ={0};“

用來(lái)存儲(chǔ)每個(gè)網(wǎng)卡對(duì)應(yīng)分發(fā)的網(wǎng)卡號(hào),可以這樣理解,如果服務(wù)器有8個(gè)網(wǎng)卡,那么每個(gè)網(wǎng)都會(huì)有一個(gè)8位的二進(jìn)制數(shù)來(lái)標(biāo)明它的轉(zhuǎn)發(fā),比如eth0復(fù)制到eth2,那么ethout_bits[0]就等于01000000,以此類推,如果我要把eth0復(fù)制到其他所有網(wǎng)卡,就會(huì)是01111111。

同時(shí)用一個(gè)全局的8字節(jié)變量,來(lái)存儲(chǔ)哪些網(wǎng)卡是鏡像流量口,防止多余的資源浪費(fèi)。

__read_mostly__u8 ifindex_bits = 0;

Skb包復(fù)制和轉(zhuǎn)發(fā)

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

當(dāng)Linux內(nèi)核收到一個(gè)skb結(jié)構(gòu)的數(shù)據(jù)包時(shí),判斷這個(gè)數(shù)據(jù)包是不是在轉(zhuǎn)發(fā)列表里,也就是網(wǎng)卡是不是鏡像源。

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

接著我用了一個(gè)循環(huán),來(lái)遍歷存儲(chǔ)的轉(zhuǎn)發(fā)目的網(wǎng)口,如果匹配的話,就使用skb_clone函數(shù)將數(shù)據(jù)包復(fù)制一份,然后通過(guò)dev_queue_xmit函數(shù)直接發(fā)送出去。

最后清理skb_buff結(jié)構(gòu)。

啟動(dòng)腳本

為了方便調(diào)試和快速提交參數(shù),可以使用如下的shell腳本:

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

實(shí)測(cè)效果

編譯,填充參數(shù)并執(zhí)行

執(zhí)行sh sh.sh

Dmesg輸出

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

鏡像流量效果

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

這里可以看到流量統(tǒng)計(jì)由于網(wǎng)卡速率,時(shí)間差等,并不會(huì)100%一樣,是正常的。

CPU占用

當(dāng)流量已經(jīng)達(dá)到400M左右的時(shí)候,CPU占用仍然比較低。

如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制

到此,關(guān)于“如何實(shí)現(xiàn)Linux內(nèi)核多路鏡像流量聚合和復(fù)制”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI