Estoy luchando por comprender por qué todos los servidores FTP requieren el uso de un rango de puertos para canales de datos de modo pasivo en lugar de usar solo un puerto de datos para todas las conexiones de canales de datos entrantes.
Los servidores FTP manejan muchos clientes conectados simultáneamente en el puerto 21. Los servidores web manejan muchos clientes conectados simultáneamente en el puerto 80. Etc ..
Entonces, ¿por qué un servidor FTP no puede usar solo un puerto de canal de datos para todas las conexiones de datos pasivos entrantes (y aún así poder manejar muchos clientes conectados simultáneamente en ese puerto, por ejemplo, el puerto 1024)?
O puede?
Estoy interesado en conocer los detalles técnicos de por qué esto no es posible o no se recomienda.
Respuestas:
Será una suposición descabellada, ya que no lo he probado, deberías probarlo por ti mismo y ver si hay otros problemas que podría haber pasado por alto.
Supongo que podría limitar el rango de puertos pasivos a un solo puerto . De hecho, puede ver en esta pregunta que en la práctica se utilizan pequeños rangos de puertos . Teóricamente, para admitir múltiples conexiones concurrentes, solo necesita los 4 valores: IP local, puerto local, IP remota, puerto remoto para ser único. Así es como se discierne entre diferentes conexiones.
Si bloquea el puerto de su servidor a un solo valor, la única variable que queda es el puerto utilizado por el cliente. Esto no es un problema, siempre y cuando el cliente tenga un grupo suficientemente grande de puertos efímeros libres para elegir. A menos que esté haciendo algo de NAT pesado, no tiene que preocuparse por esto. Ahora, tenga en cuenta que esto será puramente teórico : si utilizó múltiples puertos en su servidor, podría multiplicar la cantidad de conexiones hipotéticas concurrentes habilitando
number of ports in range
conexiones por un puerto del lado del cliente. Pero no sucederá en la práctica, ya que dudo que haya una implementación de un cliente FTP que lo admita (porque no tiene mucho sentido). Además, si el cliente tiene que compartir sus puertos efímeros de esta manera y no puede simplemente abrir uno nuevo, entonces tiene que lidiar con problemas mucho más graves. Entonces, desde esta perspectiva, debe estar totalmente seguro usando un solo puerto.Pensemos por qué un solo puerto puede no ser suficiente .
En primer lugar, podría llegar a una situación en la que una implementación de servidor FTP realmente defectuosa utiliza únicamente el número de puerto local como una forma de identificar la transferencia de datos del cliente. Una vez más, no creo que ningún FTPd decente haga eso.
El verdadero problema ( sí, puede ignorar todo lo anterior como una digresión importante ;-)) es que el rango de puertos pasivos está en un rango no privilegiado .
Esto significa que su número de puerto seleccionado no está reservado per se , y de hecho cualquier proceso de usuario (no necesita privilegios de root ) puede obtenerlo antes de que su servidor FTP lo haga. Si tiene un grupo abundante de puertos para elegir, simplemente tome uno libre al azar. Si está obligado a usar el único y ya está usado, no podrá manejar las transferencias correctamente.
Lo siento, si la respuesta parece un poco especulativa. Para ser honesto, intenté encontrar una razón por la que no debería usar un solo puerto y, aparte de la última parte, no pude pensar en ninguna evidencia contundente en su contra. Sin embargo, una pregunta interesante y desafiante que plantea.
fuente
FTP se basa en dos conexiones separadas, una para el flujo de control o comando y otra para pasar los archivos de datos y otra información, como listas de directorios. El flujo de control se realiza a través de una conexión TCP tradicional. El cliente se une a un puerto sin privilegios y envía una solicitud de conexión al servidor FTP, que está vinculado al puerto 21. Esta conexión se utiliza para pasar comandos.
En el modo Puerto o activo, el cliente le dice al servidor en qué puerto secundario y sin privilegios escuchará. Luego, el servidor inicia la conexión de datos desde el puerto 20 al puerto sin privilegios especificado por el cliente.
El modo pasivo, un mecanismo más nuevo, es el predeterminado cuando el cliente es un navegador web. En lugar de estar vinculado al puerto 20, el servidor le dice al cliente qué puerto alto usar para la transferencia de datos. Los datos se transmiten a través de puertos no privilegiados entre el cliente y el servidor.
Para más detalles, consulte:
http://tools.ietf.org/html/rfc959
EDITAR
En cuanto a bloquear el servidor a un puerto único en particular, puede ser posible en algunos servidores. Por ejemplo, en vsftpd, tiene las siguientes opciones de configuración.
Si establece ambos puertos en el mismo, por ejemplo, pasv_max_port = 12345, pasv_min_port = 12345, puede obtener lo que busca. Sospecho que esto limitará la cantidad de sesiones FTP concurrentes que admitirá su servidor. Por favor, prueba para estar seguro.
fuente
Un servidor FTP podría hacer coincidir la conexión del puerto de datos del cliente con su conexión del puerto de control basándose únicamente en la IP de origen, en lugar de basarse en el número de puerto utilizado.
Esto rompería FXP (que puede no ser algo malo) donde el cliente se conecta a dos servidores (uno en modo pasivo), luego, después de recibir la información PORT del servidor pasivo, lo pasa al servidor en modo activo como un comando PORT para que el servidor de modo se conecta al servidor de modo pasivo.
Yo sospecho que muchos servidores no crean la toma de datos hasta que el cliente solicita el modo pasivo. En ese caso, si dos clientes solicitaran el modo pasivo al mismo tiempo, los sockets creados necesitarían números de puerto únicos.
EDITAR : pensó en otra razón por la cual los servidores FTP no hacen esto: el servidor no podía distinguir a varios usuarios con la misma dirección IP.
fuente
En los puertos 21 u 80 (como en todos los puertos conocidos), hay un protocolo establecido, que el cliente usa para decir qué quiere. De esta manera, el servidor sabe para qué se está conectando. En el puerto de conexión de datos, no hay protocolo. Todo lo que el servidor sabe, lo único que es único acerca de esa conexión, es el número de puerto al que se conecta.
Si tuviera que conectarse al mismo puerto cada vez, el servidor no podría decir a qué archivo se está conectando. El número de puerto sirve como enlace entre una solicitud de transferencia en la conexión de control y una conexión de datos.
Si dos clientes solicitaran una transferencia al mismo tiempo, cuando el servidor acepta una conexión en un solo puerto, el servidor no podría decir qué archivo transferir. Por supuesto, el servidor podría usar una IP del cliente para la decisión (en realidad, muchos servidores FTP validan que la IP del cliente coincida con la IP utilizada en la conexión de control, por seguridad).
Pero esto no funcionaría para:
Consulte también Reutilización de conexiones de datos FTP .
fuente
No vi esto mencionado aquí, así que lo incluiré. La asignación del rango de puertos estaba destinada a ser una especie de característica de seguridad, donde no se podía monitorear el tráfico de datos de un puerto, los datos se enviaron a un puerto aleatorio en el rango, que no se pudo determinar fácilmente. Seguridad a través de la oscuridad.
fuente
Parece que ya sabes sobre puertos de control y puertos de datos, así que iré directo al grano. Los puertos de control son ráfagas de comunicación por naturaleza, al igual que el puerto 80 para sitios web. pueden manejar muchas solicitudes diferentes (no simultáneamente, pero muy cerca ya que son muy rápidas de completar). los puertos de datos, por otro lado, son donde ocurre la magia con FTP. Si se limita a un solo puerto de datos, solo se realiza una transferencia de datos a la vez. considere una transferencia de archivos grandes. Con un solo puerto de datos abierto, ningún otro dato puede moverse hasta que se complete la transferencia. Esto significa que durante la transferencia, un segundo usuario ni siquiera podrá enumerar el contenido del directorio de la carpeta ftp. Seguro que podrán iniciar sesión con éxito, pero su comportamiento será el mismo que si los puertos de datos no estuvieran abiertos en absoluto. Si estás de acuerdo con esto, un solo puerto funcionará muy bien para usted. Tenga en cuenta que algunos clientes ftp (puedo pensar en 1 de inmediato) configuran de forma predeterminada varias conexiones dentro de una sola sesión para descargar. Entonces, para este cliente, en un escenario de puerto único, considere una transferencia por lotes de 1 archivo grande y 4 archivos pequeños.
El cliente inicia la transferencia para el primer archivo grande, todo hunky dory. Luego, mientras continúa esa transferencia, comienza un segundo archivo. No dados. Luego el tercero, también zilch (término técnico). Al final, el registro debe mostrar 1 transferencias exitosas y 4 fallidas. La solución sería limitar al cliente a una sola conexión por sesión y estaría listo (suponiendo que otra persona no haya puesto el pie en la puerta en el mismo microsegundo que se completa una transferencia y otra aún no ha comenzado). )
fuente