Repository navigation
Reach shared hosts through the cloud's relay, without Tailscale - #61
Merged
Merged
Conversation
Members will reach shared hosts through the cloud's relay, which must not read what passes. The member's app opens a channel to the key the host announced in its team's sealed space: fresh X25519 keys both ways, a proof the host holds the announced key, and ChaCha20-Poly1305 records under a counter, so a relay can't read, change, drop or replay them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A member reached another's shared host only over Tailscale, so teammates outside the owner's tailnet couldn't. The host now keeps a connection to the cloud's relay while it shares anything; a member connects with their ticket, the relay checks it without using it, pairs the two and passes bytes, end to end encrypted to the host's announced key. The host redeems the ticket and applies roles, the 2-minute recheck, per-address limits and the first-frame rules as before, as relay connections feed the same team listener. The relay holds each team to a number of connections and a byte rate. Hosts with a Tailscale address keep listening there for members of an older enowX, which knows no relay; the app tries the relay first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Team members reach a shared host through the cloud's relay, without Tailscale.
cloud/server/relay.go): the host keeps an outbound WebSocket to/v1/relay/host; a member connects to/v1/relay/connectwith its ticket; the relay checks the ticket without consuming it, calls the host, which opens/v1/relay/accept/{id}, and copies bytes. Per team: 32 connections, 4 MiB/s (burst 16 MiB); per IP: 30 connects a minute. EnvENOWX_CLOUD_RELAY_TEAM_CONNS/RATE/BURST.cloud/relay/e2e.go): the host's X25519 key is announced in the sealed team space; member and host run an NK-like handshake (two DHs, HKDF-SHA256) and ChaCha20-Poly1305 records with counter nonces. The relay sees who, when and byte counts.HostShare.relayandTeamHost.key.Tests: pairing, refused tickets (forged, removed member, reused), team limit, relay can't read payloads, host reconnect, and an end-to-end visitor through the relay with removal dropping the connection.
Not verified: behind the production proxy, across two real machines, the UI by eye.
🤖 Generated with Claude Code