同じソースにTCPパケットを送信する[閉じる]

同じソースにTCPパケットを送信する[閉じる]

パケット転送時間を短縮するシステムを設計したいと思います。クライアントがSYNビットを送信すると、ルーターを介してサーバーに送信され、サーバーはルーターを介してクライアントに送信されるSYN + ACKに応答します。ルーター。

したがって、クライアントがルーターにSYNを送信し、ルーターがそれをサーバーに送信し、このパケットをコピーしてから、SYNをSYN + ACKに変更し、サーバーからこのSYN + ACKを送信するなどの他の操作を実行したいと思います。ルーターに行き、クライアントに送り返す前にサーバーはそれを送ることができ、ルーターはそれを受け取り(応答が来たときにそれを見て)それを捨てます。

上記の目標を達成するために、1つのラップトップは2つのイーサネットインターフェイスでパケットを送受信する設定を設計し、もう1つのラップトップはルーターとして機能するデスクトップです(パケットが入ってくる場合は宛先に転送するだけです)。ルーティングテーブルを設定しました。デスクトップでIP転送を有効にします(ルーターの役割)。

すべてがうまくいきます。ラップトップにはパケットを送受信するサーバーとクライアントプログラムがありますが、問題はパケットを送信元(ソース自体)に送信したいので、パス内のパケットを変更します。 netfilterモジュールを使用してskb全体をコピーし(skb_copyを使用)、そのIPソースと宛先を交換し(NF_INET_PREROUTINGでこれを実行します)、ポート番号を交換しますが、パケットは常に宛先に送信されます。

パケットをソース自体に送信するには、他のどのような修正が必要ですか?

答え1

TCPは接続の両側で異なるシーケンスカウンタを使用します。したがって、完全なパケットを再送信すると誤ったシーケンス番号が得られ、相手は遅延した冗長パケットであると考えるため拒否されます。

しかし、送ることはできます。コンテンツ欲しいものならパケットを返してください。簡単な方法はsocat。一つになる

socat TCP-LISTEN:9990 SYSTEM:"cat"

これは着信接続を受信し、接続が確立されたら着信データにパイプしてcat同じデータを出力し、TCP接続を介して出力を取得します。

他の方法では

socat - TCP:localhost:9990

その後、最初のsocatポート9990に接続して送信され、stdin応答が作成されますstdout。数行(stdinはCRからのみ行を送信します)を入力し、再び表示されることを確認してください。

したがって、それがアイデアであれば、設定をテストするために使用できます。同様の方法ですべてをサーバーに送り返すこともできます。

socat TCP:server.com:1234 SYSTEM:"cat"

ただし、これを行うには、サーバーが接続するときに実際に何かを送信する必要があります。

それでも問題が解決しない場合は、質問を編集して説明してください。なぜ「パケット」を送り直したい問題は何ですか?「パケット」を再送信して問題を解決しますか? (設定をテストしていますか?サーバーをテストしていますか?他に何がありますか?)

これは本当に似ているようです。XYの問題

答え2

質問が完全に変わったので、別の答えは次のとおりです。

サーバーが実際にSYNを受信する前にクライアントにSYN + ACKを再送信するタスクは何ですか?同期エージェントする。 Google の既存の実装です。

これは「パケットを再送信する」とは何の関係もなく、単に初期SYN / ACK処理に関するものです。

いいえ、ファイアウォールルールを使用してこれを行うことはできません。状態を維持する必要があるためです(または少なくとも特定の量の状態を維持する必要があります)。

関連情報