¿Por qué el modo pasivo FTP requiere un rango de puertos en lugar de un solo puerto?

34

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.

Kurt
fuente
1
Esto puede ser de su interés: w3.org/Protocols/rfc959
Matt Simmons
1
Gracias Matt Sí, he leído la mayor parte de rfc 959, pero siento que realmente no pude obtener una respuesta clara de lo que me preguntaba. La respuesta de Karol Piczak es más el tipo de información que estaba buscando.
Kurt

Respuestas:

20

Una explicación clara y técnica con respecto al problema de múltiples sesiones concurrentes de FTP cuando se bloquea el puerto de datos a un solo puerto es lo que más me interesa saber en profundidad. Cuándo puede funcionar, cuándo no funcionará, por qué puede no recomendarse, etc.

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 habilitandonumber of ports in rangeconexiones 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.

Karol J. Piczak
fuente
Por cierto, no dude en comentar los puntos perdidos y las inconsistencias aquí. Incluso yo mismo, siento como si estuviera buscando una respuesta simple: sí, puedes. ;-)
Karol J. Piczak
Muchas gracias Karol! Esto es perfecto para el tipo de información que estaba buscando (y realmente no había encontrado en ningún otro lugar). Mi razón principal por la que hice esta pregunta es porque quiero saber si es seguro configurar un servidor FTP en Windows Azure y bloquear el modo pasivo en solo 1 puerto (ya que Azure limita los puntos finales). Lo he intentado, funciona, y con tu información también me siento seguro de hacerlo. Sin embargo, el único problema que queda es que el equilibrador de carga de Azure cae la conexión de control después de 1 minuto durante las transferencias de archivos (porque está inactivo), por lo que estoy trabajando en un túnel TCP con Keep Live's para solucionarlo.
Kurt
1
Creo que la verdadera razón es que el protocolo del canal de datos no tiene información de identificación. El servidor solo sabe qué archivo se transfiere desde qué cliente en función del número de puerto.
Monstieur
4

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.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

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.

dmourati
fuente
1
Gracias por su respuesta. Sin embargo, lo que me interesa saber es por qué, en modo pasivo, el servidor ftp no puede decirle a todos los clientes que usen el mismo puerto para el canal de datos (por ejemplo, el puerto 1024) en lugar de dar a cada cliente un puerto aleatorio de un rango de puerto especificado? ¿Cuáles son las razones técnicas, si las hay, por las cuales no es posible o recomendado especificar un solo puerto de datos en la configuración del rango de puertos del servidor FTP? Creo que un servidor ftp podría manejar muchas / muchas conexiones simultáneas incluso en un solo puerto de canal de datos, ¿no?
Kurt
1
Porque FTP es el demonio y finalmente necesita morir. : D
1
Gracias por su edición con respecto al bloqueo del servidor a un puerto único en particular. De hecho, he pensado en ese método (y esto es lo que quiero lograr), pero lo que no entiendo es por qué eso limitaría el número de sesiones FTP concurrentes que el servidor puede admitir. ¿Qué es exactamente lo que evitaría que el servidor admita múltiples sesiones FTP concurrentes en este caso? Debido a que cualquier servidor FTP obviamente admite múltiples conexiones concurrentes en el puerto 21, entonces ¿por qué no también en el puerto 12345, tomado de su ejemplo? Tendré que probar esto con mayor profundidad.
Kurt
Es posible que no limite el número de conexiones concurrentes. Realmente depende de cómo el servidor realiza un seguimiento de las conexiones en varias sesiones. ¡Dale un tiro!
dmourati
Por cierto, tendré que esperar para marcar cualquier respuesta como respuesta aceptada, porque una explicación clara y técnica con respecto al problema de múltiples sesiones concurrentes de FTP cuando se bloquea el puerto de datos a un solo puerto es lo que más me interesa conocer en profundidad. Cuando se puede trabajar, cuándo va a no funcionar, por lo que no se puede recomendar, etc.
Kurt
1

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.

DerfK
fuente
Gracias. Supongo que lo que no entiendo es por qué esos zócalos de canales de datos requieren un puerto único (en el servidor) si dos o más clientes solicitan el modo pasivo al mismo tiempo. Porque estoy pensando, obviamente, dos o más clientes pueden conectarse al puerto 21 al mismo tiempo, entonces ¿por qué no decir el puerto 1024 (para el canal de datos) al mismo tiempo? Siento que esta puede ser una pregunta estúpida, pero mi descargo de responsabilidad es que ya he estado despierto durante demasiado tiempo :)
Kurt
El zócalo en sí mismo debe ser único. Puede crear un socket escuchando en un puerto y aceptar tantas conexiones como desee de ese socket, o puede crear un socket por usuario en diferentes puertos y aceptar una conexión de cada socket. Si ha diseñado el servidor para que funcione un socket por usuario, esencialmente estaría reescribiendo todo para cambiarlo al revés, y al final, las personas en hosts compartidos o detrás de la misma dirección IP no podrían conectarse al mismo tiempo, porque no habría forma de distinguir sus conexiones de datos.
DerfK
Gracias. Estoy agradecido por todas las respuestas que he recibido sobre el tema y creo que ahora estoy empezando a entenderlo muy bien.
Kurt
0

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:

  • Múltiples conexiones desde la misma máquina (la mayoría de los clientes FTP admiten transferencias / colas paralelas).
  • Conexión desde diferentes máquinas dentro de la misma red (corporativa), ya que tienen la misma IP externa.

Consulte también Reutilización de conexiones de datos FTP .

Martin Prikryl
fuente
-1

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.

Grantnoturbus
fuente
1
¿Tiene alguna referencia para este reclamo?
Martin Prikryl
-2

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). )

Andrés
fuente
2
¿Qué? Esto es completamente incorrecto. Un socket TCP se define por la 4-tupla (IP de origen, puerto de origen, puerto de destino, IP de destino). Muchos sockets TCP se pueden crear y servir simultáneamente desde el mismo puerto de destino: mapeo de IP. El proceso del servidor FTP puede servir datos dos y de cualquier número de clientes de red al mismo tiempo.
EEAA