Encontrar la dirección IP del cliente conectado a través de un proxy

¿Hay alguna forma de recostackr la dirección IP de un cliente conectado a su sitio web a través de un servidor proxy?

Toda la configuración es una LAN interna y, a través de sysadmin, también tengo control sobre la máquina proxy. Estoy usando PHP5 para el lado del servidor del sitio web.

Intenté $_SERVER['REMOTE_ADDR'] en PHP, pero esta variable solo almacena la dirección IP del proxy.

¿Algunas ideas?

La solución estándar (en php) es:

 if ($_SERVER['HTTP_X_FORWARDED_FOR']){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else{ $ip = $_SERVER['REMOTE_ADDR']; } 

Pero como la primera respuesta dice esto, todo depende del encabezado que realmente se está configurando.

Depende del proxy. Algunos proxies agregan un encabezado que da la dirección IP original, el encabezado X-Forwarded-For, pero dado que la mayoría de las empresas usa proxies para ocultar la estructura interna de la red que es rara. Si este es el caso, entonces no podrás hacerlo fácilmente.

Si tiene control sobre el proxy, entonces es hora de leer la documentación del proxy para ver cómo agregar ese encabezado.

X-Forwarded-For es la única forma de obtener la dirección IP del cliente. Compruebe si hay una manera de habilitar eso en su proxy.

En algunos proxy, le da la opción de cómo manejar el encabezado XFF existente (cuando la solicitud pasa por múltiples proxies). Esto es lo que debes tener en cuenta,

  1. Si la dirección del cliente es para fines de seguridad / confianza (como ACL o limitación de velocidad), el encabezado XFF existente debe descartarse por poder.
  2. Si la dirección es solo para información (registro, depuración), debe agregar la dirección del mismo nivel al XFF existente, separado por comas. La primera IP en la lista sería la IP del cliente.

Este código se puede usar para obtener la dirección IP del cliente que se está conectando a través de un proxy.

  public static String getClientIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } 

Pero solo detecta cuando el proxy es transparente.

A continuación está la información sobre el proxy HTTP:

  1. No usa ningún servidor proxy:

    • request.getRemoteAddr() = dirección IP del cliente
    • request.getHeader("HTTP_X_FORWARDED_FOR") = Sin valor o Sin visualización
  2. Usa Proxies transparentes:

    • HTTP_X_FORWARDED_FOR = Dirección IP real del cliente
  3. Use Proxy Normal Anónimo:

    • request.getRemoteAddr() = dirección IP del servidor proxy
    • HTTP_X_FORWARDED_FOR = dirección IP del servidor proxy