
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.
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
Enlaces transversales de Book para Iptables - Aplicando reglas para configurar el cortafuegos
Iptables - Aplicando reglas para configurar el cortafuegos escrito por Rafa Morales está protegido por una licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional