Listening services
To allow agents to tunnel SSH connections over different transports, the server must expose the corresponding service, then decapsulate the traffic and forward it to the SSHD server.
Quick choice
Enable only the listeners required by the agent transport order:
| Need | Server listener |
|---|---|
| Direct SSH | sshd-listen-addr |
| HTTP(S) egress | http-listen-addr and optionally https-listen-addr |
| Raw TLS | tls and TLS domain/listener configuration |
| QUIC | quic and quic-listen-addr |
| DNS-only egress | dns and dns-listen-addr |
For all listeners, the listen address flag has the following format: [IP]:[PORT]
If no IP address is provided, the service will listen on all interfaces. However, the : is still required before the port
SSH
No encapsulation, directly exposed.
Configuration
--sshd-listen-addr: The address the SSHD server will listen to. Format:[IP]:[PORT].
TLS
TLS configuration impacts both the SSH over TLS tunnel and the HTTPS web server.
Configuration
--https-listen-addr: the address the TLS server will listen to. Format:[IP]:[PORT].--http-domain: the domain(s) on which the web server will respond (accepts a comma-separated list of multiple domains).--tls-domain: the domain(s) on which the SSH over TLS listener will respond (accepts a comma-separated list of multiple domains).--tls/--no-tls: Enable/Disable the TLS listener. Note that it impacts both the HTTPS web server and the SSH over TLS listener.
TLS keys
The server allows two ways of providing the TLS certificate:
- Either provide a custom certificate
--tls-key: path to the TLS certificate key--tls-cert: path to the TLS certificate
- Let the server handle the certificate:
--letsencrypt-email: the mail used by the ACME protocol
With a custom certificate, the same certificate must be able to handle both domains. This doesn’t apply to the default Let’s Encrypt setup, which issues a separate certificate per domain on demand.
QUIC
Configuration
--quic-listen-addr: the address the QUIC server will listen to. Format:[IP]:[PORT].--quic/--no-quic: Enable/Disable the QUIC listener. Requires--tlsto also be enabled: the QUIC listener does not start otherwise.
If required to open traffic (firewalls), this listener always listens on UDP
HTTP
Configuration
--http-listen-addr: the address the plain HTTP server (serving both the HTTP and WebSocket transports) will listen to. Format:[IP]:[PORT].
SSH over HTTP is available at: http://[HTTP_DOMAIN]/sshttp/ and https://[HTTP_DOMAIN]/sshttp/
The secure https:// variant depends on the TLS listener, not --http-listen-addr: it requires --https-listen-addr, --tls, and --http-domain to be configured (see TLS above).
WebSocket
The WebSocket listener is served by the same HTTP server as the HTTP listener above, and shares its --http-listen-addr configuration. There is no separate flag dedicated to the WebSocket listener.
Agent SSH over WebSocket is available at: ws://[HTTP_DOMAIN]/wssh/{agent-id} and wss://[HTTP_DOMAIN]/wssh/{agent-id}.
The operator-facing SSH-over-WebSocket bridge is a separate endpoint, /ssh-ws/, and is enabled with --ssh-websocket. It is protected by the access token and IP allowlist; see Access control.
As with HTTP, the secure wss:// variant depends on the TLS listener (--https-listen-addr, --tls, --http-domain), not --http-listen-addr.
DNS
The DNS server acts as an authoritative server and responds to DNS queries that match the SSH-over-DNS format.
Configuration
--dns-listen-addr: DNS server listen address. Use port 53 for compatibility with recursive DNS resolvers.--dns-domain: DNS domain for queries. Use the shortest domain possible to maximize throughput.--dns/--no-dns: Enable/Disable the DNS listener.
Internal control channel
Agent control traffic uses Socket.IO independently from the SSH data connection. Socket.IO can use HTTP long polling, WebSocket over HTTP(S), or a WebSocket connection encapsulated over DNS. Direct SSH, TLS, and QUIC are SSH data transports; they do not carry Socket.IO by themselves.
For normal HTTP(S) control, expose the HTTP or HTTPS listener. In a DNS-only deployment, enable the DNS listener and configure the agent’s DNS control path.
SSH authentication roles
The shared SSHD accepts two distinct authentication roles:
- Agents authenticate with their registered public key and agent ID. Their connection may request only reverse port forwarding (
tcpip-forwardand cancellation) plus keepalive messages. Agent-authenticated connections cannot open operator sessions, direct-tcpip channels, or other client features. - Operators authenticate with the agent’s password and agent name. This is the role used by
tealcfor SSH sessions, port access, file transfer, proxies, and management operations. The/ssh-ws/endpoint is only a transport bridge; after it reaches SSHD, the password-authenticated connection is identified as an operator connection in exactly the same way as direct SSH.
The server records the public source IP of agent connections in the agent database. For HTTP/WebSocket transports it uses the HTTP peer address, or a validated X-Forwarded-For value when the peer is listed in --trusted-proxies; raw SSH, TLS, QUIC, and DNS transports use their actual transport peer address. The same address is carried into the SSH connection so registration and connection state report the transport’s real source rather than an internal tunnel or client-ID address.
An agent needs at least one working Socket.IO control path in addition to its SSH data transport. A working SSH transport alone is not enough for the agent to register and receive management instructions.
Flag summary
| Transport | Flag | Description | Example |
|---|---|---|---|
| SSH | --sshd-listen-addr | Address for SSH listener | [IP]:[PORT] |
| TLS | --https-listen-addr | TLS server listen address | [IP]:[PORT] |
| TLS | --tls / --no-tls | Enable/disable TLS listener | --tls |
| TLS | --http-domain | HTTPS web server domain | example.com |
| TLS | --tls-domain | SSH over TLS domain | s.example.com |
| HTTP / WebSocket | --http-listen-addr | HTTP server listen address (serves both transports) | [IP]:[PORT] |
| QUIC | --quic-listen-addr | QUIC listener address (UDP) | [IP]:[PORT] |
| QUIC | --quic / --no-quic | Enable/disable QUIC listener (requires --tls) | --quic |
| DNS | --dns-listen-addr | DNS server listen address | [IP]:53 |
| DNS | --dns-domain | Domain for SSH-over-DNS | s.example.com |
| DNS | --dns / --no-dns | Enable/disable DNS listener | --dns |