Post by ObiWanla 20 non serve :) è un errore classico, la 20 in *ingresso* NON
serve assolutamente
giusto per chiarire; supponendo di avere due hosts, il server
ftp "S" ed il client "C"
FTP normale (attivo)
C crea un socket impostando come destination IP
"S" e come destionation port la 21, lasciando source
IP e source port vuoti, il socket utilizzato per tale connex
avrà le seguenti impostazioni
src_ip C
src_port <ephemeral>
dst_ip S
dsp_port 21
dove "<ephemeral>" significa che la porta viene assegnata
automaticamente dallo stack di rete del client utilizzando la
prima porta disponibile nel range dinamico, diciamo che
tale porta sia (es.) la 2539; in tal caso supponendo che C
abbia IP 192.0.2.1 e che S abbia IP 192.0.2.100 avremo
src_ip 192.0.2.1
src_port 2539
dst_ip 192.0.2.100
dst_port 21
una volta stabilita la connessione ed inviate le credenziali
di accesso (supponendo che non si tratti di un ftp che
permette connessioni anonime) il client potrà inviare al
server comandi quali (es.) SYS, STAT, PWD ed altri
questi verranno ricevuti sulla connessione attiva e le
relative risposte arriveranno utilizzando la stessa MA
nel caso in cui il comando richieda l'invio di un flusso
dati da parte del server le cose cambieranno; se ad
esempio il client volesse ricevere l'elenco dei files
della directory corrente (comando LS) ecco ciò che
succederebbe
Il client invia al server un comando PORT formato in
questo modo
PORT 192,0,2,1,4,15
le prime quattro cifre di tale comando rappresentano
l'indirizzo IP del client (192.0.2.1) le successive due
rappresentano invece il numero della *porta* sulla
quale il client si metterà in *ascolto* nel caso di cui
sopra la porta è 0x040F ossia la porta 1039
in pratica il client prima di inviare al server il comando
PORT creerà un "listen" socket senza specificare la
porta, lo stack di rete a questo punto assegnerà al
socket un numero porta (dinamico, libero come sopra)
ed il client userà tale numero per il comando "PORT"
visto sopra
dopo aver inviato il comando PORT il client potrà
quindi inviare al server FTP il comando "LS"; il server,
ricevendo tale comando creerà un socket del tipo
src_ip S
src_port 20
dst_ip C
dst_port 1039
ossia, sempre facendo riferimento all'esempio
src_ip 192.0.2.100
src_port 20
dst_ip 192.0.2.1
dst_port 1039
come è facile notare, dst_ip e dst_port corrispondono a
quanto specificato dal client nel comando "PORT" mentre
la "src_port" ossia la porta usata dal server come origine
per la connessione sarà SEMPRE la porta 20/tcp; a questo
punto una volta che il server avrà stabilito la connessione
*verso* il client (porta 20 server -> porta 1039 client)
il server invierà il flusso dati richiesto e chiuderà il socket
(la connessione) lasciando invariata l'altra connessione
ossia quella sulla porta 21 (canale comandi)
Come credo sia facile capire, è del tutto inutile aprire la
porta 20/tcp in ingresso, dato che FTP usa tale porta solo
come porta *origine* per connessioni *in uscita* :)
FTP passivo
per quanto riguarda la modalità passiva, relativamente
al "canale comandi" (porta 21) vale quanto già scritto
sopra, quello che cambia è la modalità di trasferimento
dati, in modalità passiva, il client invece di inviare al server
un comando "PORT" specificando il proprio IP e la porta
locale in ascolto, invierà al server un comando PASV
senza alcun parametro, il server risponderà a tale comando
con un messaggio del tipo
227 Entering Passive Mode (192,0,2,100,195,149)
il messaggio specifica l'indirizzo IP del server (prime quattro
cifre) e la porta sulla quale il SERVER si metterà in *ascolto*
per ricevere la connessione dal client; in questo caso la porta
0xC395 ossia la 50069
Il client alla ricezione del messaggio creerà un socket con
le seguenti impostazioni
src_ip 192.0.2.1
src_port <ephemeral>
dst_ip 192.0.2.100
dst_port 50069
dove la porta origine sarà valorizzata dallo stack di rete (come
sopra) mentre IP e porta destinazione corrisponderanno a quelli
ritornati dal server FTP
in questo caso, oltre al fatto che la porta 20 non ha nessun ruolo
c'è da notare che il server FTP dovrebbe essere configurato in
modo da usare per la modalità passiva un ben determinato
intervallo di porte (es. 9000....9500) ed un eventuale NAT/Firewall
posto di fronte al server dovrebbe essere configurato con regole
di port forwarding per l'intervallo di porte selezionato
Spero di essere stato chiaro
ciao