Cortafuegos en Linux con iptables (segunda parte)

Esta segunda entrada sobre cortafuegos en Linux con iptables nos vamos a centrar en la parte del NAT. Si queréis, antes de continuar, podéis consultar la primera parte, donde os explico que es iptables, en qué consiste y su uso básico, con algunos ejemplos. Pero antes de nada, aclaremos algunos conceptos.

¿Qué es un 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. Hay que tener en cuenta que las direccones privadas, de las redes locales, no se pueden enrutar por Internet. 

Para solventar 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 guardar en memoria el puerto emisor empleado. Cuando llega el paquete de respuesta el router se encarga de cazar el puerto utilizado en la emisión, para así averiguar fácilmente a que dirección privada debe enviarlo.

NAT con iptables

NAT gestiona una tabla específica llamada con el mismo nombre. Esta tabla trabaja con las cadenas: PREROUTING, POSTROUTING y OUPUT, que representan el tráfico que hay que modificar antes del enrutamiento, después del enrutamiento o directamente en la salida.

Podemos visualizar la información de NAT de la siguiente manera:

sudo iptables -t nat -L
sudo iptables -t nat -S
Conectar una red privada a una red pública

El caso de conectar una red privada a una red pública suele ser el más habitual. La dirección IP del emisor en la red privada se reemplazará por la dirección pública del router NAT.

Su formato es el siguiente:

sudo iptables -t nat -A POSROUTING -o tarjeta_externa -j acción_de_nat

Veamos con más detalles:

  • -t nat : La regla afecta a la tabla NAT
  • -A POSTROUTING : Se añade una regla a la cadena POSTROUTING, para el procesado después del enrutamiento
  • -o tarjeta_externa : Identifica la tarjeta de red por la cual salen los paquetes del cortafuegos
  • -j acción_de_nat : Identifica el modo de acción de NAT, soporta dos opciones, SNAT si la dirección pública es fija y MASQUERADA si la dirección pública es dinámica

Veamos un ejemplo:

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

En el ejemplo eth2 es la interfaz conectada a la red pública.

Ejemplo de guión de iptables

Como guinda al pastel veamos un ejemplo de un guión o script para levantar un cortafuegos:

#!/bin/bash
# Nombre del fichero: levantar_cortafuegos.sh
# Empezamos por lo básico
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
# NAT con eth1 como red interna y eth2 como externa, con una IP estática pública
sudo iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to--source 84.120.55.89
# Gestionamos los paquetes devueltos
sudo iptables -A FORWARND -i eth2 -o eth1 -m state ESTABLISHED,RELATED -j ACCEPT
# Tráfico saliente que autorizamos
sudo iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 443 -j ACCEPT

Una vez hecho esto solo hemos de guardar el fichero y asignarle permisos de fichero ejecutable:

sudo chmod +x levantar_cortafuegos.sh

Si por alguna razón queremos borrar todas las reglas:

sudo iptables -F #Hacemos un flush de las reglas

Y esto es todo, espero que esta entrada os sea de utilidad en algún momento.

Fuentes consultadas

Página de man de iptables

Página de wikipedia de NAT