Tengo un servidor FTP que admite el modo de servidor pasivo (usando el comando PASV). Esto funciona bien con Windows XP. Cuando quiero acceder a este servidor desde Windows Vista o Windows 7 con el firewall habilitado, experimento un cierre inmediato de la conexión. Se envía un paquete de reinicio al servidor y se le indica al socket que el servidor ha restablecido la conexión (lo que no es cierto).
El problema desaparece cuando el firewall está desactivado.
Las conexiones a otros servidores FTP funcionan correctamente. La diferencia es que la respuesta del servidor a PASV no incluye el campo de dirección entre paréntesis. Esto es legal según lo documentado en RFC-959 y RFC-1132.
¿Cómo puedo configurar el firewall para detener este mal comportamiento?
Respuesta1
No creo que los paréntesis tengan la culpa.
Preferiría pensar que el rango de puertos dinámicos asignado por ese servidor no está de acuerdo con Vista/7.
Para una discusión sobre el tema, consulte este artículo:
El rango de puertos dinámicos predeterminado para TCP/IP ha cambiado en Windows Vista y Windows Server 2008.
Para ver el rango de puertos dinámicos en su computadora para ipv4, use el siguiente comando:
netsh int ipv4 show dynamicport tcp
Para configurar el rango de puertos dinámicos para TCP, utilice, por ejemplo:
netsh int ipv4 set dynamicport tcp start=1024 num=30000
Se describen más comandos en el artículo anterior.
EDITAR: Tenga en cuenta que el firewall de Windows puede ser lo suficientemente inteligente como para abrir un puerto dinámico especificado en la respuesta PASV, incluso si este puerto no se encuentra dentro de su rango predeterminado para puertos dinámicos. Pero puede ser que todavía no sea lo suficientemente inteligente como para entender la respuesta sin paréntesis. Puede que valga la pena echar un vistazo a la posibilidad de ampliar el rango predeterminado para puertos dinámicos.
Respuesta2
Esto me recuerda un problema que tuve con Java y FTP ejecutándose en Windows 7.
Terminó siendo un error en el firewall de Microsoft con FTP, modo pasivo y conexiones IPv6 (no era necesario que la dirección fuera IPv6, solo el software que realizó la conexión lo hace usando la pila IPv6).
El síntoma descrito en su pregunta suena muy similar a este problema, por lo que lo vincularé y lo resumiré aquí (aunque esta pregunta no tiene nada que ver con Java, la solución puede ser la misma).
Un resumen de algunas soluciones mencionadas allí:
- Revisión de Microsoft:http://support.microsoft.com/kb/2754804
- Intente hacer que su cliente FTP que se ejecuta en Vista/7 se ejecute con una pila IPv4 (puede que sea posible, puede que no).
- Deshabilite el uso de FTP con estado del firewall de Windows
netsh advfirewall set global StatefulFTP disable
(sin embargo, esto deshabilitará las conexiones FTP en modo no pasivo que atraviesan su firewall)
Respuesta3
No puedes configurar el firewall porque simplemente tiene errores.
Siempre que no pueda cambiar el servidor FTP para enviar la información del puerto entre paréntesis porque está integrado en dispositivos antiguos en el campo, necesitará un cliente especial con el siguiente comportamiento.
Este cliente debe enviar un TYPE I
comando inmediatamente antes de cada PASV
comando para mantener el firewall en buen estado. Si necesita una transferencia no binaria, puede cambiar el parámetro del comando TYPE.