是否可以在两个物理接口之间创建一个分接头(或多个分接头,如果需要两个?),以便两个接口之间的所有流量(以太网帧)都通过连接到分接头的应用程序?
如果这是可能的,从配置的角度来看如何实现?
我熟悉从应用程序读取和写入 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
,然后tap0
与eth0
和tap1
进行桥接eth1
。
两个桥接物理接口之间的分路
如果eth0
和eth1
已经桥接,那么这不起作用。您必须用于ebtables
在网桥内的这些接口之间“窃取”数据包,并将它们定向到其他地方。
单向:根据目标 MAC 过滤某些帧
您可以直接使用 来执行此操作ebtables
。
另一个方向:延迟一些帧
你可以使用类似的东西
tc qdisc add dev tap0 root netem delay 100ms
向接口添加延迟,但在一个方向上对“某些帧”执行此操作可能确实在应用程序中更容易做到。