ipn/ipnlocal: allow the ingress peer capability for unsigned peers (#20745)
0eb38dc2e (#20561) made peer capability resolution return nothing for peers with UnsignedPeerAPIOnly set, so that a possibly malicious control server can't grant capabilities to peers outside the tailnet lock authority. But Tailscale Funnel ingress nodes are unsigned by design, and control intentionally grants them PeerCapabilityIngress, which the peerapi /v0/ingress handler requires. The result was that every Funnel connection was rejected with a 403 "denied; no ingress cap". Instead of denying all capabilities to unsigned peers, allowlist PeerCapabilityIngress specifically. It only permits ingress requests over the PeerAPI, which unsigned peers can already reach, and the node only serves them for targets explicitly configured for Funnel. The tsnet TestFunnel didn't catch the regression because its fake ingress peer was a normal signed peer. Teach testcontrol to mark a node as UnsignedPeerAPIOnly (excluding such nodes from traffic- permitting filter rules, as real control does, so clients don't discard the packet filter) and make TestFunnel use it so the test now exercises the same capability checks as production Funnel traffic. Updates tailscale/corp#46053 Updates #20739 Change-Id: I3f6b8e2a94d1c07b5a2e9d84f16c30aa79e5d21b Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
B
Brad Fitzpatrick committed
0dfe672b3260727670c0d9f6835602ca7bdd0fe8
Parent: ca79c1e
Committed by GitHub <noreply@github.com>
on 8/4/2026, 3:43:45 PM