Commit Graph
11198 Commits
Author SHA1 Message Date
Becky Pauley 507a4f8dac tidy 2026-09-01 16:34:25 +01:00
Becky Pauley c852be7aba add deletion predicate, undo changes for empty vs nil endpoints 2026-09-01 12:19:14 +01:00
Becky Pauley dca89b2fae revert rbac 2026-09-01 09:59:24 +01:00
Becky Pauley 6933031557 update egress-readiness to ignore stale endpointslices 2026-08-28 18:56:43 +01:00
Becky Pauley 56289326b1 reconcile egress-eps on clusterip not externalname svc 2026-08-28 18:55:52 +01:00
Becky Pauley 993cc2babc change labels logic, protect against orphaned eps adoption 2026-08-28 08:40:14 +01:00
Becky Pauley c0e0484f2d tidy 2026-08-27 10:19:12 +01:00
Becky Pauley 9b7a92a691 rbac 2026-08-26 12:49:27 +01:00
Becky Pauley 1cffb8564d move labels, use path, add tests 2026-08-26 11:51:46 +01:00
Becky Pauley 51c85f345a tidy ports and labels logic 2026-08-25 17:29:39 +01:00
Becky Pauley b28cbc5ef0 ad protections against hot loop 2026-08-25 16:19:25 +01:00
Becky Pauley dd838129a6 v1 changes 2026-08-25 13:40:17 +01:00
Brad Fitzpatrick 5428027685 go.mod: bump github.com/go4org/hashtriemap for slight speed boost
(bumping in oss mostly to get it into corp, and we require them to be in sync
for now. But we do use this in derpserver too.)

Updates tailscale/corp#46884

Change-Id: If01e3e91787e9ec4331eb9c997292239c6b379f1
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-08-23 22:37:00 -07:00
Paul Scott ed7d521cae go.mod: upgrade go4.org/netipx (#20967)
Bring in perf improvements from go4org/netipx#22

Diff: https://github.com/go4org/netipx/compare/fdeea329fbba...3075585bcbeb

Updates tailscale/corp#46884

Signed-off-by: Paul Scott <408401+icio@users.noreply.github.com>
2026-08-23 18:26:21 +01:00
Brad Fitzpatrick de9ec7ee25 go.mod: bump x/net for http2-in-std fix for Go 1.27
There's a deadlock in x/net/http2 with Go 1.27 that's
fixed with v0.58. This is prep for switching to Go 1.27.

Updates #20220

Change-Id: I8e81eafc0c2f78e1760b36e9d39ac4f6046565af
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-08-22 11:48:56 -04:00
Bonobo 86e5d3873a cmd/tailscale/cli: stop Serve port ranges at 65535
The set-config loop uses uint16 endpoints. When Last is 65535, the increment wraps to zero and file or Unix targets continue indefinitely.

Break after applying Last so every closed range terminates without changing ordinary range behavior.

Fixes #20873

Signed-off-by: Bonobo <github@in9.at>
2026-08-21 14:23:06 -06:00
Adriano Sela Aviles 6d7f1212b7 go.mod,go.sum: bump wireguard-go to fix AllowedIPs mem leak
Pulls in https://github.com/tailscale/wireguard-go/pull/85 which
fixes an unbounded memory leak in mkIPInCIDRsTestFunc. It used a
package-level placeholder Peer, and AllowedIPs.Insert threads every
trie node onto that peer's trieEntries list, so each call leaked
its whole trie. SetAllowedIPs calls it on every netmap update, so
peer churn accumulated trie nodes until the client OOMed.

Fixes tailscale/corp#47010

Signed-off-by: Adriano Sela Aviles <adriano@tailscale.com>
2026-08-21 12:44:21 -07:00
Brad Fitzpatrick 886d1b2e63 control/controlclient: return ctx.Err() from canceled map polls
When a map poll's context is canceled mid-read, the error that
surfaces from the response body read depends on the transport and Go
version: Go 1.26's http2 returned the context error, while Go 1.27's
returns the underlying "use of closed network connection". Normalize
the read-error paths in sendMapRequest to report ctx.Err() when the
context was canceled so callers see a stable, meaningful error
regardless of Go version.

Updates #20220

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Change-Id: I5898d3f452a2e61cfdf3ee015386365943c08e70
2026-08-21 14:36:59 -04:00
chaosinthecrd 1de85e1972 cmd/k8s-operator: watch ProxyGroups for HA Services with a Service handler
The service-pg-reconciler reconciles Services annotated for an ingress
ProxyGroup, but its ProxyGroup watch reused ingressProxyGroupFilter,
which is ingressesFromIngressProxyGroup. That handler lists Ingresses
and returns Ingress keys, so when a ProxyGroup became Available the
requests it produced never matched a Service and the reconciler's Get
just came back NotFound.

This fixes this by adding servicesFromIngressProxyGroup, which lists the
Services indexed for the ProxyGroup and returns their keys, matching what
the egress path already does with egressSvcsFromEgressProxyGroup.

Fixes #20944

Signed-off-by: chaosinthecrd <tom@tmlabs.co.uk>
2026-08-21 18:19:37 +01:00
chaosinthecrd 0ed6af7b72 cmd/k8s-operator: return the requeue result from HA Service reconcile
Fixes a dropped assignment of `res` in HA service reconciler necessary
for requeuing.

Fixes #20946
Signed-off-by: chaosinthecrd <tom@tmlabs.co.uk>
2026-08-21 16:46:12 +01:00
Adrian Dewhurst 0fd2f14deb feature/conn25: enforce policy during TransitIP allocation
Only allow TransitIPs to be allocated when the client has permission to
access the requested app.

Updates tailscale/corp#40076

Change-Id: Ib4b37afa25ffbdd220ba2c0fd9cfec8d5df5311f
Signed-off-by: Adrian Dewhurst <adrian@tailscale.com>
2026-08-20 21:50:49 -04:00
yaruk-byte 2ee33782e7 cmd/testwrapper: name the flaky tests in the Windows integration panel (#20932)
Also reports when shard results are missing, unreadable, duplicated, or
empty, so the pass count and percentage can't overstate what actually ran.

Updates #20931

Signed-off-by: Yaruk Asghar <yaruk@tailscale.com>
2026-08-20 15:44:55 -07:00
Brad Fitzpatrick fc9533dc10 go.toolchain.next.rev: bump 'next' to Go 1.27.0
Updates #20220

Change-Id: Ic37fd49e2d4e6198965fc549b2efac04579f99c8
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-08-20 09:01:25 -04:00
joshrzemien c2f3230c80 k8s-operator: allow annotationless resources under proxy group policy (#20907)
Guard optional annotations maps in generated CEL expressions before
looking up expose or proxy-group annotations. This lets ordinary
annotationless Services and Ingresses pass admission while preserving
deny-all and allowlist behavior for present proxy-group annotations.

RELNOTE: Kubernetes ProxyGroupPolicy now permits annotationless resources.

Fixes #20906

Change-Id: I8b9475d34c003ca6d233246c021ac656e0530fb1

Signed-off-by: joshrzemien <joshua.k.rzemien@gmail.com>
2026-08-20 12:27:18 +01:00
yaruk-byte c87680a0bf tstest/integration: run multi-node Windows tests with userspace peers (#20764)
Updates #20711

Signed-off-by: Yaruk Asghar <yaruk@tailscale.com>
2026-08-19 16:32:05 -07:00
Simon Law 0e84b4a3a0 tailcfg: replace int with DERPRegionID for additional type safety (#20646)
Historically, when DERP regions were switched away from strings to
numeric identifiers in PR #14641, tailcfg.Node.HomeDERP was declared
as an int instead of its own type.

This PR declares a new tailcfg.DERPRegionID type, represented by an
int64, and converts the following fields to use this type:

- netcheck.Report.PreferredDERP
- netcheck.Report.RegionLatency
- netcheck.Report.RegionV4Latency
- netcheck.Report.RegionV6Latency
- tailcfg.DERPHomeParams.RegionScore
- tailcfg.DERPMap.Regions
- tailcfg.DERPNode.RegionID
- tailcfg.DERPRegion.RegionID
- tailcfg.NetInfo.PreferredDERP
- tailcfg.Node.HomeDERP
- tailcfg.PeerChange.DERPRegion
- tailcfg.PingResponse.DERPRegionID

Note that the original field was an int, while the new field is backed
by an int64. This change makes DERPRegionID the same size on both
32-bit and 64-bit architectures.

Fixes: #20165

Change-Id: Ic6f795a6d791dd16f756f246d5a02085443e212f

Signed-off-by: Simon Law <sfllaw@tailscale.com>
2026-08-19 16:25:50 -07:00
yaruk-byte bf18243bf7 cmd/testwrapper: add Windows integration results panel + Slack notification (#20811)
Updates #20464

Signed-off-by: Yaruk Asghar <yaruk@tailscale.com>
2026-08-19 12:55:12 -07:00
M. J. Fromberger f3552c29c0 ipn/ipnlocal: fix cache update for peers deleted by netmap deltas (#20851)
After a netmap delta is applied, we scan the mutations for affected peers and
update the cache (if enabled) for those peers. For removals in particular, we
were relying on the node backend to resolve node IDs (provided by the delta
mutation) to stable IDs.

Prior to 65fd320a this happened to work because the node backend would hold on
to all the peers mentioned by the previous full netmap, even after applying
deltas. But that was essentially accidental, and once we fixed it not to do
that, these lookups no longer worked. We need the stable ID, since that is how
the cache is keyed, and now that they're no longer pinned, we were not properly
evicting removed peers from the cache.

To fix this, capture removed peer stable IDs while applying mutations to the
node backend, instead of trying to look them up afterward.

Updates #20796

Change-Id: I14ded78eaf9657645f0869a52460fd3cd86edba6
Signed-off-by: M. J. Fromberger <fromberger@tailscale.com>
2026-08-19 10:31:38 -07:00
Mike Jensen 90ed0bcf4b wgengine/netstack: block 4via6 forwards to host-scoped targets (#20866)
The packet filter only sees a via address's outer ULA, so netstack unconditionally dialed whatever IPv4 was embedded in it.

This change refuses TCP, UDP, and ping relays to host-scoped destinations after UnmapVia.

Credit to the Anthropic infrastructure security team for finding and reporting.

Fixes https://github.com/tailscale/corp/issues/46646

Change-Id: I93d8e27a2eddbce7eb3f8c5fa4677f8de3a8ed9e

Signed-off-by: Mike Jensen <mikej@tailscale.com>
2026-08-19 09:16:08 -06:00
Brad FitzpatrickandAdriano Sela Aviles f29f127ace control/controlhttp/controlhttpserver: detach websocket conns from request context
The websocket upgrade path bound the returned conn's reads and writes
to the context passed to AcceptHTTP via wsconn.NetConn. That context is
typically an http.Request context, which net/http cancels once the
calling handler returns, so a caller that served the accepted conn
beyond its handler's lifetime had the conn killed out from under it.
The hijack-based HTTP/1 upgrade path has no such binding.

Make the two paths consistent: ctx now only bounds the handshake (its
deadline, if any, is applied to the conn by controlbase.Server) and the
returned conn's lifetime is the caller's responsibility. Document that
contract on AcceptHTTP and add a regression test that uses a
websocket-accepted conn after the accepting handler has returned.

Updates tailscale/corp#46806
Updates tailscale/corp#29053

Change-Id: I4fc4ea5cddc2c6174fdf21f8d832f2e0984a7533
Co-authored-by: Adriano Sela Aviles <adriano@tailscale.com>
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-08-19 10:58:47 -04:00
Tom Proctor f9417e3687 go.mod: bump ebpf, go-git, go-billy and aws-sdk-go-v2 for govulncheck (#20920)
Bump five dependencies to resolve the following advisories;
GO-2026-6238, GO-2026-5764, GO-2026-5597, GO-2026-5490, GO-2026-5496,
GO-2026-5105.

Updates tailscale/corp#9497

Signed-off-by: Tom Proctor <tomhjp@users.noreply.github.com>
2026-08-19 15:53:13 +01:00
Will HannahandWill Hannah e1ffeeffba client,feature/favorites: add locally-pinned favorites (#20563)
Let clients pin favorite devices, exit nodes, and services so GUIs can
surface & change them. Pins are stored per login profile in the new
favorites feature module, keyed per category; devices and exit nodes by
StableNodeID, services by ServiceName.

The item types live in a leaf package feature/favorites/pintype,
keeping them out of the core ipn hierarchy. Each category has
its own type (pintype.Device, pintype.ExitNode, pintype.Service).

Exposed over LocalAPI at GET/POST /localapi/v0/pins, where POST replaces
only the categories named in the request so a client can update one
category without clobbering the others. Pins are local to the device and
are not synced across a user's devices.

updates tailscale/corp#44836

Signed-off-by: Will Hannah <willh@tailscale.com>
Co-authored-by: Will Hannah <wph@Wills-Virtual-Machine.local>
2026-08-19 09:52:56 -04:00
Alex Chan 468241a13f envknob: add SetenvForTest helper for safe environment variable handling
Our tests are inconsistent in how they set environment variables and cleanup.
Missing cleanup logic can leak environment variable state across tests and
change the behaviour of subsequent tests.

This recently caused flakes in feature/acme, where `TestGetCertPEMWithValidity`
leaked `TS_CERT_SHARE_MODE` and `TestAsyncRenewalDedup` to fail inconsistently.

To fix the immediate flake and prevent future leaks, introduce a `SetenvForTest`
helper that handles setting and cleaning up environment variables in tests.

Fixes #20902

Change-Id: I9f8ef45ec875d66034cfd0054311bd69b67e2243
Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-08-19 12:22:26 +01:00
chaosinthecrd 86c178754d cmd/containerboot: make the boot map-response timeout configurable
containerboot waits up to 60s for the initial map response before
failing. Slow map responses (>60s seen in production) leaves
containerboot to timeout and fail.

Add a TS_BOOT_TIMEOUT env var to override the default. Falls back to
60s when unset.

Fixes #20912

Signed-off-by: chaosinthecrd <tom@tmlabs.co.uk>
2026-08-19 12:21:52 +01:00
Amal Bansode 0f02428a20 net/traffic: port some rendezvous hasher testcases (#20899)
Port some tiny testcases that apply to our corp impl of the rdv hasher
to OSS as well. This is in preparation for cutting over to the OSS
impl exclusively.

Updates tailscale/corp#46471

Signed-off-by: Amal Bansode <amal@tailscale.com>
2026-08-18 09:56:45 -07:00
kari-ts d3d14a8831 ipn/{desktop,ipnlocal}: register per-user policy stores on session lifecycle (#20293)
This registers per-user RSOP policy stores when a user logs into a Windows session and ensures that per-user poicy settings are delivered to clients via IPN bus.

The store lifecycle is tied to Windows session lifetime via desktopSessionExt's SessionInitCallback, which handles unattended mode (per-user policies stay enforced after gui disconnection) and multi-user (refcounted across sessions for the same user).

Updates tailscale/corp#42259

Signed-off-by: kari-ts <kari@tailscale.com>
2026-08-17 19:59:42 -07:00
Fran Bull 6e0912f979 feature/conn25: expire connector state
The connector struct holds a map of peer+transitIP -> destinationIP that
it uses for routing traffic. The client registers new entries in the map
over the peer API.

Stop the transitIPs map from growing indefinitely by expiring entries
after 1 hour.

Updates tailscale/corp#38261

Signed-off-by: Fran Bull <fran@tailscale.com>
2026-08-17 10:54:10 -07:00
Tom Proctor 902f5c414a cmd/cigocacher: make token optional for --stats (#20896)
In cases where cigocacher is using a proxy that handles the auth, it's
possible to fetch stats without knowing our own access token. Don't fail
early if the access token isn't passed. If there's no proxy, it will
fail with the error from the gocached server.

Updates tailscale/corp#45427

Signed-off-by: Tom Proctor <tomhjp@users.noreply.github.com>
2026-08-17 14:23:17 +01:00
BeckyPauley 083e8ddfc2 cmd/k8s-operator/e2e: add tests to cover DNSConfig (#20861)
Deploy k8s nameserver during e2e test setup, and point the cluster resolver
(CoreDNS or kube-dns) to it so tests can resolve MagicDNS names inside the
cluster.

Add a test to verify singleton L7 Ingress is reachable from inside the
cluster using its MagicDNS Name.

Update existing egress tests to use a dedicated tailnet target per test (to
avoid conflicts). Egress tests now also verify that an egress target is
reachable from within the cluster using both its Service and MagicDNS name.

To successfully curl using the target's MagicDNS name, publish test CAs as a
ConfigMap to the cluster, and mount these for each curl pod.

Fixes tailscale/corp#38027

Signed-off-by: Becky Pauley <becky@tailscale.com>
2026-08-17 14:22:14 +01:00
yaruk-byte cfe32b8be6 tstest/integration: run Windows integration tests against the service by default (#20565)
Updates #20464

Signed-off-by: Yaruk Asghar <yaruk@tailscale.com>
2026-08-14 22:49:30 -07:00
Bonobo 8052bb2c53 cmd/tailscale/cli: handle kubeconfig stat errors
kubeconfigPath dereferences FileInfo for non-ENOENT stat errors even though os.Stat returns nil FileInfo. Preserve the failing list entry so checkKubeconfigWritable reports the existing access error instead of panicking.

Updates #11604

Signed-off-by: Bonobo <github@in9.at>
2026-08-14 17:39:15 -07:00
License Updater 290aad71cc licenses: update license notices
Signed-off-by: License Updater <noreply+license-updater@tailscale.com>
2026-08-14 16:52:55 -07:00
James Tucker 0d66cde14f tstest/membudget: add live-heap budget regression tests
Static size checks (iossize) catch binary dirty-page growth but nothing
covered runtime heap cost, which is what actually consumes the iOS
Network Extension's 50 MiB jetsam budget. Bring up a tsnet backend
(with the full condregister feature set, matching shipping clients)
against an in-process testcontrol server and assert live post-GC heap
budgets for (a) backend startup with zero peers and (b) marginal cost
per netmap peer.

The startup test measures 1.3 MiB today and fails loudly on the
conn25 flow-table pre-allocation regression (17 MiB) that jetsam-killed
the iOS extension on large tailnets.

Budgets are deliberately generous (6-12x current measurements) to stay
flake-free while still catching the multi-MiB regressions that matter
for mobile.

A new debugknob enables us to constrain the GSO/GRO batch size to 1 for
these tests so as to avoid the memory allocation associated with those
buffers, which are a known issue with their own work stream.

Updates tailscale/corp#46408
Updates tailscale/corp#18514

Signed-off-by: James Tucker <james@tailscale.com>
2026-08-14 16:45:04 -07:00
Alex Chan 2d98e75249 feature/acme: only allow one async renewal at a time
Currently we serialise ACME account setup and ACME issuances for domains
which don't yet have a valid certificate, but not for async renewals of
still-valid certificates.

This patch adds a check that we only have one async renewal for a domain
in-flight at a time, and a test that ensures we de-dupe these renewals.

Updates tailscale/corp#46420

Change-Id: Ibbaa537cd28b8adf238b5c9396403e845f95b7e7
Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-08-14 20:15:30 +01:00
Claus Lensbøl ffaa5a361f hostinfo: improve detection of linux desktops (#20848)
Our desktop detection was using "wayland-1" as a search string for
detecting wayland desktops, but many desktops use other indexes for the
session. Additionally we did not detect mir or gamescope.

Add a new detection method that leans on systemd-logind (if available)
and fall back to using the existing method of looking for open unix
sockets, but add search strings and tail the index off of the wayland
session detection.

Fixes #20847

Signed-off-by: Claus Lensbøl <claus@tailscale.com>
2026-08-14 15:12:45 -04:00
Adrian Dewhurst 5a1066f494 tailcfg/peercap, types/appctype: prepare for conn25 grants
This change contains the protocol changes needed to support
describing authorization for conn25 apps. As a temporary transition
measure during development, app configurations can disable authorization
enforcement.

Updates tailscale/corp#40076

Change-Id: I3183c10374aacb0048f6632c384f71f758c20f2f
Signed-off-by: Adrian Dewhurst <adrian@tailscale.com>
2026-08-14 13:48:46 -04:00
Michael Ben-Ami 0953fd9a97 conn25: return early in handleConnectorTransitIP if conn25 not configured
We were checking and writing an HTTP error, but not returning.

Updates tailscale/corp#39033

Signed-off-by: Michael Ben-Ami <mzb@tailscale.com>
2026-08-14 07:31:34 -04:00
Patrick O'Doherty 4782f36506 go.mod: update to Go 1.26.6 (#20857) 2026-08-13 21:11:13 -07:00
Jordan Whited ab0489912f go.mod,wgengine/wgcfg: bump wireguard-go for device.Option
Move away from mutating global, exported variables in wireguard-go. Use
device.Option's passed to device.NewDevice, instead. No functional
changes, just API cleanup in preparation of future changes.

Updates tailscale/corp#22467
Updates tailscale/corp#46396
Updates tailscale/corp#37878

Signed-off-by: Jordan Whited <jordan@tailscale.com>
2026-08-13 15:05:36 -07:00
Joe Tsai 9f4fe8b5f2 util/ioqueue: new log buffer implementation (#20816)
This adds a new ring buffer implementation that aims to replace
logtail.Buffer and the on-disk implementation in filch.Filch.

There are several problems with filch.Filch:

* Filching stderr should not be done at the buffer layer.
  This makes structured representation within the buffer difficult
  as arbitrary stderr data may unexpectedly appear,
  which hinders attempts at more structured data.

* Log messages are assumed to be discreet lines rather than arbitrary bytes.
  This makes it harder to switch the structured representation (e.g., using CBOR instead).

* Data that appears asynchronously through stderr never triggers a wake-up within logtail.
  Consequently logs may never be uploaded.

* Relatedly, there is no mechanism for notifying that data has newly arrived in the buffer.

* There is no two-stage exfiltration. The TryReadLine method may or may not persist
  the fact that the data was read. It arbitrarily depends on whether we cross
  a magical file boundary in the dual-file approach.
  A failed upload followed by a restart results in dropped logs.
  A successful upload followed by a restart results in duplicated logs.

The new Buffer interface and VolatileBuffer implementation are
a step in the direction to resolving these problems.

* In the future, filching will output to a separate pipe
  that we explicitly process the data for,
  before putting it into the log buffer.
  By processing the data, we can protect against stderr garbage being inserted
  into the buffer unexpectedly breaking any structure.

* The Buffer.Peek and Buffer.DiscardUntil methods provide a way
  to exfiltrate in a two-step manner.
  When uploading, we peek at a chunk of data to upload.
  When successful, we discard the data, ensuring that the buffer knows
  not to provide that data again. The Len method can be used to suggest
  to the logging service the amount of back pressure that exists.

Updates tailscale/corp#21363

Signed-off-by: Joe Tsai <joetsai@digital-static.net>
2026-08-13 13:04:53 -07:00