Configuración de NAT con iptables en Linux

El manejo de la tabla NAT de iptables es relativamente fácil. En este artículo, aprenderás qué es iptables, cómo funciona y cómo puedes usarlo para proteger tu sistema. Iptables es una herramienta esencial para cualquier administrador de sistemas Linux, ya que permite gestionar el tráfico de red mediante la creación de reglas de firewall personalizadas. Ya sea que desees permitir, bloquear o redirigir el tráfico a través de tu red, iptables ofrece un control detallado y poderoso.

¿Qué es iptables?

Iptables es una utilidad de línea de comandos que permite definir reglas para filtrar el tráfico de red en sistemas operativos Linux. Estas reglas se aplican a diferentes tablas, cada una con un propósito específico, permitiendo un control detallado del tráfico entrante y saliente. Iptables es una parte del kernel de Linux, está integrado en él. Iptables utiliza las tablas de enrutamiento. Estas tablas es la forma en la que iptables se organiza para funcionar. Las tablas FILTER y NAT son las tablas más importantes para los administradores. FILTER es «el filtro» y NAT «network address translation» (traducción de direcciones de red).

Algunas de las características principales de iptables son:

  • Control del tráfico entrante y saliente.
  • Redirección y NAT (Network Address Translation).
  • Gestión de diferentes tipos de tráfico (TCP, UDP, ICMP).
  • Bloqueo de IPs o rangos de IPs específicos.

Diagrama de flujo de paquetes en iptables

La Tabla NAT

NAT (traducción de direcciones de red) se encarga de realizar una reescritura de las cabeceras IP de los paquetes que viajan entre la red pública a un red privada y viceversa. NAT permite salir de una red privada reemplazando la dirección IP privada del emisor por la dirección IP pública del router. El reemplazo de las direcciones privadas se realiza gracias al puerto emisor utilizado, ya que por cada conexión el router guarda en memoria el puerto emisor empleado. NAT gestiona una tabla específica llamada con el mismo nombre. Las tablas NAT (Network Address Translation), es decir, traducción de direcciones de red, serán consultadas cuando un paquete cree una nueva conexión. Permiten compartir una IP pública entre muchos equipos, por lo que resultan imprescindibles en el protocolo 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.

  • Source NAT (SNAT): 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 (RFC 1918) en una red local y establecemos una conexión con un equipo de Internet. Un equipo de la red (normalmente la puerta de enlace) 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.
  • Destination NAT (DNAT): 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.
  • Port Forwarding: Modifica específicamente el puerto (origen o destino) en lugar de la dirección IP.

NAT puede tomar tres acciones, las cuales dependen directamente de las cadenas que se usen, ya que algunas solo pueden ser usadas con ciertas cadenas.

Cadenas Principales en NAT

Las cadenas PREROUTING y POSTROUTING son fundamentales en la tabla NAT:

  • PREROUTING: Trata los paquetes entrantes. Se utiliza para modificar la dirección IP de destino de los paquetes antes de que el sistema decida a dónde deben ser enrutados.
  • POSTROUTING: Se utiliza para modificar la dirección IP de origen de los paquetes justo antes de que salgan del sistema. Es comúnmente usada para el enmascaramiento o SNAT.

Habilitar el Reenvío de Paquetes IPv4

Para que un sistema Linux actúe como gateway y proporcione acceso a Internet a múltiples anfitriones en una red local, es necesario habilitar el reenvío de paquetes IPv4. Para hacer que esta configuración sea persistente y se mantenga activa después de reiniciar, necesitamos editar el archivo de configuración del sistema.

Abre el archivo `/etc/sysctl.conf` con un editor de texto (usando nano o tu editor preferido):

sudo nano /etc/sysctl.conf

Busca la siguiente línea (debería estar comentada con un #):

#net.ipv4.ip_forward=1

Descomenta esta línea eliminando el # al inicio:

net.ipv4.ip_forward=1

Guarda el archivo y cierra el editor (en nano, guarda presionando Ctrl + O y luego sal con Ctrl + X).

Para aplicar los cambios sin reiniciar el sistema, ejecuta el siguiente comando:

sudo sysctl -p

Esta activación se borra cuando se apaga el equipo, ya que el directorio `/proc` está en memoria.

Configuración de NAT con iptables

A continuación, se presenta un ejemplo práctico de cómo configurar una Network-Address-Translation (NAT) en un sistema Linux con reglas iptables, de modo que el sistema pueda actuar como gateway y proporcionar acceso a Internet a múltiples anfitriones en una red local, usando solo una dirección IP pública.

Supongamos que tenemos un equipo con dos interfaces de red: `eth0` conectado a Internet con una IP pública (dinámica o estática) y `eth1` conectado a una red local con una IP privada (por ejemplo, `192.168.1.1`). Los equipos de la red `192.168.1.0/24` están interconectados entre sí, pero no tienen acceso a Internet puesto que sus direcciones IP son privadas y por tanto no son accesibles desde Internet.

El equipo con dos interfaces de red puede funcionar como dispositivo de NAT (source NAT), aceptando paquetes provenientes del resto de equipos de la red `192.168.1.0/24` que entren por `eth1` con destino a cualquier equipo de Internet.

Diagrama de red con NAT

Enmascaramiento (MASQUERADE)

Si la dirección IP pública del equipo que se conecta a Internet es dinámica, no la sabríamos a priori y no sería posible definirla en una regla SNAT. En este caso, se recurre al enmascaramiento. Iptables puede dar un «tratamiento» al paquete en cuestión para hacerlo pasar por un paquete propio de su rango. Esto se hace con las reglas de POSTROUTING, dándole un tratamiento a un paquete justo antes de enviarlo hacia afuera.

La sintaxis básica para el enmascaramiento en la tabla NAT y la cadena POSTROUTING es:

sudo iptables -t nat -A POSTROUTING -o -j MASQUERADE

Por ejemplo, si `eth0` es la interfaz conectada a Internet:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Con MASQUERADE tendríamos el mismo resultado que con SNAT, pero es más flexible para IPs dinámicas. En este caso, iptables calcula automáticamente la IP de la tarjeta de salida.

Redirección de Puertos (DNAT)

Si queremos que un servicio instalado en un equipo de la red privada sea accesible desde Internet, podemos usar DNAT. Por ejemplo, si tenemos un servidor web en la red local con IP `192.168.1.5` que ofrece un servicio en el puerto `880`, y queremos que sea accesible desde Internet a través del puerto `4444` de la IP pública de nuestro gateway.

La sintaxis básica para la redirección de puertos en la tabla NAT y la cadena PREROUTING es:

sudo iptables -t nat -A PREROUTING -p tcp --dport -j DNAT --to-destination :

En nuestro ejemplo:

sudo iptables -t nat -A PREROUTING -p tcp --dport 4444 -j DNAT --to-destination 192.168.1.5:880

De esta manera, cuando un equipo externo acceda a `IP_PUBLICA:4444`, el tráfico será redirigido a `192.168.1.5:880`.

Tabla de NAT con ejemplos de SNAT y DNAT

Ejemplo de Configuración de Red

Consideremos un escenario con tres interfaces de red en una máquina Linux:

  • `ens192`: Red interna (clientes) con IP `10.10.10.10` (Subred `10.10.10.0/24`).
  • `ens224`: Red de aplicaciones web (servidor web) con IP `172.16.10.10` (Subred `172.16.10.0/24`).
  • `ens160`: Red externa (Internet) con IP `192.168.0.26` (Subred `192.168.0.0/24`).

Los equipos de la red `10.10.10.0/24` están interconectados entre sí, pero no tienen acceso a Internet. Queremos que tengan acceso a Internet a través de `ens160` y también acceso al servidor web en `172.16.10.0/24`.

1. Habilitar Reenvío de Paquetes

Ya hemos visto cómo hacerlo en la sección anterior (`net.ipv4.ip_forward=1`).

2. Configurar Enrutamiento

Es necesario configurar las rutas en los dispositivos de cada red para que sepan cómo llegar a las otras redes a través de la máquina Linux.

  • Red `10.10.10.0/24`: Configurar una ruta predeterminada en los dispositivos de esta red para que apunte a la IP de la interfaz `ens192` de la máquina Linux (`10.10.10.10`).
  • Red `172.16.10.0/24`: Configurar una ruta predeterminada para que apunte a la IP de la interfaz `ens224` de la máquina Linux (`172.16.10.10`).
  • Red `192.168.0.0/24`: Configurar una ruta predeterminada en los dispositivos de esta red para que apunte a la IP de la interfaz `ens160` de la máquina Linux (`192.168.0.26`).

En la máquina Linux, para que el tráfico hacia las redes `10.10.10.0` y `172.16.10.0` pase por la IP `192.168.0.26` de nuestra interfaz `ens160`:

sudo ip route add default via 10.10.10.10

sudo ip route add default via 172.16.10.10

En Windows (ejemplo):

route add 10.10.10.0 mask 255.255.255.0 192.168.0.26

route add 172.16.10.0 mask 255.255.255.0 192.168.0.26

Prueba de PING entre redes configuradas

3. Aplicar Reglas en el Firewall (iptables)

Permitir acceso a Internet y tráfico WEB desde la red interna (`ens192`):

sudo iptables -A FORWARD -i ens192 -o ens160 -p tcp --dport 80 -j ACCEPT

sudo iptables -A FORWARD -i ens192 -o ens160 -p tcp --dport 443 -j ACCEPT

sudo iptables -A FORWARD -i ens160 -o ens192 -m state --state ESTABLISHED,RELATED -j ACCEPT

Permitir acceso al servidor Web (`ens224`) desde la red interna (`ens192`):

sudo iptables -A FORWARD -i ens192 -o ens224 -p tcp --dport 80 -j ACCEPT

sudo iptables -A FORWARD -i ens192 -o ens224 -p tcp --dport 443 -j ACCEPT

sudo iptables -A FORWARD -i ens224 -o ens192 -m state --state ESTABLISHED,RELATED -j ACCEPT

Permitir FTP desde la red interna (`ens192`) al servidor web (`ens224`) y denegar desde la externa (`ens160`):

sudo iptables -A FORWARD -i ens192 -o ens224 -p tcp --dport 21 -j ACCEPT

sudo iptables -A FORWARD -i ens160 -o ens224 -p tcp --dport 21 -j DROP

sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Permitir SSH desde la red interna (`ens192`) al servidor web (`ens224`):

sudo iptables -A FORWARD -i ens192 -o ens224 -p tcp --dport 22 -j ACCEPT

sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Aplicar NAT para permitir la salida a Internet desde la red interna:

sudo iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE

Configuración de reglas de firewall para acceso a servicios

NAT Redirección De Puertos en Ubuntu 16.04

tags: #anadir #table #nat #iptables