summaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)AuthorFilesLines
2026-03-30.github: Bump github/codeql-action from 4.34.1 to 4.35.1dependabot/github_actions/github/codeql-action-4.35.1dependabot[bot]1-3/+3
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.34.1 to 4.35.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/38697555549f1db7851b81482ff19f1fa5c4fedc...c10b8064de6f491fea524254123dbe5e09572f13) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.35.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
2026-03-29tsnet: fix advertiseService dropping existing servicesEvan Champion1-1/+1
AppendTo returns the new slice but the result was discarded, so only the newly added service was advertised. Signed-off-by: Evan Champion <110177090+evan314159@users.noreply.github.com>
2026-03-29docker: add riscv64 to container image architecturesBruno Verachten1-0/+6
Add riscv64 to the GOARCH list passed to mkctr for all Docker image builds. Go already cross-compiles for riscv64, so this just adds the architecture to the container manifest. Updates #17812 Signed-off-by: Bruno Verachten <gounthar@gmail.com>
2026-03-29cmd/tailscale: improve `tailscale lock` error message if no keysAlex Chan2-17/+53
Previously, running `add/remove/revoke-keys` without passing any keys would fail with an unhelpful error: ```console $ tailscale lock revoke-keys generation of recovery AUM failed: sending generate-recovery-aum: 500 Internal Server Error: no provided key is currently trusted ``` or ```console $ tailscale lock revoke-keys generation of recovery AUM failed: sending generate-recovery-aum: 500 Internal Server Error: network-lock is not active ``` Now they fail with a more useful error: ```console $ tailscale lock revoke-keys missing argument, expected one or more tailnet lock keys ``` Fixes #19130 Change-Id: I9d81fe2f5b92a335854e71cbc6928e7e77e537e3 Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-03-28README: update the version of Go in the README (#19168)Evan Lowry1-1/+1
Updates #18682 Signed-off-by: Evan Lowry <evan@tailscale.com>
2026-03-27feature/conn25: install all the hooksMichael Ben-Ami4-76/+131
Install the previously uninstalled hooks for the filter and tstun intercepts. Move the DNS manager hook installation into Init() with all the others. Protect all implementations with a short-circuit if the node is not configured to use Connectors 2025. The short-circuit pattern replaces the previous pattern used in managing the DNS manager hook, of setting it to nil in response to CapMap changes. Fixes tailscale/corp#38716 Signed-off-by: Michael Ben-Ami <mzb@tailscale.com>
2026-03-27.github: Bump actions/download-artifact from 8.0.0 to 8.0.1dependabot[bot]1-1/+1
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: 8.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
2026-03-27Add 'fish' to the list of scalesSam Fleming1-0/+1
This will become a new "second word" option in the tailnet naming scheme. Signed-off-by: Sam Fleming <91982544+SamPlaysKeys@users.noreply.github.com>
2026-03-26release/dist/unixpkgs: include tailscale-online.target in packagesBrad Fitzpatrick1-0/+26
The tailscale-online.target and tailscale-wait-online.service systemd units were added in 30e12310f1 but never included in the release packaging (tarballs, debs, rpms). Updates #11504 Change-Id: I93e03e1330a7ff8facf845c7ca062ed2f0d35eaa Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-03-26feature/conn25: connect the ExtraWireguardAllowedIPs hook (#19140)George Jones1-0/+15
The hook calls into the client assigned addresses to return a view of the transit IPs associated with that connector. Fixes tailscale/corp#38125 Signed-off-by: George Jones <george@tailscale.com>
2026-03-26feature/conn25: Store transit ips by connector key (#19071)George Jones2-24/+334
The client needs to know the set of transit IPs that are assigned to each connector, so when we register transit IPs with the connector we also need to assign them to that connector in the addrAssignments. We identify the connector by node public key to match the peer information that is available when the ExtraWireguardAllowedIPs hook will be invoked. Fixes tailscale/corp#38127 Signed-off-by: George Jones <george@tailscale.com>
2026-03-26net,tsnet: fix the capitalisation of "Wireshark"Alex Chan3-3/+3
See https://www.wireshark.org/; there's no intercapped S. Updates #cleanup Change-Id: I7c89a3fc6fb0436d0ce0e25a620bde7e310e89d2 Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-03-26tsnet/tsnet.go: fix docs link (#19136)Walter Poupore1-1/+1
Fixes #19135 Signed-off-by: Walter Poupore <walterp@tailscale.com>
2026-03-26docs: add commit message example (#19134)Noel O'Brien1-7/+8
Fixes #19133 Signed-off-by: Noel O'Brien <noel@tailscale.com>
2026-03-26ipn/ipnlocal: warn incompatibility between no-snat-routes and exitnode (#19023)KevinLiang104-0/+107
* ipn/ipnlocal: warn incompatibility between no-snat-routes and exitnode This commit adds a warning to health check when the --snat-subnet-routes=false flag for subnet router is set alone side --advertise-exit-node=true. These two would conflict with each other and result internet-bound traffic from peers using this exit node no masqueraded to the node's source IP and fail to route return packets back. The described combination is not valid until we figure out a way to separate exitnode masquerade rule and skip it for subnet routes. Updates #18725 Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com> * use date instead of for now to clarify effectivness Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com> --------- Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com>
2026-03-26.github: Bump actions/create-github-app-token from 2.2.1 to 3.0.0 (#19003)dependabot[bot]3-3/+3
Bumps [actions/create-github-app-token](https://github.com/actions/create-github-app-token) from 2.2.1 to 3.0.0. - [Release notes](https://github.com/actions/create-github-app-token/releases) - [Commits](https://github.com/actions/create-github-app-token/compare/29824e69f54612133e76f7eaac726eef6c875baf...f8d387b68d61c58ab83c6c016672934102569859) --- updated-dependencies: - dependency-name: actions/create-github-app-token dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-25feature/conn25,ipn/ipnext,ipn/ipnlocal: add ExtraRouterConfigRoutes hookFran Bull3-1/+31
conn25 needs to add routes to the operating system to direct handling of the addresses in the magic IP range to the tailscale0 TUN and tailscaled. The way we do this for exit nodes and VIP services is that we add routes to the Routes field of router.Config, and then the config is passed to the WireGuard engine Reconfig. conn25 is implemented as an ipnext.Extension and so this commit adds a hook to ipnext.Hooks to allow any extension to provide routes to the config. The hook if provided is called in routerConfigLocked, similarly to exit nodes and VIP services. Fixes tailscale/corp#38123 Signed-off-by: Fran Bull <fran@tailscale.com>
2026-03-25net/batching: use vectored writes on Linux (#19054)Alex Valiushko2-30/+59
On Linux batching.Conn will now write a vector of coalesced buffers via sendmmsg(2) instead of copying fragments into a single buffer. Scatter-gather I/O has been available on Linux since the earliest days (reworked in 2.6.24). Kernel passes fragments to the driver if it supports it, otherwise linearizes upon receiving the data. Removing the copy overhead from userspace yields up to 4-5% packet and bitrate improvement on Linux with GSO enabled: 46Gb/s 4.4m pps vs 44Gb/s 4.2m pps w/32 Peer Relay client flows. Updates tailscale/corp#36989 Change-Id: Idb2248d0964fb011f1c8f957ca555eab6a6a6964 Signed-off-by: Alex Valiushko <alexvaliushko@tailscale.com>
2026-03-25wif: add AWS ecs for autogenerated OIDC tokensPatrick Guinard1-7/+14
Adds the ability to detect when running on AWS ECS and fetch tokens from the ECS metadata endpoints in addition to IMDSv2 Fixes #18909 Signed-off-by: Patrick Guinard <patrick@public.com>
2026-03-25go.toolchain.*: bump for mips and synology segmentation violation fixesNick Khyl3-3/+3
Updates #19039 Updates tailscale/go#160 Updates tailscale/go#162 Updates golang/go#77730 Updates golang/go#77930 Signed-off-by: Nick Khyl <nickk@tailscale.com>
2026-03-25net/dns: fix duplicate search line entries (OpenBSD, primarily)Greg Steuck1-1/+8
Fixes #12360 Signed-off-by: Greg Steuck <greg@nest.cx>
2026-03-25tsnet: clean up state when Service listener is closedHarry Harpham2-89/+420
Previous to this change, closing the listener returned by Server.ListenService would free system resources, but not clean up state in the Server's local backend. With this change, the local backend state is now cleaned on close. Fixes tailscale/corp#35860 Signed-off-by: Harry Harpham <harry@tailscale.com>
2026-03-25tsnet: block rather than poll in setup for TestListenServiceHarry Harpham1-20/+11
TestListenService needs to setup state (capabilities, advertised routes, ACL tags, etc.). It is imperative that this state propagates to all nodes in the test tailnet before proceeding with the test. To achieve this, TestListenService currently polls each node's local backend in a loop. Using local.Client.WatchIPNBus improves the situation by blocking until a new netmap comes in. Fixes tailscale/corp#36244 Signed-off-by: Harry Harpham <harry@tailscale.com>
2026-03-25tsnet: use tstest.Shard in new tsnet testsHarry Harpham1-0/+4
This helps us distribute tests across CI runners. Most tsnet tests call tstest.Shard, but two recently added tests do not: tsnet.TestFunnelClose and tsnet.TestListenService. This commit resolves the oversight. Fixes tailscale/corp#36242 Signed-off-by: Harry Harpham <harry@tailscale.com>
2026-03-25ipn/ipnlocal: debounce extra enqueues in ExtensionHost.AuthReconfigAsyncMichael Ben-Ami1-0/+11
Fixes tailscale/corp#39065 Signed-off-by: Michael Ben-Ami <mzb@tailscale.com>
2026-03-24ipn/ipnserver: use peercreds for actor.Username on freebsd (for Taildrive)rtgnx1-1/+1
Signed-off-by: Adrian Cybulski <adrian@cybulski.cc>
2026-03-24control/controlclient: handle errors in rememberLastNetmapUpdator (#19112)Claus Lensbøl2-5/+11
If errors occured, the updater could end up deadlocked. Closing the done channel rather than adding to it, fixes a deadlock in the corp tests. Updates #19111 Signed-off-by: Claus Lensbøl <claus@tailscale.com>
2026-03-24types/key: use AvailableBuffer for WriteRawWithoutAllocating (#19102)Mike O'Driscoll2-21/+80
Use bufio.Writer.AvailableBuffer to write the 32-byte public key directly into bufio's internal buffer as a single append+Write, avoiding 32 separate WriteByte calls. Fall back to the existing byte-at-a-time path when the buffer has insufficient space. ``` name old ns/op new ns/op speedup NodeWriteRawWithoutAllocating-8 121 12.5 ~9.7x (0 allocs/op in both) ``` Add BenchmarkNodeWriteRawWithoutAllocating and expand TestNodeWriteRawWithoutAllocating to cover both fast (AvailableBuffer) and slow (WriteByte fallback) paths with correctness and allocation checks. Updates tailscale/corp#38509 Signed-off-by: Mike O'Driscoll <mikeo@tailscale.com>
2026-03-24derp: use AvailableBuffer for WriteFrameHeader, consolidate tests (#19101)Mike O'Driscoll3-33/+119
Use bufio.Writer.AvailableBuffer to write the frame header directly into bufio's internal buffer as a single append+Write, avoiding 5 separate WriteByte calls. Fall back to the existing writeUint32 byte-at-a-time path when the buffer has insufficient space. ``` name old ns/op new ns/op speedup WriteFrameHeader-8 18.8 7.8 ~2.4x (0 allocs/op in both) ``` Add TestWriteFrameHeader with correctness checks, allocation assertions, and coverage of both fast and slow write paths. Move BenchmarkReadFrameHeader from client_test.go to derp_test.go alongside BenchmarkWriteFrameHeader, co-located with the functions under test. Updates tailscale/corp#38509 Signed-off-by: Mike O'Driscoll <mikeo@tailscale.com>
2026-03-24ipn,ipn/local: broadcast ClientVersion if AutoUpdate.Check (#19107)kari-ts3-3/+111
If AutoUpdate.Check is false, the client has opted out of checking for updates, so we shouldn't broadcast ClientVersion. If the client has opted in, it should be included in the initial Notify. Updates tailscale/corp#32629 Signed-off-by: kari-ts <kari@tailscale.com>
2026-03-24ipn: fix the typo causing NoSNAT always set to true (#19110)KevinLiang101-1/+1
Fixes #19109 Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com>
2026-03-24licenses: update license noticesLicense Updater4-12/+12
Signed-off-by: License Updater <noreply+license-updater@tailscale.com>
2026-03-24control/controlclient: allow multiple non-streaming map requests (#19106)Claus Lensbøl1-8/+12
A client with an active streaming session would break if using the same client for a non-streaming session. Allow the client 1 streaming and n non-streaming sessions at the same time. Fixes #19105 Signed-off-by: Claus Lensbøl <claus@tailscale.com>
2026-03-24disco: remove experimental label from BindUDPRelayHandshakeStateJordan Whited1-2/+1
Updates #cleanup Signed-off-by: Jordan Whited <jordan@tailscale.com>
2026-03-24net/udprelay: remove experimental label from package docsJordan Whited1-3/+3
Update #cleanup Signed-off-by: Jordan Whited <jordan@tailscale.com>
2026-03-24feature/conn25: call AuthReconfigAsync after address assignmentFran Bull2-7/+29
When the client of a connector assigns transit IP addresses for a connector we need to let wireguard know that packets for the transit IPs should be sent to the connector node. We do this by: * keeping a map of node -> transit IPs we've assigned for it * setting a callback hook within wireguard reconfig to ask us for these extra allowed IPs. * forcing wireguard to do a reconfig after we have assigned new transit IPs. And this commit is the last part: forcing the wireguard reconfig after a new address assignment. Fixes tailscale/corp#38124 Signed-off-by: Fran Bull <fran@tailscale.com>
2026-03-24feature/*,net/tstun: add tundev_txq_drops clientmetric on LinuxJordan Whited8-0/+604
By polling RTM_GETSTATS via netlink. RTM_GETSTATS is a relatively efficient and targeted (single device) polling method available since Linux v4.7. The tundevstats "feature" can be extended to other platforms in the future, and it's trivial to add new rtnl_link_stats64 counters on Linux. Updates tailscale/corp#38181 Signed-off-by: Jordan Whited <jordan@tailscale.com>
2026-03-24feature/conn25: guard extension Init() and PeerAPI handler with opt-in env varMichael Ben-Ami1-0/+12
Fixes tailscale/corp#39003 Signed-off-by: Michael Ben-Ami <mzb@tailscale.com>
2026-03-24cmd/tailscale/cli: add a debug command to print the statedirAlex Chan2-0/+32
Example: ```console $ tailscale debug statedir /tmp/ts/node1 ``` Updates #18019 Change-Id: I7c93c94179bd7b56d0fa8fe57a9129df05c2c1df Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-03-24derp,types,util: use bufio Peek+Discard for allocation-free fast reads (#19067)Mike O'Driscoll17-47/+231
Replace byte-at-a-time ReadByte loops with Peek+Discard in the DERP read path. Peek returns a slice into bufio's internal buffer without allocating, and Discard advances the read pointer without copying. Introduce util/bufiox with a BufferedReader interface and ReadFull helper that uses Peek+copy+Discard as an allocation-free alternative to io.ReadFull. - derp.ReadFrameHeader: replace 5× ReadByte with Peek(5)+Discard(5), reading the frame type and length directly from the peeked slice. Remove now-unused readUint32 helper. name old ns/op new ns/op speedup ReadFrameHeader-8 24.2 12.4 ~2x (0 allocs/op in both) - key.NodePublic.ReadRawWithoutAllocating: replace 32× ReadByte with bufiox.ReadFull. Addresses the "Dear future" comment about switching away from byte-at-a-time reads once a non-escaping alternative exists. name old ns/op new ns/op speedup NodeReadRawWithoutAllocating-8 140 43.6 ~3.2x (0 allocs/op in both) - derpserver.handleFramePing: replace io.ReadFull with bufiox.ReadFull. Updates tailscale/corp#38509 Signed-off-by: Mike O'Driscoll <mikeo@tailscale.com>
2026-03-24all: use `bart.Lite` instead of `bart.Table` where appropriateAlex Chan4-26/+16
When we don't care about the payload value and are just checking whether a set contains an IP/prefix, we can use `bart.Lite` for the same lookup times but a lower memory footprint. Fixes #19075 Change-Id: Ia709e8b718666cc61ea56eac1066467ae0b6e86c Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-03-23tsnet: print state change in auth loop more responsively (#18048)Tom Proctor1-0/+17
tsnet has a 5s sleep as part of its logic waiting to log successful auth. Add an additional channel that will interrupt this sleep early if the local backend's state changes before then. This is early enough in the bootstrap logic that the local client has not been set up yet, so we subscribe directly on the local backend in keeping with the rest of the function, but it would be nice to port the whole function to the new eventbus in a separate change. Note this does not affect how quickly auth actually happens, it just ensures we more responsively log the fact that auth state has changed. Updates #16340 Change-Id: I7a28fd3927bbcdead9a5aad39f4a3596b5f659b0 Signed-off-by: Tom Proctor <tomhjp@users.noreply.github.com>
2026-03-23net/dns/resolver: treat DNS REFUSED responses as soft errors in forwarder ↵Brendan Creane4-52/+198
race (#19053) When racing multiple upstream DNS resolvers, a REFUSED (RCode 5) response from a broken or misconfigured resolver could win the race and be returned to the client before healthier resolvers had a chance to respond with a valid answer. This caused complete DNS failure in cases where, e.g., a broken upstream resolver returned REFUSED quickly while a working resolver (such as 1.1.1.1) was still responding. Previously, only SERVFAIL (RCode 2) was treated as a soft error. REFUSED responses were returned as successful bytes and could win the race immediately. This change also treats REFUSED as a soft error in the UDP and TCP forwarding paths, so the race continues until a better answer arrives. If all resolvers refuse, the first REFUSED response is returned to the client. Additionally, SERVFAIL responses from upstream resolvers are now returned verbatim to the client rather than replaced with a locally synthesized packet. Synthesized SERVFAIL responses were authoritative and guaranteed to include a question section echoing the original query; upstream responses carry no such guarantees but may include extended error information (e.g. RFC 8914 extended DNS errors) that would otherwise be lost. Fixes #19024 Signed-off-by: Brendan Creane <bcreane@gmail.com>
2026-03-23ipn/ipnlocal: add a map for node public key to node ID lookups (#19051)Amal Bansode2-43/+177
This path is currently only used by DERP servers that have also enabled `verify-clients` to ensure that only authorized clients within a Tailnet are allowed to use said DERP server. The previous naive linear scan in NodeByKey would almost certainly lead to bad outcomes with a large enough netmap, so address an existing todo by building a map of node key -> node ID. Updates #19042 Signed-off-by: Amal Bansode <amal@tailscale.com>
2026-03-23.github/workflows: limit vet to the tailscale.com module (#19084)Tom Proctor1-1/+5
This repo's module is tailscale.com, and the tailscale-client-go-v2 repo uses tailscale.com/client/tailscale/v2. It seems from #19010 that if we have the client module as a dependency in this module, go vet will start to consider the client module as part of tailscale.com/... I'm not sure if this is a bug in go vet, but for now let's take the easy fix and specify ./... instead. In my testing, it seems like this is sufficient to make sure it just walks the file hierarchy and doesn't find the client module as a sub-path. Updates tailscale/corp#38418 Signed-off-by: Tom Proctor <tomhjp@users.noreply.github.com>
2026-03-23.github: Bump github/codeql-action from 4.32.6 to 4.34.1dependabot[bot]1-3/+3
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.6 to 4.34.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0d579ffd059c29b07949a3cce3983f0780820c98...38697555549f1db7851b81482ff19f1fa5c4fedc) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.34.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23feature/conn25: add packet filter allow functionsFran Bull2-1/+117
That will be able to be plugged into the hooks in wgengine/filter/filter.go to let connector packets flow. Fixes tailscale/corp#37144 Fixes tailscale/corp#37145 Signed-off-by: Fran Bull <fran@tailscale.com>
2026-03-23cmd/tailscale/cli: fix a typo in the `whois` help textAlex Chan1-1/+1
Updates #cleanup Change-Id: I739052548b81a94c4e4997d15883ee755c57df3c Signed-off-by: Alex Chan <alexc@tailscale.com>
2026-03-23safesocket, ipn/ipnserver: use PeerCreds on solaris and illumosNahum Shalman2-2/+2
Updates tailscale/peercred#10 Signed-off-by: Nahum Shalman <nahamu@gmail.com>
2026-03-23util/osdiag: fix typo in comment (reciever -> receiver)Charlie Tonneslan1-1/+1
Signed-off-by: Charlie Tonneslan <cst0520@gmail.com>