あなたの例では、パケット内の単一のバイトだけを変更するのではなく、複数のパケットにまたがる可能性のある文字列を変更したいとします。また、置換文字の長さが元の文字列と異なる場合もあります。あなたは(あなたがプロキシを使用しないので)パケットレベルでこれを行う場合は、必要があるでしょう:
- おそらく場合にパケットの転送を遅らせる彼らはコンテンツに基づいて変更する必要があるかもしれません次のパケットの
- 書き換えだけでなく、あなたが理由により、すべてのシーケンス番号はまた、あなたが受信したすべての将来のパケットを
- リライトを調整する必要があるデータのサイズの変更にも以下のすべてのパケットのペイロードを変更するいくつかのパケット元の送信者が元のパケットとACKを関連付けることができるように、ACK内のシーケンス番号を調整する必要があるため、ピアからのメッセージを受信します。
これを実装する複雑さを別にすれば、パケットを遅らせる最初の点は、接続が遅くなったり停止したりするTCPフロー制御を推測することもできます。
このように、深刻なパケットの変更を実装する通常の方法は、クライアントとプロキシの間に1つのTCP接続があり、プロキシとサーバーの間に1つのTCP接続がある場合にプロキシを使用することです。このように、2つの独立したTCP接続があり、どちらも独自のTCPフロー制御を持っています。また、カーネルは正しいシーケンス番号などを自動的に処理するので、手動で調整する必要はありません。
私はプロキシを持たないというあなたの要求がいかに不変であるかわかりません。クライアントで明示的にプロキシを設定する必要がない場合もあります。しかし、プロキシは、クライアントで明示的な設定を必要としない透過的な方法で使用することもできます。
したがって、トランスペアレントプロキシを使用して実際の要件を実装する方がよい場合があります。これをHTTPで行う方法については、例えばthis documentation for mitmproxyを参照してください。同様の方法で、HTTPとは異なるプロトコルに対してもこれを実装することができます。