Desarrollo de cliente FTP: problemas con el firewall

2

Estoy trabajando en un cliente FTP para uso interno para implementaciones. Comencé con los scripts de WinSCP, todo parece funcionar bien, excepto una operación (eliminar un directorio grande (muchos archivos) que contiene archivos y subdirectorios). Sé que mi servidor FTP específico no admite la "eliminación recursiva de directorios", sin embargo, es posible lograr la operación deseada haciendo la recursión en el lado del cliente (enumerar todos los archivos / archivos y eliminar todo uno por uno).

Línea de script WinSCP que falla:

rmdir /path/to/large_directory

error:

Lost connection.
Disconnected from server
Error deleting file '/path/to/large_directory/InnerDir/InnerDir2/dir'.
Error deleting file '/path/to/large_directory/InnerDir/InnerDir2'.
Error deleting file '/path/to/large_directory/InnerDir'.
Error deleting file '/path/to/large_directory'.
Session '[email protected]' closed.
No session.

Después de no poder encontrar una solución en el script WinSCP, decidí escribir en mi propia aplicación de implementación utilizando C # y la biblioteca de código abierto 'System.Net.FtpClient'. Sin embargo, muy pronto se enfrentó con el mismo problema: "la eliminación del directorio grande recursiva" falla. Excepto que esta vez tenía más información sobre el error:

Disposing FtpClient object...
Disposing FtpSocketStream...
System.IO.IOException: 
Unable to read data from the transport connection: 
An attempt was made to access a socket in a way forbidden by its access permissions. 
---> System.Net.Sockets.SocketException: 
    An attempt was made to access a socket in a way forbidden by its access permissions 
      at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
      at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
--- End of inner exception stack trace ---

Desafío: la ocurrencia de un error es impredecible, en el sentido de que un directorio dado que contiene solo algunos directorios o archivos internos puede tener éxito o fallar, pero en un caso más grande es casi seguro que falle. Esto se aplica a la aplicación WinSCP y C #. Entonces, en teoría, esta es una posible solución: repita la secuencia de comandos hasta que el directorio se elimine por completo, pero al hacerlo se presentan otros desafíos (la reconexión manual es uno de ellos).

Mientras intentaba muchas cosas diferentes, descubrí que deshabilitar completamente el firewall de Windows 10 funcionó. Por lo tanto, la aplicación C # permitida y el script WinSCP se ejecutan sin problemas.

Necesito ayuda para configurar el firewall correctamente , pero no importa lo que haga, el problema aún persiste, excepto si el firewall está completamente desactivado. Incluso he creado reglas de entrada / salida, que deberían aplicarse a todos los perfiles, a todas las direcciones IP locales / remotas, a los puertos, a las aplicaciones / a los servicios ... aún sin resultados deseados.

Regla de entrada:

Regladesalida:

    
pregunta Nerijus Dzinzeleta 27.10.2016 - 15:46
fuente

2 respuestas

0

En realidad, al intentar muchas cosas y buscar, he encontrado una solución, que era exactamente lo que estaba buscando:

  

El problema está causado por el filtro de FTP con estado del firewall. Como un   Para evitarlo, puede desactivarlo ejecutando netsh advfirewall set global StatefulFTP disable con derechos de administrador.

Hay publicaciones con problemas similares: Java 7 evita las transferencias de FTP en Windows Vista y 7 si el firewall está activado. ¿Alguna idea?

    
respondido por el Nerijus Dzinzeleta 29.10.2016 - 14:22
fuente
0

FTP es un protocolo que usa una conexión TCP para el control y luego para cada transferencia de datos (es decir, archivos, listado de directorios) usa nuevas conexiones de datos en puertos asignados dinámicamente. Esto hace que sea una pesadilla para los cortafuegos. Tienes las siguientes opciones:

  • Deshabilitar el firewall (funciona, pero está mal)
  • Permitir todas las conexiones salientes y cambiar su cliente FTP al modo pasivo (cómo se hace esto no es un tema aquí): de esta manera el cliente intenta conectarse al servidor para la transferencia de datos en lugar del servidor que se conecta al cliente.
  • Permita las conexiones entrantes desde el puerto 20 (ftp-data) a cualquier puerto interno y cambie su cliente FTP al modo activo: un servidor FTP adecuado originará todas las conexiones de datos FTP desde el puerto 20.
  • Use algún tipo de ayudante de FTP con su firewall. Dichos ayudantes utilizan una inspección profunda de la conexión de control para averiguar qué puertos deben asignarse para las conexiones de datos y luego agregar dinámicamente las reglas necesarias al firewall. Tenga en cuenta que no todos los firewalls tienen estos ayudantes y que estos no funcionan si la conexión de control está cifrada (FTPS).
  • Use otro protocolo en lugar de FTP, es decir, SSH / SCP / SFTP no tiene estos problemas.
respondido por el Steffen Ullrich 27.10.2016 - 17:42
fuente

Lea otras preguntas en las etiquetas