Asio richiede uno scambio SOCKS5 dopo la connessione al proxy
Trattare SOCKS5 come macchina a stati del protocollo sopra il socket Asio, con letture complete, risposte validate e TLS verso la destinazione solo dopo il successo di CONNECT.
Connettere un socket TCP Asio a un listener SOCKS5 completa un passo: la connessione TCP verso quel listener. Non chiede al proxy di connettersi al server finale. Per un test consentito su un bersaglio pubblico, la lista di proxy SOCKS5 offre candidati per quel primo endpoint TCP; il connettore deve comunque eseguire lo scambio qui sotto.
Un connettore SOCKS5 deve quindi eseguire lo scambio del protocollo:
- Inviare un saluto di versione 5 che elenchi i metodi di autenticazione supportati dal client.
- Leggere il metodo scelto ed eseguire il relativo scambio di autenticazione quando richiesto.
- Inviare CONNECT con il tipo di indirizzo della destinazione, l'indirizzo e la porta in ordine di byte di rete.
- Leggere la risposta, controllarne la versione e il codice di risultato, e consumare l'indirizzo associato e la porta completi a lunghezza variabile.
- Consegnare il flusso stabilito al protocollo dell'applicazione.
Un ausiliario chiamato socks5::async_proxy_connect appartiene all'implementazione SOCKS che fornisce tale ausiliario. Nominarlo accanto a boost::asio non lo rende parte dell'interfaccia socket TCP di Asio.
Le letture TCP possono restituire solo una parte di una risposta. Comporre letture per i conteggi di byte richiesti, poi scegliere la lunghezza rimanente dal campo tipo di indirizzo. Non presumere che ogni risposta del server abbia la disposizione IPv4 fissa.
Per HTTPS, eseguire l'handshake TLS verso la destinazione dopo il successo di SOCKS CONNECT, preservando l'SNI e la verifica del nome host della destinazione. Una risposta proxy riuscita da sola non autentica il sito web.
Mantenere annullamento e scadenze lungo l'intera sequenza di configurazione. Se scade il tempo di stabilimento della connessione TCP, i successivi scambi di saluto, autenticazione e CONNECT restano senza limite.