De forma sencilla podemos decir que NAT (*Network Address Translation) nos permite traducir las direcciones de origen o destino de los paquetes IP. Existen varias razones para esto, como el ahorro de direcciones IP u ocultar redes completas. NAT es un ejemplo de una tecnología bien diseñada. Gracias a ella hemos conseguido retrasar la implementación de IPv6 durante años.

Vemos algunos conceptos básicos:

  • Inside Local IP. Es cómo se ve la dirección interna desde el punto de vista de los hosts internos. Viéndolo desde la LAN, es la dirección IP real del host.
  • Inside Global IP. Es cómo se ve la dirección interna desde el punto de vista de los hosts externos. Viéndolo desde la red externa, es la dirección traducida del host en la LAN.
  • Outside Local IP. Es cómo se ve la dirección externa desde el punto de vista de los hosts en la LAN. Viéndolo desde la LAN es la dirección traducida del host externo.
  • Outside GLobal IP. Es cómo se ve la dirección externa desde el punto de vista de los hosts externos. Viéndolo desde la LAN es la dirección real del host externo.

La traducción interna se realiza comúmente en las redes actuales. En caso que tuviéramos 7000 hosts en nuestra LAN y quisiéramos que todos ellos pudieran acceder a Internet, deberíamos tener una dirección IP pública por cada uno de ellos. Esto es extremadamente caro, e incluso si tuviésemos ese presupuesto, pudiera ser que nuestro ISP no pudiera proveérnoslas.

La solución es NAT. Podemos traducir todas las direcciones de nuestra LAN a una única dirección IP pública usando la sobrecarga. La primera pregunta que viene a la mente es cómo distingue el router los paquetes que vuelven de Internet. NAT de manera adicional, traduce el puerto de origen en la cabecera de la capa 4 (TCP/IP). Inicialmente reescribe los paquetes cambiando la dirección IP de origen. Si otro host inicia una conexión utilizando el mismo puerto, el router genera otra traducción utilizando el siguiente libre.

Basándose en este sencillo mecanismo, el router es capaz de crear 64511 (65535-1024) sesiones únicas a una sóla direccion IP pública. Recordemos que semejante nivel de traducciones no se recomienda. El máximo recomendado por cada IP es alrededor de 400.

Otro ejemplo de traducción NAT es 1:1. Ésta permite ocultar direcciones reales (normalmente dentro del RFC1918) con una dirección pública.

Topología

NAT y PAT

Sobrecarga de NAT

Ésta es una configuración típica:

Para FastEthernet0/0, necesitamos definir que será la interfaz interna, mediante el comando ip nat inside.

R1# show running-config | section FastEthernet0/0
interface FastEthernet0/0
  ip address 192.168.1.1 255.255.255.0
  ip nat inside
  ip virtual-reassembly
  duplex auto
  speed auto
R1#

Para FastEthernet0/1, diremos que es la interfaz externa con ip nat outside.

R1# show running-config | section FastEthernet0/1
  interface FastEthernet0/1  ip address 10.0.0.1 255.255.255.0
  ip nat outside
  ip virtual-reassembly
  duplex auto
  speed auto
R1#

También necesitamos una lista de acceso para indicar el tráfico que se traducirá.

R1# show ip access-list
Extended IP access list lannat 
10 permit ip 192.168.1.0 0.0.0.255 any (1 match)
R1#

Y por último necesitamos indicar la regla de traducción. En este caso diremos que todo el tráfico que encaje con la ACL lannat, será sobrecargado contra la dirección IP de la interfaz FastEthernet0/1.

R1# show running-config | include overload
  ip nat inside source list lannat interface FastEthernet0/1 overload
R1#

Ahora podemos ver que lo primero que sucede en el router es la creación de una interfa virtual NVI0 (NAT Virtual Interface). Ésta realmente nos ahorra la tarea de definir las interfaces externas e internas, mediante el comando ip nat enable. Saltémonos esto ahora.

R1# show ip interface brief | exclude unassigned
Interface         IP-Address  OK?  Method     Status  Protocol
FastEthernet0/0   192.168.1.1 YES  manual     up      up
FastEthernet0/1   10.0.0.1    YES  manual     up      up
NVI0              192.168.1.1 YES  unset      up      up
R1#

La siguiente es la tabla de traducciones que se genera en la memoria del router cuando se comienza a producit tráfico en la red:

R1# show ip nat translations
Pro Inside global Inside local     Outside local Outside global
icmp 10.0.0.1:512 192.168.1.10:512  10.0.0.100:512 10.0.0.100:512
tcp 10.0.0.1:1182 192.168.1.10:1182 10.0.0.100:80  10.0.0.100:80
tcp 10.0.0.1:1183 192.168.1.10:1183 10.0.0.100:80  10.0.0.100:80
R1#

Como vemos, las entradass se crean siguiendo las directrices indicadas por los comandos anteriores. Fijémonos en las 2 últimas. La primera se generó para una conexión desde un PC a un servidor en el puerto 80. La siguiente es exactamente igual con la diferencia que el router ya tenía una trducción como esa, con lo que reescribió el puerto de origen con el siguiente libre. De esta forma, el router podrá devolver el tráfico al host correcto. Si no se hiciese, no habría manera de saber a dónde mandar el tráfio de vuelta.

NAT estático

Partiendo de la misma topología, ahora configuraremos NAT 1:1 de forma que mapearemos la dirección interna con una dirección pública. De esta forma sólo este host tendrá acceso a la red externa. Desde el punto de vista de los hosts en la red externa, ese host es el que tiene esa dirección.

R1# show running-config | include static
ip nat inside source static 192.168.1.10 interface FastEthernet0/1
R1#

Ahora la tabla de traducciones cambia un poco:

R1# show ip nat translations
Pro Inside global  Inside local         Outside local   Outside global
tcp 10.0.0.1:1113  192.168.1.10:11133   10.0.0.100:3389 10:0.0.100:3389
tcp 10.0.0.1:3389  192.168.1.10:3389    10.0.0.100:1437 10.0.0.100:1437
--- 10.0.0.1       192.168.1.10         
---
---
R1#

Tenemos una entrada, la última, que es permanente y la que indica que hacemos NAT 1:1. Así 192.168.1.10 se traduce con la dirección de la interfaz FastEthernet0/1.

NAT Dinámico

En este tipo, el router tiene un conjunto de direcciones que se utilizarán para traducir las direcciones locales. Cada conexión utilizaŕa una de las direcciones en el pool de forma secuencial. Así podemos traducir una red interna completa de forma que su direccionamiento desde fuera sea diferente.

De nuevo una configuración un poco diferente. Primero elegimos qué hosts serán traducidos. Usamos una ACL como siempre:

R2# sh ip access-l
Extended IP access list 101
10 permit ip 192.168.1.0 0.0.0.255 any (3 matches)
R2#

A continuación preparamos el pool. Esas serán las direcciones IP públicas usadas en la traducción:

R2# sh run | s nat pool
ip nat pool test 10.0.0.150 10.0.0.155 netmask 255.255.255.0
R2#

Y la regla de traducción:

R2# sh run | s inside source
ip nat inside source list 101 pool test
R2#

Como vemos, las direcciones se asignan secuencialmente:

R2# sh ip nat tra
Pro Inside global   Inside local       Outside local      Outside global
--- 10.0.0.151      192.168.1.1        
---                
---tcp 10.0.0.150:1086  192.168.1.10:1086  10.0.0.100:80      10.0.0.100:80
--- 10.0.0.150          192.168.1.10       
---                
---tcp 10.0.0.152:1112  192.168.1.11:1112  10.0.0.100:80      10.0.0.100:80
--- 10.0.0.152          192.168.1.11       
---                
---tcp 10.0.0.153:1129  192.168.1.12:1129  10.0.0.100:80      10.0.0.100:80
--- 10.0.0.153          192.168.1.12       
---                
---
R2#

PAT

Por último veremos como generar traducción de puertos, por ejemplo, en lugar de traducir una dirección completa, sólo haremos traducción para puertos TCP o UDP determinados. Podríamos decir que son los well_known, aunque siempre que el servicio esté a la escucha en el destino.

El uso más tradicional es proveer o publicar un servicio, que se ejecuta en la red local, y se expone en Internet. Por ejemplo, si tenemos un servidor web, necesitamos hacer PAT del puerto 80/TCP de esa máquina con nuestra dirección IP pública.

En este caso sólo necesitamos 1 regla de PAT. Publicaremos el puerto 3389/TCP, que es el tradicional para RDP (Remote Desktop Protocol).

R2# sh run | s static tcp
ip nat inside source static tcp 192.168.1.10 3389 10.0.0.10 3389 extendable
R2#

Tabla de traducción:

R2# sh ip nat tra
Pro Inside global   Inside local            Outside local         Outside global
tcp 10.0.0.10:3389  192.168.1.10:3389       10.0.0.100:1043       10.0.0.100:1043
tcp 10.0.0.10:3389  192.168.1.10:3389
---
---
R2#

Conclusión

Hemos visto algunas de las configuraciones NAT de lo más sencillas. Desde aquí sólo necesitamos estudiar las necesidades de la red y alcanzaremos configuraciones más complejas, con varios pools de direcciones internas y externas, exenciones, servicios avanzados, direcciones de respaldo, route-maps, traducciones policy-based y demás. Además de que puede y de hecho resuelve algunos problemas de enrutamiento como el solapamiento de direcciones…