Setting up a temporary HTTP/HTTPS proxy via SSH
Currently I’m working on a project where I have the staging environment running on a virtual machine in a vlan. However, the virtual machine cannot directly access the internet for security reasons. This is inconvenient when I want to e.g. run a buildout to update the project.
A colleague told me to use
micro_proxy and
micro_inetd to proxy
traffic via my laptop. This is a description of how you can set things up.
Ad hoc
Obviously the first step is to install the relevant packages on the local machine (Ubuntu in my case):
$ sudo apt-get install micro-proxy micro-inetd
The next step is to run the proxy (again: on my laptop) and make sure
it accepts connections on port 3128:
$ micro-inetd 3128 /usr/sbin/micro_proxy
Then, when you SSH into the remote machine you will have to forward the right port:
$ ssh box.example.com -R 3128:localhost:3128
Whenever you want to access the internet, you’ll have to use the proxy
listening on port 3128. For instance to run wget and buildout,
you can set the following environment variables:
$ export http_proxy=http://localhost:3128
$ export https_proxy=http://localhost:3128
(Note that I’m also proxying HTTPS traffic here, which is supported by
micro_proxy.)
The following wget command should now succeed:
$ wget http://www.google.com/
Repeatable
Assuming the ad hoc setup works, you may want to configure things so things are a little bit easier the next time you want to use it. This is what I did.
So I don’t have to remember how to start the proxy, I added this line
to the ~/.bashrc file on my local machine:
alias start_proxy='echo Running proxy on port 3128 && micro-inetd 3128 /usr/sbin/micro_proxy'
The SSH command is also too much typing for my liking. So I added this
to my ~/.ssh/config file:
Host box
HostName box.example.com
RemoteForward 3128 localhost:3128
To make sure that the HTTP(S) proxy is used on the remote machine, I
added this to my ~/.bashrc file on the remote:
export http_proxy=http://localhost:3128
export https_proxy=http://localhost:3128
End result
So whenever I want to work on the staging environment, I open a terminal and run:
$ start_proxy
In another terminal I type:
$ ssh box
And I’m good to go.
Now, there may be better solutions (especially if you want to permanently setup a proxy), but for my purposes this works great.
Docker
micro_inetd/micro_proxy combination.
When I originally wrote this article, I was not yet (or only just) using Docker. But when I was setting up a new laptop a while ago, I wanted to run a proxy in a Docker container.
As a result, I now run the following to start a proxy:
$ docker run --name squid -d -p 3128:3128 datadog/squid
This way I don’t have to install micro_proxy and micro_inetd on my machine.