複数のインターネット接続を持つ一種のルーターを実装しており、その接続の現在のスループットに基づいてより高速な接続を使用してパケット/フレームを転送します。
実装をテストするには、ルーティングする実際のパケットが必要です。いくつかのトラフィックを生成するためにIPパケット断片化を実装しました。私はいくつかのトラフィックを生成するためにTCP信頼性の高い接続を実装することをほとんど発見しました。私はトラフィックを生成する方法を見つけようとしており、ローカルコンピュータのIP AからリモートホストのIP Bへのソケット接続を開くと思いました。パケット生成について心配する必要がないように、その接続に関するいくつかのデータを送信します。
問題は、このパケットをルーターからルーティングするために傍受する必要があることです。私はもともとすべてのパケットをIP Bにローカルホストに戻すいくつかのルールを作成し、ローカルホストでrawソケットを開き、IP Bに向かうすべてのパケットをフィルタリングすると思いました。私はiptablesルールを作ってみました。sudo iptables -t nat -A OUTPUT -d some_ip -j DNAT --to-destination 127.0.0.1
しかし、私が見つけたのは、それがパケットの宛先IPアドレスを変更することです。私はそれをルーティングするために元のパケットを傍受したいと思います。
キャプチャできるいくつかのトラフィックを生成する方法、または指定されたIPへのパケットをホストに転送しますが、元の宛先IPアドレスを維持するようにiptablesを設定する方法を知っていますか?
説明:私が開発しているプログラムは分散システムです。複数のRaspberry Piと考えてください。そのうちの1つは実際のプロセスルーティングパケットで、残りは専用のインターネット接続を持つリレーであり、ルータープロセスは転送に最適なリレーを選択します。パケット。システム全体のプロセスはMPIコミュニケータを介して通信し、プロセス全体はMPIを使用して実装されます。したがって、ある意味ではソフトウェアルーターです。
答え1
複数のインターネット接続を持つ一種のルーターを実装しており、その接続の現在のスループットに基づいてより高速な接続を使用してパケット/フレームを転送します。
これはマルチホームではないため、TCPやUDPなどの標準プロトコルには適用されません。各インターネット「接続」は異なるIPを持ち、単一のTCPまたはUDP接続中にそのIPを変更することはできません。
最良のものは配布することです。新しいTCPまたはUDPつながる現在の使用量に応じて、さまざまなインターネットプロバイダに提供されています。実際には、iptables
必要に応じてNATルールを変更することでこれを行うことができます(Linuxカーネルの接続トラッカーは、既存の接続がパスを変更しないようにします)。
指定されたIP宛のパケットをホストに転送しますが、元の宛先IPアドレスを維持するようにiptablesを設定する方法を知っていますか?
あなたはできません。
通信の両端を制御する特定のアプリケーションの場合は、マルチホーミングプロトコル(例:SCTPまたはマルチパスTCP)逆。