Perché la modalità passiva FTP richiede un intervallo di porte anziché una sola porta?


34

Faccio fatica a capire perché tutti i server FTP richiedono l'uso di un intervallo di porte per i canali di dati in modalità passiva invece di utilizzare solo una porta di dati per tutte le connessioni dei canali di dati in entrata.

I server FTP gestiscono molti client connessi contemporaneamente sulla porta 21. I server Web gestiscono molti client connessi contemporaneamente sulla porta 80. Ecc.

Quindi perché un server FTP non può utilizzare solo una porta del canale dati per tutte le connessioni dati passive in entrata (ed essere ancora in grado di gestire molti client connessi contemporaneamente su quella porta, diciamo la porta 1024)?

O può?

Sono interessato a conoscere i dettagli tecnici del perché questo non è possibile o non è raccomandato.


1
Questo potrebbe interessarti: w3.org/Protocols/rfc959
Matt Simmons

1
Grazie Matt. Sì, ho letto la maggior parte di rfc 959, ma sento di non essere in grado di ottenere una risposta chiara da ciò a cui mi stavo chiedendo. La risposta di Karol Piczak è più il tipo di informazioni che stavo cercando.
Kurt,

Risposte:


20

una spiegazione chiara e tecnica per quanto riguarda il multiplo problema con sessioni FTP simultanee quando si blocca la porta dati su una sola porta è ciò che mi interessa di più approfondire. Quando può funzionare, quando non funziona, perché potrebbe non essere raccomandato, ecc.

Sarà un'ipotesi folle, dato che non l'ho provato, dovresti provarlo tu stesso e vedere se ci sono altri problemi che potrei aver perso.

Suppongo che potresti limitare l'intervallo di porte passive a una singola porta . In effetti, in questa domanda puoi vedere che in pratica vengono utilizzati piccoli intervalli di porte . Teoricamente, per supportare più connessioni simultanee sono necessari solo i 4 valori: IP locale, porta locale, IP remoto, porta remota per essere univoci. Ecco come discernere tra connessioni diverse.

Se si blocca la porta sul server su un singolo valore, l'unica variabile rimasta è la porta utilizzata dal client. Questo non è un problema, purché il client abbia un pool abbastanza ampio di porte effimere gratuite tra cui scegliere. A meno che non stia facendo un NAT pesante, non devi preoccuparti di questo. Ora, tieni presente che questa sarà roba puramente teorica : se hai utilizzato più porte sul tuo server, potresti moltiplicare il numero di ipotetiche connessioni simultanee abilitandonumber of ports in rangeconnessioni per una porta lato client. Ma in pratica non accadrà, poiché dubito che ci sia un'implementazione di un client FTP che lo supporti (perché non ha molto senso). Inoltre, se il cliente deve condividere le sue porte effimere in questo modo e non può semplicemente aprirne una nuova, allora ha problemi molto più gravi da affrontare. Quindi, da questo punto di vista, dovresti essere totalmente sicuro usando una singola porta.

Pensiamo perché una singola porta potrebbe non essere sufficiente .

Prima di tutto, potrei trovare una situazione in cui un'implementazione del server FTP veramente errata utilizza solo il numero di porta locale come modo per identificare il trasferimento dei dati del client. Ancora una volta, non credo che nessun FTPd decente lo farebbe.

Il vero problema ( sì, puoi ignorare tutto quanto sopra come una grave digressione ;-)) è che l'intervallo di porte passive è in un intervallo non privilegiato .

Ciò significa che il numero di porta selezionato non è riservato di per sé , e in effetti qualsiasi processo utente (non ha bisogno dei privilegi di root ) può catturarlo prima che il server FTP lo faccia. Se hai un abbondante pool di porte tra cui scegliere, ne prendi semplicemente uno libero a caso. Se sei obbligato a utilizzare l'unico ed è già utilizzato, non sarai in grado di gestire correttamente i trasferimenti.

Scusa, se la risposta sembra un po 'troppo speculativa. Ad essere sincero, ho cercato di trovare un motivo per cui non dovresti usare una singola porta e, a parte l'ultimo, non ho potuto pensare a nessuna prova concreta contro di essa. Tuttavia, una domanda interessante e stimolante che poni.


A proposito, sentiti libero di commentare qui i punti persi e le incoerenze. Anche io, mi sento come se stessi cercando una risposta semplice: sì, puoi. ;-)
Karol J. Piczak,

Grazie mille Karol! Questo è perfetto per il tipo di informazioni che stavo cercando (e davvero non avevo trovato altrove). Il motivo principale per cui ho posto questa domanda è che voglio sapere se è sicuro configurare un server FTP in Windows Azure e bloccare la modalità passiva su una sola porta (poiché Azure limita gli endpoint). L'ho provato, funziona e con le tue informazioni mi sento anche sicuro di farlo. Tuttavia, l'unico problema rimasto è che il bilanciamento del carico di Azure interrompe la connessione di controllo dopo 1 minuto durante i trasferimenti di file (perché è inattivo), quindi sto lavorando su un tunnel TCP con keep-alive per risolverlo.
Kurt,

1
Credo che la vera ragione sia che il protocollo del canale dati non ha informazioni identificative. Il server conosce solo quale file viene trasferito da quale client in base al numero di porta.
Monstieur,

4

FTP si basa su due connessioni separate, una per il flusso di controllo o comando e una per il passaggio dei file di dati e altre informazioni come gli elenchi di directory. Il flusso di controllo viene trasferito su una connessione TCP tradizionale. Il client si collega a una porta non privilegiata alta e invia una richiesta di connessione al server FTP, che è associato alla porta 21. Questa connessione viene utilizzata per passare i comandi.

In Porta o modalità attiva, il client comunica al server su quale porta secondaria non privilegiata ascolterà. Il server quindi avvia la connessione dati dalla porta 20 alla porta non privilegiata specificata dal client.

La modalità passiva, un meccanismo più recente, è l'impostazione predefinita quando il client è un browser web. Invece di essere collegato alla porta 20, il server indica al client quale porta alta utilizzare per il trasferimento dei dati. I dati vengono quindi trasmessi su porte non privilegiate tra client e server.

Per maggiori dettagli, consultare:

http://tools.ietf.org/html/rfc959

MODIFICARE

Per quanto riguarda il blocco del server su una singola porta particolare, potrebbe essere possibile in alcuni server. Ad esempio in vsftpd, hai le seguenti opzioni di configurazione.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

Se imposti entrambe le porte sullo stesso, ad esempio pasv_max_port = 12345, pasv_min_port = 12345, potresti essere in grado di ottenere ciò che cerchi. Sospetto che questo limiterà il numero di sessioni FTP simultanee che il tuo server supporterà. Per favore prova per essere sicuro.


1
Grazie per la tua risposta. Tuttavia, ciò che mi interessa sapere è perché, in modalità passiva, il server ftp non può dire a tutti i client di utilizzare la stessa porta per il canale dati (ad esempio la porta 1024) anziché fornire a ciascun client una porta casuale da un intervallo di porte specificato? Quali sono i motivi tecnici, se del caso, per cui non è possibile o consigliabile specificare una sola porta dati nella configurazione dell'intervallo di porte del server FTP? Penserei che un server ftp possa gestire molte / molte connessioni simultanee anche su una sola porta del canale dati, no?
Kurt,

1
Perché FTP è il diavolo e deve finalmente morire. : D

1
Grazie per la modifica per quanto riguarda il blocco del server su una singola porta specifica. In realtà ho pensato a quel metodo (e questo è ciò che voglio realizzare), ma quello che non capisco bene è perché questo limiterebbe il numero di sessioni FTP simultanee che il server può supportare. Cosa impedisce esattamente al server di supportare più sessioni FTP simultanee in questo caso? Poiché qualsiasi server FTP ovviamente supporta più connessioni simultanee sulla porta 21, quindi perché non anche sulla porta 12345, presa dal tuo esempio? Dovrò testarlo in modo più approfondito.
Kurt,

Potrebbe non limitare il numero di connessioni simultanee. Dipende molto da come il server tiene traccia delle connessioni tra più sessioni. Dagli Un colpo!
dmourati,

tra l'altro dovrò attendere contrassegnando qualsiasi risposta come risposta accettata, perché una spiegazione chiara e tecnica relativa al problema delle sessioni FTP multiple simultanee quando si blocca la porta dati su una sola porta è ciò che mi interessa di più approfondire. Quando può funzionare, quando non funziona, perché potrebbe non essere consigliato, ecc.
Kurt,

1

Un server FTP potrebbe essere in grado di far corrispondere la connessione della porta dati del client alla connessione della porta di controllo basata solo sull'IP di origine anziché sul numero di porta utilizzato.

Ciò interromperebbe FXP (che potrebbe non essere una cosa negativa) in cui il client si connette a due server (uno in modalità passiva), quindi dopo aver ricevuto le informazioni PORT del server passivo, le passa al server in modalità attiva come comando PORT in modo tale che attivo Il server della modalità si connette al server della modalità passiva.

Ho il sospetto che molti server non creano il socket dati fino a quando il client richiede modalità passiva. In tal caso, se due client richiedessero la modalità passiva contemporaneamente, i socket creati avrebbero bisogno di numeri di porta univoci.

EDIT : pensato ad un altro motivo per cui i server FTP non lo fanno: il server non è in grado di distinguere più utenti con lo stesso indirizzo IP a parte.


Grazie. Immagino che ciò che non capisco sia perché quei socket del canale dati richiederebbero una porta univoca (sul server) se due o più client richiedessero la modalità passiva contemporaneamente? Perché sto pensando, due o più client possono ovviamente essere collegati alla porta 21 contemporaneamente, quindi perché non dire la porta 1024 (per il canale dati) allo stesso tempo? Sento che questa potrebbe essere una domanda stupida, ma il mio disclaimer è che sono già sveglio da troppo tempo :)
Kurt

La presa stessa deve essere unica. È possibile creare un socket in ascolto su una porta e accettare tutte le connessioni desiderate da quel singolo socket oppure è possibile creare un socket per utente su porte diverse e accettare una connessione da ciascun socket. Se il server è stato progettato per funzionare con un socket per utente, essenzialmente si riscriverebbe tutto per modificarlo viceversa e, alla fine, le persone su host condivisi o dietro lo stesso indirizzo IP non sarebbero in grado di connettiti allo stesso tempo, perché non ci sarebbe modo di distinguere le loro connessioni dati.
DerfK,

Grazie. Sono grato per tutte le risposte che ho ricevuto sull'argomento e penso che ora sto cominciando a gestirlo abbastanza bene.
Kurt,

0

Sulle porte 21 o 80 (come su tutte le porte ben note), c'è un protocollo impostato, che il client utilizza per dire cosa vuole. In questo modo il server sa a cosa ti stai connettendo. Sulla porta di connessione dati, non esiste alcun protocollo. Tutto ciò che il server conosce - l'unica cosa unica di quella connessione - è il numero di porta a cui ti connetti.

Se dovessi connetterti alla stessa porta ogni volta, il server non sarebbe in grado di dire per quale file ti stai connettendo. Il numero di porta funge da collegamento tra una richiesta di trasferimento sulla connessione di controllo e una connessione dati.

Se due client dovessero richiedere un trasferimento contemporaneamente, quando il server accetta una connessione su una singola porta, il server non sarebbe in grado di dire quale file trasferire. Naturalmente, il server potrebbe utilizzare un IP client per la decisione (in realtà molti server FTP confermano che l'IP client corrisponde all'IP utilizzato sulla connessione di controllo, per motivi di sicurezza).

Ma questo non funzionerebbe per:

  • Connessioni multiple dalla stessa macchina (la maggior parte dei client FTP supporta trasferimenti / code parallele).
  • Connessione da macchine diverse all'interno della stessa rete (aziendale), poiché quelle hanno lo stesso IP esterno.

Vedi anche riutilizzo delle connessioni dati FTP .


-1

Non ho visto questo menzionato qui, quindi lo inserirò. L'assegnazione dell'intervallo di porte doveva essere una sorta di funzione di sicurezza, in cui non era possibile monitorare una porta per il traffico di dati, i dati venivano inviati su una porta casuale in l'intervallo, che non può essere facilmente determinato. Sicurezza attraverso l'oscurità.


1
Hai qualche riferimento per questo reclamo?
Martin Prikryl,

-2

Sembra che tu sappia già delle porte di controllo e delle porte dei dati, quindi andrò subito al sodo. Le porte di controllo sono per natura comunicazioni esplose, proprio come la porta 80 per i siti Web. sono in grado di gestire molte richieste diverse (non contemporaneamente, ma dannatamente vicine poiché sono così veloci da completare). le porte dati invece sono dove avviene la magia con FTP. Se ti limiti a una singola porta dati, si verifica un solo trasferimento dati alla volta. considerare un trasferimento di file di grandi dimensioni. Con una singola porta dati aperta, nessun altro dato può spostarsi fino al completamento del trasferimento. Ciò significa che durante il trasferimento, un secondo utente non sarà nemmeno in grado di elencare il contenuto della directory della cartella ftp. Sicuramente saranno in grado di accedere correttamente, ma il loro comportamento sarà lo stesso di se le porte dati non fossero affatto aperte. Se stai bene con questo, una singola porta funzionerà perfettamente per te. Tieni presente che alcuni client ftp (mi viene in mente 1 immediatamente) per impostazione predefinita hanno impostato più connessioni in una singola sessione per il download. Quindi, per questo client, in uno scenario a porta singola, prendere in considerazione un trasferimento batch di 1 file di grandi dimensioni e 4 file di piccole dimensioni.

Il client avvia il trasferimento per il primo file di grandi dimensioni, tutto hunky dory. Quindi, mentre il trasferimento è in corso, avvia un secondo file. Niente da fare. Quindi il terzo, anche zilch (termine tecnico). Alla fine, il registro dovrebbe mostrare 1 trasferimenti riusciti e 4 falliti. Il problema consisterebbe nel limitare il client a una singola connessione per sessione e saresti a posto (supponendo che qualcun altro non abbia messo piede nella porta il microsecondo in cui un trasferimento viene completato e un altro non è ancora iniziato. )


2
Che cosa? Questo è completamente errato. Un socket TCP è definito dalla 4-tupla (IP di origine, porta di origine, porta di destinazione, IP di destinazione). Molti socket TCP possono essere creati e serviti contemporaneamente dalla stessa porta di destinazione: mappatura IP. Il processo del server FTP può servire contemporaneamente i dati due e da qualsiasi numero di client di rete.
EEAA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.