很多種交換機上都可以配置鏡像端口,也就是說所有的流量都要順便發一份到鏡像端口,一般都是在鏡像端口上接一個主機,上面開啟抓包或者審計程序,保證時刻監控網絡流量。鏡像端口解決了學習型交換機無法抓包的問題。
Linux實現了一個軟件版本的Bridge,也正是一個交換機,只是可能端口少些,通過brctl setageingtime <brname> <time>將time設置成0也可以使該軟交換機退化成一個Hub。然而我沒有在brctl的man手冊中找到如何來配置鏡像端口的任何信息,於是自己實現了一個。我的實現目前只測試了支持一個鏡像端口的情形,當然很容易擴展成支持任意多個。總的來講,對代碼的修改有兩處:
0.對基礎數據結構的修改
net_bridge_port結構體中增加一個flag,設為M,表示該端口為鏡像端口;
1.br_add_if函數增加一個參數
該新增參數表示是否為鏡像端口,若是,則設置新增net_bridge_port的M標志
2.修改br_handle_frame_finish函數
此處修改最為關鍵,主要有下面的邏輯:
以上0,1,2基本就可以實現鏡像端口了,方便了網絡抓包和網絡調試。對於用戶態的brctl也需要修改,很簡單,只需要能在addif時傳入一個M標志即可以。