Sviluppo client FTP - Problemi con il firewall

2

Sto lavorando su client FTP per uso interno per le distribuzioni. Ho iniziato con gli script WinSCP, tutto sembra funzionare bene, tranne una operazione (eliminazione di directory di grandi dimensioni (molti file) contenenti file e sottodirectory). So che il mio server FTP di destinazione non supporta la 'rimozione della directory ricorsiva', tuttavia è possibile ottenere l'operazione desiderata eseguendo la ricorsione sul lato client (elenca tutti i file / dir ed elimina tutto uno per uno).

Riga di script WinSCP che fallisce:

rmdir /path/to/large_directory

Errore:

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.

Dopo aver non trovato la soluzione sullo script WinSCP, ho deciso di scrivere sulla mia applicazione di distribuzione utilizzando C # e la libreria open source 'System.Net.FtpClient'. Tuttavia, ben presto affrontato lo stesso problema 'ricorsiva rimozione di directory di grandi dimensioni' non riesce. Tranne questa volta ha avuto più informazioni sull'errore:

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

Sfida: il verificarsi di un errore è imprevedibile, nel senso che la directory specificata che contiene solo poche directory o file interni può avere esito positivo o negativo, ma in un caso più ampio è quasi garantito il fallimento. Questo vale per l'applicazione WinSCP e C #. Quindi, in teoria, questa è la soluzione possibile - continua a ripetere lo script fino a quando la directory non viene completamente rimossa, ma farlo comporta un altro problema (la riconnessione manuale è una di queste).

Pur provando molte cose diverse, ho scoperto che disabilitare completamente il firewall di Windows 10 ha funzionato. Pertanto, l'app C # e lo script WinSCP sono stati eseguiti in modo impeccabile.

Ho bisogno di aiuto con l'impostazione corretta del firewall , ma non importa cosa faccia il problema persiste, tranne se il firewall è completamente disabilitato. Ho persino creato regole in entrata / uscita, che dovrebbero applicarsi a tutti i profili, tutti gli indirizzi IP / porte locali / remoti, le applicazioni / i servizi ... ancora senza risultati desiderati.

Regola in entrata:

Regolainuscita:

    
posta Nerijus Dzinzeleta 27.10.2016 - 15:46
fonte

2 risposte

0

In realtà provando molte cose e cercando, ho trovato una soluzione, che era esattamente quello che stavo cercando:

The problem is caused by the stateful FTP filter of the firewall. As a workaround you can disable it by executing netsh advfirewall set global StatefulFTP disable with administrator rights.

C'è un post con un problema simile: Java 7 impedisce il trasferimento FTP su Windows Vista e 7 se il firewall è attivo. Qualche idea?

    
risposta data 29.10.2016 - 14:22
fonte
0

FTP è un protocollo che utilizza una connessione TCP per il controllo e quindi per ogni trasferimento di dati (ovvero i file, l'elenco di directory) utilizza nuove connessioni dati su porte allocate dinamicamente. Questo lo rende un incubo per i firewall. Hai le seguenti opzioni:

  • Disabilita il firewall (funziona, ma è danneggiato)
  • Consenti a tutte le connessioni in uscita e passa il tuo client FTP in modalità passiva (come qui è off-topic): in questo modo il client tenta di connettersi al server per il trasferimento dei dati invece del server che si connette al client.
  • Consentire connessioni in ingresso dalla porta 20 (ftp-data) a qualsiasi porta interna e passare il client FTP alla modalità attiva: un server FTP appropriato genererà tutte le connessioni dati FTP dalla porta 20.
  • Utilizza una specie di helper FTP con il tuo firewall. Tali helper utilizzano un'analisi approfondita della connessione di controllo per scoprire quali porte devono essere allocate per le connessioni dati e quindi aggiungere dinamicamente le regole necessarie al firewall. Nota che non tutti i firewall hanno tali helper e che questi helper non funzionano se la connessione di controllo è crittografata (FTPS).
  • Utilizza un altro protocollo invece di FTP, ad esempio SSH / SCP / SFTP non presentano questi problemi.
risposta data 27.10.2016 - 17:42
fonte

Leggi altre domande sui tag