Destination NAT

Resumen

Destination NAT (DNAT) cambia la dirección IP de destino (y opcionalmente el puerto) de los paquetes que llegan al firewall. Se usa para publicar un servidor interno: los clientes de Internet apuntan a una IP pública (por ejemplo 23.1.2.100) y el firewall reescribe el destino a la IP privada real del servidor (por ejemplo 10.15.0.100), de modo que el servidor nunca expone su dirección privada.
Lo que más confunde de DNAT es qué usa cada regla. La regla de NAT se evalúa con los datos originales del paquete (zona y IP públicas, antes de traducir). La regla de Security Policy usa la zona real del servidor (después de traducir) pero la IP pública original como destino. Esta nota explica ese detalle, y las variantes: IP estática, reenvío de puerto, DNS y reparto entre varios servidores.

Requisitos previos

  • El servidor tiene una IP privada y una zona (por ejemplo dmz), y su default gateway es el firewall
  • Una IP pública para publicar, que llegue al firewall (en la subred de la interfaz de salida o enrutada por el ISP)
  • Un objeto de dirección para la IP pública (por ejemplo Public Server IP = 23.1.2.100/32) y otro para la IP privada del servidor
  • Una ruta hacia el servidor desde el firewall (interfaz conectada o ruta estática)
  • Un service object si el puerto externo no es el estándar (por ejemplo TCP-4443)
  • Una regla de Security Policy que permita el tráfico (NAT no lo permite por sí solo; ver Security Policy Fundamentals)

Qué usa cada regla

Regla de NATRegla de Security Policy
Zona de origenLa del cliente (outside)La del cliente (outside)
Zona de destinoPre-NAT: la zona donde está la IP pública (outside)Post-NAT: la zona real del servidor (dmz)
IP de destinoLa IP pública originalLa IP pública original (pre-NAT)
Puerto de destinoEl puerto original (por ejemplo 4443)El puerto original (por ejemplo 4443)
graph LR
    CL["Cliente en Internet<br/>14.9.32.87<br/>zona outside"] -->|"destino 23.1.2.100:443"| FW["Firewall"]
    FW -->|"destino traducido 10.15.0.100:443"| SV["Servidor<br/>zona dmz"]
    SV -->|"respuesta"| FW
    FW -->|"origen restaurado 23.1.2.100"| CL

En el diagrama: la regla de NAT usa outside → outside con destino 23.1.2.100; la regla de Security Policy usa outside → dmz con destino 23.1.2.100.

Configuración (Ejemplo, Lab PCNSA y Lab Network Security Engineering)

A. DNAT con IP estática

Lab Network Security Engineering: publicar 23.1.2.100 hacia el servidor 10.15.0.100 en la dmz.

  1. Objects > Addresses > Add: Public Server IP = 23.1.2.100/32, con Tag outside. Añade Srvr Private IP = 10.15.0.100/32.
  2. Policies > NAT > Add > Name DNAT to DMZ Server.
  3. Original Packet: Source Zone outside, Destination Zone outside, Destination Interface any (o la interfaz de salida), Service any, Source Address any, Destination Address Public Server IP.
  4. Translated Packet > Destination Address Translation: Translation Type Static IP, Translated Address 10.15.0.100. Deja Source Address Translation en None.
  5. OK.
  6. Policies > Security > Add > Name Allow Outside to DMZ.
  7. Source Zone outside, Source Address any. Destination Zone dmz, Destination Address Public Server IP.
  8. Application: las que necesites (por ejemplo ssl, ping, ssh). Service application-default. Action Allow, perfiles de seguridad aplicados.
  9. Commit.
set address Public_Server_IP ip-netmask 23.1.2.100/32
set rulebase nat rules DNAT_to_DMZ_Server from outside to outside source any destination Public_Server_IP service any
set rulebase nat rules DNAT_to_DMZ_Server destination-translation translated-address 10.15.0.100
set rulebase security rules Allow_Outside_to_DMZ from outside to dmz source any destination Public_Server_IP application [ ssl ping ssh ] service application-default action allow log-end yes
commit

B. Reenvío de puerto (port forwarding)

Publicar 23.1.2.100:4443 hacia 10.15.0.100:443.

  1. Objects > Services > Add > Name TCP-4443, Protocol TCP, Destination Port 4443.
  2. Policies > NAT > Add > Name Forward 4443 to DMZ 443.
  3. Original Packet: Source Zone outside, Destination Zone outside, Destination Address Public Server IP, Service TCP-4443.
  4. Translated Packet > Destination Address Translation: Translation Type Static IP, Translated Address 10.15.0.100, Translated Port 443.
  5. Security Policy: outside → dmz, Destination Address Public Server IP, Application ssl, y como Service el TCP-4443 (el puerto que cuenta es el original, no el traducido). Para confirmarlo en tu versión usa test security-policy-match con destination-port 4443.
  6. Commit.

Equivalente por CLI (verificar con Tab o ?): set rulebase nat rules "Forward 4443 to DMZ 443" destination-translation translated-address 10.15.0.100 translated-port 443.

La traducción de puerto se configura en la regla de NAT (Original Packet > Service para el puerto de entrada, y Translated Port para el de salida).

C. DNS: un servicio publicado por IP

Lab PCNSA: publicar DNS en 23.1.2.53 hacia 10.30.0.100.

  1. Policies > NAT > Add: Source Zone outside, Destination Zone outside, Destination Address 23.1.2.53; Translated Packet: Destination Address Translation Static IP, Translated Address 10.30.0.100.
  2. Security Policy: outside → dmz, Destination Address 23.1.2.53, Application dns-base (y ping si lo necesitas).
  3. Si los clientes internos consultan por nombre y ese nombre resuelve a la IP pública, activa Enable DNS Rewrite en la regla (Direction reverse o forward): el firewall reescribe la IP dentro de la respuesta DNS para que el cliente use la IP correcta según su lado.

D. Un nombre que reparte entre varios servidores (Dynamic IP con distribución de sessions)

  1. Crea un objeto de dirección tipo FQDN (por ejemplo Server DNS) que resuelva a las IPs de los servidores.
  2. Crea el objeto de la IP pública (por ejemplo LB-Global = 23.1.2.55, tipo IP Netmask).
  3. Policies > NAT > Add > Name Dynamic DNAT: Source Zone outside, Destination Zone outside, Destination Address LB-Global.
  4. Translated Packet > Destination Address Translation: Translation Type Dynamic IP (with session distribution), Translated Address Server DNS, y el método de reparto: Round Robin, Source IP Hash, IP Modulo, IP Hash o Least Sessions.
  5. Security Policy: outside → dmz, Destination Address LB-Global.

El objeto que va en Translated Address es un nombre que se resuelve por DNS (FQDN); la IP pública original (LB-Global) es un objeto de IP normal.

E. Source NAT bi-directional como alternativa

Si ya tienes una regla Static IP con Bi-directional activado para un servidor (ver Source NAT), esa regla crea la traducción inversa para las conexiones entrantes. Igual hace falta la regla de Security Policy.

F. Clientes internos que acceden al servidor por su IP pública (U-Turn NAT)

Cuando un cliente de inside usa la IP pública del servidor (porque el nombre DNS público resuelve a esa IP):

  1. Policies > NAT > Add: Source Zone inside, Destination Zone outside (la zona donde vive la IP pública), Destination Address Public Server IP.
  2. Translated Packet: Destination Address Translation Static IP con la IP privada del servidor.
  3. Security Policy: Source Zone inside, Destination Zone dmz, Destination Address Public Server IP.
  4. Si el cliente y el servidor están en la misma subred, añade Source Address Translation Dynamic IP And Port con la interfaz del servidor, para que la respuesta vuelva por el firewall.

Verificación

Comando o lugarQué debes verSi no lo ves
show running nat-policyLa regla con translate-to "dst: 10.15.0.100" (y el puerto si aplica)Falta commit o la regla no existe
test nat-policy-match from outside to outside source 14.9.32.87 destination 23.1.2.100 protocol 6 destination-port 443Tu regla de DNAT y la traducción del destinoSi no coincide, revisa zonas, IP y servicio
test security-policy-match from outside to dmz source 14.9.32.87 destination 23.1.2.100 protocol 6 destination-port 443 application sslLa regla Allow esperadaSi da interzone-default, la zona o IP de la regla están mal
show session all filter destination 23.1.2.100Sessions de entrada con el flujo hacia 10.15.0.100Si no hay, el tráfico no llegó al firewall o no coincidió
show session id <n>nat: yes, la regla y las direcciones original y traducidaSi falta la traducción, la regla de NAT no coincidió
Monitor > Logs > Traffic (columnas NAT Destination IP y NAT Destination Port)Destino traducido en cada sesiónSi faltan, no hubo NAT
Desde un cliente fuera: curl https://23.1.2.100Respuesta del servidorSi hay timeout, revisa la ruta de regreso y el gateway del servidor
En el servidor: captura (tcpdump -n port 443)Paquetes con IP de origen del cliente y destino la IP privadaSi no llegan, el problema está antes del servidor

Errores comunes

No llega nada al servidor

  • Causa: la regla de NAT no coincide (zona, IP o servicio), o falta la de Security Policy.
  • Revisa: test nat-policy-match y test security-policy-match con la IP pública original.
  • Solución: corrige los campos. En NAT, ambas zonas son outside; en Security, la destino es dmz.

La Security Policy usa la IP privada y no coincide

  • Causa: se puso la IP real del servidor como Destination Address.
  • Solución: la regla debe usar la IP pública original (pre-NAT).

La Security Policy usa outside como zona destino y no coincide

  • Causa: se puso la zona de la IP pública en vez de la zona real del servidor.
  • Solución: usa la zona del servidor (post-NAT), por ejemplo dmz.

El servidor recibe pero la respuesta no regresa

  • Causa: el servidor no tiene como default gateway al firewall, o la respuesta sale por otro camino (ruteo asimétrico).
  • Revisa: show session id <n>: si solo ves el flujo de ida, no volvió; y la configuración de red del servidor.
  • Solución: corrige el gateway del servidor o añade Source NAT para forzar el regreso por el firewall.

La IP pública no responde en absoluto

  • Causa: la IP no está en la subred de la interfaz de salida y el ISP no la enruta hacia ti.
  • Solución: usa una IP de la subred conectada o pide al ISP que la enrute.

El reenvío de puerto no funciona

  • Causa: la regla de NAT no tiene el Service del puerto original, no se puso Translated Port, o la Security Policy usa application-default con un puerto no estándar.
  • Solución: crea el service object con el puerto original, úsalo en NAT y en la Security Policy, y configura Translated Port.

Los clientes internos no llegan al servidor por la IP pública

  • Causa: falta una regla de NAT con inside como Source Zone (U-Turn NAT).
  • Solución: crea la regla según la sección F, y la regla de Security Policy inside → dmz.

Los clientes internos llegan pero las conexiones se cuelgan

  • Causa: cliente y servidor están en la misma subred y la respuesta no vuelve por el firewall.
  • Solución: añade Source Address Translation en la regla U-Turn.

Una regla de NAT anterior toma el tráfico

  • Causa: el orden de las reglas; una regla general está arriba de la de DNAT.
  • Solución: mueve la de DNAT arriba o hazla más específica.

Seguridad: el servidor quedó expuesto a todo Internet

  • Causa: Security Policy con any aplicación o sin perfiles.
  • Solución: permite solo las aplicaciones y puertos necesarios, con perfiles de seguridad y decryption según el caso (ver SSL Inbound Inspection).