Add Tailscale Serve support for WSL gateways - #967
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed July 18, 2026, 1:34 AM ET / 05:34 UTC. Summary Reproducibility: not applicable. as a defect reproduction: this is a new capability. The PR supplies a concrete Windows/WSL setup and WSS invocation scenario, but its live evidence should be repeated on the current merge head. Review metrics: 2 noteworthy metrics.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Maintainer decision needed
Security Review detailsBest possible solution: Ship only if a maintainer sponsors Tailscale Serve as an opt-in core setup capability and the contributor refreshes redacted live proof on Do we have a high-confidence way to reproduce the issue? Not applicable as a defect reproduction: this is a new capability. The PR supplies a concrete Windows/WSL setup and WSS invocation scenario, but its live evidence should be repeated on the current merge head. Is this the best way to solve the issue? Unclear. The implementation is narrow and preserves a root-owned, disabled-by-default transport path, but whether Tailscale lifecycle and tailnet identity authorization belong in core remains a maintainer product/security decision. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 6b9e814cdd18. Label changesLabel changes:
Label justifications:
Evidence reviewedWhat I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (9 earlier review cycles; latest 8 shown)
|
|
The tailscale daemon needs to be in the openclaw account to allow openclaw to run I've addressed the other finding for parsing the |
|
Great improvement. If WSL/Tailscale path now changes, please call out migration expectations for existing gateway installs. |
|
Right now this only supports newly created WSL gateways to keep the implementation simpler. |
The opt-in layering is good and should be preserved: Tailscale provisioning defaults off, Tailscale identity trust is separately opt-in, the normal non-Tailscale setup steps skip cleanly, the auth key is not persisted and is redacted, Serve status now validates the exact proxy target, and the mutable installer was replaced with the signed Noble APT repository. The real Windows/Tailscale proof is also valuable. The remaining security-boundary concern is Before merge, please make the privilege model explicit and choose one of these approaches:
Please also replace the fixed two-second authorization waits around Automated coverage requested:
The current “newly created WSL gateways only” migration boundary should be stated prominently in the PR and docs. Existing managed gateways should remain untouched rather than partially upgraded. This is a promising feature, but the paired reviews both landed below the 90% merge bar because the operator delegation is a lasting security contract, not just implementation detail. A narrow privilege decision plus Finalize/polling coverage would materially improve confidence. |
@andyeskridge, the hardened #967 head passed paired review at 91–93% and is approved from a code/security perspective. After #1011 merged, GitHub now reports a conflict in the overlapping setup surface. Could you please rebase onto current After resolving, please rerun the required build/shared/tray validation plus the focused Tailscale pipeline/rollback/non-Tailscale tests. Once the rebased head is green, this should be ready for a quick final diff check and merge. |
4a70b19 to
a8b7933
Compare
|
Rebased codex/tailscale onto current origin/main (4518dd8), retaining #1011’s cancellation/timeout semantics. |
Preserve strict setup argument parsing and pairing cancellation semantics while integrating the Tailscale CLI options. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 418d0565-a857-47bb-aa72-029b898235dc
|
Automated conflict-resolution update
Validation:
Blockers: none. |
Summary
wss://<wsl-node>.<tailnet>.ts.net. Tailscale identity authentication is a separate explicit opt-in.openclawaccount is not a Tailscale operator.Change Type (select all)
Scope (select all touched areas)
winnodeLinked Issue/PR
Validation
Current commit:
4a70b196 Scope Tailscale recovery to managed gateways.\build.ps1dotnet test .\tests\OpenClaw.SetupEngine.Tests\OpenClaw.SetupEngine.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~ConnectionPageTailscaleRecoveryTestsgit diff --checkReal behavior proof
Current-head automated proof
The current head includes focused regression coverage for the security and failure boundaries requested in review:
tailscaledbefore pairing;gateway.auth.allowTailscale=falseand preserves shared/bootstrap/device-token precedence;Current-head WinUI managed vs. unmanaged Tailscale recovery proof
wss://[redacted].ts.netendpoint; no real tailnet hostname, credential, or WSL gateway was used.4a70b196 Scope Tailscale recovery to managed gateways.IsLocal=trueandSetupManagedDistroName=OpenClawGateway-Proof, then allowed the fake WSS connection to fail..ts.netrecord without a managed-distro marker.tailscaled, Serve, OpenClaw service, Funnel, WSS-only, and no-localhost-fallback guidance..ts.netgateways retain ordinary network recovery.Current-head live Windows/WSL/Tailscale proof
Environment tested: Windows host with WSL2 and Windows Tailscale connected to the same tailnet as the replacement
OpenClawGatewaydistro.PR head / commit tested:
4a70b196 Scope Tailscale recovery to managed gateways.Setup result: generated app-owned record is
wss://…ts.net, namedTailscale (OpenClawGateway), marked local, and retains the managed distro association. It has no shared or bootstrap token.Tailscale state: Windows and WSL MagicDNS suffixes matched;
tailscaledwas active as root; the non-rootopenclawuser gateway service was active and could runtailscale whois.Serve and public exposure: Windows HTTPS to the generated hostname returned
200;tailscale serve status --jsoncontained exactly one127.0.0.1:18789proxy; neither Serve nortailscale funnel status --jsonreported a public Funnel flag.Identity trust:
gateway.auth.allowTailscale=true. A Windows-originated WSSconnectwith no shared/bootstrap/device-token fields and no device identity reachedNOT_PAIRED / DEVICE_IDENTITY_REQUIRED, rather than token authorization rejection. The same token-free request with the already-paired device's signed identity returnedok: true. This proves the intended layered path: Serve-verified tailnet identity plus normal paired-device identity, without silently falling back to a shared token.Companion result:
openclaw nodes statusreported one paired and connected node;openclaw nodes invoke --command device.info --params '{}'returnedok: truethrough the WSS record.Redaction: setup logs contained zero
tskey-matches and zerologin.tailscale.comauthorization URLs.Screenshot/artifact links verified?
Security Impact (required)
Yes)Yes)Yes)No)No)Yes, explain risk + mitigation:tailscale up, Serve, reset, logout, and daemon administration are root-owned. The gateway account receives no Tailscale operator authority.Compatibility / Migration
Yes)Yes)No)--tailscale,--tailscale-trust-auth,--tailscale-auth browser|auth-key,--tailscale-hostname, andOPENCLAW_SETUP_TAILSCALE_AUTH_KEYfor auth-key mode.Review Conversations