Sto lavorando a un progetto che deve implementare una connessione Reverse Socks5. In termini pratici, il browser (Chrome / FireFox / Opera / IE) si connetterà a un server locale di socks (127.0.0.1:8080) e su questo stesso server avrò una connessione client remota su un'altra porta (192.168.0.9: 8081).
Dopo aver aperto un sito Web sul browser, è possibile eseguire più richieste (html, immagini, script ...), dovrei passare dalla porta 8080 alla connessione sulla porta 8081. Il client remoto deve eseguire le richieste e rispedisci la risposta sulla porta 8081, una volta arrivato dovrei reindirizzare questa risposta sul tunnel alla porta 8080 e consegnarla al browser.
Ho provato a creare un diagramma per mostrare il mio flusso di dati:
Fingo di utilizzare le classi Indy (IdTCPServer / IdTCPClient), ma non importa quale classe verrà utilizzata.
Il problema arriva quando ho bisogno di inviare le richieste tramite la connessione sulla porta 8081:
-
Non so quante richieste farà il browser, quindi apro solo 1 connessione sulla porta 8081. Devo passare tutte le richieste su questa connessione?
-
Se la risposta per la prima domanda era Sì, una volta che ho risposto a Socks5 per rispondere, come il server conoscerà la connessione sulla porta 8080 che la risposta dovrebbe essere consegnata?
-
Se la risposta per la prima domanda era No, quindi dovrei creare nuove connessioni sulla porta 8081 per elaborare le richieste. Una volta ricevuta una nuova connessione, invio la richiesta a questa connessione, eseguo sul client, restituisco su questa connessione. Ma dovrei tenere traccia della connessione del browser che ha fatto la richiesta, per consegnarla. E ancora, dovrei inviare un testo o qualcosa del genere, sulla prima connessione sulla porta 8081, per richiedere una nuova connessione. Non è troppo complicato?
Mi manca qualche punto su come costruire correttamente un tunnel TCP? Non è possibile creare un tunnel che trasmetta solo le richieste / risposte alle giuste connessioni, senza interferenze del Server?