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 inside y outside (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

TipoQué haceCuándo usarlo
Static IP (SIP)1 IP privada ↔ 1 IP pública fijaUn 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 puertoPocos 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)

  1. Crea el objeto de la IP pública: Objects > Addresses > Add > Name Linux_1_Global_Address, Type IP Netmask, 23.1.2.105/32.
  2. Policies > NAT > Add.
  3. General: Name Linux_1_to_Outside.
  4. Original Packet: Source Zone inside, Destination Zone outside, Destination Interface ethernet1/6, Source Address Linux_1 (10.10.0.105), Destination Address any, Service any.
  5. Translated Packet > Source Address Translation: Translation Type Static IP, Translated Address Linux_1_Global_Address.
  6. Bi-directional: déjalo en No salvo que el equipo sea un servidor al que también se llegue desde afuera.
  7. 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)

  1. Objects > Addresses > Add > Name Public_Pool_Range, Type IP Range, 23.1.2.201-23.1.2.250.
  2. Policies > NAT > Add > Name Subnet 20 Dynamic NAT.
  3. Original Packet: Source Zone inside, Destination Zone outside, Destination Interface ethernet1/6, Source Address Subnet 20, Service any.
  4. Translated Packet: Translation Type Dynamic IP, Translated Address > Add Public_Pool_Range.
  5. Opcional, Advanced (Dynamic IP/Port Fallback): para pasar a DIPP si el pool se agota.
  6. 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)

  1. Policies > NAT > Add > Name DIPP for Subnet 10.
  2. Original Packet: Source Zone inside, Destination Zone outside, Destination Interface ethernet1/6, Source Address Subnet 10, Service any.
  3. Translated Packet > Source Address Translation: Translation Type Dynamic IP And Port.
  4. Address Type Interface Address: Interface ethernet1/6, IP Address 23.1.2.15/24. (Con Address Type Translated Address puedes usar una o varias IPs de un rango.)
  5. Destination Address Translation: Translation Type None.
  6. 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.

  1. Clona la regla DIPP anterior y cámbiale el nombre (ej. DIPP via ISP B).
  2. Destination Interface ethernet1/7.
  3. Translated Packet: Interface ethernet1/7, IP Address 24.1.2.15/24.
  4. 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 lugarQué debes verSi no lo ves
show running nat-policyTus 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 443El nombre de la regla esperada y la traducciónSi coincide otra regla, revisa el orden; si no coincide ninguna, revisa zonas e interfaz de salida
show session all filter source 10.10.0.105La session con el flujo s2c mostrando la IP traducidaSi 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 traducidaSi no hay NAT, el tráfico no coincidió con la regla
show running ippoolPools en uso y cuántas traducciones tiene cada unoSi 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ónSi faltan, no hubo traducción
Desde un cliente: curl ifconfig.meLa IP pública esperadaSi muestra otra, la regla equivocada tomó el tráfico
show counter global filter delta yes severity dropSin contadores de NAT subiendoflow_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-match y test 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-match con 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).