Obtenga la dirección IP del cliente desde el encabezado HTTP X-Forwarded-For al utilizar un listener de capa 7 de CLB.
Funcionamiento
Los listeners de capa 7 de CLB (HTTP/HTTPS) conservan la dirección IP del cliente en el encabezado HTTP X-Forwarded-For. Los servidores backend pueden obtener esta IP tras la configuración correspondiente.
El campo X-Forwarded-For tiene el siguiente formato:
X-Forwarded-For: <client IP address, proxy-server-1-IP, proxy-server-2-IP, ...>
Al emplear este método, la dirección IP más a la izquierda en la lista corresponde a la dirección IP del cliente.
CLB finaliza la conexión HTTPS y se comunica con los servidores backend mediante HTTP. Configure los servidores backend exclusivamente para HTTP, incluso si utiliza un listener HTTPS.
Procedimiento
Requisitos previos
Se ha creado una instancia de CLB con un listener de capa 7. Este tema utiliza un listener HTTP en el puerto 80. Create and manage CLB instances. Add an HTTP listener.
Se ha agregado un grupo de servidores con servidores backend a la instancia de CLB. Este tema emplea un grupo vServer con protocolo HTTP, instancias ECS y el puerto 80. Create and manage vServer groups.
Paso 1: Comprobar que el listener utiliza X-Forwarded-For
Inicie sesión en la consola de Classic Load Balancer (CLB).
En la barra de navegación superior, seleccione la región donde se despliega la instancia.
En la página Instances, localice la instancia objetivo y haga clic en su ID.
En la página Instance Details, haga clic en la pestaña Listener, busque el listener de capa 7 objetivo y haga clic en su ID.
-
En la página de detalles del listener, compruebe que la sección Custom HTTP Header incluye X-Forwarded-For: Retrieve Client IP.
De forma predeterminada, los listeners de capa 7 de CLB usan el encabezado X-Forwarded-Para para obtener la dirección IP del cliente. Esta función no se puede deshabilitar.
Paso 2: Configurar los servidores backend
Esta sección describe cómo registrar la dirección IP del cliente en los registros de acceso del servidor backend (mediante el campo
X-Forwarded-For). Las variables de nivel de conexión (como$remote_addren Nginx) siguen mostrando la IP de reenvío de CLB y no se ven afectadas.Si desea reemplazar la variable de nivel de conexión (como
$remote_addr) por la IP real del cliente para que los formatos de registro existentes, las reglas de control de acceso y los límites de tasa funcionen sin modificaciones, consulte Replace connection-layer addresses with client IPs (Nginx and Apache).
Servidor Nginx
Entorno de ejemplo: CentOS 7.9 con Nginx 1.20.1. Su configuración podría ser diferente.
-
Ejecute
nginx -V | grep http_realip_modulepara comprobar si http_realip_module está instalado. Nginx utiliza este módulo para analizar los registros de X-Forwarded-For.Si la salida incluye
--with-http_realip_module, el módulo está instalado. Continúe con el siguiente paso.http_realip_module está disponible desde Nginx 1.0.4 (2011). Si usa una versión anterior, haga una copia de seguridad de su configuración y actualice Nginx.
Si http_realip_module no está instalado, recompile Nginx con el módulo o reinstale Nginx mediante un gestor de paquetes como yum.
-
Edite el archivo de configuración de Nginx. Ejecute
nginx -tpara encontrar la ruta del archivo. La ruta predeterminada es/etc/nginx/nginx.conf.http { # Make sure that the log_format includes $http_x_forwarded_for. This variable records the value of X-Forwarded-For. log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... } Ejecute el comando
sudo nginx -s reloadpara recargar la configuración de Nginx.
Servidor Apache
Entorno de ejemplo: CentOS 7.9 con Apache 2.4.6. Su configuración podría ser diferente.
-
Ejecute
httpd -M | grep remoteip_modulepara comprobar si remoteip_module está instalado. Apache utiliza este módulo para analizar los registros de X-Forwarded-For.Si la salida incluye
remoteip_module (shared), el módulo está instalado. Continúe con el siguiente paso.remoteip_module está disponible desde Apache 2.4.0 (2012). Si usa una versión anterior, haga una copia de seguridad de su configuración y actualice Apache.
Si remoteip_module no está instalado, recompile Apache con el módulo o reinstale Apache mediante un gestor de paquetes como yum.
-
Edite el archivo de configuración de Apache. La ruta predeterminada es
/etc/httpd/conf/httpd.conf.# ... <IfModule log_config_module> # Add %{X-Forwarded-For}i to record X-Forwarded-For information. LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common #... </IfModule> # ... Ejecute el comando
sudo systemctl restart httpdpara reiniciar el servicio de Apache.
Servidor IIS
Entorno de ejemplo: Windows Server 2016. Su configuración podría ser diferente.
Descargue y descomprima el archivo F5XForwardedFor.
Según la arquitectura de su sistema operativo, copie
F5XFFHttpModule.dllyF5XFFHttpModule.inidesde el directoriox86\ox64\hacia una ubicación con permisos de lectura para IIS.En Server Manager, abra IIS Manager.
-
Seleccione el servidor y haga doble clic en Modules.

-
Haga clic en Configure Native Modules y luego en Register.

-
Agregue el archivo .dll descargado.
Introduzca el nombre del archivo, seleccione la ruta y haga clic en OK.

El sistema selecciona automáticamente el módulo recién registrado. Haga clic en OK.

-
Regrese a la página principal del servidor y haga doble clic en el módulo Logging. Configure el formato de registro para incluir el campo
X-Forwarded-For.-
Haga clic en Select Fields.

-
En la esquina inferior izquierda, haga clic en Add Field, agregue el campo de registro y luego haga clic en OK.

En la esquina superior derecha, haga clic en Apply para guardar los cambios.
-
Reinicie el servidor IIS para que la configuración surta efecto.
Paso 3: Verificar la obtención de la IP del cliente
Siga los pasos correspondientes a su tipo de servidor.
Servidor Nginx
Revise el registro de acceso de Nginx para verificar la obtención de la IP del cliente.
La ruta predeterminada del registro de acceso de Nginx es /var/log/nginx/access.log.
La IP más a la izquierda en el campo $http_x_forwarded_for es la dirección IP del cliente.

Servidor Apache
Revise el registro de acceso de Apache para verificar la obtención de la IP del cliente.
La ruta predeterminada del registro de acceso de Apache es /var/log/httpd/access_log.
La IP más a la izquierda en el campo %{X-Forwarded-For}i es la dirección IP del cliente.

Servidor IIS
Revise el registro de IIS para verificar la obtención de la IP del cliente.
Encuentre la ruta del archivo de registro en el módulo Logging.

La IP más a la izquierda en el campo X-Forwarded-For es la dirección IP del cliente.

Preguntas frecuentes
Acceso frecuente desde IPs que comienzan con 100
El sistema CLB reenvía solicitudes externas a las instancias ECS backend y realiza comprobaciones de estado. Ambos tipos de solicitudes se originan en el sistema.
El sistema CLB utiliza el bloque CIDR reservado 100.64.0.0/10. Este bloque es exclusivo de Alibaba Cloud y no representa ningún riesgo de seguridad, pero explica el acceso frecuente desde IPs que comienzan con 100.
Asegúrese de que iptables y otro software de seguridad en sus servidores no bloqueen este bloque CIDR.
Obtención de IPs de cliente con WAF, CDN y GA
Si el tráfico pasa por WAF, CDN o Global Accelerator (GA) antes de llegar a CLB, aún puede usar X-Forwarded-For para obtener la IP del cliente. Estos servicios transmiten X-Forwarded-For de forma predeterminada sin necesidad de configuración adicional.
Para evitar la suplantación de X-Forwarded-For, utilice un encabezado personalizado para registrar la IP del cliente. Por ejemplo, en una arquitectura cliente > CDN > WAF > CLB > ECS, CDN puede pasar el encabezado Ali-Cdn-Real-Ip. En WAF, seleccione Specify header field como método de determinación de la IP del cliente y establezca el encabezado en Ali-Cdn-Real-Ip. Configure la variable de registro de Nginx como $http_Ali_Cdn_Real_Ip.
Medidas de seguridad adicionales:
Valide y filtre el encabezado XFF en los servidores backend. Compruebe el formato y las direcciones IP, y rechace los valores no válidos o sospechosos.
Utilice firewalls y ACL entre CLB y los servidores backend para filtrar solicitudes maliciosas dirigidas al encabezado XFF.
Emplee cifrado SSL/TLS para proteger las comunicaciones, incluida la transmisión del encabezado XFF, contra ataques de intermediario.
Obtención de IPs de cliente en un entorno ACK
En un clúster de Container Service for Kubernetes (ACK), el método es el mismo, pero algunos detalles operativos difieren. Network management FAQ.
Listener de capa 4 frente a capa 7: comportamiento de la IP de origen
Cuando una solicitud de cliente pasa por CLB, la IP de origen visible para los servidores backend depende del tipo de listener:
|
Tipo de listener |
Manejo de la IP de origen |
|
|
Capa 4 (TCP/UDP) |
CLB transmite directamente la IP de origen del cliente |
Dirección IP de origen del cliente |
|
Capa 7 (HTTP/HTTPS) |
CLB actúa como proxy inverso y establece una nueva conexión TCP con el servidor backend |
IP de reenvío interno de CLB (rango 100.64.0.0/10) |
Con los listeners de capa 7, CLB agrega automáticamente el encabezado de solicitud HTTP X-Forwarded-For para transportar la dirección IP de origen del cliente. Si $remote_addr en su registro de acceso de Nginx muestra una IP de reenvío interno de CLB en el rango 100.64.0.0/10 en lugar de la IP del cliente, este es el comportamiento esperado.
Reemplazo de direcciones de nivel de conexión por IPs de cliente (Nginx y Apache)
Nginx
De forma predeterminada, $remote_addr en los registros de Nginx registra la IP de reenvío interno de CLB (rango 100.64.0.0/10). Para reemplazarla por la IP real del cliente y permitir que los formatos de registro existentes, el control de acceso y las reglas de limitación de tasa funcionen sin modificaciones, utilice el módulo ngx_http_realip_module:
Ejecute
nginx -V | grep http_realip_modulepara verificar que el módulo esté instalado.-
Agregue lo siguiente al bloque
httpen el archivo de configuración (predeterminado:/etc/nginx/nginx.conf):set_real_ip_from 100.64.0.0/10; real_ip_header X-Forwarded-For; real_ip_recursive on; Ejecute
sudo nginx -tpara validar la configuración y luego ejecutesudo nginx -s reloadpara recargarla.
Una vez que la configuración surta efecto, revise el registro de acceso (predeterminado:/var/log/nginx/access.log) para confirmar que$remote_addrahora muestra la IP real del cliente.
Si el tráfico pasa por múltiples proxies como WAF o CDN, agregue los rangos de IP de origen de cada capa de proxy a set_real_ip_from .
Las solicitudes de comprobación de estado (HEAD, sinX-Forwarded-For) seguirán mostrando$remote_addrcomo100.64.0.0/10, lo cual es el comportamiento esperado.
Apache
De forma predeterminada, %h en los registros de Apache registra la IP de reenvío interno de CLB. Para reemplazarla por la IP real del cliente y permitir que los formatos de registro existentes y las reglas de control de acceso Require ip funcionen sin modificaciones, utilice el módulo integrado mod_remoteip de Apache 2.4:
Ejecute
httpd -M | grep remoteip_modulepara verificar que el módulo esté instalado.-
Agregue lo siguiente al archivo de configuración (predeterminado:
/etc/httpd/conf/httpd.conf):RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 100.64.0.0/10 Ejecute
sudo systemctl restart httpdpara reiniciar el servicio de Apache.
Una vez que la configuración surta efecto, revise el registro de acceso (predeterminado:/var/log/httpd/access_log) para confirmar que%hahora muestra la IP real del cliente.
Si el tráfico pasa por múltiples proxies como WAF o CDN, agregue los rangos de IP de origen de cada capa de proxy a RemoteIPTrustedProxy .
Las solicitudes de comprobación de estado (HEAD, sinX-Forwarded-For) seguirán mostrando%hcomo100.64.0.0/10, lo cual es el comportamiento esperado.
Documentos relacionados
Otros tipos de load balancer utilizan métodos diferentes:
Application Load Balancer (ALB): utiliza X-Forwarded-For. Retrieve client IP addresses by using an ALB.
Network Load Balancer (NLB): utiliza grupos de servidores o protocolo Proxy. Retrieve client IP addresses by using an NLB.
Listener de capa 4 de CLB: obtiene la IP directamente o usa el protocolo Proxy. Retrieve client IP addresses by using a CLB Layer 4 listener.