63

I'm currently doing some testing work with TOR and ran in to a small problem. Tor's client only supports receiving connections through a SOCKS5 protocol, but the applications I'm using only support HTTP Proxy Protocals.

Is it possible to put something in the middle? So that for example it went.

My Program (HTTP Only) > HTTP to SOCKS Converter > Tor SOCKS5 Server

1
  • You could use an OS (e.g. Tails and Whonix) that transparently routes all traffic through Tor without the application needing to support proxies at all. This also greatly reduces the risk of DNS leaks and other Tor bypasses. Mar 3, 2018 at 17:51

8 Answers 8

47

It looks like DeleGate can do this, with something like the following (where DeleGate will accept HTTP connections on port 8080 and forward to a SOCKS server on port 9050):

delegated -P8080 SERVER=http SOCKS=localhost:9050
7
  • @Dboy1612: Can you tell about your experience with delegated for this use case. I also have same use-case. Jun 9, 2014 at 12:45
  • 1
    Any idea why does it require an email address during the download AND the install? Jun 23, 2014 at 11:55
  • 3
    @pradeepchhetri After spending a day playing with delegate(d), I've concluded that it is absolutely determined to leak DNS requests, notwithstanding multiple contrary claims in the configuration documentation. I would love to discover that I'm wrong about that, but I'm pessimistic on that point. Dec 30, 2014 at 9:00
  • 1
    Brilliant :) very east to get something up with this Docker image too: hub.docker.com/r/vimagick/delegated
    – jkp
    Feb 1, 2017 at 10:31
  • 2
    delegate.org seems to be down, any alternative? Jan 7, 2018 at 15:00
21

You can also use Privoxy. Add this line to its config.txt file:

forward-socks5 / 127.0.0.1:9050 .

(Don't forget the small dot at the end.)

Then use the HTTP or HTTPS proxy at 127.0.0.1:8118

3
  • an awesome and easy way. thank you. works like a charm Aug 24, 2017 at 21:24
  • Life saver. Thank you. Feb 17, 2020 at 11:57
  • Keep in mind that Privoxy does not support HTTP/2 (therefore, gRPC): privoxy.org/faq/misc.html#HTTP2. This was important for me.
    – kzu
    May 20, 2021 at 22:01
11

Tor bundle no longer has polipo, here is from the official tor FAQ:

In the past, Tor bundles included an HTTP proxy like Privoxy or Polipo, solely to work around a bug in Firefox that was finally fixed in Firefox 6. Now you don't need a separate HTTP proxy to use Tor, and in fact leaving it out makes you safer because Torbutton has better control over Firefox's interaction with websites.

If you are trying to use some external application with Tor, step zero should be to reread the set of warnings for ways you can screw up. Step one should be to try to use a Socks proxy rather than an http proxy — Tor runs a Socks proxy on port 9050 on Windows, or see above for OSX and Linux.

If that fails, feel free to install privoxy. However, please realize that this approach is not recommended for novice users. Privoxy has an example configuration of Tor and Privoxy.

1
  • 1
    It worked for me tnx!
    – Hikari
    Apr 1, 2015 at 13:08
11

HTTP Proxy to Socks5

Install python-proxy

$ pip3 install pproxy
$ pproxy -r socks5://127.0.0.1:9150 -vv

Usage

http://127.0.0.1:8080
https://127.0.0.1:8080
1
  • only this works for me, in 2022 . you saved my day!
    – Siwei
    May 13, 2022 at 6:18
5

You didn't specify an operating system. Please do so in future.


This answer recommends Polipo, which is included in the Vidalia bundle hosted by the Tor project and therefore probably recommended by them for Windows. Polipo also has a *nix version (and was originally designed for *nix), so I've included instructions on how to set it up - see the second section below. It is a rather lightweight solution, if it matters.


##Windows

Download the Vidalia bundle. It includes the Vidalia GUI and a program called Polipo, along with Tor. In the bundle, Polipo by default runs a HTTP proxy on port 8118 that redirects through the Tor SOCKS proxy on port 9050.

###Advanced setup

It's also possible to configure Polipo manually, without the Vidalia bundle.

Taken from https://www.irif.fr/~jch/software/polipo/tor.html

They also provide binaries you should download.

###Configuration

Polipo is configured by setting a number of configuration variables in Polipo's configuration file, which is a plain text file. In order to tell Polipo to use tor and not to cache any fetched pages on disk, you will want to add the following lines to your configuration file:

socksParentProxy = localhost:9050
diskCacheRoot=""

You will also want to disable the local configuration interface in order to protect yourself from browser vulnerabilities:

disableLocalInterface=true

###Running it

When running Polipo, you should specify the location for the configuration file, by using the -c flag on Polipo's command line:

> polipo.exe -c "/Program Files/Polipo/config.txt"

Note that even under Windows you must use Unix syntax for the filename (using forward slashes) and you cannot specify a device (“drive”) to use.

The Polipo default listening port is 8123.

The default config from the Vidalia bundle is included at the bottom of this answer.


##*nix

Includes Linux, Unix, BSD, OS X, most major modern (2012) operating systems that are not based on NT (Windows).

Once again, taken from https://www.irif.fr/~jch/software/polipo/tor.html

Download a package from whatever repository you use. Google may help here. Alternatively, a direct binary can be downloaded.

###Configuration

Polipo is configured by setting a number of configuration variables in Polipo's configuration file, which is either ~/.polipo or /etc/polipo/config, whichever exists. In order to tell Polipo to use tor and not to cache any fetched pages on disk, you will want to add the following lines to your configuration file:

socksParentProxy = localhost:9050
diskCacheRoot=""

You will also want to disable the local configuration interface in order to protect yourself from browser vulnerabilities:

disableLocalInterface=true

If you want to specify a different location for the configuration file, you can specify it by using the -c flag on Polipo's command line.

Note that if you installed Polipo from a distribution-provided binary, it will probably not take ~/.polipo into account — you will need to edit /etc/polipo/config.

###Running it

If you installed Polipo from a distribution-provided package, Polipo is probably already running; you will need to restart it so it takes its new configuration into account. Otherwise, just grab a free terminal window and type:

$ polipo

If you are using a non-standard location for Polipo's configuration file, specify it on the command line, for example:

$ polipo -c "/Program Files/Polipo/config.txt"

The Polipo default listening port is 8123.

The default config from the Vidalia bundle is included at the bottom of this answer.


##Default Polipo config (Vidalia bundle)

This is my default Polipo configuration from the Vidalia bundle for Windows. From the look of it, it should work in *nix too - there's nothing platform specific as far as I can tell. Yes, it is an IPv4 config.

### $Id$
#
### Basic configuration
### *******************

# Uncomment one of these if you want to allow remote clients to
# connect:

# proxyAddress = "::0"        # both IPv4 and IPv6
# proxyAddress = "0.0.0.0"    # IPv4 only

proxyAddress = "127.0.0.1"
proxyPort = 8118

# If you do that, you'll want to restrict the set of hosts allowed to
# connect:

# allowedClients = "127.0.0.1, 134.157.168.57"
# allowedClients = "127.0.0.1, 134.157.168.0/24"

allowedClients = 127.0.0.1
allowedPorts = 1-65535

# Uncomment this if you want your Polipo to identify itself by
# something else than the host name:

proxyName = "localhost"

# Uncomment this if there's only one user using this instance of Polipo:

cacheIsShared = false

# Uncomment this if you want to use a parent proxy:

# parentProxy = "squid.example.org:3128"

# Uncomment this if you want to use a parent SOCKS proxy:

socksParentProxy = "localhost:9050"
socksProxyType = socks5


### Memory
### ******

# Uncomment this if you want Polipo to use a ridiculously small amount
# of memory (a hundred C-64 worth or so):

# chunkHighMark = 819200
# objectHighMark = 128

# Uncomment this if you've got plenty of memory:

# chunkHighMark = 50331648
# objectHighMark = 16384

chunkHighMark = 33554432

### On-disk data
### ************

# Uncomment this if you want to disable the on-disk cache:

diskCacheRoot = ""

# Uncomment this if you want to put the on-disk cache in a
# non-standard location:

# diskCacheRoot = "~/.polipo-cache/"

# Uncomment this if you want to disable the local web server:

localDocumentRoot = ""

# Uncomment this if you want to enable the pages under /polipo/index?
# and /polipo/servers?.  This is a serious privacy leak if your proxy
# is shared.

# disableIndexing = false
# disableServersList = false

disableLocalInterface = true
disableConfiguration = true

### Domain Name System
### ******************

# Uncomment this if you want to contact IPv4 hosts only (and make DNS
# queries somewhat faster):
#
# dnsQueryIPv6 = no

# Uncomment this if you want Polipo to prefer IPv4 to IPv6 for
# double-stack hosts:
#
# dnsQueryIPv6 = reluctantly

# Uncomment this to disable Polipo's DNS resolver and use the system's
# default resolver instead.  If you do that, Polipo will freeze during
# every DNS query:

dnsUseGethostbyname = yes


### HTTP
### ****

# Uncomment this if you want to enable detection of proxy loops.
# This will cause your hostname (or whatever you put into proxyName
# above) to be included in every request:

disableVia = true

# Uncomment this if you want to slightly reduce the amount of
# information that you leak about yourself:

# censoredHeaders = from, accept-language
# censorReferer = maybe

censoredHeaders = from,accept-language,x-pad,link
censorReferer = maybe

# Uncomment this if you're paranoid.  This will break a lot of sites,
# though:

# censoredHeaders = set-cookie, cookie, cookie2, from, accept-language
# censorReferer = true

# Uncomment this if you want to use Poor Man's Multiplexing; increase
# the sizes if you're on a fast line.  They should each amount to a few
# seconds' worth of transfer; if pmmSize is small, you'll want
# pmmFirstSize to be larger.

# Note that PMM is somewhat unreliable.

# pmmFirstSize = 16384
# pmmSize = 8192

# Uncomment this if your user-agent does something reasonable with
# Warning headers (most don't):

# relaxTransparency = maybe

# Uncomment this if you never want to revalidate instances for which
# data is available (this is not a good idea):

# relaxTransparency = yes

# Uncomment this if you have no network:

# proxyOffline = yes

# Uncomment this if you want to avoid revalidating instances with a
# Vary header (this is not a good idea):

# mindlesslyCacheVary = true

# Suggestions from Incognito configuration
maxConnectionAge = 5m
maxConnectionRequests = 120
serverMaxSlots = 8
serverSlots = 2
tunnelAllowedPorts = 1-65535
2
  • I am using polipo on Mac OS X 10.6. It seems to have some problems when doing POST requests sometimes. The official site of polipo are here and here. Apr 3, 2013 at 5:47
  • 1
    I am also using 3proxy on Windows. I use it to turn my SSH tunnel (SOCKS5) into a HTTP proxy for programs that do not support SOCKS. 3proxy is developed by Russians. It is open-source. The official site is here and its SourceForge project is here (not as updated as the official site). Apr 3, 2013 at 6:06
2

Fiddler also allows a conversion from http request to a socks tunnelled request.

I did this to push some Windows Updates to run through a socks connection (via Amazon EC2 and Putty).

From this page https://groups.google.com/forum/#!topic/httpfiddler/6m2xEe0fRmw

In Fiddler there is a "FiddlerScript" tab where you can add the following:

Using the X-OverrideGateway flag, use the socks= prefix to indicate that >Fiddler should use the SOCKS v4a protocol when speaking to the upstream server.

For instance, the TOR installer sets up an entry point to the TOR network using a SOCKS proxy on port 9150 called Polipo. You can add the following inside your FiddlerScript’s OnBeforeRequest method to route any request to test.example.com through the TOR network:

    if (oSession.HostnameIs("test.example.com")) {
      oSession["x-OverrideGateway"] = "socks=127.0.0.1:9150";    
  }

If you’d instead prefer to send all of the traffic via the SOCKS, you can simply set the X-OverrideGateway flag unconditionally for each Session.

0

WinGate can also do this. Check the Connection tab on your WWW proxy and you can choose upstream SOCKS4, SOCKS4a, or HTTP proxy.

WinGate also has a free license for 10 concurrent users.

WWW Proxy Connection tab

Disclaimer: I work for Qbik who are the authors of WinGate

0

A really nice solution can be found in tinyproxy. According to its homepage it is a "a light-weight HTTP/HTTPS proxy daemon for POSIX operating systems". The project is over 22 years old and still actively maintained. It can be configured to forward all traffic to an upstream socks proxy using the following line in its config file:

upstream socks5 $IP:$PORT

Alternatively it can be configured to split traffic to one of several upstream proxies, depending on the target URL:

upstream socks5 $IP1:$PORT1 ".some.domain"
upstream http $IP2:$PORT2 ".some.other.domain"

Any traffic that is not explicitly routed through an upstream, will be routed via the gateway of node that is running tinyproxy.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .