An application protocol multiplexer
In a nutshell, this application lets you run multiple kinds of applications on a single port. This is useful for, for instance, running an OpenVPN server and a TLS/HTTPS server on port 443, which in turn is useful for evading firewalls that block all other outbound ports.
Compile the multiplexer with
go build protoplex.go
and then run it with (for example, to run SSH and HTTPS)
./protoplex -ssh your_ssh_host:22 -tls your_webserver:443
Protoplex is now running on port 8443
and ready to accept connections.
For more extensive configuration, please see the output of -help
.
A docker image may be used for ease of use and deployment.
The concepts for this multiplexer were as follows:
- Resource usage about on par with
sslh
- Easily extensible
- Highly dynamic
To this end, protoplex supports multiple matching methods for protocols:
- Bytestring comparison
- Regex matching
These can both be implemented for a protocol, with bytestrings taking priority (due to efficiency). In addition, protocols support matching limits, reducing the amount of protocols evaluated for a given handshake.
Currently supported protocols are:
- SSH
- HTTP
- TLS (/ HTTPS)
- OpenVPN
- SOCKS4 / SOCKS5
- Syncthing Relay (untested, hypothetical)
Feel free to file an issue on the GitHub repository if you want a protocol to be supported. Please include steps to accurately reproduce your client setup.
Alternatively, you may submit a pull request.
GOOS=freebsd GOARCH=amd64 go build -o protoplex.exe protoplex.go