LinuxParty
NAT significa Network Address Translation y es una técnica utilizada en redes para permitir que los dispositivos con direcciones IP privadas accedan a Internet. En el contexto de iptables, NAT se refiere a la funcionalidad de traducción de direcciones en el kernel de Linux que permite reemplazar la dirección IP de un paquete con una dirección diferente antes de su envío.
Hay tres tipos básicos de NAT en iptables:
- SNAT (Source NAT): Reemplaza la dirección IP fuente de un paquete antes de su envío hacia Internet. Se utiliza para permitir que dispositivos con direcciones IP privadas accedan a Internet con una dirección IP pública.
- DNAT (Destination NAT): Reemplaza la dirección IP de destino de un paquete antes de su envío hacia un dispositivo de destino dentro de la red privada. Se utiliza para permitir el acceso remoto a dispositivos dentro de la red privada.
- MASQUERADE: Es un tipo especial de SNAT que se utiliza cuando se quiere compartir la conexión a Internet desde una máquina con una dirección IP privada hacia varios dispositivos.
En resumen, NAT permite que dispositivos con direcciones IP privadas accedan a Internet o sean accesibles desde Internet, permitiendo así la conectividad entre redes privadas y públicas.
Iptables realiza dos funciones principalmente, filtrado de paquetes y traducción de direcciones de red, [n]etwork [a]ddress [t]ranslation; habitualmente los manuales de iptables tratan estas dos funciones de forma simultánea lo que resulta confuso para las personas que se introducen en el tema. En esta entrada explicaremos desde cero los rudimentos de NAT con iptables.
NAT
NAT son las siglas del inglés network address translation o traducción de direcciones de red y es un mecanismo que se usa ampliamente hoy en día, fundamentalmente porque permite compartir una dirección IP pública por muchos equipos y esto es imprescindible en muchas situaciones por la escasez de direcciones IPv4.
Existen diferentes tipos de NAT, dependiendo de si se cambia la dirección IP origen o la dirección IP destino del paquete que abre la conexión, incluso existe una extensión de NAT que permite modificar el puerto origen o destino.
Este tipo de NAT es en el que se cambia la dirección IP de origen, es la situación más utilizada cuando estamos utilizando una dirección IP privada en una red local y establecemos una conexión con un equipo de Internet. Un equipo de la red se encarga de cambiar la dirección IP privada origen por la dirección IP pública, para que el equipo de Internet pueda contestar. Los pasos que se seguirían serían algo como:
- Un equipo de una red local con una dirección IP privada (supongamos 192.168.3.14) quiere solicitar una página web (puerto 80/tcp) del equipo de Internet http://www.wordpress.com
- Realiza una consulta DNS y obtiene que el equipo que aloja dicha página tiene la dirección IP 76.74.254.126
- Consulta su tabla de encaminamiento y como no está en la misma red que el servidor web de wordpress, envía el paquete con la solicitud de la página al equipo que es su destino por defecto (puerta de enlace o gateway), que supongamos tiene la dirección 192.168.3.254.
- El gateway, que en este caso debe actuar como dispositivo de NAT, recibe el paquete y comprueba la dirección IP destino, como no es la suya, lo envía a su propio destino por defecto (gateway) que ya será una dirección IP pública.
- Antes de que el paquete salga por la interfaz de red externa, se le cambia la dirección IP origen (192.168.3.14) por la dirección IP pública (supongamos que fuese 80.58.1.14) y se guarda la petición en lo que se denomina tablas de NAT (anotando también el puerto origen, supongamos que fuese el 5015/tcp).
- El paquete viaja por Internet saltando de router a router hasta que llega a su destino
- El equipo 76.74.254.126 recibe una petición desde la dirección 80.58.1.14 y la contesta, por lo que el paquete de vuelta llevará ahora dirección IP origen 76.74.254.126, dirección IP destino 80.58.1.14, puerto origen 80/tcp y puerto destino 5015/tcp.
- La contestación del servidor web de wordpress.com llega a la interfaz externa del dispositivo de NAT, que consulta las tablas de NAT y comprueba (gracias al puerto origen) que corresponde con una petición realizada desde el equipo 192.168.3.14, por lo que modifica la dirección IP destino por ésta y se lo envía directamente.
IP MASQUERADING
Este tipo de NAT normalmente es sinónimo de SNAT, pero iptables distingue dos casos:
- SNAT: Cuando la dirección IP pública que sustituye a la IP origen es estática (SNAT también significa Static NAT).
- MASQUERADE: Cuando la dirección IP pública que sustituye a la IP origen es dinámica, caso bastante habitual en conexiones a Internet domésticas.
Destination NAT o port forwarding
Este tipo de NAT se utiliza cuando tenemos algún servidor en una máquina detrás del dispositivo de NAT. En este caso será un equipo externo el que inicie la conexión, ya que solicitará un determinado servicio y el dispositivo de NAT, en este caso, debe modificar la dirección IP destino. Veamos paso a paso cuál sería la situación.
- Un equipo cualquiera de Internet, con dirección IP pública 150.212.23.6 desea conectarse por ssh (22/tcp) al equipo estudio.mired.com
- Realiza una consulta DNS y obtiene como respuesta que estudio.mired.com tiene la dirección IP 85.136.14.7
- Establece la conexión (supongamos puerto origen 23014/tcp) con el equipo 85.136.14.7, que resulta ser un dispositivo de NAT que no tiene ningún servicio ssh escuchando en el puerto 22/tcp, pero que tiene una regla de DNAT para que todo lo que llegue a ese puerto se lo envíe a un equipo de su red local (supongamos que fuese el 10.0.0.2), por lo que cambia la dirección IP destino (85.136.14.7) por la 10.0.0.2 y lo registra en sus tablas de NAT.
- Al equipo 10.0.0.2 llega un solicitud al puerto 22/tcp y la respuesta tiene las siguientes características: IP origen 10.0.0.2, puerto origen 22/tcp, IP destino 150.212.23.6 y puerto destino 23014/tcp.
- El dispositivo de NAT cambia ahora la dirección IP origen por su dirección IP pública (85.136.14.7) y el paquete llega de vuelta a su destino.
PAT (Port Address translation)
Modifica específicamente el puerto (origen o destino) en lugar de la dirección IP. Por ejemplo si queremos reenviar todas las peticiones web que lleguen al puerto 80/tcp al mismo equipo pero al puerto 8080/tcp
Instalación de iptables
Instalamos el paquete iptables:
aptitude install iptables
En Fedora / CentOS, AlmaLinux y Rocky Linux
yum install iptables
Tablas y cadenas
Hay tres tablas definidas en iptables que son filter, nat y mangle, que se encargan de diferentes tipos de procesos, aquí sólo trataremos de la tabla nat, por lo que cada vez que escribamos una instrucción comenzaremos con iptables -t nat.
La tabla nat está formada por tres cadenas
PREROUTING: Permite modificar paquetes entrantes antes de que se tome una decisión de enrutamiento.
OUTPUT: Permite modificar paquetes generados por el propio equipo después de enrutarlos
POSTROUTING: Permite modificar paquetes justo antes de que salgan del equipo.
Para cadena se especifican reglas, para las que es fundamental el orden, ya que cuando un paquete encuentra una regla que lo define, aplica esa regla y no lee las siguientes.
Que nos muestra las tres cadenas de la tabla nat y que en este momento no hay ninguna regla aplicada.
Parámetros generales
Listar reglas
Utilizamos el parámetro -L (normalmente se acompaña de -n para que los resultados se muestren de forma numérica y evitar consultas DNS)
# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Que nos muestra las tres cadenas de la tabla nat y que en este momento no hay ninguna regla aplicada.
Verbose
Para una salida más completa de iptables utilizamos el parámetro -v:
# iptables -t nat -L PREROUTING -n -v
Chain PREROUTING (policy ACCEPT 21 packets, 4133 bytes)
pkts bytes target prot opt in out source destination
que nos informa de los paquetes y bytes que «atraviesan» una cadena y en caso de que hubiese reglas, se contarían los paquetes y bytes a los que se ha aplicado cada una.
Borrar contadores
Si queremos poner a cero los contadores de paquete que se aplican en las cadenas de una tabla:
iptables -t nat -Z
Borrar todas las reglas de una cadena
Para borrar todas las reglas de una cadena se escribe:
iptables -t nat -F OUTPUT
Se puede no especificar ninguna cadena, con lo que se borran todas las reglas de todas las cadenas de una tabla:
iptables -t nat -F
Antes de empezar a utilizar iptables, una norma elemental es escribir:
iptables -t nat -F
iptables -t nat -Z
Que borra todas las reglas anteriores y pone los contadores a cero.
Ejemplo
Supongamos que tenemos una situación como la de la imagen:
+-------+ |Disposi| +---->------o----->-----o------>--->| tivo |--> I N T E R N E T | | | | N.A.T.| +---+---+ +---+---+ +---+---+ | | |Equipo1| |Equipo2| |Equipo3| +-------+ | | | | | | | | | | | | | | | | | | +-------+ +-------+ +-------+ ^ ^ ^ | | | +------192.168.3.0/24---+
Activación del bit de forward
echo 1 > /proc/sys/net/ipv4/ip_forward
Esta activación se borra cuando se apaga el equipo, ya que el directorio /proc está en memoria. Para que dicha activación permanezca lo habitual es definirla en el fichero /etc/sysctl.conf, asegurándonos de que exista una línea como:
net.ipv4.ip_forward=1
POSTROUTING
Todos los equipos de la red 192.168.3.0/24 están interconectados entre sí, pero en principio no tienen acceso a Internet puesto que sus direcciones IP son privadas y por tanto no son accesibles desde Internet . El equipo que tiene dos interfeces de red sí tiene acceso a Internet ya que la interfaz de red eth0 tiene una dirección IP pública, además pertenece a la red 192.168.3.0/24 ya que está conectado a través de la interfaz de red eth1 con dirección IP 192.168.3.254.
El equipo con dos interfaces de red puede funcionar como dispositivo de NAT , aceptando paquetes provenientes del resto de equipos de la red 192.168.3.0/24 que entren por eth1 con destino a cualquier equipo de Internet.
-s 192.168.3.0/24: Se aplica a los paquetes que tengan como dirección origen la 192.168.3.0/24
-j SNAT --to 80.58.1.14 : Cambia la dirección de origen por la 80.58.1.14
Podríamos tener un caso similar al anterior, pero en el que la dirección IP pública del equipo que se conecta a Internet fuese dinámica, por lo que no la sabríamos a priori y no sería posible definirla en una regla como la anterior. En ese caso la regla de iptables a utilizar sería: iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
Donde el único cambio se refiere a la acción , en este caso es MASQUERADE, que cambia la dirección origen por la que tenga la interfaz de salida .
Si volvemos a nuestro problema, el único equipo de la red local que es accesible desde Internet es el dispositivo de NAT a través de su dirección IP pública 80.58.1.14, ya que sería el único con el que un equipo de Internet podría establecer un socket y por tanto sería el único equipo de la red que podría alojar servicios. Todo esto cambia si utilizamos NAT, ya que en el equipo que tiene las dos interfaces de red podemos cambiar la dirección IP destino de una petición que llegue de Internet y mandarla a un equipo de la red local.
-j DNAT --to 192.168.3.2 : Cambia la dirección IP destino a 192.168.3.2
Es lógico que haya que hacerlo en la cadena PREROUTING, porque las reglas de esta cadena se aplican antes de tomar la decisión de enrutamiento, así se tomará la decisión de encaminamiento con la nueva dirección IP destino.
Para otros servicios bastaría con poner el protocolo y puerto adecuados, aunque el caso del servicio ftp es más complicado y necesitaría una discusión mas detallada. La principal limitación de utilizar DNAT con una sola dirección pública es que no es posible poner más de un servicio en el mismo puerto, ya que sólo se puede hacer DNAT a un equipo de la red local.
Hay algunos servicios que permiten utilizar puertos diferentes a los estándar, como por ejemplo http, ya que podemos acceder a un servidor web que esté en un puerto diferente al 80/tcp, simplemente especificándolo en el navegador.
Basado en el artículo en Alberto Molina.
-
Internet
- La muerte lenta del hipervínculo
- Cómo cambiar dirección IP (modo gráfico), por qué querría hacerlo y cuándo no debería hacerlo
- 10 comandos "IP" útiles para configurar interfaces de red
- Cómo configurar conexiones IP de red usando 'nmcli' en Linux
- Configuración de una IP Estática en una Tarjeta de Red en Linux.
- ¿Migrar a la nube? Marque esta lista de verificación
- Nuevo estándar de Internet L4S: el plan silencioso para hacer que Internet se sienta más rápido
- Nextcloud y Roundcube se Fusionan para Impulsar la Descentralización en la Productividad en la Nube
- Los 10 mejores servidores proxy inversos de código abierto para Linux
- Una guía para principiantes para crear conexiones (Bonding) y puentes de red (Bridging) en Linux
- Conectar dos redes Locales alejadas creando de un Puente Transparente
- Crear un puente de red transparente "bridge" para conectar dos redes locales remotas
- Crear un Puente de Red o Bridge
- La propuesta de la ICANN / Verisign permitiría a cualquier gobierno confiscar nombres de dominio
- Listado errores HTTP, estados de respuesta del servidor