amazon web services - que - Determine la dirección IP del cliente detrás de Amazon ELB
que es elb amazon (6)
¿Puedes tener al cliente para reportar explícitamente su dirección IP? Revisa esta post .
Tenemos algunos servidores PHP en EC2 detrás de ELB. Nos gustaría determinar la ubicación / región por la dirección IP de los clientes que se conectan a nuestros servidores. El problema es que los servidores PHP solo ven la dirección IP de ELB. Nos gustaría ver las direcciones IP de los clientes pasadas a través de ELB.
De acuerdo con los documentos de AWS , el ELB debe configurar el encabezado HTTP ''X-Forwarded-For'' que conserva la dirección IP del cliente original:
El encabezado de solicitud X-Forwarded-For le ayuda a identificar la dirección IP de un cliente. Debido a que los equilibradores de carga interceptan el tráfico entre clientes y servidores, los registros de acceso de su servidor solo contienen la dirección IP del equilibrador de carga. Para ver la dirección IP del cliente, use el encabezado de solicitud X-Forwarded-For.
Puede acceder a él usando el siguiente código PHP (asumiendo apache):
$http_headers = apache_request_headers();
$original_ip = $http_headers["X-Forwarded-For"];
Este es un gran problema, así que prueba esto: D
<?php
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$real_client_ip = $_SERVER["REMOTE_ADDR"];
}
Parece que mod_cloudflare quizás sea una mejor opción para algunos, especialmente para los usuarios de v2.2 Lea más en el blog de este capítulo: http://knowledgevoid.com/blog/2012/01/13/logging-the-correct-ip-address-using-apache-2-2-x-and-amazons-elastic-load-balancer/
Si usa Apache, eche un vistazo al módulo mod_remoteip . Se incluye en Apache 2.4 y más reciente, pero también se pueden encontrar backports para 2.2.
El módulo anula la dirección IP del cliente para la conexión con la dirección IP del agente de usuario que se informa en el encabezado de solicitud configurado con la directiva RemoteIPHeader.
Una vez que se reemplaza como se indica, esta dirección IP de agente de usuario anulada se usa para la función mod_authz_host Require ip, se reporta por mod_status y se registra por mod_log_config% a y core% a cadenas de formato. La IP del cliente subyacente de la conexión está disponible en la cadena de formato% {c}.
En otras palabras, puede establecer qué encabezado usar (por ejemplo, X-Forwarded-For) y qué IP son de confianza (por ejemplo, su equilibrador de carga). Las direcciones IP confiables se eliminan del encabezado y la primera dirección IP no confiable se usa como el cliente de origen. Luego, Apache utiliza internamente esta IP en otros módulos, como el registro, la autenticación del host, etc.
Esto lo hace más útil que solo manejar el encabezado XFF en PHP, ya que mod_remoteip se encarga de toda la pila, se asegura de que sus registros de acceso sean correctos, etc.
Nota: También hay un módulo mod_rpaf que es el predecesor de este. Es mucho más limitado. Por ejemplo, no puede manejar rangos de IP confiables. Necesitas esto ya que no sabes de antemano la propiedad intelectual de ELB. Tampoco puede manejar múltiples saltos, como ELB antes de Barniz, antes de Apache. Yo sugeriría omitir el módulo rpaf y usar el control remoto en su lugar.
Solución óptima para la aplicación PHP detrás de AWS ELB:
if (!empty($_SERVER[''HTTP_X_FORWARDED_FOR''])) {
$commaPos = strrchr($_SERVER[''HTTP_X_FORWARDED_FOR''], '','');
if ($commaPos === FALSE) $remote_addr = $_SERVER[''HTTP_X_FORWARDED_FOR''];
else $remote_addr = trim(substr($_SERVER[''HTTP_X_FORWARDED_FOR''], $commaPos + 1));
} else {
$remote_addr = $_SERVER[''REMOTE_ADDR''];
}
Notas: X-Forwarded-For puede ser una lista de proxies separados por espacios de coma, siendo el último de la lista el que se conectó a ELB de AWS, y por lo tanto, el único en el que podemos confiar es que no está siendo falsificado.