En este sencillo tutorial explicaré cómo proteger de una manera sencilla nuestro servidor usando IPTables.
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.
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.
Voy a explicar cada caso por separado
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
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
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
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.