QA@IT

プロキシサーバ経由のIPアドレスの取得について

6831 PV

こんばんは。
ASP.NET4.0 C#です。

初めてレンタルサーバーを借りて、インターネット上にサイトを作ろうとしています。
アクセスしてきたPCのIPアドレスを取得したいと思っています。
その際、プロキシサーバー経由の場合には、元のアドレスを取得したいので、ネットにあった記事
enter link description here

のようにしてみたのですが、
元のIPアドレスが取得できません。
プロキシサーバーのIPでもないアドレスが入ってしまいます。
元のIPアドレスを取得するには、どうすればよいのでしょうか?
(このコードは、正しいのでしょうか?)
よろしくお願いします。
以下、コードです。
(Markdown記法にしたいのですが、コードの始めの方が'でも'''でもハイライトにならないです。すいません。)

if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null 
    && Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != "")
{
    strIPV4 = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

    strIPV4 = strIPV4.Split(',').GetValue(0).ToString().Trim();
}
else
{
    strIPV4 = Request.UserHostAddress;
}

if (strIPV4 != "::1")
{
    strIPV4 = strIPV4.Split(':').GetValue(0).ToString().Trim();
}

回答

クライアント、サーバ間の環境が分かりませんが
ルータなどを経由しているとアドレス変換されている
可能性があるのでその場合、変換前のアドレスは取得出来ません。

編集 履歴 (0)
  • ありがとうございます。
    取得できないということが分かっただけでも、助かります。
    ということは、このコードで取得したIPは、サーバーまでの経路で、最後に経由したルーター等のアドレスといことなのでしょうか?
    -
  • そういう事になるかと思います。 -

流派?!ですか。

プロキシサーバがクライアントIPを伝達するために使用するヘッダの名前は標準化されていないため、どんな名前のヘッダを使用するかはプロキシサーバ開発者の自由意思に委ねられています。

レンタルサーバーでデバッグできないので、全部書き出してみます。

自分の利用しているレンタルサーバで「のみ」「今現在」動けばいいのであれば、レンタルサーバの稼働している環境で使用されているヘッダからだけ値を読み取ればいい話ですが、今後

  • 他のレンタルサーバに乗り換える
  • レンタルサーバの事業者がプロキシサーバを他の機種に変更する

などの事態も考えられます。

アプリケーションが様々な環境でも動作することを願うなら、「世間一般で使用されているいくつかのヘッダのどれかに有効な値が設定されていたらそこから値を取得する」という戦略でコードを書くべきだと思います。

編集 履歴 (0)
  • アドバイスありがとうございます。
    掲示板的なものを作っていて、プロキシ経由で投稿された時に、ログのIPが意味を無くしてしまうので、何とか元のIPを取れないかなと思っています。
    >>どれかに有効な値が設定されていたらそこから値を取得する
    有効な値を判定するのが難しそうですが、頑張ってみます。
    -
  • >有効な値を判定するのが難しそうですが

    難しくないですw

    ヘッダの標準化こそされてませんが、よそのベンダのプロキシサーバが使用しているヘッダにデタラメな値を設定しているケースを想定する必要はないはずなので、単純に「ヘッダにから文字列以外の値が設定されている=クライアント IPである」と見做してよいと思います。
    -

(このコードは、正しいのでしょうか?)

方向性は合ってますが、不十分なコードです。

プロキシサーバは、クライアントの IP アドレスをリクエストヘッダに設定しますが、ヘッダ名にいくつかの流派?があります。

なので、サンプルコードに示されたヘッダ名でクライアントの IP アドレスが取得できるかどうかは分かりません、いくつかのヘッダから値を取得してみて、有効な値が設定されているヘッダを探さなければならないです。

なお、ネットワーク構成やプロキシサーバの設定によってはクライアントの IP アドレスが正しく取得できない場合も考えられますが、よほど例外的な構成でない限りまず取得できるはずです。

もし、著名なヘッダすべてに有効な値が設定されていないようなら、プロバイダに問い合わせてみてください。

編集 履歴 (0)
  • ありがとうございます。
    流派?!ですか。
    レンタルサーバーでデバッグできないので、全部書き出してみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。