歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux Bridge的鏡像端口實現

Linux Bridge的鏡像端口實現

日期:2017/2/28 15:54:03   编辑:Linux教程

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

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