X-Forwarded-For

X-Forwarded-For: ヘッダー (HTTP)

[31] X-Forwarded-For: ヘッダーは、 (順串逆串) が直接のクライアントIPアドレスを保存し、 次以降のホップへと伝えるためのものです。

仕様書

構文

[11] IPv6アドレスは (括弧で括るなどせずに) 直接書くことができるようです。

[12] Squid などが対応しているようです。鯖側Webアプリケーションの類では IPv4アドレスにしか対応していないことが多々あります。

[13] X-Forwarded-For: 欄を複数含めることにより (あるいは , によって連結することにより) 多段のの通過を表現できます。

[14] 鯖側Webアプリケーションの類ではこれに対応していないこともあります。

順序

[6] Wikipedia の説明によると先頭 (前) ほどクライアント側、末尾 (後) ほど側の IPアドレスを表していることになっているようです。

[39] MDN も同じ順序を示しています。 >>37

[38] 実際には必ずしもこの順序が守られているわけでは無いようです。

[40] MDN は詳しい解説を載せていますが >>37、 その根拠をまったく示していません。

[41] そもそもこの機能は仕様書もなく慣習的に使われてきたもので、 どのように使われるべきか規範的で信頼できる根拠が何も存在していないのです。

[42] どのような順序にするのが正しいかという問題とは別に (しかし密接に関わる問題として)、 IPアドレスを1つ拾って何かをしたいとき、 どれを選ぶのが適切なのか、という問題があります。 >>15

[43] これも仕様が定まっていない上に、「用途による」としか言いようがないので答えるのが難しい。

[15] Ruby - Rack::Request#hostがX-Forwarded-Hostの最後のプロキシホストを返す理由 - Qiita [キータ] ( ( 版)) http://qiita.com/mechamogera/items/32db29aa0db91df704ba

実装

[36] さくらインターネットの共有レンタルサーバーでは、 X-Sakura-Forwarded-For: (HTTP_X_SAKURA_FORWARDED_FOR) が使われるようです。

[10] X-Client-IP:, CF-Connecting-IP:, X-Real-IP: といったヘッダーが使われることもあります。

Forwarded: ヘッダー for 引数

[20] Forwarded: ヘッダーfor 引数は、クライアントについての情報を表します >>19

[24] 値の構文は節点識別子です >>19

  1. 節点識別子

[21] 既定の設定では難読化識別子を使うべきです >>19

[22] 必要ならかわりにIPアドレス (や場合によってはポート番号) を指定しても構いません >>19

[23] unknown としても構いません >>19

歴史

誕生

[4] X-Forwarded-For:Squid が使い始めました。

X-Forwarded-For: clientIPaddr|unknown

Squid が最初。 他のproxyがつけているのはSquidのマネ。 HTTP DraftがForwarded:からVia: へ変更されたのを受けて、 クライアントアドレスをどこかに残すために新設されました。 (changelogヨリ)

  • 1.0.beta1: Forwarded: 追加 (User-Agent: ... via ... そのまま)
  • 1.1.alpha17: User-Agent: via.. 廃止、Forwarded:のみ
  • 1.1.beta21: Forwarded->Via
  • 1.1.beta24: X-Forwarded-For 新設

この頃の Squid はバージョンアップがやたら激しく、 alphaだbetaだreleaseだといった違いにあまり意味はありません。

Forwarded: by proxy-URI [(product)] [for client-FQDN]

draft-ietf-http-v10-spec-01.txt および draft-ietf-http-v11-spec-01.txt までの HTTP-draft に出現。 標準化に際しては 「冗長である」 という理由から Via: に置き換わっています。 "for ..." 部分は Via: から削られたため、Squid では代わりに X-Forwarded-For ヘッダを新設しました。 (当時まじめにDraft等を追っかけていたのは Squid くらいだったような気が)

Forwarded-For: ヘッダー

[29] Forwarded-For: として標準化することが提案されました >>28

Forwarded: ヘッダー

[30] >>28 は次の版で現在とほぼ同じ Forwarded: ヘッダーに拡張されました。

[25] RFC 7239X-Forwarded-For: と同様の内容を持つ Forwarded: ヘッダーfor 引数 >>19 が追加されました。

[27] IPv6アドレスが含まれることもあります >>26

X-Forwarded-For: 192.0.2.43, 2001:db8:cafe::17

メモ

[5] X-Forwarded-For - Wikipedia, the free encyclopedia ( ( 版)) http://en.wikipedia.org/wiki/X-Forwarded-For

[7] suz-lab - blog: すでに"X-Forwarded-For"ヘッダのついたHTTPリクエストがELBを経由すると ( ( 版)) http://blog.suz-lab.com/2011/06/x-forwarded-forhttpelb.html

[8] リバースプロキシ環境下のapacheではmod_extract_forwardedよりもやっぱりmod_rpaf? - うまい棒blog ( ( 版)) http://d.hatena.ne.jp/hogem/20090622/1245675445

[9] mod_remoteip - Apache HTTP Server ( ( 版)) http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html

[16] HTTP - XFF - Qiita ( ( 版)) http://qiita.com/wakaba@github/items/cf8730ca3d75b28d844a

[44] HTTP X-Forwarded-For: ヘッダー ($ENV{HTTP_X_FORWARDED_FOR}) のよくある話のまとめ

[17] How does CloudFlare handle HTTP Request headers? – CloudFlare Support ( ( 版)) https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-CloudFlare-handle-HTTP-Request-headers-

[18] draft-nottingham-surrogates-00 - Requirements for Demand-Driven Surrogate Origin Servers ( ( 版)) http://tools.ietf.org/html/draft-nottingham-surrogates-00#section-3.7.1

[32] X-Forwarded-For Header :: Add-ons for Firefox ( ( 版)) https://addons.mozilla.org/ja/firefox/addon/x-forwarded-for-header/

[33] SOL4816 - Using the X-Forwarded-For HTTP header to preserve the original client IP address for traffic translated by a SNAT ( ( 版)) https://support.f5.com/kb/en-us/solutions/public/4000/800/sol4816.html

[34] Guidelines for Web Content Transformation Proxies 1za ( ( 版)) http://www.w3.org/2005/MWI/BPWG/Group/TaskForces/CT/editors-drafts/Guidelines/100402#sec-additional-headers

[35] mod_proxy - Apache HTTP Server Version 2.4 ( 版) http://httpd.apache.org/docs/current/en/mod/mod_proxy.html#x-headers

X-Forwarded-For

The IP address of the client.