SSLH(8)
π SSLH(8) β like, the whole entire manual, bestie π«Ά
Okay so welcome to sslh(8), the protocol demultiplexer β¨ β yes that's a big word, no I will not be apologizing, it's giving main character energy and honestly it deserves it π . Buckle up, we're going through everything.
πΈ SYNOPSIS πΈ
sslh [-Fconfig file] [-t num] [--transparent] [-p listening address [-p
listening address ...] [--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 n] [-i] [-V]
[-f] [-n]
π¦ DESCRIPTION π¦
So here's the tea β: sslh accepts connections on whatever ports you tell it to, and then forwards them further based on tests performed on the first data packet sent by the remote client. Like a little bouncer at the club door, checking IDs π.
Probes for HTTP, TLS, SSH, OpenVPN, tinc, XMPP are implemented β and any other protocol that can be tested using a regular expression can be recognised too. Iconic, honestly.
The typical use case, iykyk: allow serving several services on port 443 (e.g. to connect to ssh from inside a corporate firewall, which almost never blocks port 443) while still serving HTTPS on that port. Corporate firewalls stay mad π.
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. Cute origin story fr fr.
π Libwrap support
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. Sad but true π.
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. Slay π«Ά.
π Configuration file
A configuration file can be supplied to sslh. Command line arguments override file settings. (Important. Write it down. Tattoo it. Whatever.) 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. Regex girlies rise β¨.
π₯ Probing protocols
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 always be used last, as it always succeeds and further protocols will never be tried. Like, it eats the whole buffet and leaves nothing for anyone else π.
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.
π Logging
As a security/authorization program, sslh logs to the LOG_AUTH facility, with priority LOG_INFO for normal connections and LOG_ERR for failures. It's giving responsible adult π
.
β¨ OPTIONS β¨
-Ffilename,--config filenameβ Uses filename as configuration file. If other command-line options are specified, they will override the configuration file's settings. File says one thing, you say another, you win π .-t num,--timeout numβ Timeout before forwarding the connection to the timeout protocol (which should usually be SSH). Default is2s.--on-timeout protocol nameβ Name of the protocol to connect to after the timeout period is over. Default is to forward to the first specified protocol. It usually makes sense to specify'ssh'as the timeout protocol, as the SSH specification does not tell who is supposed to speak first and a large number of SSH clients wait for the server to send its banner. Awkward silence protocol π.--transparentβ Makessslhbehave as a transparent proxy, i.e. the receiving service sees the original client's IP address. π«Ά
Heads up bestie: this works on Linux only and involvesiproute2settings. In some cases alsoiptables/nftablessettings are needed. Refer to the README or <https://github.com/ftasnetamot/sslh/blob/2014-08-16--close-filehandles-with-detach/doc/simple_transparent_proxy.md> for more information.
-p listening address,--listen listening addressβ Interface and port on which to listen, e.g.foobar:443, wherefoobaris the name of an interface (typically the IP address on which the Internet connection ends up).
This can be specified several times to bind sslh to several addresses. Collect them all π.
--tls target addressβ Interface and port on which to forward SSL connection, typicallylocalhost:443.
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. Networking slay β¨.
Also, sslh probes for TLS handshakes 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 --anyprot instead instead. (Yes, really. That's the workaround. Don't come for me.)
--ssh target addressβ Interface and port on which to forward SSH connections, typicallylocalhost:22.--openvpn target addressβ Interface and port on which to forward OpenVPN connections, typicallylocalhost:1194.--xmpp target addressβ Interface and port on which to forward XMPP connections, typicallylocalhost:5222.--http target addressβ Interface and port on which to forward HTTP connections, typicallylocalhost:80.--tinc target addressβ Interface and port on which to forward tinc connections, typicallylocalhost:655.
This is experimental. If you use this feature, please report the results (even if it works!) π
--anyprot target addressβ Interface and port on which to forward if no other protocol has been found. Becausesslhtries protocols in the order specified on the command line, this should be specified last. If no default is specified,sslhwill forward unknown protocols to the first protocol specified. The catch-all bestie π«Ά.-v,--verbose nβ Override all verboseness. Refer toexample.cfgfor all verbose sub-options.-n,--numericβ Do not attempt to resolve hostnames: logs will contain IP addresses. This is mostly useful if the system's DNS is slow and running thesslh-selectvariant, as DNS requests will hang all connections. Not the vibe π.-Vβ Printssslhversion.-u username,--user usernameβ Requires to run under the specified username.-C chroot,--chroot chrootβ Requires to run under the specified chroot.-P pidfile,--pidfile pidfileβ Specifies a file in which to write the PID of the main server.-i,--inetdβ Runs as aninetdserver. Options-P(PID file),-p(listen address),-u(user) are ignored.-f,--foregroundβ Runs in foreground. The server will not fork and will remain connected to the terminal. Messages normally sent to syslog will also be sent tostderr.--backgroundβ Runs in background. This overrides foreground if set in the configuration file (or on the command line β but there is no point setting both on the command line unless you have a personality disorder ππ). Straight from the manual, bestie. I don't make the rules.
π FILES π
/etc/init.d/sslhβ Start-up script. The standard actionsstart,stopandrestartare supported. The holy trinity π./etc/default/sslhβ Server configuration. These are environment variables loaded by the start-up script and passed tosslhas command-line arguments. Refer to the OPTIONS section for a detailed explanation of the variables used bysslh.
π§ SEE ALSO π§
The latest version is available from <https://github.com/yrutschle/sslh>. There you can find a more detailed and recent documentation. Go read it, she's thorough π.
β AUTHOR β
Written by Yves Rutschle. Respect the legend π«Ά.
And that's the whole page, bestie β no skips, no summarizing, every single flag made it in π. This was SSLH(8), version 2.3.1, dated 2026-06-21 β see you in the group chat, mwah ππ
π¦ where this page comes from
- epel 9: sslh 2.3.1-4.el9 Β· GPL-2.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms