En este sencillo tutorial explicaré cómo proteger de una manera sencilla nuestro servidor usando IPTables.

  1. Hacer flush de reglas
  2. Establecer políticas por defecto
  3. Permitir sólo lo que queramos

El flush de reglas quitará todas las reglas existentes y nos dejará el IPTables limpio, como si estuviera desactivado.

iptables -F
iptables -X
iptables -Z
iptables -t nat -F

Estableceré la política por defecto permitiendo todo menos la entrada de paquetes.

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

Ahora empezaré a dar permisos a diferentes máquinas para que administren el servidor.

  1. Al propio servidor le daré acceso total. La IP de la propia máquina siempre es 127.0.0.1. En IPTables lo podemos especificar con la interfaz loopback
  2. A una máquina de la red local le daremos acceso total para que pueda administrar el servidor

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.33 -j ACCEPT

Ahora empezaremos a permitir el acceso a los diferentes servicios de nuestro servidor.

  1. Web
  2. Correo
  3. SSH
  4. DNS

Voy a explicar cada caso por separado

1. Servidor Web

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

2. Servidor de Correo

El servidor de correo usa el puerto 25 para el envío de correos y los puertos 143 y 993 para la recepción del correo via IMAP e IMAPS (imap seguro) respectivamente.

iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j ACCEPT

3. Shell remota SSH

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

4. Servidor DNS

iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

Y para terminar voy a permitir la respuesta a los ping que hago desde el servidor.

iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

Tal vez haya alguien que no entienda porqué hay reglas que incluyen lo de ESTABLISHED,RELATED. Bien, voy a tratar de explicarlo a mi manera, aunque tal vez no sea la correcta.

Empezaré por los ping que es un poco más sencillo de explicar. Yo no quiero que hagan ping a mi servidor, pero sí quiero poder hacerlos yo. Bien, yo puedo hacerlos porque la política de OUTPUT es ACCEPT por defecto. El problema es que cada petición de ping recibe una respuesta y, en las reglas de IPTables debo permitir entrar esa respuesta, porque sinó no puedo saber si ha funcionado el ping que esté haciendo. La cuestión es que yo quiero dejar entrar los paquetes icmp (los del ping) pero sólo cuando haya sido yo quien haya hecho el ping. Pues bien, para especificar exactamente eso en IPTables se usan los estados ESTABLISHED,RELATED. Dejo entrar los paquetes icmp sólo cuando provengan de una conexión ya establecida.

Para el DNS es lo mismo. Haces una consulta a un servidor DNS y éste te responde. El problema es que la respuesta no entra por el puerto 53, aunque el puerto de origen (--sport) sí que es el 53. Por eso permito la entrada de paquetes cuyo puerto de origen sea el 53, pero siempre y cuando haya sido yo el que haya hecho la consulta al servidor DNS. Es decir, que ese paquete venga de una conexión ya establecida.

Y en el caso del servidor de correo creo que es exactamente igual que en el DNS.

Valid XHTML 1.0 Strict¡CSS Válido!