萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> Linux中多路鏡像流量聚合和復制的處理步驟

Linux中多路鏡像流量聚合和復制的處理步驟

  在Linux系統操作中,安全性監控和測試的過程中會遇到異常流量等問題,這就需要在Linux內核上進行多路鏡像流量聚合和復制的處理了,那麼要如何進行操作呢?隨小編一起來學習一下吧。

  架構設計

   Linux中多路鏡像流量聚合和復制的處理步驟

  內核模塊的流程比較簡單,轉發配置從用戶態提交給內核模塊,如”eth1@eth2_eth1@eth3_eth1/eth4@eth5“,這段的配置是:

  來自eth1的流量,復制給eth2和eth3

  來自eth1和eth4的流量,聚合給eth5

  MIRROR內核模塊中,只需要實現參數讀取,配置分析,網卡判斷(源,目的)即可。

  算法、代碼實現

  參數輸入

   Linux中多路鏡像流量聚合和復制的處理步驟

  這段代碼的功能是,將前面提到的如“eth1@eth2_eth1@eth3_eth1/eth4@eth5“這樣的參數,按照”_”進行拆分,分段提交給參數設置函數”option_setup”

  參數設置

   Linux中多路鏡像流量聚合和復制的處理步驟
上一頁123下一頁共3頁

  這裡我們把得到的參數”eth0@eth1”進行進一步的拆分,分出了源網卡eth0,目的網卡eth1,在內核模塊的全局變量中,有一個結構

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

  用來存儲每個網卡對應分發的網卡號,可以這樣理解,如果服務器有8個網卡,那麼每個網都會有一個8位的二進制數來標明它的轉發,比如eth0復制到eth1,那麼ethout_bits[0]就等於01000000,以此類推,如果我要把eth0復制到其他所有網卡,就會是01111111。

  同時用一個全局的8字節變量,來存儲哪些網卡是鏡像流量口,防止多余的資源浪費。

  __read_mostly__u8 ifindex_bits = 0;

  Skb包復制和轉發

   Linux中多路鏡像流量聚合和復制的處理步驟

  當Linux內核收到一個skb結構的數據包時,判斷這個數據包是不是在轉發列表裡,也就是網卡是不是鏡像源。

  Linux中多路鏡像流量聚合和復制的處理步驟

  接著我用了一個循環,來遍歷存儲的轉發目的網口,如果匹配的話,就使用skb_clone函數將數據包復制一份,然後通過dev_queue_xmit函數直接發送出去。

  最後清理skb_buff結構。

  啟動腳本

  為了方便調試和快速提交參數,可以使用如下的shell腳本:

   Linux中多路鏡像流量聚合和復制的處理步驟
上一頁12 3下一頁共3頁

  實測效果

  編譯,填充參數並執行

  執行sh sh.sh

  Dmesg輸出

  Linux中多路鏡像流量聚合和復制的處理步驟

  鏡像流量效果

   Linux中多路鏡像流量聚合和復制的處理步驟

  這裡可以看到流量統計由於網卡速率,時間差等,並不會100%一樣,是正常的。

  CPU占用

  當流量已經達到400M左右的時候,CPU占用仍然比較低。

   Linux中多路鏡像流量聚合和復制的處理步驟

  MIRROR.c源代碼與pdf格式下載

  上面就是Linux內核實現多路鏡像流量聚合和復制的方法介紹了,如果你的交換機上可做鏡像流量的端口數量有限制,又不想購買專業的設備的話,不妨試試上面介紹的方法吧。

上一頁123 下一頁共3頁
copyright © 萬盛學電腦網 all rights reserved