Si te has instalado un servidor FTP bajo Linux, y has configurado las iptables con política DROP, seguramente te has encontrado con un problema, cuando un cliente se conecta y entra en modo pasivo, no funciona ni "ls" ni "get" ni "put". Del mismo modo si utilizas un ordenador como firewall de tu red, te habrás encontrado con el problema del modo activo, cuando te conectas a un servidor FTP externo no puedes transferir datos... Seguidamente explico el porqué y como solucionarlo:
Teoria activo/pasivo
A grandes rasgos, cuando conectamos con un servidor FTP, se utilizan dos puertos: por defecto el 21 utilizado por la transferencia de comandos (control port), y el 20 (data port), que es por donde circulan los datos que pertenecen a los ficheros. En el modo activo, el cliente elige que puerto se utilizará por la transferencia de los archivos, entonces el servidor conecta al cliente desde el su puerto 20 hasta el X que permanece abierto en el cliente. En el modo pasivo es el servidor quien realiza la elección. El cliente con la palabra "PASV" pide al servidor este puerto, por donde serán enviados los datos relacionados con los archivos. Y es el cliente quien establece la conexió con el servidor.
Modo Activo:
CLIENTE [X] <---------- [20] SERVIDOR; X elegido por cliente
Modo Pasivo:
CLIENTE[20] ----------> [X] SERVIDOR; X elegido por servidor
¿Por que puede suponer esto un problema?
-
Imagina el caso en que tengamos un servidor proftp o vsftp, y una política de INPUT DROP en la cual, creiendo que sabemos como funciona, definimos las siguientes reglas:
| iptables -A INPUT -p tcp --dport 21 -j ACCEPT |
| iptables -A INPUT -p tcp --dport 20 -j ACCEPT |
Si el cliente accede en modo activo, no hay problema, puesto que es el servidor quien crea la conexió. Pero el problema recae sobre nosotros cuando intentamos pasar a modo pasivo. El cliente es quien crea la conexió por el puerto que el servidor a elegido, pero como podemos suponer, todos los paquetes que llegan por un puerto diferente al 21, es rechazado por iptables.
-
Ahora imaginemos el caso que tengamos un pc haciendo de firewall de nuestra red local. Como somos informáticos valientes, establecemos una política de FORWARD DROP. Y abrimos únicamente los puertos necesarios (20 y 21).
En este caso, es el modo activo quien nos causa problemas a la hora de conectar como clientes a un servidor de fuera nuestra LAN. Pues es el servidor quien elige el puerto y establece conexió con el cliente, cuando el paquete llega al router, este lo echa directamente a la basura...
Solución
| iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT |
| iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT |
Aceptamos lass conexions de entrada que ya estan establecidas (ESTABLISHED) o relacionadas con alguna conexión (RELATED). Y las de salida nuevas (NEW), establecidas y relacionadas con alguna conexión.
Con esto conseguimos que cuando se negocie el puerto para la transferencia de datos, como disponemos de la regla "RELATED", iptables aceptará las conexiones entrantes, ya que esta deriva de la primera conexión, la cua ha estado aceptada.
Pero no acaba aqui la cosa, resulta que para poder utilizar la regla RELATED de iptables con ftp, necesitamos unos módulos. Tenemos que asegurarnos que los tenemos instalado y cargado.
| #Para el caso del servidor: |
| ip_conntrack_ftp ip_conntrack |
| #Para el caso del firewall: |
| ip_conntrack_ftp ip_conntrack ip_nat_ftp |
- Inicie sesión o regístrese para enviar comentarios
