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を効果的に利用するためには、どのプロキシサーバが信頼できるかの情報が必須となる。例えば、信頼できる人物が管理するサーバが一覧化されているホワイトリストに当該プロキシサーバが載っているかを検索するなどして情報を得る必要がある。 このフィールドの一般的なフォーマットは次の通りである。 X-Forwarded-For: client1, proxy1, proxy2 ここで、値（変数）はコンマとスペースで分けられた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などのウェブサーバと連携できるものも含まれる。一例を挙げると、 Squid Apache mod_proxy IHSも同様。 Pound（英語版） HAProxy（英語） Varnish Cache IronPort（英語版） Web Security Appliance CAI Networks WebMux（英語版） アレイ・ネットワークス Radware's Appdirector and Web Server Director（英語版） F5 Big-IP Blue Coat ProxySG Cisco キャッシュエンジン McAfee Web ゲートウェイ Phion Airlock Finjan製 Vital Security NetApp NetCache（英語版）（Blue Coat Systems（英語版）に売却済み） jetNEXUS Crescendo Networks製 Maestro Microsoft ISA Server 2004/2006 に ISA サーバ向け Winfrasoft X-Forwarded-For を積んだもの（英語） Winfrasoft X-Forwarded-For Microsoft と Forefront TMG 2010 （ 2012年11月末をもって販売終了）- フリー・ウェブフィルターの TMG あるいは XFF-Filter.dll 向け などがある。 X-Forwarded-Forフィールドを記録する方法はApache HTTP Serverをはじめとする多くのウェブサーバでサポートされている。Microsoft IIS 6.0と7.0では"Winfrasoft X-Forwarded-For for IIS"というサードパーティーのISAPIフィルターがこの機能を実現している。IIS 7.0はまた、"HTTP Module"というサードパーティー製フィルターを利用できる。 "Zeus Traffic Manager"と"Zeus Load Balancer"はX-Forwarded-Forフィールドをサポートしている。 Radwareのロードバランサはone-armed（英語版）とmulti-armed設定用のX-Forwarded-Forをサポートしている。 シトリックス・システムズの"NetScaler"はクライアントのIPアドレスをクライアントの接続要求に挿入するため、X-Forwarded-Forをはじめとするユーザー定義フィールドをサポートしている。 "Cisco Ace Load Balancing Modules"は、送信元ネットワークアドレス変換（"source NAT"、SNAT）を実行するためロードバランサを設定する時や、ロードバランサのone-armed設定を有効にした場合、このフィールドを挿入可能であり、通常それで十分であるが、一方、クライアントの送信元IPアドレスのために実体サーバが利用できる仕組みをこの製品は提供する。製品マニュアルには"x-forward"と記述されているが、これはX-Forwarded-Forの代わりであると推定される。 CAI Networksのロードバランサはone-armed single network設定向けのX-Forwarded-Forをサポートしている。 F5ネットワークスのロードバランサはone-armedとmulti-armed設定向けのX-Forwarded-Forをサポートしている。 jetNEXUSのロードバランサはone-armedとmulti-armed設定向けのX-Forwarded-Forをサポートしている。 KEMP Technologies（英語版） "LoadMaster"はone-armedとmulti-armed設定双方で非透過的負荷分散処理向けにX-Forwarded-Forをサポートしている。 Coyote Point Systems（英語版） "Equalizer"はone-armedとmulti-armed設定双方で負荷分散処理向けにX-Forwarded-Forフィールドをサポートしている。 HAProxyはone-armedとmulti-armed設定双方で非透過的または透過的負荷分散処理向けにX-Forwarded-Forをサポートしている。 OpenBSD "relays"はこのフィールドを挿入もしくは改変できる。 Amazon's Elastic Load Balancing serviceはIPv4、IPv6双方でこのフィールドをサポートしている。 "LBL LoadBalancer"はone-armedとmulti-armed設定向けにX-Forwarded-Forをサポートしている。 多くのウェブサーバはログファイルにX-Forwarded-Forフィールドに含まれるIPアドレスを記録するよう設定できる。Apache HTTP Serverでは、これは標準機能として実装されており、単に設定を変更することでログに記録するようになる。しかしながら、Microsoft IISはサードパーティー・アプリケーションが必要である。IIS7向けには、IIS.netウェブサイトから、同様にIISのログにX-Forwarded-Forの値を書き込むフリーなIISモジュールを取得可能である。 [脚注の使い方] ^ VLAN間でのルーティングに利用されるルーターの設定。 ^ 具体的には、X-Forwarded-Forは、（非標準であるとはいえ）HTTPヘッダフィールドであるから、設定ファイル（/etc/apache2/apache2.confなど）のLogFormatディレクティブにて LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" などと記述してから、httpdデーモンを再起動すれば、以降のログの各行最左端にX-Forwarded-Forフィールドの中身が記録される。またApacheはHTTPヘッダフィールドを環境変数として利用可能であるからSetEnvIfディレクティブを利用し、X-Forwarded-Forと送信元IPアドレスを使った簡易なアクセス制御も可能である。 ^ IHSも同様。"負荷分散装置やProxyが付与する"X-Forwarded-For"ヘッダー情報をIHSアクセス・ログに記録する方法 (NTWK-09-036)" ^ Winfrasoft X-Forwarded-For for IISはIISにX-Forwarded-For IPサポートを追加するIISのサードパーティー・プラグインである。これを利用すると、IISのW3C Extended Log Fileにおける"c-ip"（client-ip）ログ・フィールドにXFFの情報を追加することができる。 ^ XFFを偽装するMozilla Firefox用拡張機能が存在する。 “X-Forwarded-For Spoofer”. Mozilla Foundation. addons.mozilla.org. 2011年7月8日閲覧。[リンク切れ] ^ Squid configuration directive forwarded_for（英語） ^ SquidFaq/ConfiguringSquid（英語） ^ mod_proxy（英語） ^ リバース・プロキシーとしての IHS の構成（英語） ^ Pound proxy（英語）。"Request Logging"を参照。 ^ HAProxy 設定マニュアル（英語） ^ ログ記録に関するVarnish FAQ（英語）。 ^ IronPort Web Security Appliances（英語） ^ a b Apache または PHP で "X-Forwarded-For" を使用する（英語） ^ Bluecoat Knowledge Base Article 2996（英語） ^ Cisco Cache Engine ユーザガイド Version 2.1.0 - Appendix A: Command Reference - グローバル設定コマンド - "http"（英語） ^ Web キャッシュを調節 - NetApp NetCache C720（英語） ^ TMG, ISA サーバと IIS 向け X-Forwarded-For（英語） ^ TMG2010 向け X-Forwarded-For フリー・ウェブフィルター（英語） ^ IIS7 向け X-Forwarded-For HTTP Module, ソースも提供!（英語） ^ Citrix NetScaler Traffic Management Guide - Release 9.1 ^ Cisco ACE with Source NAT and Client IP Header ^ Using the X-Forwarded-For HTTP header field to preserve the original client IP address for traffic translated by a SNAT ^ LoadMaster Product Manual. p.129 ^ Equalizer User Guide. pp.119,136 ^ relayd.conf manual page ^ Using IPv6 with Elastic Load Balancing ^ “Extended X-Forwarded-For Logging with Apache”. www.gadgettrail.com (2005年1月11日). 2011年7月8日閲覧。 ^ Client-ip not logged on application server when using ARR インターネット・プライバシー（英語版） プロキシ X-Originating-IP（英語版） - 送信元IPアドレスを通知する電子メールヘッダ。 RFC 7239 Forwarded HTTP Extension Apache mod_extract_forwarded - Apacheソフトウェア財団外で作成されているプロキシ転送情報抽出用Apache HTTP Serverモジュール。 X-Forwarded-For in TMG2010 Free web filter for TMG2010 to add X-Forwarded-For header in inbound requests XFF project - ウィキメディア財団のXFFに関する情報。