0

IPv6 に関する状況とSO_BINDTODEVICE、本当に助けが必要な状況があります。私はこのような設定をしたい:

Linux を実行している私のマシンでは、着信トラフィックは oneth0です。これらのパケットは、複数のアプリケーションのいずれかを宛先としています。パケット ペイロードに含まれる一部のビットは、複数のアプリケーションのいずれにパケットが送信されるかを決定します。つまり、パケットの宛先がどのアプリケーションであっても、宛先 IP アドレスは同じです。これは重要。

これを実装するために、 を使用して設計しましたSO_BINDDTODEVICE。これが私がすることです:

アプリケーションごとに 1 つの「ダミー」インターフェースをセットアップしました。私の例では、2 つのアプリケーションがあります。つまり、セットアップdummy0dummy1インターフェースがあります。

Linux カーネルのフック関数 (PRE_ROUTINGフック) は、受信パケットの内容のビットを調べて、送信先のアプリケーションを決定します。決定すると、PRE_ROUTINGフックは Linuxskb構造 ( skb->dev) 内のデバイスを「dummy0」または「dummy1」のいずれかを指すように設定します。

各アプリケーションは RAW ソケット (どのアドレスにもバインドされていません) を開き、SO_BINDTODEVICE ソケット オプションを設定してdummy0dummy1それぞれダミー インターフェイスの 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 マーティン

4

0 に答える 0