El cortafuegos utilizado para gestionar las conexiones en Linux es iptables. Las posibilidades de iptables son prácticamente infinitas y un administrador que quiera sacarle el máximo provecho, puede realizar configuraciones extremadamente complejas. Para simplificar, diremos que básicamente, iptables permite crear reglas que analizarán los paquetes de datos que entran, salen o pasan por nuestra máquina, y en función de las condiciones que establezcamos, tomaremos una decisión que normalmente será permitir o denegar que dicho paquete siga su curso.




El cortafuegos controla las comunicaciones entre la red y el exterior

Para crear las reglas, podemos analizar muchos aspectos de los paquetes de datos. Podemos filtrar paquetes en función de:

Tipo de paquete de datos:

  • Tipo INPUT: paquetes que llegan a nuestra máquina
  • Tipo OUTPUT: paquetes que salen de nuestra máquina
  • Tipo FORWARD: paquetes que pasan por nuestra máquina

Interfaz por la que entran (-i = input) o salen (-o = output) los paquetes

  • eth0, eth1, wlan0, ppp0, ...

IP origen de los paquetes (-s = source)

  • IP concreta, ej: 10.0.1.3
  • Rango de red, ej: 10.0.1.0/8

IP destino de los paquetes (-d = destination)

  • IP concreta, ej: 10.0.1.3
  • Rango de red, ej: 10.0.1.0/8

Protocolo de los paquetes (-p = protocol)

  • Tcp, udp, icmp...

Hacer NAT (modificar IP origen y destino para conectar nuestra red a otra red o a Internet) y...

  • Filtrar antes de enrutar: PREROUTING
  • Filtrar después de enrutar: POSTROUTING



Los paquetes pueden entrar, salir o pasar

Una forma sencilla de trabajar con iptables es permitir las comunicaciones que nos interesen y luego denegar el resto de las comunicaciones. Lo que se suele hacer es definir la política por defecto aceptar (ACCEPT), después crear reglas concretas para permitir las comunicaciones que nos interesen y finalmente, denegar el resto de comunicaciones. Lo mejor será crear un script en el que dispondremos la secuencia de reglas que queremos aplicar en nuestro sistema. Un ejemplo típico podría ser el siguiente:

#!/bin/sh
# Script cortafuegos.sh para la configuración de iptables
#
# Primero borramos todas las reglas previas que puedan existir
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Después definimos que la politica por defecto sea ACEPTAR
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

# Para evitar errores en el sistema, debemos aceptar
# todas las comunicaciones por la interfaz lo (localhost)
iptables -A INPUT -i lo -j ACCEPT

# Aceptamos las comunicaciones que nos interesan y luego denegamos el resto.

# Ejemplo: Denegamos acceso al aula 1
iptables -A FORWARD -s 10.0.1.0/24 -j DROP

# Aceptamos SMTP, POP3 y FTP (correo electrónico y ftp)
iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 21 -j ACCEPT

# HTTP y HTTPS no es necesario porque nuestro servidor será servidor proxy
# Dejamos comentadas las líneas, por si algún día las necesitamos
#iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT
#iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 443 -j ACCEPT

# DNS no es necesario porque nuestro servidor será servidor DNS
# Dejamos comentadas las líneas (tcp y udp), por si algún día las necesitamos
#iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 53 -j ACCEPT
#iptables -A FORWARD -s 10.0.0.0/8 -p udp --dport 53 -j ACCEPT

# Al PC del Director le damos acceso a todo (cliente VIP)
iptables -A FORWARD -s 10.0.0.7 -j ACCEPT

# Denegamos resto de comunicaciones (no funcionará el p2p)
iptables -A FORWARD -s 10.0.0.0/8 -j DROP

# Hacemos NAT si IP origen 10.0.0.0/8 y salen por eth0
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

# Activamos el enrutamiento
echo 1 > /proc/sys/net/ipv4/ip_forward

# Comprobamos cómo quedan las reglas
iptables -L -n

En el script anterior vemos una serie de reglas que se van a ir ejecutando secuencialmente conformando la configuración del cortafuegos iptables. Cuando indicamos "-A FORWARD" nos referimos a paquetes que van a pasar por nuestro servidor. Otras opciones son "-A INPUT" y "-A OUTPUT". Acto seguido ponemos las condiciones. Si ponemos "-s 10.0.0.0/8" nos referimos a paquetes cuya IP origen está en el rango 10.0.0.0/8. Cuando ponemos "-p tcp" nos referimos a paquetes que utilizan el protocolo tcp. Cuando indicamos "--dport 25" nos referimos a paquetes cuyo puerto de destino es el 25, es decir, protocolo SMTP (correo saliente). Si en una regla no ponemos la condición -p ni la condición --dport, significa que no nos importa el protocolo (cualquier protocolo) ni nos importa el puerto destino (cualquier puerto destino). Por ejemplo, en la regla donde damos acceso al PC del Director, no hemos indicado ni protocolo ni puerto, por lo que dejará pasar todos los protocolos y todos los puertos.

Icono de iDevice

¿Sabías que?

Manejar iptables desde comandos puede resultar un poco complejo, por eso existen herramientas gráficas como firestarter que permiten gestionar iptables con clics de ratón, aunque con limitaciones