パケット転送時間を短縮するシステムを設計したいと思います。クライアントが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処理に関するものです。
いいえ、ファイアウォールルールを使用してこれを行うことはできません。状態を維持する必要があるためです(または少なくとも特定の量の状態を維持する必要があります)。