Reverse Tunnel vs FTP (vsftpd).

Ultimamente ho studiato molto il funzionamento dei tunnel con SSH. Nessun problema a forwardare una connessione HTTP o SSH. Con il protocollo FTP viene fuori il problema della connessione dati. La porta 21 infatti, accetta solo comandi dal client. Nel momento in cui il client richiede l’ invio o la ricezione di un file, i dati di questo vengono trasveriti mediante un’ altra connessione TCP/IP. Client e server possono mettersi daccordo su questa “connessione di servizio” in 2 modalità: attiva e passiva. In modalita attiva, il client FTP apre una porta in ascolto e dice al server FTP di stabilire la connessione dati collegandosi a questa porta (comando PORT). In modalità passiva il client chiede al server FTP a quale porta collegarsi per effettuare la connenssione per la trasmissione dei dati (comando PASV). Per maggiori dettagli vedi qui. Quindi per tunnellizzare un server FTP non è sufficiente forwardare la sola porta 21. Quello che si può fare è:

-Utilizzare la modalità passiva.

-Configurare il server FTP in modo che utilizzi, per le connessioni dati passive, un range di porte da noi stabilito (es. 20091-20100).

-Configurare il server FTP in modo da  forzare la risposta al comando PASV con l’ IP della macchina del demone SSH.

-Effettuare il port forwarding di tutte le porte in gioco (ovvero la 21 e il range 20091/20100) verso il server SSH mediante reverse tunnel.

Questa è la teoria, adesso faccio un esperimento nella mia piccola LAN. Nel mio caso il server SSH gira su un Banana PI e il suo IP è 192.168.1.205 mentre il server FTP vsftpd è installato su un Raspberry PI con IP 192.168.1.248 . Quello che voglio fare è collegare il mio laptop (192.168.1.119) al server FTP del Raspberry PI attraverso il Banana PI. Per configurare correttamente vsftpd sul Raspberry PI dovrò modificare il file /etc/vsftpd.conf

pasv_enable=YES
pasv_min_port=20091
pasv_max_port=20100
pasv_address=192.168.1.205

Adesso bisogna creare tanti reverse tunnel dal Raspberry PI (da dove gira il server FTP), per tutte le porte necessarie. Se per la porta di controllo possiamo specificare valori di porte diversi tra origine e destinazione, per i socket dati le porte di origine e destinazione dovranno avere necessariamente lo stesso valore.

ssh -Ng -R *:20021:localhost:21 pi@192.168.1.205 
ssh -Ng -R *:20091:localhost:20091 pi@192.168.1.205 
ssh -Ng -R *:20092:localhost:20092 pi@192.168.1.205 
ssh -Ng -R *:20093:localhost:20093 pi@192.168.1.205 
ssh -Ng -R *:20094:localhost:20094 pi@192.168.1.205 
ssh -Ng -R *:20095:localhost:20095 pi@192.168.1.205 
ssh -Ng -R *:20096:localhost:20096 pi@192.168.1.205 
ssh -Ng -R *:20097:localhost:20097 pi@192.168.1.205 
ssh -Ng -R *:20098:localhost:20098 pi@192.168.1.205 
ssh -Ng -R *:20099:localhost:20099 pi@192.168.1.205 
ssh -Ng -R *:20100:localhost:20100 pi@192.168.1.205 

Finito. Aprendo il client FTP sul mio laptop (192.168.1.119) andrò a impostare l’ host 192.168.1.205 e la porta 20021 per collegarmi di fatto al server FTP che invece gira sull’host 192.168.1.248 in ascolto sulla porta 21.

L’ inconveniente di questa tecnica è che bisogna creare dei tunnel a prescindere dall’ effettiva utilità e assicurarsi inoltre che questi tunnel non cadano. Naturalmente tutto questo può essere affinato per esempio utilizzando autossh e utilizzando la chiave pubblica del server FTP per l’autenticazione automatica al server SSH.

Annunci
Questa voce è stata pubblicata in Senza categoria e contrassegnata con , , , , , . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...