Los servidores web que están detrás de un proxy reverso / balanceador de carga, suelen recibir como dirección IP del visitante, la IP del proxy reverso que hace de intermediario. Para que eso no sea así y se pueda registrar en los logs del equipo, la IP real del visitante, se debe poder configurar tanto el servidor proxy como el servidor web (Nginx / Apache) destino.
Configurar un proxy reverso con Nginx que envíe la dirección IP real de las solicitudes.
location /some/path/ { proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; # Posibilidad 1. proxy_set_header X-Forwarded-For $remote_addr; # Posibilidad 2. proxy_set_header X-Forwarded-Host $remote_addr; # Posibilidad 3 (estándar de facto). proxy_pass http://localhost:8000; }
No hay problema en enviar todas esas cabeceras si no se conoce como está configurado el servidor web, por norma se usa la opción 3. A continuación se muestra como configurar un servidor web Apache o Nginx para que registre la IP real de las solicitudes en sus logs.
Configurar el formato de logs en el servidor web Nginx para que registre la IP real enviada por el proxy reverso.
Dentro de “http {}”, normalmente en el fichero nginx.conf.
log_format specialLog '$remote_addr forwarded for $http_x_real_ip - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
Posteriormente se debe indicar qué ficheros de logs usarán dicho formato.
access_log /var/log/nginx/blog/access.log specialLog;
Ejemplo de logs en Nginx.
61.71.161.7 - XXX [23/Nov/2015:17:11:24 +0100] "GET /nagios/stylesheets/common.css?4.0.8 HTTP/1.0" 304 0 "https://dominio/main.php" "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0" 61.71.161.7 forwarded for 210.63.81.20 - XXX [23/Nov/2015:17:12:11 +0100] "GET /nagios/stylesheets/common.css?4.0.8 HTTP/1.0" 304 0 "https://dominio/main.php" "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0"
Configurar el formato de logs en Apache para que registre la IP real enviada por el proxy reverso.
Con esta configuración para Apache, se usará el formato que incluye la ip real del cliente cuando se detecte que la solicitud vino de un proxy reverso.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded CustomLog "logs/access_log" combined env=!forwarded CustomLog "logs/access_log" proxy env=forwarded
NOTA: Cabeceras enviadas por el servidor proxy que pueden contener la IP real: “X-Forwarded-For” (estandar de facto), “X-Real-IP” y “True-Client-IP”
Enlace de interés: http://www.techstacks.com/howto/log-client-ip-and-xforwardedfor-ip-in-apache.html