質問

ユーザーが私のサイトを訪れた場所からIPアドレスの統計を収集しましたが、172.16.16.1と172.16.16.248の2つのIPアドレスしか表示されていません。 IPアドレスを決定するために使用するプロパティは

Request.UserHostAddress

IPアドレス情報が失われる理由は何ですか?すべてのユーザーは世界中から来ているため、2つのプロキシのみの背後にいることはできません。

役に立ちましたか?

解決

これは、リバースプロキシの動作のように見えます。 リバースプロキシを使用すると、クライアントはプロキシに接続し、プロキシ自体がサーバーへの新しい接続を開きます。 ASP.NETは着信接続の情報を使用してユーザーアドレスを埋めるため、リバースプロキシのアドレスを取得します。

実際にこの構成にいる場合は、正しい情報を取得するためにリバースプロキシの助けが必要です。ほとんどのリバースプロキシは、クライアントの実際のIPアドレスを使用して、HTTP要求にヘッダーを追加する可能性を提供します。プロキシのドキュメントを確認してください。

他のヒント

このようなことをしたいかもしれません;

string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0];

HTTP_X_FORWARDED_FORヘッダーは、プロキシサーバーの背後のIPアドレスを取得します。

理由を詳しく説明するこのページを参照してください。 ユーザーの実際のIPを取得

Dave Andersonの答えに基づいて、逆プロキシのチェーンを考慮したスニペットを次に示します。

string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
                   ? Request.ServerVariables["REMOTE_ADDR"] 
                   : forwardedFor.Split(',').Select(s => s.Trim()).First();

NAT /リバースプロキシの背後にいると想定しているため、使用する必要があると思います:

Request.ServerVariables("REMOTE_ADDR") 

ほとんどの場合、172.16.0.0 / 12はプライベートLANであり、172.16.16.248は自分のアドレスで、172.16.6.1はルーター/プロキシのアドレスです。

Request.ServerVariables(" REMOTE_ADDR")は機能しません。 この問題は、おそらくurサーバーが何らかのプロキシの背後にある(または何らかのネットワーク経由でインターネットに接続されている)か、ルーター設定がNAT(ネットワークアドレス変換)として設定されているためです。そのような状況では、Asp.netを使用してIPアドレスを取得できません ただし、Javaは、どの場合でもIPアドレスを取得できるアプレットを使用して提供します。

(Netscape、Mozilla、Firefoxのみ、およびJavaを有効にする必要があります)

<script language="javascript" type="text/javascript">   

if (navigator.appName.indexOf("Netscape") != -1){
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
document.write("<b>Your IP address is " + ip+'</b>');
}
else {
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>");
}

</script>

そこにリストした2つのアドレスは、プライベートとして定義された範囲の1つからのものです。 (説明については、こちらをご覧ください)

自分のファイアウォールの内部アドレスを取得しているように聞こえますか?

tomfanningsの回答に基づいて作成...

 public static string ClientIp(this HttpRequestBase @this) {
  var clientIp = string.Empty;
  string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"];

  if (string.IsNullOrWhiteSpace(forwardedFor)) {
    clientIp = @this.ServerVariables["REMOTE_ADDR"];
  } else {

    var array = forwardedFor
      .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
      .Select(s => s.Trim());

    foreach (var element in array) {
      if (element.IsValidIp4() || element.IsValidIp6()) {
        clientIp = element;
        break;
      }
    }
  }
  return clientIp;
}

public static bool IsValidIp4(this string @this) {
  var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))<*>quot;);
  return pattern.IsMatch(@this);
}

public static bool IsValidIp6(this string @this) {
  var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))<*>quot;);
  return pattern.IsMatch(@this);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top