Vamos a ver, el principal problema que hay con el FTP es de aquellos de vosotros que usais un ROUTER ADSL. Os voy a explicar un poquito cual es el problema y como solucionarlo al menos por ahora.

Resulta que vuestro router tiene una direccion IP publica, que es la que se ve desde internet, y es la que usa para enviar y recibir datos. Sin embargo, los PCs que teneis conectados al router tienen IPs privadas, que no son accesibles desde internet. Para que estos PCs puedan acceder a internet, dirigen las conexiones al router, y este las reenvia a internet con su IP publica, en vez de la del PC que origino la conexion, ya que de no ser asi las respuestas a esas conexiones nunca llegarian. Cuando el router recibe la respuesta de otro sistema de internet, este "averigua" a que PC corresponde esa conexion y se la envia como si la hubiera enviado directamente el sistema de internet. A esto se le llama NAT o IP-Masquerading, que viene a ser usar una IP publica para uso de varios PCs.

El problema estriba, poniendo un ejemplo, en que si uno de nuestros PCs, nuestro flamante Athlon a 1333 Mhz pone un servidor Web, tan solo podran acceder a el los de la red interna, no los de fuera (en principio). Si alguien de fuera (de internet) intenta conectarse a la IP publica del router para que reenvie la conexion al Athlon, lo lleva claro :). Esto es porque el router ve que no tiene ninguna conexion asociada al puerto web por parte de ningun PC de la red interna, asi que actua denegando la peticion de conexion que se hacia desde internet.

Sin embargo, cualquiera de estos routers mas o menos decentes permiten redirigir un puerto (Port Forwarding) a uno de los PCs internos. En este caso, podriamos redirigir el puerto 80 del router al 80 del PC del Athlon, y de esta forma quien pusiese nuestra direccion IP publica en su navegador se conectaria al servidor Web. ESTO es precisamente lo que Leviathan hace con el mud.

Poniendonos mas en situacion, como ya sabreis, el mud tiene su propio servicio de FTP con autentificacion propia usando los nombres de usuario y passwords del mud. Sin embargo, esta implementacion del FTP hecha en el mud carece de alguna que otra caracteristica bastante imporante aunque no obligatoria del protocolo. En particular, solo acepta conexiones en modo ACTIVO de FTP.

El modo activo de FTP actua de la siguiente forma: Tu, desde tu PC que esta detras de un router, conectas a driade.fadlan.com en el puerto de FTP-MUD, el 4000. La conexion se establece y te autentificas. Puede que tu cliente intente establecer el modo PASIVO de FTP, pero el servidor le informara de que no puede hacerlo.

Asi pues, el modo ACTIVO sera usado. Cuando tu pides un listado de directorio, o subir o bajar algun fichero, entonces, por el peculiar disenyo del FTP, se debe abrir una nueva conexion para transferir los datos. Es en este apartado donde difieren los dos modos (es por eso que podeis entrar en el FTP y escribir una orden ls y sin embargo se os queda colgado ahi sin mostraros el listado).

En el modo ACTIVO, que es el que nos importa, el CLIENTE le dice al servidor en que puerto va a escuchar para que el servidor inicie una conexion a ese puerto para transferirle los datos.

Sin embargo, recordando la parrafada anterior, cuando el servidor manda la peticion de conexion para el puerto que tu cliente ha especificado, se encuentra con que el ROUTER adsl tan bonito que tienes en casa no tiene ni idea de que tu PC quiere esa conexion, de forma que la deniega. Por eso no funciona el FTP.

Ahora bien, por que no coger el puerto de datos y redirigirlo al PC que uso para conectar por FTP, tal como hace Leviathan con el mud o como has hecho con el ejemplo de la Web? Pues sencillamente, porque este puerto es aleatorio.

A partir de aqui, la solucion optima es obtener un buen software para el router que controle estas situaciones. Como eso parece ser poco comun, ademas de que tampoco parece ser popular el uso de un proxy FTP en el router (esto no es necesario explicarlo, si no lo entendeis simplemente seguid leyendo sin mas), la solucion CHAPUCERA pero muy extendida, al menos entre quienes tienen problemas con esto y saben que hacer al respecto, es agarrar el rango de puertos aleatorios que usa el cliente de FTP y redirigirlos todos al PC que usamos para la conexion FTP. Si no sabemos que puertos suele usar, lo podemos averiguar con un sniffer (si tampoco sabes que es, olvida esta opcion y sigue leyendo) y si aun asi vemos que el rango es demasiado grande y aleatorio, lo oportuno es agarrar todos los puertos que no esten en uso y redirigirlos al PC.

Esto que puede parecer facil no lo es tanto como parece. Hacer lo que he dicho anularia completamente la funcion original del router, que es permitir la conexion a mas de una maquina. El problema es que si asignas todos los puertos para ser redirigidos a un PC el otro se queda a dos velas. Esto puede ser valido en el momento en que hagas el FTP pero no es muy aceptable.

Asi pues, la solucion optima dentro de lo que supone que el router no sepa lo que es un FTP activo, es decirle que todos aquellos puertos que no esten en uso, se reenvien al PC en cuestion (si podemos reducir el rango desde TODOS los puertos a tan solo los que usa nuestro cliente FTP, aun mejor pero requiere ciertos conocimientos adicionales y no siempre es posible como ya he dicho). No se si todos los routers permiten especificamente esto o tan solo permiten especificar puertos o rangos a redirigir. Si mal no creo, los routers 3COM si permiten redirigir todos los puertos que no esten en uso a un PC especifico, lo cual es lo que buscamos. A malas, una redireccion completa a un PC al menos durante el periodo de tiempo en que estamos con el FTP siempre funcionara. Sin embargo, dudo que algunos modems permitan redirigir los puertos especificando rangos, y si es asi os veo redirigiendo mas de 60000 puertos a mano XDDDD.

Asi pues, como veis, toca ponerse a mirar la configuracion del ROUTER y enterarse de como se hacen estas cosas. Para ello visitad la web del fabricante, que algo suele haber, asi como webs de esas sobre ADSL.

Logicamente, todo esto no seria necesario si el servidor aceptase FTP PASIVO, ya que en ese caso seria el servidor el que le daria al cliente un puerto al cual conectar para obtener los datos (el problema en este caso seria para el router de Leviathan, pero es casi inexistente y normalmente el propio router se da cuenta de ello).

Tambien se solucionaria esto si el protocolo FTP no necesitase de abrir otra conexion en otro puerto para los datos. Por eso estoy desarrollando un servidor que envia tanto control como datos a traves de un mismo puerto.

Bueno, y eso es todo, os toca moveros un poquito, si teneis problemas informad por aqui o en la mailing.

PD: Hay otra posibilidad por la cual puede fallar el FTP a pesar de no estar detras de un router, y es tener un FIREWALL/Cortafuegos que impida conexiones a puertos no permitidos, como el Cortafuegos que viene por defecto en Windows XP. En este caso, el cortafuegos tampoco tiene idea de lo que es un FTP activo, por lo que el problema es el mismo, salvo que en este caso podremos desactivarlo o definir reglas mas permisivas.

Tyrael.