2つのインターフェイス間のすべてのトラフィック(イーサネットフレーム)がタブに接続されているアプリケーションを通過するように、2つの物理インターフェイス間にタブ(または2つが必要な場合は複数のタブ)を作成できますか?
これが可能であれば、構成の観点からどのように達成されますか?
私はアプリケーションでTapインターフェースを読み書きすることに慣れています。アプリケーションが双方向のトラフィックを読み書きできるようにする方法を探しています。 Linuxデバイスは本質的に見えないイーサネットブリッジになります。
私の目標は、アプリケーションに次の2つのことを実行させることです。
一方向:ターゲットMACに基づいて特定のフレームをフィルタリングします。イーサネット0到着イーサネット101:01:01:01:01:01 または ff:ff:ff:ff:ff:ff:ff と一致しない項目は削除されます。
他の方向:いくつかのフレームを遅らせます。イーサネット1到着イーサネット0バッファリングされた次のYサイクルの間、Xサイクルごとに1回だけ送信されます。
これが不可能または可能であっても、これを達成するためのより良い方法はありますか?
編集:@dirktは答えで述べたアプローチに従います。
はい。 2つのtuntapインターフェースtap0とtap1を使用してアプリケーションを作成し、> tap0をeth0に関連付け、tap1をeth1に関連付けます。
アプリケーション層で2つ(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
2つのインターフェイス間のすべてのトラフィック(イーサネットフレーム)がタブに接続されているアプリケーションを通過するように、2つの物理インターフェイス間にタブ(または2つが必要な場合は複数のタブ)を作成できますか?
はい。 2 つの tuntap インターフェイスを使用してtap0
アプリケーションを作成し、tap1
とtap0
ブリッジします。eth0
tap1
eth1
2 つのブリッジされた物理インターフェイス間の分割
eth0
とがすでにブリッジされている場合はeth1
効果がありません。ebtables
ブリッジ内のこれらのインターフェイス間でパケットを「盗んだ」他の場所に送信する必要があります。
一方向:ターゲットMACに基づいた特定のフレームフィルタリング
を使用して直接これを実行できますebtables
。
その他の方向:一部のフレーム遅延
次のようなものを使用できます
tc qdisc add dev tap0 root netem delay 100ms
インターフェイスに遅延を追加しますが、一方向の「特定のフレーム」に対してこれを行うことは、実際にはアプリケーションで簡単になります。