歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux Bridge的鏡像端口實現

很多種交換機上都可以配置鏡像端口,也就是說所有的流量都要順便發一份到鏡像端口,一般都是在鏡像端口上接一個主機,上面開啟抓包或者審計程序,保證時刻監控網絡流量。鏡像端口解決了學習型交換機無法抓包的問題。

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函數

此處修改最為關鍵,主要有下面的邏輯:

  1. ...  
  2. if (skb) {  
  3.     if (dst) {  
  4.         if (!dst->dst->flags & M) {  
  5.             struct net_bridge_port *p;  
  6.             list_for_each_entry(p, &br->port_list, list) {  
  7.                 if (p->flags & M) {  
  8.                     struct sk_buff *skb3 = skb_clone(skb, GFP_ATOMIC);  
  9.                     br_forward(dst->dst, skb3);  
  10.                 }  
  11.             }      
  12.         }  
  13.         br_forward(dst->dst, skb);  
  14.     } else  
  15.         br_flood_forward(br, skb);  
  16. }  
  17. ...

以上0,1,2基本就可以實現鏡像端口了,方便了網絡抓包和網絡調試。對於用戶態的brctl也需要修改,很簡單,只需要能在addif時傳入一個M標志即可以。

Copyright © Linux教程網 All Rights Reserved