Cortafuegos de una LAN

Ahora que ya sabemos más o menos como funciona Iptables, vamos a ver cómo configurarlo en un PC que hace de firewall de una red local. Haremos un ejemplo bastante simple simplemente para ilustrar aquellas cosas que son comunes para el correcto funcionamiento de este tipo de firewalls. El filtrado que pondremos aquí es un ejemplo que debería modificarse y adaptar a las necesidades de cada uno. Si aún no estáis familiarizados con iptables, es recomendable leer antes el tutorial de introducción a iptables.

Situación inicial

Supondremos que tenemos el siguiente esquema:

red local <—> eth1 [PC Firewall] eth0 <—> Internet

Es decir, que tenemos un PC que hará de firewall de nuestra LAN, que está entre ésta y internet, y que se conecta a ella mediante eth1 y a internet mediante eth0.
Supondremos también que la red local tiene asignado el siguiente rango de ips privadas: 192.168.0.0/24
Supondremos también que el pc con IP 192.168.0.35 tiene corriendo un servidor web que escucha en el puerto 8080. Así que las peticiones que lleguen a nuestro firewal al puerto 80 (web) las redigiremos a ese pc y al puerto 8080.

Antes de empezar, hay que remarcar algo muy importante para el correcto funcionamiento del firewall: un paquete no puede salir a internet con una IP privada. En nuestro caso, los paquetes generados en la red local, tendrán como IP de origen una IP de la LAN, que es una ip privada que no puede circular por internet. Para evitar esto, tendremos que hacer NAT en el PC que hace de firewall para cambiar la ip de origen, y que el paquete pueda salir correctamente a internet.

Según este esquema, todos los paquetes de la red local que vayan a internet, se entregarán al PC firewall y este los reencaminará hacia internet (de aquí podemos deducir que estos paquetes los filtraremos en la cadena FORWARD del firewall).

Dicho esto veamos un ejemplo de firewall que cumpla estos requisitos, y luego explicaremos el por qué de cada cosa:

Cortafuegos para nuestra LAN

En este ejemplo configuraremos un firewall que permita la salida a internet de una red local, pero dejando sólo el acceso necesario para que puedan navegar. Por dejecto denegaremos el resto. Suponemos también que en la red local no tenemos ningún servidor que necesite acceso desde el exterior.

#!/bin/bash

echo "Generando reglas iptables..."

# Borramos las reglas de las cadenas y los contadores
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Establecemos las políticas por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

### Redirecciones ###
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.35:8080

### Filtrado de acceso al firewall ###

# Dejamos acceso al localhost
iptables -A INPUT -i lo -j ACCEPT

# Dejamos acceso al firewall desde la red local
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j ACCEPT

 
### Filtrado de conexiones salientes de la LAN ###

# Esta vez filtraremos desde la cadena FORWARD ya que los paquetes nos llegan
# pero no son para nosotros, son para ser reencaminados.

# Permitimos conexiones salientes al puerto 80 (web) y 443 (https)
iptables -A FORWARD -i eth1 -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -s 192.168.0.0/24 --dport 443 -j ACCEPT

# Aceptamos conexiones salientes a DNS (puerto 53 tcp y udp)
iptables -A FORWARD -i eth1 -p tcp -s 192.168.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT

# Denegamos el resto de conexiones salientes
# (No necesitamos filtrar las entrantes en FORWARD ya que sólo serán
# las que hayamos permitido explícitamente en PREROUTING)
iptables -A FORWARD -i eth1 -p tcp -s 192.168.0.0/24 -j DROP

 
### Enmascaramiento de la red local ###

# Enmascaramos la red local (para hacer NAT)
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

# Activamos forwarding (para permitir reencaminar paquetes)
echo 1 >/proc/sys/net/ipv4/ip_forward

Con esto podríamos dar por terminado un sencillo script para configurar el cortafuegos de una LAN.

Explicación del script

Esta vez hemos optado por un cortafuegos con la política por defecto de INPUT a DROP y la política por defecto de FORWARD a ACCEPT. Como ya sabemos, la cadena INPUT se encarga de los paquetes que son para nosotros, y la cadena FORWARD se encarga de los paquetes que nos llegan, pero que no son para nosotros, que hemos de reencaminar (en nuestro ejemplo, paquetes para la LAN).

Lo primero que hacemos es borrar las reglas que pudiera haber. Vemos que hemos considerado también la tabla de nat, ya que ahora usaremos 2 cadenas (PREROUTING y POSTROUTING) para hacer redirecciones y enmascarar la red local que pertenecen a dicha tabla.

Luego establecemos las políticas por defecto. Hemos puesto INPUT a DROP, porque por defecto queremos denegar aquellos paquetes cuyo destino es el propio firewall. Si queremos permitir alguno, lo haremos explícitamente. Hemos puesto la política de FORWARD a ACCEPT ya que no será necesario filtrar el tráfico que llega a FORWARD desde el exterior, ya que sólo será aquel que haya podido pasar por PREROUTING; así, filtramos sólo el tráfico saliente que queramos dejar salir, y denegamos el reto de tráfico de salida.

Una vez tenemos la políticas, lo primero que ponemos son las redirecciones, es decir, las conexiones que permitimos desde el exterior a la red local. En este caso redirigiremos al pc en cuestión las peticiones que van al puerto 80 (servidor web).
Luego filtraremos el acceso al propio firewall permitiendo explícitamente las conexiones que creamos oportunas.
Una vez hecho esto, filtraremos en la cadena FORWARD aquellas conexiones que queramos permitir desde la LAN. Por el momento sólo dejaremos peticiones web y dns, para que sólo se pueda navegar. Si se necesitara algo más, podríamos añadir una regla en este apartado. Luego denegaremos le resto.

Teniendo todo esto configurado sólo nos queda enmascarar la red local y habilitar el forwarding. Como los paquetes que salen de una LAN tienen una ip privada que no puede usarse en internet, necesitamos algún mecanismo que nos la cambie por una dirección válida. Esto lo hacemos con MASQUERADE.
Por último habilitaremos el forwarding, ya que por defecto el kernel de linux no acepta paquetes que no vayan hacia nosotros.

Pautas generales para el cortafuegos de una LAN

Habiendo entendido el script vamos a resumir los pasos que deberían seguirse a la hora de configurar un cortafuegos para una LAN como esta. Evidentemente, cualquier variación para adaptarlo a las necesidades de cada uno es perfectamente válida.

  1. Borrar las reglas y las cadenas que pudieran existir, para crear nuestro cortafuegos desde cero de una forma limpia.
  2. Establecer las políticas por defecto para cada tabla. Aquí las decisiones pueden ser diferentes, pero tendremos que tenerlo en cuenta al diseñar las reglas del cortafuegos.
  3. Configurar la redirecciones. Aquí configuraremos las conexiones que permitiremos hacia nuestra red local.
  4. Filtrar las conexiones hacia el propio cortafuegos.
  5. Filtrar las conexiones de la LAN hacia el exterior.
  6. Enmascarar la red local y habilitar el forwarding.

Con esto podemos configurar de una forma muy flexible un cortafuegos para una LAN. Puede que parezca que sea muy complicado o que puedan necesitarse muchas reglas, pero si se mira cada «bloque» por separado no es complicado de comprender.

Ultimas palabras

Son muchas las variaciones que pueden hacerse dependiendo de las necesidades; por ejemplo, cambiar las políticas por defecto a ACCEPT para no ser tan restrictivo y filtrar lo que no deseamos en vez de permitir explícitamente sólo lo que queremos. Pero hay que tener cuidado en ser coherente copn las políticas por defecto a la hora de escribir las reglas de filtrado.

Otra cosa importante es el orden de las reglas. El orden que hemos dado aquí en las pautas generales es bastante adecuado y proporciona un esquema bastante bueno sobre el que se puede trabajar a la hora de crear y personalizar el cortafuegos.

Tutorial elaborado por Nacx para ADSLAyuda.com

Este sitio web utiliza cookies para mejorar su experiencia. Asumiremos que estás de acuerdo, pero puedes optar por no seguir si lo deseas. Aceptar Leer más