IPv6 に関する状況とSO_BINDTODEVICE
、本当に助けが必要な状況があります。私はこのような設定をしたい:
Linux を実行している私のマシンでは、着信トラフィックは oneth0
です。これらのパケットは、複数のアプリケーションのいずれかを宛先としています。パケット ペイロードに含まれる一部のビットは、複数のアプリケーションのいずれにパケットが送信されるかを決定します。つまり、パケットの宛先がどのアプリケーションであっても、宛先 IP アドレスは同じです。これは重要。
これを実装するために、 を使用して設計しましたSO_BINDDTODEVICE
。これが私がすることです:
アプリケーションごとに 1 つの「ダミー」インターフェースをセットアップしました。私の例では、2 つのアプリケーションがあります。つまり、セットアップdummy0
とdummy1
インターフェースがあります。
Linux カーネルのフック関数 (PRE_ROUTING
フック) は、受信パケットの内容のビットを調べて、送信先のアプリケーションを決定します。決定すると、PRE_ROUTING
フックは Linuxskb
構造 ( skb->dev
) 内のデバイスを「dummy0」または「dummy1」のいずれかを指すように設定します。
各アプリケーションは RAW ソケット (どのアドレスにもバインドされていません) を開き、SO_BINDTODEVICE ソケット オプションを設定してdummy0
、dummy1
それぞれダミー インターフェイスの 1 つにバインドします。
このセットアップを IPv4 パケットで実行すると、すべて意図したとおりに機能します。アプリケーション 1 宛てのパケットは deviceにバインドdummy0
された RAW ソケットで受信され、アプリケーション 2 宛てのパケットは device にバインドされた RAW ソケットで受信されますdummy1
。
私の問題は、IPv6 パケットに対して同じ設定が機能しないことです。:-(
IPv6 パケットは Linux IP スタックに入りますが、アプリケーションへの道は見つかりません。代わりに、着信 IPv6 パケットごとに ICMPv6「パラメータの問題、サポートされていない次のヘッダー」パケットが返されます。当然のことながら、私はそのヘッダーのハンドルを持っていませんが、RAW ソケットを使用しているため、とにかくパケットのコピーをソケットに送信する必要があります。( を使用してstrace
) どの RAW ソケットでも何も受信されていないことがわかります。IPv4 では機能しますが、IPv6 では機能しません。ペイロードはまったく同じです!
RAW ソケットを特定の宛先 IPv6 アドレスにバインドしようとしましたが、それを「ダミー」インターフェースにも追加しようとしましたが、成功しませんでした。
私が読んだマニュアルには、IPv6 については特に何も書かれていませんSO_BINDTODEVICE
が、動作しないという記述もありません。
お願いします、誰か助けてくれませんか?よろしくお願いします!
BR マーティン