SNAT, NAT y X-Forwarded-For

Resumen

En un full proxy, la respuesta del servidor tiene que volver por el BIG-IP. Si los servidores usan otro router como gateway, se usa SNAT: BIG-IP cambia la IP de origen del cliente por una suya, y el servidor le responde a él. El precio es que el servidor ya no ve la IP real del cliente; en HTTP se recupera con el header X-Forwarded-For. Esta nota configura SNAT Auto Map, SNAT pool, iSNAT, NAT 1 a 1 y X-Forwarded-For.

Requisitos previos

  • Saber cuál es el gateway de los servidores
  • Conexiones concurrentes esperadas (para el tamaño del SNAT pool)
  • Para iSNAT: lista de redes que deben salir con una IP fija
  • Acceso al servidor web para leer X-Forwarded-For

Conceptos clave

ConceptoQué es
SNAT Auto MapUsa la self IP de la VLAN de salida (prefiere la floating)
SNAT poolLista de IPs de traducción
Port exhaustion~65 535 puertos por IP SNAT hacia un mismo miembro; más conexiones = más IPs
iSNATiRule + data group para dar una IP SNAT concreta a cierto tráfico
NATTraducción 1 a 1 en ambos sentidos (requiere BIG-IP como gateway del servidor)
X-Forwarded-For (XFF)Header HTTP con la IP real del cliente
Auto Last HopResponde por la misma MAC/VLAN por donde entró el cliente (activo por defecto)
Conexiones concurrentes al mismo miembroIPs en el SNAT pool
Hasta ~64 0001 (Auto Map)
70 0002
100 000–150 0003

Configuración (Ejemplo, Lab CBT Nuggets)

1. SNAT Auto Map en el VS

Local Traffic > Virtual Servers > el VS > Source Address Translation: Auto Map (por defecto None) > Update.

tmsh modify ltm virtual VS-172.16.101.20-HTTP-APP1 source-address-translation { type automap }

2. SNAT pool

Local Traffic > Address Translation > SNAT Pool List > Create > Name: snatpool_app1, Members: 10.10.101.21, 10.10.101.22 > Finished. En el VS: Source Address Translation: SNAT > SNAT Pool: snatpool_app1 > Update.

tmsh create ltm snatpool snatpool_app1 members add { 10.10.101.21 10.10.101.22 }
tmsh modify ltm virtual VS-172.16.101.20-HTTP-APP1 source-address-translation { type snat pool snatpool_app1 }

3. iSNAT (IP fija para usuarios internos)

  1. Local Traffic > iRules > Data Group List > Create > Name: usuarios_internos, Type: Address > agrega 192.168.10.0/24 > Finished.
  2. Local Traffic > iRules > Create > Name: iSNAT_internos:
when CLIENT_ACCEPTED {
    if { [class match [IP::client_addr] equals usuarios_internos] } {
        snat 10.10.101.20
    }
}
  1. VS > Resources > iRules > Manage > agrega iSNAT_internos > Finished.

La IP SNAT debe existir en el BIG-IP

La IP que usa la iRule (10.10.101.20) tiene que estar creada como SNAT Translation (Local Traffic > Address Translation > SNAT Translation List) o ser miembro de un SNAT pool. Así el BIG-IP responde ARP por ella y recibe el tráfico de vuelta de los servidores. Alternativa: snatpool <nombre> en la iRule.

4. X-Forwarded-For

Opción A (perfil): Local Traffic > Profiles > Services > HTTP > Create > Name: X-Forward-For, Parent: http > Insert X-Forwarded-For: Enabled > Finished. VS > HTTP Profile (Client): X-Forward-For > Update.

Opción B (iRule):

when HTTP_REQUEST {
    HTTP::header insert X-Forwarded-For [IP::remote_addr]
}

En NGINX (/opt/bitnami/nginx/conf/nginx.conf en el servidor del curso):

set_real_ip_from 10.10.101.11;
set_real_ip_from 10.10.101.12;
real_ip_header X-Forwarded-For;

Luego sudo nginx -s reload (o reinicia el servicio).

5. NAT 1 a 1

Local Traffic > Address Translation > NAT List > Create > NAT Address (pública) 172.16.101.50, Origin Address (privada) 10.10.101.101 > Finished. Solo funciona si el servidor usa BIG-IP como gateway.

6. Sin SNAT: BIG-IP como gateway

En los servidores, gateway = floating self IP interna (10.10.101.13). Si además deben salir a Internet, crea un forwarding VS en la VLAN internal (Virtual Servers, paso 3).

Verificación

Comando o lugarQué debes verSi no lo ves
tmsh show sys connection cs-server-addr 172.16.101.20Lado servidor con la IP SNAT como origenRevisa la opción SNAT del VS
tail /opt/bitnami/nginx/logs/access.log (servidor)Sin XFF: la IP SNAT; con XFF bien configurado: la IP real (172.16.101.5)Revisa el perfil/iRule y la config de NGINX
tmsh show ltm snatpoolConexiones repartidas entre las IPsPaso 2
tmsh show ltm rule iSNAT_internosEjecuciones de la iRuleiRule no asignada al VS

Errores comunes

La web no carga aunque el pool está verde

  • Causa: sin SNAT y con los servidores usando otro gateway: responden directo al cliente.
  • Revisa: tcpdump -ni internal host 10.10.101.101 (llegan SYN pero no vuelve el SYN-ACK al BIG-IP).
  • Solución: SNAT Auto Map o floating IP como gateway.

Fallan conexiones con mucha carga

  • Causa: port exhaustion con una sola IP SNAT.
  • Solución: SNAT pool con más IPs.

El servidor sigue registrando la IP del BIG-IP

  • Causa: XFF no se inserta o el servidor no confía en las IPs del BIG-IP.
  • Solución: revisa el perfil/iRule y set_real_ip_from.

Una app no web necesita la IP del cliente

  • Causa: X-Forwarded-For es solo HTTP.
  • Solución: no uses SNAT; enruta el retorno por el BIG-IP.