sockhole
is a decrypting
SOCKS
proxy.
When it receives a request to make a connection to a port listed in its
TLS_PORTS
list, it will establish the encrypted connection itself, verify the
TLS certificate, and then proxy decrypted data to the client as if the
connection were made to a plaintext service.
This is intended to support old software/equipment which supports SOCKS proxies
but does not support SSL/TLS or modern ciphers.
That software can establish a plaintext connection over a trusted LAN
connection to a local machine running sockhole
, and the sockhole
proxy can
establish a secure tunnel over the public internet.
For example, a computer running a POP3 client with SOCKS proxy support but no SSL support can connect to a remote POP3 server over TLS just by switching the port configured in the POP3 client to 995 (POP3S).
server$ bundle install --path vendor/bundle
server$ bundle exec ruby sockhole.rb
Supported options:
-a allowed range
: add the IP/mask to the list of allowed IPs; defaults to the /24 of the listen IP-d
: enable debugging-p port
: set the listen port (defaults to 1080)-i ip
: set the listen IP (defaults to the first non-loopback IP on all interfaces)
curl
should be instructed to use the http
protocol on port 443, not
https
, or else it will expect encrypted data to come through the SOCKS proxy.
However, when specifying a URL of http://example.com:443/
, curl
will send a
header of Host: example.com:443
which may cause problems on the server end
with it not matching a configured virtual host.
The -H
option can be used to override the sent Host
header to remove the
port:
server$ bundle exec ruby sockhole.rb
[2020-11-12 08:47:24 -0600] [I] [server] listening on 192.168.1.1:1080
client$ curl -H "Host: example.com" --preproxy socks5h://192.168.1.1 http://example.com:443/
<!doctype html>
...
When connecting to a TLS host with an invalid certificate, sockhole
will reject
the client before it sends any data.
client$ curl -H "Host: wrong.host.badssl.com" --preproxy socks5h://192.168.1.1 http://wrong.host.badssl.com:443/
curl: (97) connection to proxy closed
client$ nc -x 192.168.1.1 imap.fastmail.com imaps
* OK IMAP4 ready