Pregunta

Recopilo estadísticas sobre direcciones IP desde donde los usuarios visitan mi sitio y he notado que solo se presentan dos direcciones IP, 172.16.16.1 y 172.16.16.248. La propiedad que uso para determinar la dirección IP es

Request.UserHostAddress

¿Cuál podría ser la razón de la pérdida de información de la dirección IP? Todos los usuarios son de todo el mundo, por lo que no pueden estar detrás de solo dos servidores proxy.

¿Fue útil?

Solución

Esto se parece al trabajo de un proxy inverso. Cuando usa un proxy inverso, el cliente se conecta al proxy, que a su vez abre una nueva conexión a su servidor. Dado que ASP.NET utiliza la información de la conexión entrante para completar la dirección del usuario, obtiene la dirección del proxy inverso.

Si realmente está en esta configuración, necesitará ayuda del proxy inverso para obtener la información correcta. La mayoría de los servidores proxy inversos ofrecen la posibilidad de agregar un encabezado a la solicitud HTTP, con la dirección IP real del cliente. Compruebe la documentación de su proxy.

Otros consejos

Es posible que desee algo como esto;

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

El encabezado HTTP_X_FORWARDED_FOR obtiene la dirección IP detrás de los servidores proxy.

Vea esta página que explica por qué con más detalle; Obtener la IP real de sus usuarios

Sobre la base de la respuesta de Dave Anderson, aquí hay un fragmento que tiene en cuenta una cadena de proxies inversos.

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

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

Supongo que estás detrás de un Proxy inverso / NAT, así que creo que tienes que usar:

Request.ServerVariables("REMOTE_ADDR") 

Lo más probable es que 172.16.0.0/12 sea su LAN privada, donde 172.16.16.248 es su propia dirección y 172.16.16.1 la dirección de su enrutador / proxy.

Request.ServerVariables (" REMOTE_ADDR ") no es trabajo. Este problema se debe a que su servidor probablemente está detrás de algún proxy (o conectado a Internet a través de alguna red) o la configuración de su enrutador está configurada como NAT (traducción de direcciones de red). Esta técnica no pasa la IP al servidor. En tales situaciones, no puede obtener una dirección IP utilizando Asp.net. sin embargo, Java Proporcione el applet con el que puede obtener la dirección IP en cualquier caso.

(solo para Netscape, Mozilla y Firefox, y Java debe estar habilitado)

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

Las dos direcciones que ha enumerado allí son de uno de los rangos definidos como privados. (consulte aquí para obtener una descripción)

¿Suena más como si estuvieras recogiendo la dirección interna de tus propios cortafuegos?

Basándose en la respuesta de 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top