2016-11-03 25 views
0

X-Forwarded-Forヘッダーの処理についての理解を確認するために、Apache mod_proxyとmod_remoteipを試しています。内部IPアドレス(例:10.xxxまたは192.168.xxの範囲)が処理されています。mod_proxyがX-Forwarded-Forヘッダーに内部IPアドレスを追加する場合があるのはなぜですか?

mod_proxyは常に内部IPアドレスをX-Forwarded-Forヘッダに追加するとは限りませんが、期待される動作を説明しているドキュメントは見つかりませんでした。

私の知る限り、要求が内部IPアドレスから開始されると、mod_proxyは内部IPアドレスをX-Forwarded-Forヘッダに追加しますが、最初の要求がパブリックIPから来た場合、mod_proxyはX-Forwarded-Forに内部IPアドレスを追加していないようです。

質問

私の質問は:mod_proxyのは、X-転送さ-用ヘッダに呼び出し元のIPアドレスを追加するかどうかを管理するルールは何。

documentation on mod_proxy

は言う:

(例えば、ProxyPassディレクティブを使用して)リバースプロキシモードで動作し、mod_proxy_httpがオリジンサーバに情報を渡すために、いくつかのリクエストヘッダを追加します。これらのヘッダーは次のとおりです。

X- Forwarded-For - クライアントのIPアドレスです。

Xフォワードホスト - ホストHTTP要求ヘッダーでクライアントが要求した元のホスト。

Xフォワードサーバ - プロキシサーバのホスト名。

オリジナルのリクエストに既にこれらのヘッダーのいずれかが含まれていた場合は、複数の(カンマ区切りの)値が含まれるため、これらのヘッダーをオリジナルサーバーで使用する場合は注意が必要です。たとえば、元のサーバーのログ形式文字列に%{X-Forwarded-For} iを使用して元のクライアントのIPアドレスを記録できますが、要求が複数のプロキシを通過する場合、複数のアドレスを取得する可能性があります。

これは、クライアントのIPアドレスが常にX-Forwarded-Forヘッダーに追加されると言っていますが、これは私が観察している動作ではありません。

残りの質問は、私が行ったテストと私が観察した動作です。

セットアップ

私はmod_proxyをインストールしてApacheを実行している両方のセットアップ二つのサーバをしました。私はこれらを1と2と呼んでいます。

  • 一つは、2つは(内部)IPアドレス10.0.7を持っている(内部)IPアドレスに10.0.7.1
  • を持っています。2

一つは/ proxyToTwoのサブパスへの要求を二

<Location "/proxyToTwo"> 
     ProxyPass http://10.0.7.2/proxyToOne 
</Location> 

つ上/ proxyToOne下等価サブパスに送信されるように、以下のProxyPassディレクティブを有しているので、次のProxyPassディレクティブを有します/ proxyToOneのサブパスへの要求は一つではなく/ proxyToOneプレフィックス

<Location "/proxyToOne"> 
     ProxyPass http://10.0.7.1 
</Location> 
ずに送り返されていることを

この効果は、私がhttp://One/proxyToTwo/fooに要求を発行したとき、それはプロキシだということです

  1. 一つは、要求を受信http://10.0.7.2/proxyToOne/foo
  2. 2つは要求を受信し、2つに次のリクエストを発行し、次のように、バック一つhttp://10.0.7.1/foo
  3. 一つに次のリクエストを発行/foo要求を受信すると、実際にリソースを提供してい

したがって、すべてのリクエストは1から2にバウンスされ、2つに応答する前に1に戻る。

curl http://10.0.7.1/proxyToTwo/foo 

X-転送さ-用とX-転送さ-ホスト:上記の設定を使用して内部IP

で呼び出す

は、私はそれが内部IPアドレスだ使って二つから一つを呼び出します一つは、最終的に/fooリソースに対する要求を取得するときにヘッダが、私は以下の期待される受信:

X-Forwarded-For: 10.0.7.2, 10.0.7.1 
X-Forwarded-Host: 10.0.7.1, 10.0.7.2 

これは私が期待していることですが、最初にOne2を介して要求がプロキシされ、要求元のIPアドレスが最初にTwo(curl)からの最初の要求で、One(mod_proxy)からの要求と最後の要求それは外部のIP

予期しない動作を呼び出す2つ(のmod_proxy)からのもの接続

のクライアントIPだからパブリックIPから呼び出されたときにmod_proxyの動作が異なるように見えるということです。だからではなく、二つから一つを呼び出すので、私はパブリックアドレスを使用して、私のローカルマシンから一つを呼び出す

curl http://35.162.28.102/proxyToTwo/foo 

X-転送さ-ホストは、私が期待するものはまだです:

ある
X-Forwarded-Host: 35.162.28.102, 10.0.7.2 

、要求をOneを介して最初に(外部アドレスを使用して)、次にTwoを経由してプロキシされました。

しかし、X-Forwarded-Forヘッダーには唯一の私の(外部)IPアドレス表示されます。

X-Forwarded-For: 35.163.25.76 

これはmod_proxyの最初の実行がでX-Forwarded-Forヘッダーを追加していることを私に示唆をクライアントのIPアドレス。しかし、その後の2つのプロキシは、1のアドレスを追加しません。

この動作はおそらく、内部IPアドレスをヘッダに付加するよりも便利だと思いますが、どこに文書化されているのかわかりませんので、完全に理解したいと思います。

+0

mod_proxyコードの検査を行っても、上記の動作を引き起こすものは何も表示されません。私の実際の理論は、これは実際にはmod_proxyとmod_remoteipの間の相互作用によって引き起こされるということです。 – EdC

答えて

0

これに答えると、他の人も同様の誤りを犯す可能性があります。

要約:mod_proxyは常にクライアントIPをX-Forwarded-Forヘッダーに追加します(または既存のヘッダーがない場合はX-Forwarded-Forヘッダーを追加します)。

しかし、他のApacheモジュールはmod_proxyを処理する前にX-Forwarded-Forヘッダを操作できます。 Mod_proxyはクライアントIPをX-Forwarded-Forヘッダーと見なすものに追加します。これは他のApacheモジュールの出力となります。

私のテストでは、結果に影響する他のモジュールはmod_remoteipでした。結果として生じる動作の違いの理由は、私がRemoteIpTrustedProxyディレクティブを使用して信頼できるプロキシを指定していたため、最初の接続としてプライベートIPを信頼することができますが、X-Forwarded-ForヘッダーでプライベートIPを処理しません。

外部IPの場合の結果として、以下の取り扱いがありましたが:

  1. 私のマシン(35.163.25.76は)私と二に、この要求を送信していないX-転送さ-については
  2. 一つで一つに接続しますIPアドレスがX-Forwarded-Forヘッダー(X-Forwarded-For: 35.163.25.76
  3. 2人がこの要求を受け取ると、mod_remoteipはX-Forwarded-Forヘッダーを処理します.1つは信頼され、クライアントIPは効果的に35.163.25.76であり、X-Forward- mod_proxyに渡されたヘッダ
  4. 2つはX-Forwarded-Forヘッダー内の私のIPを一つにこの要求を送信する(X-Forwarded-For: 35.163.25.76

は、これは「プライベートIPを追加していない」として提示したが、実際にX-フォワード-についてはヘッダを処理しているものです同一のものを製造する。

mod_remoteipがX-ForwardのプライベートIPアドレスを受け入れていないため、プライベートIDのケースが異なる動作をします。

  1. 二(10.0.7.2)X-Forwarded-Forヘッダー内の2のIPを持つ2つの(X-Forwarded-For: 10.0.7.2
  2. にこの要求を送信していないX-転送さ-については
  3. 一つで一つに接続しますので、それはによって処理されます2つはこの要求を受け取り、mod_remoteipはX-Forwarded-Forヘッダーを処理しますが、その値を信頼しないためそのまま残ります。したがって、クライアントIPは、自分のIP(10.0.7.1)のままであり、mod_proxyに渡されるX-Forward-Forヘッダーは変更されません。
  4. 2人がX-Forwarded-ForヘッダーにクライアントIPを追加するOneにこの要求を送信します。X-Forwarded-For: 10.0.7.2, 10.0.7.1

実際に信頼できるホストからX-Forwarded-Forヘッダーを送信して確認しました。例えば。

curl http://10.0.7.1/proxyToTwo/foo --header "X-Forwarded-For: TrustedHost1, TrustedHost2" 

これは、ヘッダが本当にmod_remoteipによって処理され、mod_proxyのによって再発行されていることを示すだけTrustedHost1を含む最終Xフォワード-Forヘッダーになります。

関連する問題