Pergunta

Eu coleciono estatísticas sobre endereços IP de onde os usuários visitar o meu site e tenho notado que há apenas dois endereços IP apresentados, 172.16.16.1 e 172.16.16.248. A propriedade que eu uso para determinar o endereço IP é

Request.UserHostAddress

O que poderia ser um motivo de IP informações de endereço perdedor? Todos os usuários são de todo o mundo, para que eles cann't estar por trás apenas dois proxies.

Foi útil?

Solução

Este parece ser o trabalho de um proxy reverso. Quando você usa um proxy reverso, o cliente se conecta ao proxy, que se abre uma nova conexão com o servidor. Desde ASP.NET usa as informações sobre da conexão de entrada para preencher o endereço do usuário, você começa o endereço do proxy reverso.

Se você estiver realmente com essa configuração, você vai precisar de ajuda do proxy reverso para obter as informações corretas. A maioria dos proxies reversos oferecem a possibilidade de adicionar um cabeçalho à solicitação HTTP, com o endereço IP real do cliente. Verifique a documentação do seu proxy.

Outras dicas

Você pode querer algo assim;

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

O HTTP_X_FORWARDED_FOR cabeçalho obtém o endereço IP por trás de servidores proxy.

Veja esta página que explica por que com mais detalhes; Obtendo o IP real de seus usuários

Com base na resposta de Dave Anderson, aqui está um trecho que leva em conta uma cadeia de proxies reversos.

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

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

Eu suponho que você está atrás de um proxy NAT / Reverso então eu acho que você tem que usar:

Request.ServerVariables("REMOTE_ADDR") 

O mais provável 172.16.0.0/12 é a sua privat LAN onde 172.16.16.248 é o seu próprio endereço e 172.16.16.1 o endereço do seu roteador / proxy.

Request.ServerVariables ( "REMOTE_ADDR") não é trabalho. este problema ocorre porque servidor ur é provavelmente atrás de algum proxy. (ou conectado à internet através de algum rede) ou as configurações do roteador são definidas como NAT (Network Address Translation) esta técnica does not passar IP com o servidor. em tais situações u não pode obter o endereço IP usando Asp.net no entanto Java Fornecer miniaplicativo usando o que u pode obter o endereço IP em qualquer caso.

(para Netscape, Mozilla Firefox e só, e Java deve estar ativado)

<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>

Os dois endereços que você listou existem de um dos intervalos definidos como sendo privado. (Veja aqui para descrição)

Parece mais como você está pegando o endereço interno do seu próprio firewall (s)?

Com base na resposta 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]))$");
  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]))$");
  return pattern.IsMatch(@this);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top