Networking

在兩個橋接的物理介面之間分接

  • May 14, 2020

是否可以在兩個物理介面之間創建一個分路器(或多個分路器,如果需要兩個?),以便兩個介面之間的所有流量(乙太網幀)都通過連接到分路器的應用程序傳遞?

所需設置圖

如果這是可能的,那麼從配置的角度來看如何實現呢?

我熟悉從應用程序讀取和寫入點擊界面,我只是在尋找如何設置它,以便應用程序可以讀取和寫入雙向的流量。linux設備基本上變成了一個無形的乙太網橋。

我的目標是能夠讓應用程序在兩者之間做兩件事:

在一個方向上:根據目標 MAC 過濾某些幀 - 例如,從eth0eth1的所有數據包不是到 dest 01:01:01:01:01:01 或 ff:ff:ff:ff:ff:ff 被丟棄

在另一個方向:延遲一些幀 - 例如,從eth1eth0的所有數據包都被緩衝,然後僅每 X 滴答發送 Y 滴答

如果這是不可能的,或者即使是 - 是否有更好的方法來實現這一目標?

編輯:使用@dirkt 在他的回答中提到的方法:

是的。創建一個應用程序,它有兩個 tuntap 介面 tap0 和 tap1,然後 >bridge tap0 和 eth0 和 tap1 和 eth1。

對於如何在應用程序層中實現兩者(eth0/tap0 和 eth1/tap1)之間的橋樑,這是否是適當的虛擬碼/正確想法?


counter = 0

//eth0 is bridged to tap0
tap0 = open ("tap0") 

//eth1 is bridged to tap1
tap1 = open ("tap1") 

forever {

   //buffer all packets received by eth1 (tap1) - do I need to buffer them constantly or will they wait at the file pointer until I read them (within reason)
   packet_buffer[] = read(tap1) 

   //every 100 cycles (for simplicity)
   if (counter == 100) { 

       //reset counter
       counter = 0

       //write all buffered packets from eth1 (tap1) to eth0 (tap0)
       foreach (packet_buffer as packet){
           write(tap0, packet) 
       }

       //empty packet buffer so we can start filling it again (yes very simplified - would likely use a ring buffer)
       packet_buffer = []

   }


   //if eth0 (tap0) gets a packet
   if ( packet = read(tap0) ) { 

       //forward to eth1 (tap1) if the destination is 01:01:01:01:01:01 or ff:ff:ff:ff:ff:ff
       if(packet.dest == 01:01:01:01:01:01 OR packet.dest == ff:ff:ff:ff:ff:ff ){ 
           write(tap1, packet)
       }

   }

   //increment counter
   counter++

}

是否可以在兩個物理介面之間創建一個分路器(或多個分路器,如果需要兩個?),以便兩個介面之間的所有流量(乙太網幀)都通過連接到分路器的應用程序傳遞?

是的。創建一個具有兩個 tuntap 介面tap0和的應用程序,然後與和tap1橋接。tap0``eth0``tap1``eth1

在兩個橋接的物理介面之間分接

如果eth0eth1已經被橋接,那麼這是行不通的。您必須使用ebtables“竊取”網橋內這些介面之間的數據包,並將它們定向到其他地方。

單向:根據目標 MAC 過濾某些幀

您可以直接使用ebtables.

在另一個方向:延遲一些幀

你可以使用類似的東西

tc qdisc add dev tap0 root netem delay 100ms

為界面添加延遲,但為“某些幀”和一個方向等執行此操作可能確實更容易在應用程序中執行。

引用自:https://unix.stackexchange.com/questions/586504