asp.net - obtener - UserHostAddress proporciona direcciones IP incorrectas
ip address c# (7)
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.
Recopilo estadísticas sobre 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 es
Request.UserHostAddress
¿Cuál podría ser la razón por la cual la información de la dirección IP está perdiendo? Todos los usuarios son de todo el mundo, por lo que no pueden estar detrás de solo dos proxies.
Las dos direcciones que ha enumerado allí pertenecen a uno de los intervalos definidos como privados. (mira aquí para la descripción)
Parece más como si estuvieras recogiendo la dirección interna de tu propio firewall (s)?
Supongo que estás detrás de un proxy de NAT / inversa, así que creo que debes 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 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 la IP al servidor. en tales situaciones, no puede obtener una dirección IP utilizando Asp.net, sin embargo, el applet Java Provide puede usar 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>
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();
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);
}
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é en más detalle; Obtener la verdadera IP de sus usuarios