Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
264 commits
Select commit Hold shift + click to select a range
36df320
tsnet: remove an expired configuration-path migration step (#16120)
creachadair May 28, 2025
b0d3597
go.toolchain.rev: bump to 1.24.3 (#16060)
awly May 29, 2025
dca4036
util/set: add SmallSet
bradfitz May 27, 2025
4cccd15
ipn/ipnlocal: fix data race when accessing b.appConnector
nickkhyl May 29, 2025
191afd3
net/tshttpproxy: fix WDAP/PAC proxy detection on Win10 1607 and earlier
nickkhyl May 29, 2025
401d6c0
go.mod: bump golang.org/x deps
bradfitz May 29, 2025
ef49e75
util/set: add SmallSet.SoleElement, fix bug, add more tests
bradfitz May 29, 2025
5b670eb
cmd/containerboot: allow setting --accept-dns via TS_EXTRA_ARGS again…
irbekrm May 30, 2025
11e83f9
controlclient,health,ipnlocal,tailcfg: add DisplayMessage support
zofrex May 7, 2025
84aa7ff
syncs: fix AtomicValue.CompareAndSwap (#16137)
dsnet May 30, 2025
c9a5d63
tsconsensus: enable writing state to disk
franbull May 27, 2025
5f35143
go.mod,wgengine/magicsock: update wireguard-go (#16148)
jwhited Jun 2, 2025
8a3afa5
ipn/ipnlocal: fix deadlock when filtering DisplayMessage URLs
zofrex Jun 2, 2025
cc98859
posture: propagate serial number from MDM on Android
knyar May 30, 2025
5f0e139
cmd/tsidp: add Docker image building support (#16078)
rajsinghtech Jun 3, 2025
1635ccc
ssh/tailssh: display more useful error messages when authentication f…
oxtoacart May 29, 2025
5fde183
ipn: add watch opt to include actions in health messages
zofrex Jun 3, 2025
13ee285
health: show DisplayMessage actions in 'tailscale status'
zofrex Jun 4, 2025
486a55f
cmd/natc: add optional consensus backend
franbull Apr 16, 2025
75a7d28
net/packet: fix Parsed docs (#16200)
jwhited Jun 5, 2025
3e08eab
cmd/natc: use new on disk state store for consensus
franbull Jun 5, 2025
3f7a9f8
wgengine/magicsock: fix bpf fragmentation jump offsets (#16204)
cmol Jun 6, 2025
66ae873
wgengine/magicsock: make endpoint.bestAddr Geneve-aware (#16195)
jwhited Jun 6, 2025
7b06532
ipn/ipnlocal: Update hostinfo to control on service config change (#1…
KevinLiang10 Jun 6, 2025
5716d09
health: prefix Warnables received from the control plane
zofrex Jun 6, 2025
4456f77
cmd/k8s-operator: explicitly set tcp on VIPService port configuration…
ChaosInTheCRD Jun 9, 2025
67b1693
wgengine/magicsock: enable setting relay epAddr's as bestAddr (#16229)
jwhited Jun 9, 2025
c343bff
wgengine/relaymanager: don't start runLoop() on init() (#16231)
jwhited Jun 9, 2025
9501f66
wgengine/magicsock: don't cancel in-progress relayManager work (#16233)
jwhited Jun 9, 2025
cc8dc9e
types/netmap: fix NodeMutationEndpoints docs typo (#16234)
jwhited Jun 9, 2025
db34cdc
cmd/tailscale/cli: add a risk message about rp_filter
knyar May 22, 2025
e72c528
cmd/{derp,derpprobe},prober,derp: add mesh support to derpprobe (#15414)
mikeodr Jun 10, 2025
8114260
go.toolchain.rev: bump to go 1.24.4 (#16230)
patrickod Jun 10, 2025
6a93b17
types/netmap,wgengine/magicsock: propagate CapVer to magicsock.endpoi…
jwhited Jun 11, 2025
3b25e94
cmd/natc: allow specifying the tsnet state dir
franbull Jun 6, 2025
6010812
ipn/localapi,client/local: add debug watcher for bus events (#16239)
cmol Jun 11, 2025
8baa016
.github: Bump github/codeql-action from 3.28.15 to 3.28.19 (#16227)
dependabot[bot] Jun 12, 2025
75a4297
.github: Bump slackapi/slack-github-action from 2.0.0 to 2.1.0 (#15948)
dependabot[bot] Jun 12, 2025
7c05811
.github: Bump actions/setup-go from 5.4.0 to 5.5.0 (#15947)
dependabot[bot] Jun 12, 2025
3219de4
cmd/k8s-operator: ensure status update errors are displayed to users …
irbekrm Jun 12, 2025
3b5ce9d
tsweb/varz: add binary name to version metric
bradfitz Jun 12, 2025
3ed76ce
feature/relayserver,net/{netcheck,udprelay}: implement addr discovery…
jwhited Jun 12, 2025
b0f7b23
net/netcheck: preserve live home DERP through packet loss
raggi Jun 11, 2025
9206e76
net/packet: cleanup IPv4 fragment guards
raggi Jun 3, 2025
923bbd6
prober: record DERP dropped packets as they occur
raggi Jun 11, 2025
dac00e9
go.mod: bump github.com/cloudflare/circl (#16264)
awly Jun 13, 2025
6a4d92e
ipn/ipnlocal: replace nodeContext with nodeBackend in comments
nickkhyl Jun 13, 2025
fe391d5
client/local: use an iterator to stream bus events (#16269)
creachadair Jun 13, 2025
733bfae
ipn/ipnlocal: signal nodeBackend readiness and shutdown
nickkhyl Jun 13, 2025
e29e3c1
cmd/k8s-operator: ensure that TLS resources are updated for HA Ingres…
irbekrm Jun 16, 2025
59fab8b
.github: Bump github/codeql-action from 3.28.19 to 3.29.0 (#16287)
dependabot[bot] Jun 16, 2025
42da161
tka: reject removal of the last signing key
knyar Jun 13, 2025
8e6f63c
ipn/ipnlocal,wgengine/magicsock: use eventbus for node & filter updat…
jwhited Jun 16, 2025
5b7cf7f
.github/workflows: do a go mod download & cache it before all jobs
bradfitz Jun 15, 2025
8666142
util/eventbus: remove redundant code from eventbus.Publish
nickkhyl Jun 13, 2025
3d6e117
tsconsensus: protect from data race
franbull Jun 16, 2025
735f15c
util/must: add Get2 for functions that return two values
zofrex Jun 16, 2025
8698522
cmd/natc: add a flag to use specific DNS servers
raggi Jun 16, 2025
259bab9
scripts/check_license_headers.sh: delete, rewrite as a Go test
bradfitz Jun 16, 2025
5b086cd
tool/gocross: make gocross opt-in instead of opt-out
bradfitz Jun 15, 2025
077d52b
.github/workflows: removes extra '$'
irbekrm Jun 16, 2025
d7770d2
.github/workflows: test that ./go/tool version matches go mod version
irbekrm Jun 16, 2025
42f71e9
prober: speed up TestCRL ~450x by baking in some test keys
bradfitz Jun 17, 2025
d37e8d0
.github/workflows: remove redundant work between staticcheck jobs
bradfitz Jun 17, 2025
e7f5c9a
derp/derphttp: add error notify for RunWatchConnectionLoop (#16261)
mikeodr Jun 17, 2025
939355f
tool/gocross: put the synthetic GOROOTs outside of the tsgo directory
bradfitz Jun 15, 2025
4431fb8
ipn/ipnlocal: add some verbose logging to taildrive peerapi handler
oxtoacart Jun 17, 2025
cbc14bd
ipn: add missing entries for OpenBSD
juanfra684 Jun 17, 2025
49ae66c
cmd/tailscale: clean up dns --help messages (#16306)
sfllaw Jun 18, 2025
a91fcc8
ipn/ipnlocal: make pricing restriction message for Tailnet Lock clearer
knyar Jun 18, 2025
45a4b69
cmd/tsidp: fix OIDC client persistence across restarts
rajsinghtech Jun 18, 2025
fcab50b
ipn/ipnlocal,wgengine{/magicsock}: replace SetNetworkMap with eventbu…
jwhited Jun 18, 2025
ad0dfcb
net/*: remove Windows exceptions for when Resolver.PreferGo didn't work
bradfitz Jun 18, 2025
4979ce7
feature/tpm: implement ipn.StateStore using TPM sealing (#16030)
awly Jun 18, 2025
e92eb6b
net/tlsdial: fix TLS cert validation of HTTPS proxies
bradfitz Jun 9, 2025
583f740
Revert "types/netmap,wgengine/magicsock: propagate CapVer to magicsoc…
jwhited Jun 19, 2025
a64ca7a
tstest/tlstest: simplify, don't even bake in any keys
bradfitz Jun 19, 2025
253d0b0
cmd/k8s-operator: remove conffile hashing mechanism (#16335)
irbekrm Jun 20, 2025
5a52f80
docs: fix typo in commit-messages.md
okunamayanad Jun 17, 2025
9af42f4
.github/workflows: shard the Windows builder
bradfitz Jun 19, 2025
ca06d94
.github/workflows: try running Windows jobs on bigger VMs
bradfitz Jun 20, 2025
bb085cf
tool: add go toolchain wrapper for Windows
bradfitz Jun 20, 2025
12e92b1
tsconsensus: skipping slow non-applicable tests on Windows for now
bradfitz Jun 20, 2025
d3bb34c
wgengine/magicsock: generate relay server set from tailnet policy (#1…
jwhited Jun 20, 2025
cd9b9a8
wgengine/magicsock: fix relay endpoint allocation URL (#16344)
jwhited Jun 21, 2025
e935a28
wgengine/magicsock: set rxDiscoMsgCh field in relayHandshakeWork (#16…
jwhited Jun 22, 2025
61958f5
wgengine/magicsock: set conn field in relayHandshakeDiscoMsgEvent (#1…
jwhited Jun 22, 2025
0905936
wgengine/magicsock: set Geneve header protocol for WireGuard (#16350)
jwhited Jun 22, 2025
b3e7436
tool: rename go.ps1 to go-win.ps1 for cmd.exe+Powershell compat
bradfitz Jun 23, 2025
9309760
util/prompt: make yes/no prompt reusable
kradalby Jun 19, 2025
0198255
cmd/tailscale: warn user about nllock key removal without resigning
kradalby Jun 19, 2025
9288efe
wgengine/magicsock: remove premature return in handshakeServerEndpoin…
jwhited Jun 23, 2025
a589863
feature/relayserver,net/udprelay,wgengine/magicsock: implement retry …
jwhited Jun 23, 2025
31eebdb
wgengine/magicsock: send CallMeMaybeVia for relay endpoints (#16360)
jwhited Jun 23, 2025
4a1fc37
release/dist: switch back to Ubuntu 20.04 for building QNAP packages
oxtoacart Jun 23, 2025
9e28bfc
ipn/ipnlocal,wgengine/magicsock: wait for magicsock to process pendin…
nickkhyl Jun 24, 2025
83cd446
release/dist/qnap: upgrade to Ubuntu 24.04 Docker image
oxtoacart Jun 24, 2025
f2f1236
util/eventbus: add test helpers to simplify testing events (#16294)
cmol Jun 25, 2025
b75fe9e
cmd/k8s-operator: Add NOTES.txt to Helm chart (#16364)
davidsbond Jun 25, 2025
35b11e7
envknob/featureknob: restore SSH and exit-node capability for Home As…
lmagyar Jun 25, 2025
37eca17
net/netmon: add tests for the events over the eventbus (#16382)
cmol Jun 25, 2025
51d00e1
wgengine/magicsock: fix relayManager alloc work cleanup (#16387)
jwhited Jun 26, 2025
aa106c9
.github/workflows: request @tailscale/dataplane review DERP changes (…
sfllaw Jun 26, 2025
47dff33
tool/gocross: remove GOROOT to ensure correct toolchain use
raggi Jun 26, 2025
99aaa6e
ipn/ipnlocal: update PeerByID to return SelfNode and rename it to Nod…
q792602257 Jun 26, 2025
d2c1ed2
.github/workflows: replace tibdex with official GitHub Action (#16385)
sfllaw Jun 26, 2025
6feb3c3
ipn/store: automatically migrate between plaintext and encrypted stat…
awly Jun 27, 2025
b2bf7e9
wgengine/magicsock: add envknob to toggle UDP relay feature (#16396)
jwhited Jun 27, 2025
b32a01b
disco,net/udprelay,wgengine/magicsock: support relay re-binding (#16388)
jwhited Jun 27, 2025
4a7b8af
cmd/tailscale: add tlpub: prefix to lock log output
kradalby Jun 20, 2025
df786be
cmd/tailscale: use text format for TKA head
kradalby Jun 27, 2025
53f67c4
util/eventbus: fix docstrings (#16401)
cmol Jun 27, 2025
f81baa2
cmd/k8s-operator, k8s-operator: support Static Endpoints on ProxyGrou…
ChaosInTheCRD Jun 27, 2025
711698f
cmd/{containerboot,k8s-operator}: use state Secret for checking devic…
tomhjp Jun 27, 2025
0a64e86
wgengine/magicsock: move UDP relay path discovery to heartbeat() (#16…
jwhited Jun 27, 2025
76b9afb
ipn/store: make StateStore.All optional (#16409)
awly Jun 27, 2025
544aee9
tsidp: update README to refer to community projects (#16411)
sfllaw Jun 28, 2025
3dc694b
wgengine/magicsock: clear UDP relay bestAddr's on disco ping timeout …
jwhited Jun 28, 2025
ee8c356
tailcfg: format integer IDs as decimal consistently
bradfitz Jun 23, 2025
f85e4bc
client/systray: replace counter metric with gauge
willnorris Jun 27, 2025
2fc2475
cmd/k8s-operator: ProxyClass annotation for Services and Ingresses (#…
ChaosInTheCRD Jun 30, 2025
47e7756
wgengine/magicsock: avoid handshaking relay endpoints that are truste…
jwhited Jun 30, 2025
6a9bf91
ipn/ipnlocal: add verbose Taildrive logging on client side
oxtoacart Jun 30, 2025
454d856
drive,ipn/ipnlocal: calculate peer taildrive URLs on-demand
oxtoacart Jul 1, 2025
d15b231
tailcfg: add CapabilityOwner (#16426)
kari-ts Jul 1, 2025
d2edf71
wgengine/magicsock: remove references to rucPtr (#16441)
jwhited Jul 2, 2025
172e26b
tailcfg: report StateEncrypted in Hostinfo (#16434)
awly Jul 2, 2025
f9e7131
wgengine/magicsock: make lazyEndpoint load bearing for UDP relay (#16…
jwhited Jul 2, 2025
eb03d42
cmd/k8s-operator: Allow configuration of login server (#16432)
davidsbond Jul 2, 2025
77d1960
derp/derphttp: fix DERP TLS client server name inclusion in URL form
raggi Jul 2, 2025
3a4b439
feature/relayserver,net/udprelay: add IPv6 support (#16442)
jwhited Jul 3, 2025
5dc11d5
cmd/k8s-operator: Set login server on tsrecorder nodes (#16443)
davidsbond Jul 3, 2025
1a2185b
ipn/ipnlocal: rename setAutoExitNodeIDLockedOnEntry to pickNewAutoExi…
nickkhyl Jul 3, 2025
56d772b
ipn/ipnlocal: simplify pickNewAutoExitNode
nickkhyl Jul 3, 2025
6ecc25b
ipn/ipnlocal: skip TestUpdateNetmapDeltaAutoExitNode
nickkhyl Jul 3, 2025
0098822
ipn/ipnlocal: update suggestExitNode to skip offline candidates and f…
nickkhyl Jul 3, 2025
a8055b5
cmd/tailscale/cli,ipn,ipn/ipnlocal: add AutoExitNode preference for a…
nickkhyl Jul 3, 2025
c46145b
cmd/k8s-operator: Move login server value to top-level (#16470)
davidsbond Jul 4, 2025
639fed6
Dockerfile,build_docker.sh: add a note on how to build local images (…
irbekrm Jul 4, 2025
92a114c
tailcfg, feature/relayserver, wgengine/magicsock: invert UDP relay se…
dylan-tailscale Jul 4, 2025
079134d
cmd/k8s-operator: always set ProxyGroup status conditions (#16429)
tomhjp Jul 6, 2025
4f3355e
.github: Bump github/codeql-action from 3.29.0 to 3.29.1 (#16423)
dependabot[bot] Jul 7, 2025
84eac7b
cmd/k8s-operator: Allow custom ingress class names (#16472)
davidsbond Jul 7, 2025
540eb05
wgengine/magicsock: make Conn.Send() lazyEndpoint aware (#16465)
jwhited Jul 7, 2025
3b32cc7
wgengine/magicsock: simplify Geneve-encapsulated disco.Ping handling …
jwhited Jul 7, 2025
a84d580
wgengine/magicsock: fix lazyEndpoint DstIP() vs SrcIP() (#16453)
jwhited Jul 7, 2025
04d24cd
wgengine/netstack: correctly proxy half-closed TCP connections
tendstofortytwo Jul 7, 2025
3e01652
ipn/ipnlocal: add (*LocalBackend).RefreshExitNode
nickkhyl Jul 3, 2025
4c1c0ba
ipn/ipnlocal: plumb nodeBackend into suggestExitNode to support delta…
nickkhyl Jul 3, 2025
381fdcc
ipn/ipnlocal,util/syspolicy/source: retain existing exit node when us…
nickkhyl Jul 4, 2025
cb7b499
ipn/ipnlocal: add (*LocalBackend).reconcilePrefsLocked
nickkhyl Jul 4, 2025
a6f6478
util/syspolicy: add HasAnyOf to check if any specified policy setting…
nickkhyl Jul 7, 2025
f1c7b46
ipn/{ipnauth,ipnlocal,localapi}: make EditPrefs return an error if ch…
nickkhyl Jul 7, 2025
ea4018b
ipn/ipnlocal: fix missing defer in testExtension.Shutdown
nickkhyl Jul 7, 2025
47f431b
net/udprelay: fix relaying between mixed address family sockets (#16485)
jwhited Jul 8, 2025
5b00747
go.mod,wgengine/magicsock: implement conn.InitiationAwareEndpoint (#1…
jwhited Jul 8, 2025
1fe82d6
cmd/tailscale/cli,ipn/ipnlocal: restrict logout when AlwaysOn mode is…
nickkhyl Jul 8, 2025
9bf9974
ipn/ipnlocal: refactor resolveExitNodeInPrefsLocked, setExitNodeID an…
nickkhyl Jul 8, 2025
2c630e1
ipn/ipnlocal: make applySysPolicy a method on LocalBackend
nickkhyl Jul 8, 2025
740b77d
ipn/ipnlocal,util/syspolicy: add support for ExitNode.AllowOverride p…
nickkhyl Jul 8, 2025
a60e0ca
wgengine/magicsock: remove conn.InitiationAwareEndpoint TODO (#16498)
jwhited Jul 9, 2025
bad17a1
cmd/tailscale: format empty cities and countries as hyphens (#16495)
sfllaw Jul 9, 2025
90bf0a9
cmd/k8s-operator/deploy: clarify helm install notes (#16449)
tomhjp Jul 9, 2025
4dfed6b
cmd/{k8s-operator,k8s-proxy}: add kube-apiserver ProxyGroup type (#16…
tomhjp Jul 9, 2025
27fa2ad
cmd/k8s-operator: don't require generation for Available condition (#…
tomhjp Jul 9, 2025
008a238
wgengine/magicsock: support self as candidate peer relay (#16499)
jwhited Jul 9, 2025
cc2f4ac
ipn: move ParseAutoExitNodeID from ipn/ipnlocal to ipn
nickkhyl Jul 9, 2025
c5fdf9e
cmd/tailscale/cli: add support for tailscale {up,set} --exit-node=aut…
nickkhyl Jul 9, 2025
21a4058
ipn/ipnlocal: add test to verify handling of unknown auto exit node e…
nickkhyl Jul 8, 2025
ff18031
ipn/ipnlocal: change order of exit node refresh and netmap update so …
nickkhyl Jul 9, 2025
d40b253
tailcfg, wgengine/magicsock: disable all UDP relay usage if disable-r…
dylan-tailscale Jul 9, 2025
ae86417
cmd/tailscale/cli,ipn/ipnstate,wgengine/magicsock: label peer-relay (…
jwhited Jul 9, 2025
6a0fad1
wgengine/magicsock: don't peer relay if NodeAttrOnlyTCP443 is set (#1…
jwhited Jul 10, 2025
fbc4c34
ipn/localapi: do not break client on event marshalling errors (#16503)
cmol Jul 10, 2025
cf0460b
cmd/k8s-operator: allow letsencrypt staging on k8s proxies (#16521)
davidsbond Jul 10, 2025
2b665c3
cmd/{k8s-operator,k8s-proxy}: allow setting login server url (#16504)
davidsbond Jul 10, 2025
d0cafc0
cmd/{k8s-operator,k8s-proxy}: apply accept-routes configuration to k8…
davidsbond Jul 10, 2025
f9bfd81
wgengine/magicsock: resolve epAddr collisions across peer relay conns…
jwhited Jul 10, 2025
bebc796
ipn/ipnlocal: add traffic-steering nodecap (#16529)
sfllaw Jul 10, 2025
fbc6a9e
all: detect JetKVM and specialize a handful of things for it
bradfitz Jul 10, 2025
fed72e2
cmd/tailscale, ipn/ipnstate, wgengine/magicsock: update ping output f…
dylan-tailscale Jul 10, 2025
5f678b9
docs/windows/policy: add ExitNode.AllowOverride as an option to ExitN…
nickkhyl Jul 9, 2025
bd29a1c
feature/relayserver,wgengine/magicsock: remove WIP gating of peer rel…
jwhited Jul 11, 2025
c18ba44
ipn/ipnlocal: add traffic steering support to exit-node suggestions (…
sfllaw Jul 11, 2025
04e8d21
go.mod: bump wg-go to fix keepalive detection (#16535)
jwhited Jul 11, 2025
30da2e1
cmd/tailscale/cli: add "configure jetkvm" subcommand
bradfitz Jul 11, 2025
39bf84d
cmd/tsidp: set hostinfo.App in tsnet mode (#16544)
awly Jul 11, 2025
24062e3
net/udprelay: fix peer relay server deadlock (#16542)
jwhited Jul 12, 2025
f23e427
types/lazy: add lazy.GMap: a map of lazily computed GValues (#16532)
sfllaw Jul 13, 2025
bcaea4f
k8s-operator,sessionrecording: fixing race condition between resize (…
ChaosInTheCRD Jul 14, 2025
fe46f33
cmd/{k8s-operator,k8s-proxy},kube/k8s-proxy: add static endpoints for…
ChaosInTheCRD Jul 14, 2025
fc50500
wgengine/magicsock: don't acquire Conn.mu in udpRelayEndpointReady (#…
jwhited Jul 14, 2025
f338c40
util/jsonutil: remove unused package (#16563)
dsnet Jul 14, 2025
b63f8a4
wgengine/magicsock: prioritize trusted peer relay paths over untruste…
jwhited Jul 14, 2025
bfb3449
ipn/ipnlocal: modernize nm.Peers with AppendMatchingPeers
sfllaw Jul 15, 2025
205f822
ipn/ipnlocal: check if suggested exit node is online
sfllaw Jul 15, 2025
7a32211
.github: Bump slackapi/slack-github-action from 2.1.0 to 2.1.1 (#16553)
dependabot[bot] Jul 15, 2025
e0fcd59
tailcfg: send health update if DisplayMessage URL changes
zofrex Jul 14, 2025
ffe8cc9
.github: Bump github/codeql-action from 3.29.1 to 3.29.2 (#16480)
dependabot[bot] Jul 15, 2025
d65c0fd
tailcfg,wgengine/magicsock: set peer relay CapVer (#16531)
jwhited Jul 15, 2025
cb7a0b1
net/udprelay: log socket read errors (#16573)
jwhited Jul 15, 2025
67514f5
ssh/tailssh: fix path of "true" on Darwin (#16569)
creachadair Jul 16, 2025
3c6d17e
cmd/tailscale/cli,ipn/ipnlocal,wgengine/magicsock: implement tailscal…
jwhited Jul 16, 2025
097c2bc
go.mod: bump wireguard-go (#16578)
jwhited Jul 16, 2025
17c5116
ipn/ipnlocal: sort tailscale debug peer-relay-servers slice (#16579)
jwhited Jul 16, 2025
e84e58c
ipn/ipnlocal: use rendezvous hashing to traffic-steer exit nodes
sfllaw Jul 16, 2025
36aeacb
wgengine/magicsock: add peer relay metrics (#16582)
jwhited Jul 16, 2025
e7238ef
cmd/tailscale/cli: Add service flag to serve command (#16191)
KevinLiang10 Jul 16, 2025
93511be
types/geo: add geo.Point and its associated units (#16583)
sfllaw Jul 17, 2025
d334d9b
client/local,cmd/tailscale/cli,ipn/localapi: expose eventbus graph (#…
cmol Jul 18, 2025
871f73d
Kevin/add drain sub command for serve services (#16502)
KevinLiang10 Jul 18, 2025
d1ceb62
client/systray: look for ubuntu gnome
cmol Jul 17, 2025
6c206fa
feature/tpm: try opening /dev/tpmrm0 before /tmp/tpm0 on Linux (#16600)
awly Jul 18, 2025
e01618a
cmd/tailscale/cli: Add clear subcommand for serve services (#16509)
KevinLiang10 Jul 18, 2025
5adde9e
cmd/tailscale/cli: remove advertise command (#16592)
KevinLiang10 Jul 18, 2025
f421907
all-kube: create Tailscale Service for HA kube-apiserver ProxyGroup (…
tomhjp Jul 21, 2025
d6d29ab
tstest/integration/testcontrol: include peer CapMaps in MapResponses
rajsinghtech Jul 14, 2025
5d4e67f
net/dns/recursive: set EDNS on queries
bradfitz Jul 21, 2025
1677fb1
wgengine/magicsock,all: allocate peer relay over disco instead of Pee…
jwhited Jul 21, 2025
0d03a37
feature/tpm: log errors on the initial info fetch (#16574)
awly Jul 21, 2025
c989824
cmd/k8s-operator: Allow specifying cluster ips for nameservers (#16477)
davidsbond Jul 21, 2025
8453170
feature/relayserver: fix consumeEventbusTopics deadlock (#16618)
jwhited Jul 21, 2025
6f7e78b
cmd/tailscale/cli: make configure kubeconfig accept Tailscale Service…
tomhjp Jul 22, 2025
22a8e0a
cmd/{k8s-operator,k8s-proxy},kube: use consistent type for auth mode …
tomhjp Jul 22, 2025
4494705
cmd/{k8s-proxy,containerboot,k8s-operator},kube: add health check and…
davidsbond Jul 22, 2025
0de5e7b
util/set: add IntSet (#16602)
dsnet Jul 22, 2025
19faaff
cmd/tailscale/cli: revert key for web config for services to FQDN (#1…
KevinLiang10 Jul 22, 2025
729d653
tailcfg: add Hostinfo.ExitNodeID to report the selected exit node (#1…
sfllaw Jul 22, 2025
1ae6a97
cmd/tailscale/cli: add advertise command to advertise a node as servi…
KevinLiang10 Jul 23, 2025
f1f334b
flake.lock/go.mod.sri: update flake version info (#16631)
mikeodr Jul 23, 2025
1ef8fbf
ipn/ipnlocal: send Hostinfo after resolveExitNode for "auto:any" (#16…
sfllaw Jul 23, 2025
179745b
wgengine/magicsock: update discoInfo docs (#16638)
jwhited Jul 23, 2025
c87f44b
cmd/tailscale/cli: use DNS name instead of Location to hide Mullvad e…
nickkhyl Jul 22, 2025
758dfe7
VERSION.txt: this is v1.86.0
dblohm7 Jul 24, 2025
fdcff40
VERSION.txt: this is v1.86.1
dblohm7 Jul 25, 2025
91d65e0
k8s-operator: handle multiple WebSocket frames per read (#16678) (#16…
tomhjp Jul 28, 2025
4123469
util/syspolicy/setting: use a custom marshaler for time.Duration
nickkhyl Jul 28, 2025
9c73050
net/portmapper: avert a panic when a mapping is not available (#16686)
creachadair Jul 28, 2025
50a476f
wgengine/magicsock: fix magicsock deadlock around Conn.NoteRecvActivi…
jwhited Jul 29, 2025
a277abc
k8s-operator: adding session type to cast header (#16660) (#16689)
ChaosInTheCRD Jul 29, 2025
d72494b
VERSION.txt: this is v1.86.2
dblohm7 Jul 29, 2025
d6116ea
feature/taildrop: do not use m.opts.Dir for Android (#16316)
kari-ts Aug 1, 2025
55027d4
Revert "feature/taildrop: do not use m.opts.Dir for Android (#16316)"
kari-ts Aug 6, 2025
2589be2
feature/taildrop: do not use m.opts.Dir for Android (#16316) (#16789)
kari-ts Aug 6, 2025
2b42f22
VERSION.txt: this is v1.86.3
barnstar Aug 7, 2025
51c11a8
VERSION.txt: this is v1.86.4
barnstar Aug 7, 2025
56f738a
cmd/k8s-proxy,k8s-operator: fix serve config for userspace mode (#169…
tomhjp Aug 22, 2025
db392ae
VERSION.txt: this is v1.86.5
tomhjp Aug 22, 2025
e5fb76e
Merge branch 'release-branch/1.86' into cpierre/coreweave-1.86
ChandonPierre Sep 3, 2025
4518c6f
chore(ci): remove additional upstream workflows
ChandonPierre Sep 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 0 additions & 27 deletions .github/workflows/natlab-integrationtest.yml

This file was deleted.

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,6 @@ client/web/build/assets
*.xcworkspacedata
/tstest/tailmac/bin
/tstest/tailmac/build

# Ignore personal IntelliJ settings
.idea/
9 changes: 9 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@
# Tailscale images are currently built using https://github.com/tailscale/mkctr,
# and the build script can be found in ./build_docker.sh.
#
# If you want to build local images for testing, you can use make.
#
# To build a Tailscale image and push to the local docker registry:
#
# $ REPO=local/tailscale TAGS=v0.0.1 PLATFORM=local make publishdevimage
#
# To build a Tailscale image and push to a remote docker registry:
#
# $ REPO=<your-registry>/<your-repo>/tailscale TAGS=v0.0.1 make publishdevimage
#
# This Dockerfile includes all the tailscale binaries.
#
Expand Down
56 changes: 33 additions & 23 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ updatedeps: ## Update depaware deps
tailscale.com/cmd/tailscale \
tailscale.com/cmd/derper \
tailscale.com/cmd/k8s-operator \
tailscale.com/cmd/stund
tailscale.com/cmd/stund \
tailscale.com/cmd/tsidp
PATH="$$(./tool/go env GOROOT)/bin:$$PATH" ./tool/go run github.com/tailscale/depaware --update -goos=linux,darwin,windows,android,ios --internal \
tailscale.com/tsnet

Expand All @@ -34,7 +35,8 @@ depaware: ## Run depaware checks
tailscale.com/cmd/tailscale \
tailscale.com/cmd/derper \
tailscale.com/cmd/k8s-operator \
tailscale.com/cmd/stund
tailscale.com/cmd/stund \
tailscale.com/cmd/tsidp
PATH="$$(./tool/go env GOROOT)/bin:$$PATH" ./tool/go run github.com/tailscale/depaware --check --goos=linux,darwin,windows,android,ios --internal \
tailscale.com/tsnet

Expand Down Expand Up @@ -62,7 +64,7 @@ buildmultiarchimage: ## Build (and optionally push) multiarch docker image
check: staticcheck vet depaware buildwindows build386 buildlinuxarm buildwasm ## Perform basic checks and compilation tests

staticcheck: ## Run staticcheck.io checks
./tool/go run honnef.co/go/tools/cmd/staticcheck -- $$(./tool/go list ./... | grep -v tempfork)
./tool/go run honnef.co/go/tools/cmd/staticcheck -- $$(./tool/go run ./tool/listpkgs --ignore-3p ./...)

kube-generate-all: kube-generate-deepcopy ## Refresh generated files for Tailscale Kubernetes Operator
./tool/go generate ./cmd/k8s-operator
Expand Down Expand Up @@ -90,34 +92,42 @@ pushspk: spk ## Push and install synology package on ${SYNO_HOST} host
scp tailscale.spk root@${SYNO_HOST}:
ssh root@${SYNO_HOST} /usr/syno/bin/synopkg install tailscale.spk

publishdevimage: ## Build and publish tailscale image to location specified by ${REPO}
@test -n "${REPO}" || (echo "REPO=... required; e.g. REPO=ghcr.io/${USER}/tailscale" && exit 1)
@test "${REPO}" != "tailscale/tailscale" || (echo "REPO=... must not be tailscale/tailscale" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/tailscale" || (echo "REPO=... must not be ghcr.io/tailscale/tailscale" && exit 1)
@test "${REPO}" != "tailscale/k8s-operator" || (echo "REPO=... must not be tailscale/k8s-operator" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/k8s-operator" || (echo "REPO=... must not be ghcr.io/tailscale/k8s-operator" && exit 1)
.PHONY: check-image-repo
check-image-repo:
@if [ -z "$(REPO)" ]; then \
echo "REPO=... required; e.g. REPO=ghcr.io/$$USER/tailscale" >&2; \
exit 1; \
fi
@for repo in tailscale/tailscale ghcr.io/tailscale/tailscale \
tailscale/k8s-operator ghcr.io/tailscale/k8s-operator \
tailscale/k8s-nameserver ghcr.io/tailscale/k8s-nameserver \
tailscale/tsidp ghcr.io/tailscale/tsidp \
tailscale/k8s-proxy ghcr.io/tailscale/k8s-proxy; do \
if [ "$(REPO)" = "$$repo" ]; then \
echo "REPO=... must not be $$repo" >&2; \
exit 1; \
fi; \
done

publishdevimage: check-image-repo ## Build and publish tailscale image to location specified by ${REPO}
TAGS="${TAGS}" REPOS=${REPO} PLATFORM=${PLATFORM} PUSH=true TARGET=client ./build_docker.sh

publishdevoperator: ## Build and publish k8s-operator image to location specified by ${REPO}
@test -n "${REPO}" || (echo "REPO=... required; e.g. REPO=ghcr.io/${USER}/tailscale" && exit 1)
@test "${REPO}" != "tailscale/tailscale" || (echo "REPO=... must not be tailscale/tailscale" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/tailscale" || (echo "REPO=... must not be ghcr.io/tailscale/tailscale" && exit 1)
@test "${REPO}" != "tailscale/k8s-operator" || (echo "REPO=... must not be tailscale/k8s-operator" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/k8s-operator" || (echo "REPO=... must not be ghcr.io/tailscale/k8s-operator" && exit 1)
publishdevoperator: check-image-repo ## Build and publish k8s-operator image to location specified by ${REPO}
TAGS="${TAGS}" REPOS=${REPO} PLATFORM=${PLATFORM} PUSH=true TARGET=k8s-operator ./build_docker.sh

publishdevnameserver: ## Build and publish k8s-nameserver image to location specified by ${REPO}
@test -n "${REPO}" || (echo "REPO=... required; e.g. REPO=ghcr.io/${USER}/tailscale" && exit 1)
@test "${REPO}" != "tailscale/tailscale" || (echo "REPO=... must not be tailscale/tailscale" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/tailscale" || (echo "REPO=... must not be ghcr.io/tailscale/tailscale" && exit 1)
@test "${REPO}" != "tailscale/k8s-nameserver" || (echo "REPO=... must not be tailscale/k8s-nameserver" && exit 1)
@test "${REPO}" != "ghcr.io/tailscale/k8s-nameserver" || (echo "REPO=... must not be ghcr.io/tailscale/k8s-nameserver" && exit 1)
publishdevnameserver: check-image-repo ## Build and publish k8s-nameserver image to location specified by ${REPO}
TAGS="${TAGS}" REPOS=${REPO} PLATFORM=${PLATFORM} PUSH=true TARGET=k8s-nameserver ./build_docker.sh

publishdevtsidp: check-image-repo ## Build and publish tsidp image to location specified by ${REPO}
TAGS="${TAGS}" REPOS=${REPO} PLATFORM=${PLATFORM} PUSH=true TARGET=tsidp ./build_docker.sh

publishdevproxy: check-image-repo ## Build and publish k8s-proxy image to location specified by ${REPO}
TAGS="${TAGS}" REPOS=${REPO} PLATFORM=${PLATFORM} PUSH=true TARGET=k8s-proxy ./build_docker.sh

.PHONY: sshintegrationtest
sshintegrationtest: ## Run the SSH integration tests in various Docker containers
@GOOS=linux GOARCH=amd64 ./tool/go test -tags integrationtest -c ./ssh/tailssh -o ssh/tailssh/testcontainers/tailssh.test && \
GOOS=linux GOARCH=amd64 ./tool/go build -o ssh/tailssh/testcontainers/tailscaled ./cmd/tailscaled && \
@GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go test -tags integrationtest -c ./ssh/tailssh -o ssh/tailssh/testcontainers/tailssh.test && \
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go build -o ssh/tailssh/testcontainers/tailscaled ./cmd/tailscaled && \
echo "Testing on ubuntu:focal" && docker build --build-arg="BASE=ubuntu:focal" -t ssh-ubuntu-focal ssh/tailssh/testcontainers && \
echo "Testing on ubuntu:jammy" && docker build --build-arg="BASE=ubuntu:jammy" -t ssh-ubuntu-jammy ssh/tailssh/testcontainers && \
echo "Testing on ubuntu:noble" && docker build --build-arg="BASE=ubuntu:noble" -t ssh-ubuntu-noble ssh/tailssh/testcontainers && \
Expand Down
2 changes: 1 addition & 1 deletion VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.84.3
1.86.5
6 changes: 5 additions & 1 deletion atomicfile/atomicfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,9 @@ func WriteFile(filename string, data []byte, perm os.FileMode) (err error) {
if err := f.Close(); err != nil {
return err
}
return rename(tmpName, filename)
return Rename(tmpName, filename)
}

// Rename srcFile to dstFile, similar to [os.Rename] but preserving file
// attributes and ACLs on Windows.
func Rename(srcFile, dstFile string) error { return rename(srcFile, dstFile) }
46 changes: 46 additions & 0 deletions build_docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
# hash of this repository as produced by ./cmd/mkversion.
# This is the image build mechanim used to build the official Tailscale
# container images.
#
# If you want to build local images for testing, you can use make, which provides few convenience wrappers around this script.
#
# To build a Tailscale image and push to the local docker registry:

# $ REPO=local/tailscale TAGS=v0.0.1 PLATFORM=local make publishdevimage
#
# To build a Tailscale image and push to a remote docker registry:
#
# $ REPO=<your-registry>/<your-repo>/tailscale TAGS=v0.0.1 make publishdevimage

set -eu

Expand Down Expand Up @@ -90,6 +100,42 @@ case "$TARGET" in
--annotations="${ANNOTATIONS}" \
/usr/local/bin/k8s-nameserver
;;
tsidp)
DEFAULT_REPOS="tailscale/tsidp"
REPOS="${REPOS:-${DEFAULT_REPOS}}"
go run github.com/tailscale/mkctr \
--gopaths="tailscale.com/cmd/tsidp:/usr/local/bin/tsidp" \
--ldflags=" \
-X tailscale.com/version.longStamp=${VERSION_LONG} \
-X tailscale.com/version.shortStamp=${VERSION_SHORT} \
-X tailscale.com/version.gitCommitStamp=${VERSION_GIT_HASH}" \
--base="${BASE}" \
--tags="${TAGS}" \
--gotags="ts_package_container" \
--repos="${REPOS}" \
--push="${PUSH}" \
--target="${PLATFORM}" \
--annotations="${ANNOTATIONS}" \
/usr/local/bin/tsidp
;;
k8s-proxy)
DEFAULT_REPOS="tailscale/k8s-proxy"
REPOS="${REPOS:-${DEFAULT_REPOS}}"
go run github.com/tailscale/mkctr \
--gopaths="tailscale.com/cmd/k8s-proxy:/usr/local/bin/k8s-proxy" \
--ldflags=" \
-X tailscale.com/version.longStamp=${VERSION_LONG} \
-X tailscale.com/version.shortStamp=${VERSION_SHORT} \
-X tailscale.com/version.gitCommitStamp=${VERSION_GIT_HASH}" \
--base="${BASE}" \
--tags="${TAGS}" \
--gotags="ts_kube,ts_package_container" \
--repos="${REPOS}" \
--push="${PUSH}" \
--target="${PLATFORM}" \
--annotations="${ANNOTATIONS}" \
/usr/local/bin/k8s-proxy
;;
*)
echo "unknown target: $TARGET"
exit 1
Expand Down
1 change: 1 addition & 0 deletions chirp/chirp_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

package chirp

import (
Expand Down
85 changes: 83 additions & 2 deletions client/local/local.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

//go:build go1.22

// Package local contains a Go client for the Tailscale LocalAPI.
package local

import (
"bufio"
"bytes"
"cmp"
"context"
Expand All @@ -16,6 +15,7 @@ import (
"errors"
"fmt"
"io"
"iter"
"net"
"net/http"
"net/http/httptrace"
Expand All @@ -42,6 +42,7 @@ import (
"tailscale.com/types/dnstype"
"tailscale.com/types/key"
"tailscale.com/types/tkatype"
"tailscale.com/util/eventbus"
"tailscale.com/util/syspolicy/setting"
)

Expand Down Expand Up @@ -397,6 +398,23 @@ func (lc *Client) IncrementCounter(ctx context.Context, name string, delta int)
return err
}

// IncrementGauge increments the value of a Tailscale daemon's gauge
// metric by the given delta. If the metric has yet to exist, a new gauge
// metric is created and initialized to delta. The delta value can be negative.
func (lc *Client) IncrementGauge(ctx context.Context, name string, delta int) error {
type metricUpdate struct {
Name string `json:"name"`
Type string `json:"type"`
Value int `json:"value"` // amount to increment by
}
_, err := lc.send(ctx, "POST", "/localapi/v0/upload-client-metrics", 200, jsonBody([]metricUpdate{{
Name: name,
Type: "gauge",
Value: delta,
}}))
return err
}

// TailDaemonLogs returns a stream the Tailscale daemon's logs as they arrive.
// Close the context to stop the stream.
func (lc *Client) TailDaemonLogs(ctx context.Context) (io.Reader, error) {
Expand All @@ -414,6 +432,50 @@ func (lc *Client) TailDaemonLogs(ctx context.Context) (io.Reader, error) {
return res.Body, nil
}

// EventBusGraph returns a graph of active publishers and subscribers in the eventbus
// as a [eventbus.DebugTopics]
func (lc *Client) EventBusGraph(ctx context.Context) ([]byte, error) {
return lc.get200(ctx, "/localapi/v0/debug-bus-graph")
}

// StreamBusEvents returns an iterator of Tailscale bus events as they arrive.
// Each pair is a valid event and a nil error, or a zero event a non-nil error.
// In case of error, the iterator ends after the pair reporting the error.
// Iteration stops if ctx ends.
func (lc *Client) StreamBusEvents(ctx context.Context) iter.Seq2[eventbus.DebugEvent, error] {
return func(yield func(eventbus.DebugEvent, error) bool) {
req, err := http.NewRequestWithContext(ctx, "GET",
"http://"+apitype.LocalAPIHost+"/localapi/v0/debug-bus-events", nil)
if err != nil {
yield(eventbus.DebugEvent{}, err)
return
}
res, err := lc.doLocalRequestNiceError(req)
if err != nil {
yield(eventbus.DebugEvent{}, err)
return
}
if res.StatusCode != http.StatusOK {
yield(eventbus.DebugEvent{}, errors.New(res.Status))
return
}
defer res.Body.Close()
dec := json.NewDecoder(bufio.NewReader(res.Body))
for {
var evt eventbus.DebugEvent
if err := dec.Decode(&evt); err == io.EOF {
return
} else if err != nil {
yield(eventbus.DebugEvent{}, err)
return
}
if !yield(evt, nil) {
return
}
}
}
}

// Pprof returns a pprof profile of the Tailscale daemon.
func (lc *Client) Pprof(ctx context.Context, pprofType string, sec int) ([]byte, error) {
var secArg string
Expand Down Expand Up @@ -788,6 +850,25 @@ func (lc *Client) CheckUDPGROForwarding(ctx context.Context) error {
return nil
}

// CheckReversePathFiltering asks the local Tailscale daemon whether strict
// reverse path filtering is enabled, which would break exit node usage on Linux.
func (lc *Client) CheckReversePathFiltering(ctx context.Context) error {
body, err := lc.get200(ctx, "/localapi/v0/check-reverse-path-filtering")
if err != nil {
return err
}
var jres struct {
Warning string
}
if err := json.Unmarshal(body, &jres); err != nil {
return fmt.Errorf("invalid JSON from check-reverse-path-filtering: %w", err)
}
if jres.Warning != "" {
return errors.New(jres.Warning)
}
return nil
}

// SetUDPGROForwarding enables UDP GRO forwarding for the main interface of this
// node. This can be done to improve performance of tailnet nodes acting as exit
// nodes or subnet routers.
Expand Down
5 changes: 3 additions & 2 deletions client/systray/systray.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ func (menu *Menu) Run() {
case <-menu.bgCtx.Done():
}
}()
go menu.lc.IncrementCounter(menu.bgCtx, "systray_start", 1)
go menu.lc.IncrementGauge(menu.bgCtx, "systray_running", 1)
defer menu.lc.IncrementGauge(menu.bgCtx, "systray_running", -1)

systray.Run(menu.onReady, menu.onExit)
}
Expand Down Expand Up @@ -127,7 +128,7 @@ func init() {

desktop := strings.ToLower(os.Getenv("XDG_CURRENT_DESKTOP"))
switch desktop {
case "gnome":
case "gnome", "ubuntu:gnome":
// GNOME expands submenus downward in the main menu, rather than flyouts to the side.
// Either as a result of that or another limitation, there seems to be a maximum depth of submenus.
// Mullvad countries that have a city submenu are not being rendered, and so can't be selected.
Expand Down
Loading