[Ultramonkey-l7-develop 381] X-Forwarded-Forヘッダ追加について

アーカイブの一覧に戻る

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 バイト
説明:       無し
ダウンロード 



Ultramonkey-l7-develop メーリングリストの案内
アーカイブの一覧に戻る