Cuando un servidor está detrás de un proxy, la IP del cliente que ve el servidor es la IP del proxy. Si bien esto no afecta directamente al servicio, no es útil por varias razones como por ejemplo:
- En los logs no se registra la IP correcta del cliente.
- No es posible implementar ningún sistema, basado en IP, para limitar los ataques de fuerza bruta contra el sistema de login.
- Si desea usar usar algún módulo de localización geográfica como por ejemplo el módulo ngx_http_geoip_module de NIGNX.
Para lograr esto, es necesario:
1.- Usar el parámetro real_ip_header
, del módulo ngx_http_realip_module de NGINX, para modificar la cabecera que contiene la IP del cliente.
2.- Configurar HAProxy para que añada la cabecera X-Forwarded-For
o X-Real-IP
.
3.- Configurar NGINX para que reemplace el parámetro fastcgi REMOTE_ADDR
con la IP de la cabecera X-Forwarded-For
o X-Real-IP
.
Configurar real_ip_header en NGINX
La sintaxis del parámetro es:
|
|
donde,
X-Real-IP
, reemplaza la cabecera de la IP del cliente por la IP de la cabeceraX-Real-IP
.X-Forwarded-For
, reemplaza la cabecera de la IP del cliente por la IP de la cabeceraX-Forwarded-For
..proxy_protocol
, reemplaza la cabecera de la IP del cliente por la IP de la cabeceraproxy_protocol
, para usar esta opción es necesario que activar el parámetro proxy_protocol en la directivalisten
. Más información en Module ngx_http_core_module - listen y The Proxy Protocol.
Configurar HAProxy para que añada la cabecera X-Forwarded-For o X-Real-IP
HAProxy puede aplicar acciones sobre las peticiones HTTP (capa 7) mediante la palabra clave http-request
, algunas de estas acciones permiten añadir una cabecera (add-header
), configurar el valor de una cabecera (set-header
) o borrar una cabecera (del-header
).
La principal diferencia entre add-header
y set-header
, es que set-header
primero elimina la cabecera y después la añade con el valor indicado, esto permite garantizar que dicha cabecera no podrá ser manipulada por un usuario externo.
- Añadir la cabecera
X-Forwarded-For
:1http-request set-header X-Forwarded-For %[src]
O bien mediante:
|
|
- Añadir la cabecera
X-Client-IP
:1http-request set-header X-Client-IP %[src]
O bien mediante:
|
|
Configurar fastcgi_param REMOTE_ADDR
En el bloque donde se invoque a fastcgi_pass
, es necesario añadir include fastcgi_params;
y fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
. Ejemplo:
|
|