在兩個橋接的物理介面之間分接
是否可以在兩個物理介面之間創建一個分路器(或多個分路器,如果需要兩個?),以便兩個介面之間的所有流量(乙太網幀)都通過連接到分路器的應用程序傳遞?
如果這是可能的,那麼從配置的角度來看如何實現呢?
我熟悉從應用程序讀取和寫入點擊界面,我只是在尋找如何設置它,以便應用程序可以讀取和寫入雙向的流量。linux設備基本上變成了一個無形的乙太網橋。
我的目標是能夠讓應用程序在兩者之間做兩件事:
在一個方向上:根據目標 MAC 過濾某些幀 - 例如,從eth0到eth1的所有數據包不是到 dest 01:01:01:01:01:01 或 ff:ff:ff:ff:ff:ff 被丟棄
在另一個方向:延遲一些幀 - 例如,從eth1到eth0的所有數據包都被緩衝,然後僅每 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
在兩個橋接的物理介面之間分接
如果
eth0
和eth1
已經被橋接,那麼這是行不通的。您必須使用ebtables
“竊取”網橋內這些介面之間的數據包,並將它們定向到其他地方。單向:根據目標 MAC 過濾某些幀
您可以直接使用
ebtables
.在另一個方向:延遲一些幀
你可以使用類似的東西
tc qdisc add dev tap0 root netem delay 100ms
為界面添加延遲,但為“某些幀”和一個方向等執行此操作可能確實更容易在應用程序中執行。