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
| Concepto | Qué es |
|---|---|
| SNAT Auto Map | Usa la self IP de la VLAN de salida (prefiere la floating) |
| SNAT pool | Lista de IPs de traducción |
| Port exhaustion | ~65 535 puertos por IP SNAT hacia un mismo miembro; más conexiones = más IPs |
| iSNAT | iRule + data group para dar una IP SNAT concreta a cierto tráfico |
| NAT | Traducció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 Hop | Responde por la misma MAC/VLAN por donde entró el cliente (activo por defecto) |
| Conexiones concurrentes al mismo miembro | IPs en el SNAT pool |
|---|---|
| Hasta ~64 000 | 1 (Auto Map) |
| 70 000 | 2 |
| 100 000–150 000 | 3 |
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)
- Local Traffic > iRules > Data Group List > Create > Name:
usuarios_internos, Type: Address > agrega192.168.10.0/24> Finished. - Local Traffic > iRules > Create > Name:
iSNAT_internos:
when CLIENT_ACCEPTED {
if { [class match [IP::client_addr] equals usuarios_internos] } {
snat 10.10.101.20
}
}
- 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 lugar | Qué debes ver | Si no lo ves |
|---|---|---|
tmsh show sys connection cs-server-addr 172.16.101.20 | Lado servidor con la IP SNAT como origen | Revisa 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 snatpool | Conexiones repartidas entre las IPs | Paso 2 |
tmsh show ltm rule iSNAT_internos | Ejecuciones de la iRule | iRule 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.