``` Filename: 232-pluggable-transports-through-proxy.txt Title: Pluggable Transport through SOCKS proxy Author: Arturo Filastò Created: 28 February 2012 Status: Closed Implemented-In: 0.2.6 Overview Tor introduced Pluggable Transports in proposal "180 Pluggable Transports for circumvention". The problem is that Tor currently cannot use a pluggable transport proxy and a normal (SOCKS/HTTP) proxy at the same time. This has been noticed by users in #5195, where Tor would be failing saying "Unacceptable option value: You have configured more than one proxy type". Trivia This comes from a discussion that came up with Nick and I promised to write a proposal for it if I wanted to hear what he had to say. Nick spoke and I am writing this proposal. Acknowledgments Most of the credit goes to Nick Mathewson for the main idea and the rest of it goes to George Kadianakis for helping me out in writing it. Motivation After looking at some options we decided to go for this solution since it guarantees backwards compatibility and is not particularly costly to implement. Design overview When Tor is configured to use both a pluggable transport proxy and a normal proxy it should delegate the proxying to the pluggable transport proxy. This can be achieved by specifying the address and port of the normal proxy to the pluggable transport proxy using environment variables: When both a normal proxy and the ClientTransportPlugin directives are set in the torrc, Tor should put the address of the normal proxy in an environment variable and start the pluggable transport proxy. When the pluggable transport proxy starts, it should read the address of the normal proxy and route all its traffic through it. After connecting to the normal proxy, the pluggable transport proxy notifies Tor whether it managed to connect or not. The environment variables also contain the authentication credentials for accessing the proxy. Specifications: Tor Pluggable Transport communication When Tor detects a normal proxy directive and a pluggable transport proxy directive, it sets the environment variable: "TOR_PT_PROXY" -- This is the address of the proxy to be used by the pluggable transport proxy. It is in the format: ://[][:][@]: ex. socks5://tor:test1234@198.51.100.1:8000 socks4a://198.51.100.2:8001 Acceptable values for are: 'socks5', 'socks4a' and 'http'. If no can be specified (e.g. in 'socks4a'), it is left out. If the pluggable transport proxy detects that the TOR_PT_PROXY environment variable is set, it attempts connecting to it. On success it writes to stdout: "PROXY DONE". On failure it writes: "PROXY-ERROR ". If Tor does not read a PROXY line or it reads a PROXY-ERROR line from its stdout and it is configured to use both a normal proxy and a pluggable transport it should kill the transport proxy. ```