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 NAT | Regla de Security Policy | |
|---|---|---|
| Zona de origen | La del cliente (outside) | La del cliente (outside) |
| Zona de destino | Pre-NAT: la zona donde está la IP pública (outside) | Post-NAT: la zona real del servidor (dmz) |
| IP de destino | La IP pública original | La IP pública original (pre-NAT) |
| Puerto de destino | El 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.
- Objects > Addresses > Add:
Public Server IP=23.1.2.100/32, con Tagoutside. AñadeSrvr Private IP=10.15.0.100/32. - Policies > NAT > Add > Name
DNAT to DMZ Server. - Original Packet: Source Zone
outside, Destination Zoneoutside, Destination Interfaceany(o la interfaz de salida), Serviceany, Source Addressany, Destination AddressPublic Server IP. - Translated Packet > Destination Address Translation: Translation Type
Static IP, Translated Address10.15.0.100. Deja Source Address Translation enNone. - OK.
- Policies > Security > Add > Name
Allow Outside to DMZ. - Source Zone
outside, Source Addressany. Destination Zonedmz, Destination AddressPublic Server IP. - Application: las que necesites (por ejemplo
ssl,ping,ssh). Serviceapplication-default. ActionAllow, perfiles de seguridad aplicados. - 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.
- Objects > Services > Add > Name
TCP-4443, ProtocolTCP, Destination Port4443. - Policies > NAT > Add > Name
Forward 4443 to DMZ 443. - Original Packet: Source Zone
outside, Destination Zoneoutside, Destination AddressPublic Server IP, ServiceTCP-4443. - Translated Packet > Destination Address Translation: Translation Type
Static IP, Translated Address10.15.0.100, Translated Port443. - Security Policy:
outside→dmz, Destination AddressPublic Server IP, Applicationssl, y como Service elTCP-4443(el puerto que cuenta es el original, no el traducido). Para confirmarlo en tu versión usatest security-policy-matchcondestination-port 4443. - 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.
- Policies > NAT > Add: Source Zone
outside, Destination Zoneoutside, Destination Address23.1.2.53; Translated Packet: Destination Address TranslationStatic IP, Translated Address10.30.0.100. - Security Policy:
outside→dmz, Destination Address23.1.2.53, Applicationdns-base(ypingsi lo necesitas). - Si los clientes internos consultan por nombre y ese nombre resuelve a la IP pública, activa Enable DNS Rewrite en la regla (Direction
reverseoforward): 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)
- Crea un objeto de dirección tipo
FQDN(por ejemploServer DNS) que resuelva a las IPs de los servidores. - Crea el objeto de la IP pública (por ejemplo
LB-Global=23.1.2.55, tipoIP Netmask). - Policies > NAT > Add > Name
Dynamic DNAT: Source Zoneoutside, Destination Zoneoutside, Destination AddressLB-Global. - Translated Packet > Destination Address Translation: Translation Type
Dynamic IP (with session distribution), Translated AddressServer DNS, y el método de reparto:Round Robin,Source IP Hash,IP Modulo,IP HashoLeast Sessions. - Security Policy:
outside→dmz, Destination AddressLB-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):
- Policies > NAT > Add: Source Zone
inside, Destination Zoneoutside(la zona donde vive la IP pública), Destination AddressPublic Server IP. - Translated Packet: Destination Address Translation
Static IPcon la IP privada del servidor. - Security Policy: Source Zone
inside, Destination Zonedmz, Destination AddressPublic Server IP. - Si el cliente y el servidor están en la misma subred, añade Source Address Translation
Dynamic IP And Portcon la interfaz del servidor, para que la respuesta vuelva por el firewall.
Verificación
| Comando o lugar | Qué debes ver | Si no lo ves |
|---|---|---|
show running nat-policy | La 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 443 | Tu regla de DNAT y la traducción del destino | Si 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 ssl | La regla Allow esperada | Si da interzone-default, la zona o IP de la regla están mal |
show session all filter destination 23.1.2.100 | Sessions de entrada con el flujo hacia 10.15.0.100 | Si 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 traducida | Si 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ón | Si faltan, no hubo NAT |
Desde un cliente fuera: curl https://23.1.2.100 | Respuesta del servidor | Si 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 privada | Si 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-matchytest security-policy-matchcon la IP pública original. - Solución: corrige los campos. En NAT, ambas zonas son
outside; en Security, la destino esdmz.
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-defaultcon 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
insidecomo 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
anyaplicació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).