SSLH(8) | SSLH(8) |
sslh - protocol demultiplexer
sslh [-Fconfig file] [-t num] [--transparent] [-p listening address [-p listening address ...] [--ssl target address for SSL] [--tls target address for TLS] [--ssh target address for SSH] [--openvpn target address for OpenVPN] [--http target address for HTTP] [--xmpp target address for XMPP] [--tinc target address for TINC] [--anyprot default target address] [--on-timeout protocol name] [-u username] [-C chroot] [-P pidfile] [-v] [-i] [-V] [-f] [-n]
sslh accepts connections on specified ports, and forwards them further based on tests performed on the first data packet sent by the remote client.
Probes for HTTP, SSL, SSH, OpenVPN, tinc, XMPP are implemented, and any other protocol that can be tested using a regular expression, can be recognised. A typical use case is to allow serving several services on port 443 (e.g. to connect to ssh from inside a corporate firewall, which almost never block port 443) while still serving HTTPS on that port.
Hence sslh acts as a protocol demultiplexer, or a switchboard. Its name comes from its original function to serve SSH and HTTPS on the same port.
One drawback of sslh is that the servers do not see the original IP address of the client anymore, as the connection is forwarded through sslh.
For this reason, sslh can be compiled with libwrap to check accesses defined in /etc/hosts.allow and /etc/hosts.deny. Libwrap services can be defined using the configuration file.
A configuration file can be supplied to sslh. Command line arguments override file settings. sslh uses libconfig to parse the configuration file, so the general file format is indicated in <http://www.hyperrealm.com/libconfig/libconfig_manual.html>. Please refer to the example configuration file provided with sslh for the specific format (Options have the same names as on the command line, except for the list of listen ports and the list of protocols).
The configuration file makes it possible to specify protocols using regular expressions: a list of regular expressions is given as the regex_patterns parameter, and if the first packet received from the client matches any of these expressions, sslh connects to that protocol.
When receiving an incoming connection, sslh will read the first bytes sent by the connecting client. It will then probe for the protocol in the order specified on the command line (or the configuration file). Therefore --anyprot should alway be used last, as it always succeeds and further protocols will never be tried.
If no data is sent by the client, sslh will eventually time out and connect to the protocol specified with --on-timeout, or ssh if none is specified.
As a security/authorization program, sslh logs to the LOG_AUTH facility, with priority LOG_INFO for normal connections and LOG_ERR for failures.
When using the shorthand version, make sure there should be no space between -F and the filename.
This can be specified several times to bind sslh to several addresses.
Note that you can set sslh to listen on ext_ip:443 and httpd to listen on localhost:443: this allows clients inside your network to just connect directly to httpd.
Also, sslh probes for SSLv3 (or TLSv1) handshake and will reject connections from clients requesting SSLv2. This is compliant with RFC6176 which prohibits the usage of SSLv2. If you wish to accept SSLv2, use --default instead.
This is experimental. If you use this feature, please report the results (even if it works!)
The latest version is available from <http://www.rutschle.net/tech/sslh>, and can be tracked from <http://freecode.com/projects/sslh>.
Written by Yves Rutschle.
2023-03-23 | 1.20-1+b2 |