Kouhei TANUMA
tanum****@nttco*****
2009年 5月 28日 (木) 13:22:25 JST
皆様 田沼です。 プロトコルモジュールの X-Forwarded-For ヘッダフィールドによる クライアント IP アドレスの追加機能についてですが、 sessionless モジュールや ip モジュールでは正常に動作しません。 動作するように修正したパッチを作成するにはしたのですが、 処理フローが変更になってしまいます。 以下に変更内容を記載しますので、ご意見等いただければ幸いです。 ■ v2.1.0-0 までの処理 [ クライアント接続 ] | ↓ [ ◎クライアントからデータ受信 ] | ↓ [ ★接続先リアルサーバ選択, クライアントデータ処理 ] | ↓ [ リアルサーバへ接続 ] ここで、◎部分でクライアントからデータを受信するまで 先に進まない、つまりリアルサーバと接続されませんので SMTP や FTP などサーバが先にメッセージを送信し、その後に クライアントが応答するプロトコルではダンマリ状態になって 通信がうまくいきません。 そこで、v2.1.1-0 でクライアントのデータ不要でリアルサーバを 選択できるモジュールでは、◎部分の処理を飛ばしてリアルサーバに すぐに接続するようにしました。 ■ v2.1.1-0 以降の処理 [ クライアント接続 ] | ↓ [ プロトコルモジュールの fast_schedule フラグチェック ] | | |off |on(sessionless, ip) ↓ | [ ◎クライアントからデータ受信 ] | | | ↓ ↓ [ ★接続先リアルサーバ選択, クライアントデータ処理 ] | ↓ [ リアルサーバへ接続 ] これで、クライアントとリアルサーバが 1 対 1 で決まるので その後の通信は、そのまま対向に転送するだけになります(※) これで一見うまくいっていたと思っていたのですが、 X-Forwarded-For の追加などのクライアントデータの変更は ★部分でリアルサーバ選択と同時に行っているので、 fast_schedule on の場合はクライアント接続時に即★部分に 来るため、クライアントデータが無く、データ追加などが できなくなってしまいました。 ■ 対応案 (1) ★部分の関数(プロトコルモジュールの match_cldata)で 「接続先のリアルサーバ選択」と「クライアントデータ処理」の 2 つの処理を行っているのが問題なので、これを別々の関数に分ける。 ★部分では「接続先のリアルサーバ選択」だけを行い、 リアルサーバ接続後のクライアントデータ受信に対して 「クライアントデータ処理」を行う。 (2) インタフェース等はこのまま維持しておき、 リアルサーバ接続後のクライアントデータ受信に対して ★部分の処理を再度行う。 ただし、★部分の「接続先リアルサーバ選択」処理は不要なので 条件分岐で飛ばす。 案(1)はプロトコルモジュールのテンプレートに新しい関数を 用意する必要があり、変更が大きいですが、綺麗にまとまると 思います。 案(2)は★部分の関数が汚くなると思います。 他に案があればお願いします。 ちなみに添付の patch は案(2)のものです。 ■ 補足 (※)クライアントとリアルサーバが決まった後の通信についてですが 通信方向によって処理が異なります。 (1) クライアント → リアルサーバ [ クライアントデータ受信 ] | |そのまま転送 ↓ [ リアルサーバへ転送 ] (2) リアルサーバ → クライアント [ リアルサーバからデータ受信 ] | ↓ [ リアルサーバデータ処理 ] (analyze_rsdata) | ↓ [ クライアントへ転送 ] 上記のようにリアルサーバのデータは毎回処理するのに対して クライアントデータはそのままスルーするという違いがなぜかあります。 上記対応案を実施することにより、クライアント → リアルサーバでも 毎回データ処理をすることになり、統一がとれます。 また、クライアントデータを毎回処理することで性能に対する多少の 懸念はありますが、HTTP の keep-alive 通信時の X-Forwarded-For の 追加もうまくいくようになります。 以上、宜しくお願い致します。 -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: patch.txt 型: application/octet-stream サイズ: 8522 バイト 説明: 無しダウンロード