萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心模組實現多路鏡像流量聚合與複製:架構設計、程式碼解析與效能實測

當交換機鏡像埠不足、不想採購專用 NPB (Network Packet Broker) 設備時,可在 Linux 核心層實現流量鏡像聚合與複製。本文完整記錄 MIRROR 核心模組的設計、關鍵程式碼、啟動腳本與實測數據。

架構設計

MIRROR 模組架構圖

配置語法

# 格式:源介面@目的介面_源介面@目的介面_源介面1/源介面2@目的介面
# 範例:eth1@eth2_eth1@eth3_eth1/eth4@eth5
# 含義:
# 1. eth1 流量複製給 eth2、eth3
# 2. eth1 與 eth4 流量聚合給 eth5

核心程式碼關鍵實作

1. 參數解析 (模組載入時)

參數輸入解析程式碼

  • 以 _ 分割多組規則
  • 每組再以 @ 分割源/目的
  • 聚合規則以 / 分割多源

2. 參數建立轉發對應表

參數設置程式碼

  • ethout_bits[MAX_OUT]:每張網卡一個位元組,bit 位代表轉發目標網卡索引
  • 例:eth0 複製到 eth1 → ethout_bits[0] = 0b01000000
  • ifindex_bits:標記哪些介面是鏡像源,避免重複處理

3. SKB 封包複製與轉發 (核心路徑)

SKB 封包處理流程

轉發迴圈程式碼

// 核心邏輯簡化
if (skb->dev->ifindex 在鏡像源列表) {
    u8 targets = ethout_bits[src_index];
    for (i = 0; i < MAX_OUT; i++) {
        if (targets & (1 << i)) {
            struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
            clone->dev = dev_get_by_index(&init_net, out_ifindex[i]);
            dev_queue_xmit(clone);  // 直接送出,不經協定棧
        }
    }
}
kfree_skb(skb);  // 原封包正常處理或釋放

啟動腳本自動化

啟動腳本範例

#!/bin/bash
# sh.sh
insmod mirror.ko "eth1@eth2_eth1@eth3_eth1/eth4@eth5"
# 或寫入 /etc/modules-load.d/mirror.conf

實測效果驗證

dmesg 載入日誌

鏡像流量統計對比

  • 流量統計因網卡速率、時間差、中斷合併等因素,雙向不完全對等屬正常
  • Wireshark 抓包驗證:封包內容完整、序號正確、無重複/遺漏

CPU 佔用效能數據

CPU 佔用率圖表

  • 400 Mbps 流量下 CPU 佔用極低 (<5%)
  • 受益於 skb_clone 零拷貝 (僅複製 skb 結構體、增加引用計數)
  • 無協定棧處理開銷,直接 dev_queue_xmit 入驅動發送佇列

生產環境部署建議

  1. 核心版本鎖定:DKMS 自動重建模組,防止核心更新失效
  2. 多佇列優化:RSS/RPS/RFS 將中斷分散多核心
  3. 巨型幀支援:MTU 9000 減少封包處理次數
  4. 旁路部署:搭配光分路器 (TAP) 或交換機 SPAN,不影響生產流量
  5. 高可用**:雙機 VRRP/Keepalived + 狀態同步

現代替代方案

  • eBPF XDP:用戶空間可程式化、無需核心模組、安全穩定
  • tc (Traffic Control) mirred:tc filter add dev eth1 ingress matchall action mirred egress mirror dev eth2
  • DPDK/VPP:用戶空間高速封包處理、零拷貝、百萬級 pps

核心模組雖高效但維護成本高,新專案建議優先評估 eBPF/XDP 或 tc mirred,僅在極致效能或舊核心環境下考慮核心模組。

copyright © 萬盛學電腦網 all rights reserved