两个桥接物理接口之间的分路

两个桥接物理接口之间的分路

是否可以在两个物理接口之间创建一个分接头(或多个分接头,如果需要两个?),以便两个接口之间的所有流量(以太网帧)都通过连接到分接头的应用程序?

所需设置图

如果这是可能的,从配置的角度来看如何实现?

我熟悉从应用程序读取和写入 Tap 接口,我只是在寻找如何进行设置,以便应用程序可以读取和写入双向流量。 Linux设备基本上变成了一个看不见的以太网桥。

我的目标是能够让应用程序做两件事:

在一个方向上:根据目标 MAC 过滤某些帧 - 例如来自的所有数据包以太网0以太网1不符合 01:01:01:01:01:01 或 ff:ff:ff:ff:ff:ff 的将被丢弃

在另一个方向:延迟一些帧 - 例如来自以太网1以太网0被缓冲,然后仅在 Y 个周期内每 X 个周期发送一次

如果这是不可能的,或者即使是可能的,是否有更好的方法来实现这一目标?

编辑:通过 @dirkt 在他的回答中提到的方法:

是的。创建一个具有两个tuntap 接口tap0 和tap1 的应用程序,然后>将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++

}

答案1

是否可以在两个物理接口之间创建一个分接头(或多个分接头,如果需要两个?),以便两个接口之间的所有流量(以太网帧)都通过连接到分接头的应用程序?

是的。创建一个具有两个 tuntap 接口tap0和 的应用程序tap1,然后tap0eth0tap1进行桥接eth1

两个桥接物理接口之间的分路

如果eth0eth1已经桥接,那么这不起作用。您必须用于ebtables在网桥内的这些接口之间“窃取”数据包,并将它们定向到其他地方。

单向:根据目标 MAC 过滤某些帧

您可以直接使用 来执行此操作ebtables

另一个方向:延迟一些帧

你可以使用类似的东西

tc qdisc add dev tap0 root netem delay 100ms

向接口添加延迟,但在一个方向上对“某些帧”执行此操作可能确实在应用程序中更容易做到。

相关内容