これは、HTTPキープアライブに関するものです。これにより、複数のリソース要求が単一のTCPセッション(およびSSLを使用する場合は単一のSSLセッション)を介して送信されます。キープアライブがないと、要求されたリソースごとにSSLハンドシェイクが必要になるため、これはSSLサイトのパフォーマンスにとって非常に重要です。
したがって、ここでの懸念は、クライアントからバックエンドサーバーまでの1つの大きなキープアライブセッションです。これはパフォーマンスにとって重要なことであり、最近のHTTPサーバーでは当然のことと考えられていますが、このパッチではサポートされていません。その理由を見てみましょう。
キープアライブセッションは、次々と要求が増えるだけFIN
です。サーバーが1つの要求に対する応答を完了すると、サーバーはTCPセッションを終了するためのパケットを送信しません。クライアントは単純にヘッダーの別のバッチを送信できます。
そのパッチの機能を理解するために、キープアライブの会話の例を次に示します。
クライアント:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
サーバ:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
ここで、非キープアライブ接続が停止します。ただし、キープアライブを使用すると、クライアントは別のクライアントを起動できます。
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
プロキシのクライアントIDの場合、一部のリバースプロキシはX-Forwarded-For
、各クライアント要求のヘッダーに追加できます。これにより、ロギングやその他のアプリケーションのニーズにおける健全性のために、要求が(リバースプロキシのIPから開始されるすべての要求の代わりに)どこから来ているかが上流のサーバーに通知されます。
X-Forwarded-For
ヘッダは、各フルヘッダーが毎回送信されるように、キープアライブ接続を介して送信されたすべてのクライアントのリソース要求に注入する必要があります。X-Forwarded-For
ヘッダーの処理と「実際の」要求IP であるヘッダーへの変換は、TCP-keep-alive-sessionごとではなく、要求ごとに行われます。そして、ねえ、単一のキープアライブセッションを使用して複数のクライアントからの要求にサービスを提供する素晴らしいリバースプロキシソフトウェアがあるかもしれません。
これは、このパッチが失敗する場所です。
そのサイトのパッチは、TCPセッションのバッファでストリーム内の最初のHTTPヘッダーセットの終わりを監視し、最初のヘッダーセットの終わりの後で新しいヘッダーをストリームに挿入します。これが完了すると、X-Forwarded-For
ジョブが完了したと見なされ、新しいヘッダーセットの終わりのスキャンが停止します。このメソッドは、後続のリクエストを介して着信する将来のヘッダーすべてを認識しません。
それらを本当に非難することはできません。stunnelは、ストリームのコンテンツの処理と変換を行うために実際に構築されたのではありません。
これがシステムに与える影響は、キープアライブストリームの最初のリクエストでX-Forwarded-For
ヘッダーが適切に挿入され、後続のすべてのリクエストが正常に機能することですが、ヘッダーはありません。
接続ごとに複数のクライアント要求を処理できる別のヘッダーインジェクションパッチがない(または、スタックオーバーフローで友人の助けを借りてこれを調整できる)場合を除き、SSL終了の他のオプションを確認する必要があります。