A quanto pare non è mai semplice configurare un server FTP quando questo server si trova dietro un firewall. Le cose si fanno ancora più complicate quando si vuole usare la versione sicura di FTP, ovvero il protocollo FTPS. Cerchiamo di capire come occorre configurare il proprio server per risolvere i problemi più comuni e come gestire il firewall per permettere le connessioni in entrata.
Quando un client FTP(S) vuole trasferire dei dati in modalità passiva (Passive Mode), richiede un trasferimento con il comando PASV. A questa richiesta il server risponde con indirizzo ip e numero di porta a cui il client potrà connettersi per eseguire il trasferimento.
In caso di connessioni dirette questo non è un problema, il server è infatti direttamente raggiungibile all’indirizzo ip e porta specificate. I problemi iniziano a presentarsi nel momento in cui il nostro server si trova dietro un firewall o un NAT.
Il problema delle porte FTPS
Il problema che si presenta in presenza di un firewall (ma anche di un NAT o altri dispositivi di routing) è dato dal fatto che questo sistema si trova in mezzo fra server e client. ciò fa si che il server si trovi con buona probabilità sulla sottorete privata ed abbia quindi un indirizzo ip interno.
Questo fa si che il server scriva sul pacchetto di risposta alla richiesta PASV del client, il proprio indirizzo ip interno e la porta su cui rimarrà in ascolto per la connessione.
Senza nessun intervento esterno, al client arriverebbe un pacchetto contenente l’indirizzo ip privato del server. A questo punto però il client si trova su una sottorete diversa, e quindi non sarebbe più in grado di contattare il server.
Fortunatamente i moderni firewall, NAT e altri dispositivi di routing spesso sono in grado di riconoscere il contenuto della risposta come una risposta ad un comando PASV FTP e quindi sono in grado di modificare la risposta inserendo l’ip pubblico corretto e aprendo la porta necessaria in attesa della connessione del client. Al ricevimento della successiva richiesta da parte del client saranno quindi in grado di identificare correttamente il destinatario interno.
I problemi di presentano però in caso di protocollo FTPS. In questo caso, i pacchetti che viaggiano dal server al client sono crittografati TLS e quindi il firewall/NAT non è in grado di leggerne il contenuto e operare le dovute sostituzioni e aperture di porte.
La soluzione: configurare le porte sul server FTPS
Fortunatamente non siete gli unici ad avere questo problema e quindi gli sviluppatori dei server FTPS hanno trovato una soluzione per voi!
Ci sono solitamente due modalità di funzionamento di un server FTPS: la modalità esplicita e quella implicita. Solitamente la modalità esplicita utilizza in maniera predefinita la porta 21, mentre la modalità implicita usa solitamente le porte 990 e 989.
In base alla configurazione del vostro server dovrete quindi aprire molto probabilmente la porta 21 oppure le porte 990 e 989.
In aggiunta a queste, per la modalità PASV, solitamente viene utilizzato un range di porte (che vengono assegnate ai diversi client). Solitamente queste porte sono configurabili tramite dei parametri di configurazione con nomi tipo pasv_max_port
e pasv_min_port
. Occorrerà quindi aprire sul firewall anche questo range di porte per permettere le connessioni.
Inoltre, per risolvere il problema dell’indirizzo ip interno del server, potreste trovare un ulteriore parametro di configurazione (in vsftpd lo trovate come pasv_address
) in cui sarà necessario specificare l’indirizzo ip pubblico dietro cui si trova il nostro server. Questo indirizzo sarà incluso nella risposta alla richiesta PASV al posto dell’indirizzo interno del server. In questo modo potremo ovviare all’impossibilità da parte del firewall di modificare il pacchetto crittografato TLS.
Conclusioni
In conclusione per garantire il funzionamento di un server FTPS dietro un firewall/NAT occorrerà aprire le porte 21 o 990 e 989 in base all’utilizzo della modalità esplicita o implicita. In più occorrerà aprire il range di porte configurato per la modalità passiva (in vsftpd tramite i parametri di configurazione pasv_max_port
e pasv_min_port
). Per finire occorrerà specificare nel server l’indirizzo ip pubblico sul quale il nostro servizio si presenta (in vsftpd tramite il parametro di configurazione pasv_address
).