Uffff, venga, va... hoy me apetece escribir:
Hay dos modos de abrir una conexión de datos a un ftp: activo(o modo port) y pasivo. El servidor se puede configurar para que acepte ambos tipos de conexiones o solamente una de ellas. El cliente, a su vez, tiene que saber cómo debe conectarse al servidor. La mayoría de los clientes vienen con la modalidad pasiva por defecto (creo que el ftp del MS-DOS no XD, lo que lo hace útil para pruebas), incluso los web browsers vienen en pasivo por defecto. (los servidores suelen aceptar ambos tipos por defecto)
La diferencia es la siguiente: en ambos modos, la conexión de control la abre el cliente al puerto 21, en el que se supone que el servidor está escuchando, y por lo tanto está "abierto" en el firewall del router. Pero a la hora de abrir la conexión de datos, la cosa cambia. En los primeros clientes, estos después informaban mediante un comando PORT sobre el puerto que el SO del cliente ftp había decidido para establecer la conexión de datos(ya que se elige de manera dinámica). El servidor cogía esa información y abría una conexión de datos hacia ese puerto del cliente, poniendo el 20 (generalmente, aunque puede usar otro) como su puerto de conexión de datos, y la cosa funciona. Pero en este caso, es el servidor el que abre la conexión de datos hacia el cliente, y puede que ese puerto no esté abierto si el cliente está detrás de un firewall y no tiene control sobre dicho firewall, con lo cuál la conexión no se establecerá.
Para evitar este problema con los firewalls en el cliente, se diseñó el modo pasivo. En el modo pasivo, se trata de que sea el cliente también el que abre la conexión de datos, de tal manera que el firewall no la impida (suelen ser menos restrictivos en las conexiones salientes que en las que quieren entrar). Ahora, cuando la conexión de control está establecida, el cliente envía una petición PASV al servidor, en la que pide permiso para ser él el que abra la conexión, así como información sobre el puerto que debería usar para conectarse al servidor. El servidor se lo pedirá al SO y este le asignará un puerto por encima del 1024 (ya no será el 20!). El servidor le comunica al cliente que es a ese puerto al que debe abrir la conexión, y el cliente así lo hace, con lo que esta vez ES EL CLIENTE EL QUE ABRE LA CONEXIÓN AL SERVIDOR.
Problemón: Tu ordenador, en el que se está ejecutando el servidor, sabe que debe esperar una conexión en tal puerto por encima de 1024, pero tu router no sabe nada al respecto, con lo que no redirige la conexión a ningún ordenador y esta nunca se establece.
Solución:
La más fácil-> No permitir conexiones en modo pasivo, configurando el servidor para ello. Lo malo es que tienes que avisar a todos tus clientes de que configuren su cliente ftp en modo activo.
La más difícil -> Tener un servidor FTP que entre las opciones incluya una en la que tú puedas decidir qué puertos se van a elegir cuando alguien haga una petición PASV, y abrir esos mismos puertos en el router. Esto no es muy útil con el P643, ya que no permite abrir rangos de puertos.
El WarFTP server, además de ser muy bueno y gratuito (y no demasiado evidente de configurar, he de decir...:-P), tiene una aplicación para ello. Se trata de que el creador del servidor ha puesto un servidor externo. En este servidor "dynip.jgaa.com", das de alta tu ftp, le creas un dominio, e incluyes esta información en un fichero de texto que viene con el servidor. Cuando el servidor arranca, comprueba la IP dinámica externa que tienes asignada, pidiéndole al servidor externo que la mire, y asocia tu dominio a esa IP. Pero además, permite que especifiques qué puertos se van a usar para el comando PASV, de tal manera que cuando el cliente se intente conectar, los encuentre abiertos en el router. Supongo que especificando un sólo puerto, en vez de un rango, debería funcionar, pero no estoy seguro. Habría que probarlo...(quizás lo haga yo esta noche :-D)
Pero hay más... (esto te pasa por preguntar XDDDD). En modo pasivo, además del puerto en el que el cliente debe conectarse, el servidor envía su propia IP, para que el cliente sepa a dónde debe conectarse (un detalle del estándar que solamente resulta útil para la conexión entre dos servidores FTP gestionada por un cliente). Y?... Bueno, esa dirección va en el campo de datos del mensaje. Por ejemplo mi ordenador le diría al cliente: "Si quieres abrir tú la conexión, hazlo en el puerto 2734 a mi IP, que es la 192.168.1.1" , ya que esa es la dirección que el cliente cree que tiene. ¿Sustituye esta dirección el NAT del router por la suya, la externa del router? -> No!!, porque el NAT actúa a nivel de red (direcciones IP de la cabecera) y no cambia cosas dentro del campo de datos de las aplicaciones (a no ser que sea un router muy bueno, de los que no tenemos en casa). Resultado: el cliente intentará abrir la conexión a la dirección inexistente de intenet 192.168.1.1 :-(
Este es el otro problema que resuelve el método del WarFTP que te he contado, ya que la dirección IP que mete en la respuesta PASV es la que detecta el servidor externo, y no la que está definida en tu ordenador local detrás de NAT.
Una última observación: cuando des de alta el dominio, no tienes por qué usarlo. Puedes seguir usando otro que ya le hayas puesto al FTP siempre y cuando los dos apunten en todo momento a la misma dirección, la de tu router. Es decir, que estén los dos actualizados en todo momento si tienes IP dinámica, o bien que tengas IP fija, en cuyo caso siempre apuntarán a lo mismo.
Salu2.
P.D.- Hacía siglos que no me curraba un post así, pero es que me ha hecho mucha ilusión la dirección que has puesto para probar el FTP desde fuera. La que tenía yo era un coñazo. Gracias- ;-)
Editado: Diversas correcciones de forma y ortografía... 8-). Añadidas correcciones sugeridas por xavi_super en este hilo