Source NAT
Resumen
Source NAT cambia la dirección IP de origen (y, según el tipo, también el puerto) de los paquetes que salen de tu red. Tus equipos usan direcciones privadas (10.x, 172.16.x, 192.168.x) que no se pueden enrutar por Internet; al salir, el firewall las reemplaza por una IP pública, y cuando la respuesta regresa, deshace el cambio y la entrega al equipo correcto. Para eso guarda cada traducción en la session table.
Hay tres formas de hacerlo: Static IP (una IP privada siempre con la misma IP pública), Dynamic IP (cada equipo recibe una IP de un conjunto o pool, de una en una) y Dynamic IP And Port (DIPP) (muchos equipos comparten una sola IP pública, y el firewall los distingue por el puerto de origen). DIPP es el que se usa casi siempre para la salida a Internet. Source NAT por sí solo no permite el tráfico: la Security Policy sigue siendo necesaria.
Requisitos previos
- Interfaces L3 con zonas creadas, por ejemplo
insideyoutside(ver L3 Interfaces, Subinterfaces y DHCP) - Virtual Router con una ruta default hacia Internet (ver Static Routing y Path Monitoring)
- Una regla de Security Policy que permita
inside→outside(ver Security Policy Fundamentals) - Una IP pública disponible: la IP de la interfaz de salida, una IP fija o un rango
- Objetos de dirección para cada IP pública o rango (solo en Static IP y Dynamic IP)
- Si las IPs públicas no están en la subred de tu interfaz, el ISP debe enrutarlas hacia tu firewall
Tipos de Source NAT
| Tipo | Qué hace | Cuándo usarlo |
|---|---|---|
| Static IP (SIP) | 1 IP privada ↔ 1 IP pública fija | Un servidor que siempre debe salir con la misma IP pública |
| Dynamic IP (DIP) | Cada host recibe una IP libre del pool, 1 a 1; sin cambio de puerto | Pocos hosts y un pool grande |
| Dynamic IP And Port (DIPP) | Muchos hosts → 1 IP, diferenciados por puerto (PAT, many-to-one) | La salida normal a Internet |
Cuidado con Dynamic IP
Si hay más hosts que IPs en el pool, los hosts extra no pueden salir. Por ejemplo, una red /24 (254 hosts) con un pool de 50 IPs. Usa Advanced (Dynamic IP/Port Fallback) para que, cuando se agote el pool, pase a DIPP.
graph LR PC["PC 10.10.0.105<br/>puerto 51000"] -->|"origen 10.10.0.105:51000"| FW["Firewall<br/>regla NAT DIPP"] FW -->|"origen traducido 23.1.2.15:40001"| NET[("Internet<br/>8.8.8.8")] NET -->|"destino 23.1.2.15:40001"| FW FW -->|"destino restaurado 10.10.0.105:51000"| PC
Configuración (Ejemplo, Lab PCNSA)
Valores del lab: ver Lab PCNSA (curso). Zona inside (10.10.0.0/24 y 10.20.0.0/24), zona outside con ethernet1/6 (23.1.2.15/24, ISP A) y ethernet1/7 (24.1.2.15/24, ISP B).
A. Static IP (un host, una IP fija)
- Crea el objeto de la IP pública: Objects > Addresses > Add > Name
Linux_1_Global_Address, TypeIP Netmask,23.1.2.105/32. - Policies > NAT > Add.
- General: Name
Linux_1_to_Outside. - Original Packet: Source Zone
inside, Destination Zoneoutside, Destination Interfaceethernet1/6, Source AddressLinux_1(10.10.0.105), Destination Addressany, Serviceany. - Translated Packet > Source Address Translation: Translation Type
Static IP, Translated AddressLinux_1_Global_Address. - Bi-directional: déjalo en
Nosalvo que el equipo sea un servidor al que también se llegue desde afuera. - OK y Commit.
set address Linux_1_Global_Address ip-netmask 23.1.2.105/32
set rulebase nat rules Linux_1_to_Outside from inside to outside source Linux_1 destination any service any to-interface ethernet1/6
set rulebase nat rules Linux_1_to_Outside source-translation static-ip translated-address Linux_1_Global_Address
commit
B. Dynamic IP (pool de IPs públicas)
- Objects > Addresses > Add > Name
Public_Pool_Range, TypeIP Range,23.1.2.201-23.1.2.250. - Policies > NAT > Add > Name
Subnet 20 Dynamic NAT. - Original Packet: Source Zone
inside, Destination Zoneoutside, Destination Interfaceethernet1/6, Source AddressSubnet 20, Serviceany. - Translated Packet: Translation Type
Dynamic IP, Translated Address > AddPublic_Pool_Range. - Opcional, Advanced (Dynamic IP/Port Fallback): para pasar a DIPP si el pool se agota.
- OK y Commit.
set address Public_Pool_Range ip-range 23.1.2.201-23.1.2.250
set rulebase nat rules Subnet_20_Dynamic_NAT from inside to outside source Subnet_20 destination any service any to-interface ethernet1/6
set rulebase nat rules Subnet_20_Dynamic_NAT source-translation dynamic-ip translated-address Public_Pool_Range
commit
C. Dynamic IP And Port (la salida normal a Internet)
- Policies > NAT > Add > Name
DIPP for Subnet 10. - Original Packet: Source Zone
inside, Destination Zoneoutside, Destination Interfaceethernet1/6, Source AddressSubnet 10, Serviceany. - Translated Packet > Source Address Translation: Translation Type
Dynamic IP And Port. - Address Type
Interface Address: Interfaceethernet1/6, IP Address23.1.2.15/24. (Con Address TypeTranslated Addresspuedes usar una o varias IPs de un rango.) - Destination Address Translation: Translation Type
None. - OK y Commit.
set rulebase nat rules DIPP_for_Subnet_10 from inside to outside source Subnet_10 destination any service any to-interface ethernet1/6
set rulebase nat rules DIPP_for_Subnet_10 source-translation dynamic-ip-and-port interface-address interface ethernet1/6
commit
D. Segundo ISP (respaldo): una regla por cada interfaz de salida
Con dos rutas default (ver Static Routing y Path Monitoring), el tráfico puede salir por ethernet1/6 o por ethernet1/7. Cada interfaz necesita su propia regla DIPP, porque la IP traducida debe ser la de la interfaz por donde sale.
- Clona la regla DIPP anterior y cámbiale el nombre (ej.
DIPP via ISP B). - Destination Interface
ethernet1/7. - Translated Packet: Interface
ethernet1/7, IP Address24.1.2.15/24. - Commit.
Si falta esta regla
Cuando falle ISP A y el tráfico salga por ISP B, saldrá con la IP privada o con la IP equivocada y no habrá respuesta.
E. Bi-directional en Static IP (servidor)
En la regla Static IP, activa Bi-directional para que el equipo también reciba conexiones iniciadas desde afuera a su IP pública. Esto crea una traducción inversa implícita, pero igual necesitas una regla de Security Policy que permita ese tráfico entrante (Source Zone outside, Destination Zone la real del servidor, Destination Address la IP pública).
F. Orden de las reglas
Las reglas de NAT se leen de arriba a abajo y gana la primera que coincide. Pon las reglas específicas (un host con Static IP) arriba de las generales (una subred con DIPP).
G. Excluir tráfico del NAT (No-NAT) y detalles de DIPP
- No-NAT: una regla con Translated Packet > Source Address Translation > Translation Type
None, colocada arriba, excluye tráfico (por ejemplo hacia un túnel VPN o entre subredes internas). - Proxy ARP: si el pool o la Static IP están en la misma subred que la interfaz de salida, el firewall responde ARP por esas IP; si no responde, no regresa el tráfico.
- Capacidad de DIPP: cada IP soporta un número limitado de puertos por destino; con muchas sessions usa varias IP, el oversubscription de DIPP o Persistent.
Verificación
| Comando o lugar | Qué debes ver | Si no lo ves |
|---|---|---|
show running nat-policy | Tus reglas con translate-to "src: 23.1.2.15 (dynamic-ip-and-port)" o (static-ip) | Falta commit o la regla no se guardó |
test nat-policy-match from inside to outside source 10.10.0.105 destination 8.8.8.8 protocol 6 destination-port 443 | El nombre de la regla esperada y la traducción | Si coincide otra regla, revisa el orden; si no coincide ninguna, revisa zonas e interfaz de salida |
show session all filter source 10.10.0.105 | La session con el flujo s2c mostrando la IP traducida | Si no hay session, el tráfico no llegó o fue negado |
show session id <n> | nat: yes, nombre de la regla de NAT y las IPs original y traducida | Si no hay NAT, el tráfico no coincidió con la regla |
show running ippool | Pools en uso y cuántas traducciones tiene cada uno | Si el pool de DIP está lleno, hay hosts sin traducción |
show running nat-rule-ippool rule "DIPP for Subnet 10" | Detalle de las IPs y los puertos usados por la regla | Útil para ver agotamiento |
| Monitor > Logs > Traffic (agrega las columnas NAT Source IP y NAT Source Port) | Origen traducido en cada sesión | Si faltan, no hubo traducción |
Desde un cliente: curl ifconfig.me | La IP pública esperada | Si muestra otra, la regla equivocada tomó el tráfico |
show counter global filter delta yes severity drop | Sin contadores de NAT subiendo | flow_fwd_l3_noroute indica falta de ruta |
Errores comunes
El tráfico no sale a Internet
- Causa: no hay regla de NAT que coincida, no hay Security Policy, o no hay ruta default.
- Revisa:
test nat-policy-match,test security-policy-matchytest routing fib-lookup virtual-router default ip 8.8.8.8. - Solución: corrige lo que falte. NAT no reemplaza a la Security Policy.
La regla de NAT existe pero no se aplica
- Causa: Source Zone, Destination Zone, Destination Interface o Source Address no coinciden con el tráfico, o una regla anterior lo toma primero.
- Revisa:
test nat-policy-matchcon los valores reales del tráfico. - Solución: ajusta los campos o reordena. Recuerda que las zonas son las originales, antes de traducir.
Con el ISP principal funciona; en el respaldo no
- Causa: falta la regla de NAT para la segunda interfaz de salida.
- Solución: crea una regla igual con Destination Interface y dirección de la otra interfaz (sección D).
Algunos hosts salen y otros no (Dynamic IP)
- Causa: el pool se agotó (más hosts que IPs).
- Revisa:
show running ippool. - Solución: amplía el pool, activa Advanced (Dynamic IP/Port Fallback) o cambia a DIPP.
La session sale traducida pero la respuesta no regresa
- Causa: el ISP no enruta la IP pública traducida hacia tu firewall (típico de IPs de un pool que no están en tu subred conectada).
- Revisa: que la IP o rango pertenezca a la subred de la interfaz de salida, o que el ISP tenga una ruta hacia tu interfaz.
- Solución: pide al ISP que enrute el rango, o usa IPs de la subred de la interfaz.
Un servidor con Static IP bi-directional se expuso demasiado
- Causa: Bi-directional más una regla de Security Policy muy amplia.
- Solución: limita la regla de entrada a las aplicaciones y puertos necesarios, y aplica perfiles de seguridad.
Dos reglas distintas usan la misma IP pública y se pisan
- Causa: una regla general (DIPP) está arriba de una específica (Static IP).
- Solución: pon la específica arriba.
No sé si el NAT funcionó
- Causa: no hay un lugar donde se vea la traducción si no activas las columnas.
- Solución: usa
show session id, las columnas NAT en el log de tráfico y una captura de paquetes antes y después del NAT (ver Troubleshooting NAT).