Iptables - Aplicando reglas para configurar el cortafuegos

Rafa Morales 16 Abril 2013
7min
0
Linux

A continuación vamos a describir los pasos necesarios para convertir un sistema Linux en un router con cortafuegos. Para conseguir este objetivo utilizaremos la herramienta Iptables, de la que tenéis una explicación muy detallada de su uso en el artículo Aprendiendo a utilizar Iptables. Aquí nos centraremos en conocer las reglas necesarias para llevar a cabo una configuración óptima del cortafuegos para los diversos casos que se nos pueden presentar en una red.

Nos basaremos en la red que se muestra en la figura, donde el router une dos redes internas (mediante las interfaces eth1 y eth2) y les da acceso a Internet (a través de la interfaz eth3). Entre otras cosas, se permitirá el tráfico sin restricciones entre las interfaces internas, se habilitará el NAT para el acceso a Internet y se abrirán puertos para permitir conexiones directas a servicios como el Escritorio Remoto de Windows y la VPN con PPTP.

Red ejemplo iptables

 

Activando el reenvío de paquetes

Comenzaremos habilitando el reenvío de paquetes entre las distintas interfaces de red del equipo. Editaremos el archivo "/etc/sysctl.conf" y descomentaremos la siguiente línea.

net.ipv4.ip_forward=1

Para que los cambios sean efectivos ejecutaremos:

sysctl -p

 

Aplicando las reglas automáticamente: Opción 1

Podemos configurar la tarjeta de red para que cuando antes o después de pasar a estado activo ejecute automáticamente el script que contiene las reglas de Iptables. Para ello editamos el archivo "/etc/network/interfaces" y a una de las tarjetas de red, por ejemplo la que de acceso a Internet, le añadimos la línea que está en negrita.

auto eth0 
iface eth0 
inet static 
  address 192.168.1.100 
  netmask 255.255.255.0 
  gateway 192.168.1.1 
  broadcast 192.168.1.255 
  pre-up /etc/iptables-rules

 

Continuamos creando el fichero "/etc/iptables-rules", al que debemos otorgarle permisos de ejecución.

chmod 700 /etc/iptables-rules

 

Aplicando las reglas automáticamente: Opción 2

Otra opción para hacer las reglas de iptables persistentes de una forma fácil, podría ser valernos del paquete iptables-persistent que guardará la configuración actual de Iptables y la volverá a cargar después de cada reinicio. Sería una alternativa a la solución ofrecida en el apartado anterior, donde guardamos las reglas en un fichero y las cargamos al iniciar la interfaz de red.

apt-get install iptables-persistent

En la instalación se nos preguntará si queremos salvar las actuales reglas relacionadas con IPv4 y las relacionadas con IPv6. Nos interesa decirle que sí a las reglas de IPv4.

Cada vez que realicemos un cambio en las reglas, debemos guardarlas manualmente, ejecutando el siguiente comando:

/etc/init.d/iptables-persistent save

 

Aplicando las reglas automáticamente: Opción 3

También podemos incluir el script /etc/iptables-rules que hemos creado anteriormente, al que debemos otorgar permisos de ejecución, dentro del script general /etc/rc.local, el cual se ejecuta al final de todos los runlevels.

chmod 700 /etc/iptables-rules

Editamos el script general:

nano /etc/rc.local

E incluimos la ejecución del fichero de reglas de Iptables:

/etc/iptables-rules

 

Fichero de reglas de Iptables

Recordamos que si no se especifica ninguna tabla en la regla, por defecto se aplican a la tabla filter.

#!/bin/bash

# Limpia las tablas de iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -F
iptables -t filter -X

# Deniega todo el tráfico por defecto
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Permite el tráfico loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permite el reenvío de tráfico entre las redes internas eth1 y eth2
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth2 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -i eth2 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A OUTPUT -o eth2 -j ACCEPT

# Permite la salida de tráfico hacia la red pública eth3
iptables -A INPUT -i eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth3 -j ACCEPT

# Permite el tráfico NAT en la interfaz pública eth3 con IP dinámica
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth3 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth3 -j MASQUERADE

# Permite el tráfico NAT en la interfaz pública eth3 con IP estática
#iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth3 -j SNAT --to 8.8.8.8
#iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth3 -j SNAT --to 8.8.8.8

# Permite el protocolo ICMP de entrada en la red externa
iptables -A INPUT -i eth3 -p icmp -j ACCEPT

# Permite la conexión al puerto 22 de cualquier equipo de la red externa
iptables -A INPUT -i eth3 -p tcp --dport 22 -j ACCEPT

# Permite la conexión al puerto 22 desde una determinada dirección MAC 
#iptables -A INPUT -i eth3 -p tcp --dport 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

# Permite la conexión al puerto 22 desde direcciones MAC almacenadas en un fichero
#for MAC in `cat fichero_direcciones_MAC`; do 
#  iptables -A INPUT -i eth3 -p tcp --dport 22 -m mac --mac-source $MAC -j ACCEPT
#done

# Deniega la conexión al puerto 22 a todos excepto una determinada dirección MAC
#iptables -A INPUT -i eth3 -p tcp --port 22 -m mac ! --mac-source 3E:D7:88:A6:66:8E -j REJECT

# Permite la redirección del puerto 3389 al 3389 de un equipo de la red interna
iptables -t nat -A PREROUTING -i eth3 -p tcp --dport 3389 -j DNAT --to 10.0.1.10:3389
iptables -A FORWARD -i eth3 -p tcp -d 10.0.1.10 --dport 3389 -j ACCEPT

# Permite la redirección del puerto 3390 al 3389 de un equipo de la red interna
iptables -t nat -A PREROUTING -i eth3 -p tcp --dport 3390 -j DNAT --to 10.0.2.10:3389
iptables -A FORWARD -i eth3 -p tcp -d 10.0.2.10 --dport 3389 -j ACCEPT

# Permite la conexión al puerto 1194
# para establecer una conexión con OpenVPN y SSL/TLS en el mismo equipo
# Permite el tráfico por la red tun0
iptables -A INPUT -i eth3 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT

# Permite la redirección de los puertos y protocolos 
# para establecer una conexión VPN con PPTP hacia un equipo Windows
iptables -t nat -A PREROUTING -i eth3 -p tcp --dport 1723 -j DNAT --to 10.0.1.10:1723
iptables -A FORWARD -i eth3 -p tcp -d 10.0.1.10 --dport 1723 -j ACCEPT
iptables -t nat -A PREROUTING -i eth3 -p gre -j DNAT --to 10.0.1.10
iptables -A FORWARD -i eth3 -p gre -d 10.0.1.10 -j ACCEPT

 

Listando las reglas de Iptables

Si queremos listar las reglas que tenemos actualmente aplicadas utilizaremos las siguientes opciones, donde -n hace que no se resuelvan las direcciones IP.

iptables -L
iptables -L -n
iptables -t nat -L -n

 

Limpiando las reglas de Iptables

Si queremos eliminar todas las reglas del iptables, crearemos el fichero /etc/iptables-clean, al que debemos otorgarle permisos de ejecución:

chmod 700 /etc/iptables-clean

 

#!/bin/bash

echo "Limpiando reglas Iptables y permitiendo todo el tráfico..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -F
iptables -t filter -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT