X-Forwarded-For

X-Forwarded-For (XFF) とは、HTTPヘッダフィールドの一つ。HTTPプロキシサーバまたは負荷分散装置（ロードバランサ）を経由してウェブサーバに接続するクライアントの送信元IPアドレスを特定する際のデファクトスタンダードである。このヘッダはSquidキャッシング・プロキシサーバの開発者により初めて導入された。のちに、IETFのネットワーク作業部会 (Network Working Group) が同種のHTTPヘッダForwardedを RFC 7239 で提唱している。
ここでのキャッシング・サーバー（キャッシュ・サーバ）とは、概ね、大規模なISPの利用者がWWWへ接続する際にISPが利用を推奨または強制的に利用させるプロキシサーバのことを指し、データのキャッシングにより外部へのネットワーク帯域幅を減らす働きを持つ。いくつかの場合、これらプロキシサーバは透過的プロキシであり、利用者は利用していることに気付かないかもしれない。
XFFや別の類似の技術を利用しなければ、プロキシ経由の接続はすべてプロキシサーバの送信元IPアドレスのみを示すことになり、送信元IPアドレスが利用できなくなる。そのため、悪意あるアクセスを検知したり防ぐことはかなり困難になり、プロキシサーバをに変えてしまう。XFFの利用は送信元ホストのIPアドレスを正直に報告するプロキシサーバの存在を仮定している。そのため、XFFを効果的に利用するためには、どのプロキシサーバが信頼できるかの情報が必須となる。例えば、信頼できる人物が管理するサーバが一覧化されているホワイトリストに当該プロキシサーバが載っているかを検索するなどして情報を得る必要がある。
フォーマット.
このフィールドの一般的なフォーマットは次の通りである。
ここで、値（変数）はコンマとスペースで分けられたIPアドレスの一覧である。コロンとスペースの次に来る、最も左のカラムにある値は最下流に位置するクライアントのIPアドレス、続いて接続要求を伝送する、おのおの連続したプロキシが、接続要求の送信元IPアドレスを追加していく。この例では、接続要求はproxy1、proxy2を通過し、最後に接続要求側のリモート・アドレスとして現れるproxy3に伝わる。
X-Forwarded-Forフィールドをでっち上げるのは簡単なので、与えられた情報は慎重に取り扱うべきである。最終IPアドレスは常に最後のプロキシに接続するIPアドレスであるが、すなわちこの情報ソースが最も信頼できることを意味する。
フォワードプロキシまたはリバースプロキシを利用するシナリオにおいてはX-Forwarded-Forデータが利用可能である。
クライアントがフォワードプロキシを利用するシナリオの場合、接続先ネットワークの管理者は、クライアント側内部のネットワークのプロキシ接続の連鎖を経由して、接続するクライアントの実体IPアドレスを追跡することが可能で、ゲートウェイ機器上でのそのIPアドレスが記録される。セキュリティ的理由で、インターネットへ接続要求を送信する前に、管理下にあるゲートウェイ機器は任意のX-Forwarded-Forを削るべきである。またX-Forwarded-Forの情報が管理下にあるネットワーク内部で全て生成される場合は、このシナリオにおいては、X-Forwarded-Forの情報を信頼できるようにすべきである。
管理下のネットワークがリバースプロキシを利用するシナリオの場合、たとえ管理下のウェブサーバがインターネットからの経路情報を持たない場合でも、- 例えばウェブサーバがOSI参照モデル第7層に位置するプロキシ機器の背後に隠れている場合でも、ウェブサーバ管理者はウェブサーバにインターネット接続するクライアントの実体IPアドレスを追跡できる。またインターネット上から欺瞞情報を受信する可能性がある場合は、このシナリオにおいては、全てのX-Forwarded-Forの情報は信頼すべき"ではない"。X-Forwarded-Forフィールドに通知されているプロキシIPアドレスが信頼できるものか確かめるため、斯様な信頼できるIPアドレスのリストを利用するべきである。
プロキシ接続の連鎖の末端にあるIPアドレスはX-Forwarded-Forフィールドの中に含まれていないので、X-Forwarded-Forフィールドのログをただ取得することは常に十分であるとは限らない。その情報は実際にはIPヘッダに含まれている。徹底するためには、ウェブサーバは接続要求元IPアドレスとX-Forwarded-Forフィールドの情報の"双方"を記録すべきである。
各種製品のサポート状況.
プロキシサーバとキャッシュ・エンジン.
X-Forwarded-Forフィールドは多くのプロキシサーバやキャッシュ・エンジンでサポートされており、Apacheなどのウェブサーバと連携できるものも含まれる。一例を挙げると、
などがある。
X-Forwarded-Forフィールドを記録する方法はApache HTTP Serverをはじめとする多くのウェブサーバでサポートされている。Microsoft IIS 6.0と7.0では"Winfrasoft X-Forwarded-For for IIS"というサードパーティーのISAPIフィルターがこの機能を実現している。IIS 7.0はまた、"HTTP Module"というサードパーティー製フィルターを利用できる。
ウェブサーバ・ログのためのX-Forwarded-For.
多くのウェブサーバはログファイルにX-Forwarded-Forフィールドに含まれるIPアドレスを記録するよう設定できる。Apache HTTP Serverでは、これは標準機能として実装されており、単に設定を変更することでログに記録するようになる。しかしながら、Microsoft IISはサードパーティー・アプリケーションが必要である。IIS7向けには、IIS.netウェブサイトから、同様にIISのログにX-Forwarded-Forの値を書き込むフリーなIISモジュールを取得可能である。