Funnel ingress denied: upstream 0eb38dc2e strips peer caps from UnsignedPeerAPIOnly relays
#16
Open
opened 2026-07-28 22:06:19 +02:00 by codinget
·
0 comments
No Branch/Tag Specified
Labels
Clear labels
Agentic
Component/CI
Component/Funnel
Component/React
Component/State
Component/Taildrive
Component/Taildrop
Component/Tailscale
Component/Tailshare
Component/Transport
Component/tsconnect
Component/VFS
Component/WebRTC
Component/Worker
Human
Protocol/FTP
Protocol/HTTP
Protocol/SFTP
Protocol/SMB
Protocol/SSH
Protocol/WebDAV
Protocol/WebSocket
Security
Agent
claude-fable-5
Work done by Claude Fable 5
Agent
claude-opus-4-8
Work done by Claude Opus 4.8
Agent
claude-opus-5
Work done by Claude Opus 5
Agent
claude-sonnet-4-6
Work done by Claude Sonnet 4.6
Agent
claude-sonnet-5
Work done by Claude Sonnet 5
Agent
gpt-5.5
Work done by GPT 5.5
Agent
gpt-5.6-luna
Work done by GPT 5.6 Luna
Agent
gpt-5.6-sol
Work done by GPT 5.6 Sol
Agent
gpt-5.6-terra
Work done by GPT 5.6 Terra
Opened by an agent
Work on the CI tooling
Work on the Tailscale Funnel or certificate system
Work on a React binding
Work on a state store (eg Redux)
Work on the taildrive system
Work on the taildrop system
Work on the Tailscale fork
Work on the Tailshare app
Work on the transport system
Work on the tsconnect packages
Work on the VFS system
Work on the WebRTC system
Work on the worker system
Opened by a human
Kind
Bug
Bug work
Kind
Enhancement
Enhancement work
Kind
Feature
Feature work
Kind
Maintenance
Maintenance work
Priority
P0
1
Critical work that must be done right now
Priority
P1
2
Urgent work
Priority
P2
3
Medium priority work
Priority
P3
4
Low priority work
Priority
P4
5
Lowest priority work, wishlist-tier
Work on the FTP protocol
Work on the HTTP protocol
Work on the SFTP protocol
Work on the SMB protocol
Work on the SSH protocol
Work on the WebDAV protocol
Work on the WebSocket protocol
Security work
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: webnet/tailscale#16
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Carrying a fork-local patch to
canIngress()because upstream0eb38dc2ebreaks Funnel. This issue is the reminder to drop the patch once upstream fixes it.What breaks
Funnel ingress is refused by the receiving node. Externally it looks like a TLS failure, because the ingress relay closes the client connection after the ClientHello:
The node logs the real reason:
Cause
Upstream
0eb38dc2e("ipn,magicsock: deny peer capabilities to unsigned peers", 2026-07-22, tailscale/tailscale#20561) addedsrcIsUnsignedPeerLockedand madepeerCapsLockedreturnnilfor any peer withUnsignedPeerAPIOnlyset.Funnel ingress relays are exactly that class of node. From the doc comment on
tailcfg.Node.UnsignedPeerAPIOnly:Both halves of that are visible in the log above: the relay's direct traffic is dropped by the packet filter (
no rules matched), and its one sanctioned action — the peerapi ingress endpoint — is now refused too, becausecanIngress()is resolved purely through the capability map:Note that
canDebug()directly above it has its own explicitUnsignedPeerAPIOnlycheck. The pre-existing design was granular per handler; the new blanket denial at the capability layer catches Funnel as collateral damage.This does not require Tailnet Lock to be enabled on the tailnet — the relay is delivered unsigned regardless — so it should affect any node running upstream main, not just this fork.
The patch
nodeBackend.peerCapsLockedis split, factoring the lookup intopeerCapsIgnoringSignatureLocked.peerCapsLockedkeeps the unsigned-peer denial for every existing caller.nodeBackend.PeerCapsIncludingUnsigned/LocalBackend.PeerCapsIncludingUnsignedskip only that denial.canIngress()is the sole caller.Every other capability keeps upstream's stricter behaviour; only the ingress cap on the peerapi ingress endpoint is exempted.
To do
tailscaledon main to confirm it reproduces outside this forkpeerCapsLocked🤖 Generated with Claude Code