2008-10-14 17 views
9

Recopilo estadísticas sobre las direcciones IP desde donde los usuarios visitan mi sitio y he notado que solo hay dos direcciones IP presentadas, 172.16.16.1 y 172.16.16.248. La propiedad que uso para determinar la dirección IP esUserHostAddress da direcciones IP incorrectas

Request.UserHostAddress 

¿Cuál podría ser el motivo 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 proxies.

Respuesta

9

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

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

1

Asumo que está detrás de un NAT/Proxy inverso, así que creo que hay que utilizar:

Request.ServerVariables("REMOTE_ADDR") 

Lo más probable es que su 172.16.0.0/12 Privat LAN en la que 172.16.16.248 es su propia dirección y 172.16 .16.1 la dirección de su enrutador/proxy.

+0

Usted no lo entendía/16? – leppie

+0

No,/12 debería estar correcto como predeterminado. =) http: //en.wikipedia.org/wiki/Private_network – Node

0

Las dos direcciones que ha enumerado allí pertenecen a uno de los intervalos definidos como privados. (vea here para obtener más información)

Parece más como que está recogiendo la dirección interna de su propio servidor de seguridad (s)?

23

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.

Consulte esta página que explica por qué en más detalle; Getting The Real IP of your Users

+0

Conozco el encabezado HTTP_X_FORWARDED_FOR, pero estoy más interesado en los motivos del problema. ¡Gracias de cualquier manera! –

+5

Tenga en cuenta que los proxies encadenados pueden dar lugar a varios encabezados HTTP_X_FORWARDED_FOR. –

+0

@Marc Climent: ¿Podría agregar una nueva respuesta a esta pregunta que tenga en cuenta eso? Me gustaría ver cómo funciona eso. ¿'Request.ServerVariables [" HTTP_X_FORWARDED_FOR "]' devolvería una cadena delimitada de direcciones IP, o simplemente devolvería el primer/último encabezado? – MikeWyatt

1

Request.ServerVariables ("REMOTE_ADDR") no funciona. 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 transfiere IP al servidor. en tales situaciones, no puede obtener la dirección IP utilizando Asp.net , sin embargo, el applet Java Provide con el que puede obtener la dirección IP en cualquier caso.

(para Netscape, Mozilla y Firefox solamente, 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> 
5

Sobre la respuesta de Dave Anderson, aquí es 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(); 
0

Basándose en tomfannings respuesta ...

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); 
} 
+0

Explicar su código en relación con la pregunta hecha ayudaría. – Prateek

Cuestiones relacionadas