當交換機鏡像埠不足、不想採購專用 NPB (Network Packet Broker) 設備時,可在 Linux 核心層實現流量鏡像聚合與複製。本文完整記錄 MIRROR 核心模組的設計、關鍵程式碼、啟動腳本與實測數據。
# 格式:源介面@目的介面_源介面@目的介面_源介面1/源介面2@目的介面
# 範例:eth1@eth2_eth1@eth3_eth1/eth4@eth5
# 含義:
# 1. eth1 流量複製給 eth2、eth3
# 2. eth1 與 eth4 流量聚合給 eth5
_ 分割多組規則@ 分割源/目的/ 分割多源
ethout_bits[MAX_OUT]:每張網卡一個位元組,bit 位代表轉發目標網卡索引ethout_bits[0] = 0b01000000ifindex_bits:標記哪些介面是鏡像源,避免重複處理
// 核心邏輯簡化
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
skb_clone 零拷貝 (僅複製 skb 結構體、增加引用計數)dev_queue_xmit 入驅動發送佇列tc filter add dev eth1 ingress matchall action mirred egress mirror dev eth2核心模組雖高效但維護成本高,新專案建議優先評估 eBPF/XDP 或 tc mirred,僅在極致效能或舊核心環境下考慮核心模組。