環境変数&プロキシ講座

プロキシの傾向と対策

現実にはプロキシ・ソフトは非常に多様である。元々、サーバ業界は圧倒的シェアを誇るプラットホームがないので、採用されているプロキシソフトも実に多様であり、そのプロキシソフトが出力する情報も実に多様である。だから、この項の情報は執筆時の情報に過ぎず、新たなプロキシソフトの登場、あるいはバージョンアップによって変化すること、及び筆者の狭い範囲での調査報告に過ぎないことを前提として読んで頂きたい。

基本的にはどのサーバソフトを使っているかは、HTTP_VIA か、HTTP_FORWARDED に出る。これを自動的に解析するのは割と難しいだろう。

  1. squid
  2. Traffic-Server
  3. NetCache
  4. DeleGate
  5. MS Proxy
  6. NetScape-Proxy



まず、比較的定型的な出力パターンを持つプロキシから始めよう。

squid
現在、もっともメジャーなプロキシソフトは squid である。筆者の調査では過半数のプロキシがこれを採用しているようである。squid は匿名にすることが比較的難しいため、ほとんど悪意の匿名プロキシでは採用されないようである。

squid の環境変数出力パターン

HTTP_VIA
バージョン名などが出る
HTTP_X_FORWARDED_FOR
に、IPアドレスが出る。多段プロキシの場合はコンマ(,) で区切られたリストになる。

squid と同様のパターンで出力されるプロキシソフトとして、HTTP_VIA が "1.0 cache" になるもの(Apacheか?)、"N2H2 Proxy Server" になるもの、"Topproxy"などがある。これらは squid の出力パターンを模倣していると見て良いだろう。これらを合わせると、squid パターンだけで約8割はカバーできるのではないだろうか。とはいえ、多段接続についてはどういう結果になるか、確実なことはいえない。元に近いIPを落とすようでもある。

Traffic-Server
INKTOMI社の商用プロキシソフト。

Traffic-Server の出力パターン
HTTP_VIA
に、バージョン名などが出る。
HTTP_CLIENT_IP
に、要求元IPが出る。

NetCache
Network Appliance社のプロキシ専用機。

NetCache の出力パターン
これはトリッキーな出力パターンを持つ。
HTTP_VIA
に、バージョン名などが出る。
HTTP_CLIENT_IP
に、要求元IPが出る。この時同時に HTTP_X_FORWARDED_FOR にもIPアドレスが出ているが、こっちはウソである。
HTTP_X_FORWARDED_FOR
に要求元IPが出る。もし、HTTP_CLIENT_IP が出てなければ正しい要求元IPである。

推測すると、設定間違いだろう。本来、HTTP_X_FORWARDED_FOR に正しい要求元IPを設定するように設計されているが、設定者(ディストリビュータ?)が HTTP_CLIENT_IP に出すように設定し、その時に HTTP_X_FORWARDEF_FOR を出さないようにするのを忘れていて、デフォルトの設定ファイルに書かれているウソのIPが出ている、というあたりではなかろうか。

この HTTP_CLIENT_IP か HTTP_X_FORWARDED_FOR に要求元IPが出るパターンだけで、実際のプロキシの約9割強をカバーできる。だから擬似コードで示すと、

if( HTTP_CLIENT_IP がある ) {
	実IPは HTTP_CLIENT_IP である。
} else if( HTTP_X_FORWARDED_FOR がある ) {
	実IPは HTTP_X_FORWARDED_FOR の先頭IPである。
}

これで9割OKだろう。

残りは変則的な出力パターンを持つ。

DeleGate
国産プロキシである。変換フィルターをプロキシに噛ませるとか、多段接続ができるとか、面白い機能が多い。特に多段接続はアタッカーに利用されやすいので要注意。現在それほど使われていない。

DeleGate の環境変数出力パターン
これは変則である。
HTTP_VIA
に、バージョン名などが出る。
HTTP_FORWARDED
に、"by http://プロキシのIP:ポート/ (DeleGate/バージョン) for 要求元ホスト名" のパターンで出る。要求元IPは出ないので変換が必要である。

MS Proxy
言わずと知れたマイクロソフト社のプロキシ。これも変則である。

MS Proxy の環境変数出力パターン
HTTP_VIA
が、 "サーバ名 (MSProxy/バージョン) for 要求元IP" になる。解析が必要である。
NetScape-Proxy
これも言わずと知れた、NetScape 社のプロキシ。超変則である(一例のみなので、ひょっとしたら設定ミスかもしれない)。

NetScape-Proxy の環境変数出力パターン
HTTP_FORWARDED
に、バージョン名などが出る。
HTTP_HOST
に、要求元IPが出る。普通、HTTP_HOST は要求されたHTTPサーバのホスト名であるが、これに要求元IPが出る。非常に変だが、匿名プロキシにたまにこういうパターンがある。NetScape-Proxy を使っているのかもしれない。


copyright by K.Sugiura, 1996-2006