Run SSH, HTTPS, OpenVPN, and XMPP on the same port. SSLH detects the protocol at connection time and forwards it to the right backend — a lifesaver on networks where only port 443 is open.
FROM scratch, no OS, no shell, no package managersslh-ev (default, libev), sslh-select, sslh-forkEvery build ships a Sigstore-signed SBOM and a full Trivy scan — verify them yourself, no login required:
gh attestation verify oci://ghcr.io/oorabona/sslh:latest --owner oorabona
Full walkthrough (SBOM payload, Trivy findings, multi-arch manifest inspection, upstream dependency tracking) → https://oorabona.github.io/docker-containers/verify-images/
Available SSLH flavors (v2.0+):
sslh-fork - Original SSLH projectsslh-select - Uses select instead of epollsslh-ev - Uses libev (default, best performance)IMPORTANT: This is a
FROM scratchimage with no shell. Environment variables are NOT supported for configuration. You must provide full command line arguments.
# Check version
docker run --rm oorabona/sslh
# Run with full command line
docker run -d \
--name sslh \
-p 443:443 \
oorabona/sslh \
-f \
-p 0.0.0.0:443 \
--ssh ssh.example.com:22 \
--tls backend.example.com:8443 \
--openvpn vpn.example.com:1194
Key arguments:
-f - Required: Keep process in foreground (Docker expects this)-p <ip>:<port> - Listen address and port--ssh <host>:<port> - SSH backend--tls <host>:<port> - TLS/HTTPS backend--openvpn <host>:<port> - OpenVPN backendBy default, sslh-ev is used. To use a different flavor, override the entrypoint:
# Use sslh-fork
docker run -d --entrypoint /usr/local/bin/sslh-fork oorabona/sslh -f -p 0.0.0.0:443 ...
# Use sslh-select
docker run -d --entrypoint /usr/local/bin/sslh-select oorabona/sslh -f -p 0.0.0.0:443 ...
services:
sslh:
image: oorabona/sslh
ports:
- "443:443"
command:
- -f
- -p
- "0.0.0.0:443"
- --ssh
- "192.168.1.2:22"
- --tls
- "192.168.2.1:8443"
- --openvpn
- "192.168.2.1:1194"
restart: unless-stopped
For complex configurations, use a config file:
docker run -d \
--name sslh \
-p 443:443 \
-v /path/to/sslh.cfg:/etc/sslh.cfg:ro \
oorabona/sslh -f -F /etc/sslh.cfg
# Maximum security runtime configuration
docker run -d \
--name sslh \
--read-only \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--security-opt no-new-privileges:true \
-p 443:443 \
oorabona/sslh -f -p 0.0.0.0:443 --ssh backend:22 --tls backend:8443
services:
sslh:
image: ghcr.io/oorabona/sslh:latest
read_only: true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
security_opt:
- no-new-privileges:true
ports:
- "443:443"
command:
- -f
- -p
- "0.0.0.0:443"
- --ssh
- "backend:22"
- --tls
- "backend:8443"
restart: unless-stopped
foreground: true;
listen:
(
{ host: "0.0.0.0"; port: "443"; }
);
protocols:
(
{ name: "ssh"; service: "ssh"; host: "localhost"; port: "22"; fork: true; },
{ name: "openvpn"; host: "localhost"; port: "1194"; },
{ name: "xmpp"; host: "localhost"; port: "5222"; },
{ name: "http"; host: "localhost"; port: "80"; },
{ name: "tls"; host: "localhost"; port: "443"; log_level: 0; },
{ name: "anyprot"; host: "localhost"; port: "443"; }
);
sslh-fork doesn't support UDP.For more examples, see the SSLH project.
./make build sslh
v2.0.0). Defaults to latestalpine)latest)1)Example with custom arguments:
./make build sslh v2.0.0
MIT
Content type
Image
Digest
sha256:29a2f4af4…
Size
2.4 MB
Last updated
1 day ago
docker pull oorabona/sslh