<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tailscale, branch main</title>
<subtitle>The easiest, most secure way to use WireGuard and 2FA</subtitle>
<id>http://git.waynecole.info/tailscale/atom?h=main</id>
<link rel='self' href='http://git.waynecole.info/tailscale/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/'/>
<updated>2026-04-25T02:01:43Z</updated>
<entry>
<title>all: fix duplicate package docs and tighten TestPackageDocs</title>
<updated>2026-04-25T02:01:43Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-25T01:14:56Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=f3b2f9b0ef09ed20119f5b89a9652b14ccd94122'/>
<id>urn:sha1:f3b2f9b0ef09ed20119f5b89a9652b14ccd94122</id>
<content type='text'>
TestPackageDocs walked into directories starting with "." (such as
.claude worktrees) and only logged warnings on duplicate package docs
across files in a directory. Skip dot-directories (which covers the
old .git but also .claude), ignore files with "//go:build ignore" so
command files don't falsely trip the duplicate check, and promote the
duplicate-doc warning to a t.Errorf.

While here, deduplicate the package docs that were previously only
logged: drop the redundant comment from client/systray/startup-creator.go,
move the comprehensive taildrop doc into feature/taildrop/doc.go, and
remove a leftover doc fragment from feature/condlite/expvar/omit.go.

The tstest/integration/vms allowlist is no longer needed since the
//go:build ignore filter now handles its dns_tester.go and udp_tester.go
files generically.

Fixes #19526

Change-Id: Id794d96bd728826a1883a054e4a244f90fa05d3d
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>maths: remove unused package (#19516)</title>
<updated>2026-04-24T23:17:10Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-24T23:17:10Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=873b8b8e2e537026d3947df74399439d31d7dfbb'/>
<id>urn:sha1:873b8b8e2e537026d3947df74399439d31d7dfbb</id>
<content type='text'>
Added in 2025 and appears to be unused.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
<entry>
<title>util/expvarx: remove unused package (#19519)</title>
<updated>2026-04-24T23:16:42Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-24T23:16:42Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=d64ed4af89c4a709a9e08c2cc5b23d99d2753833'/>
<id>urn:sha1:d64ed4af89c4a709a9e08c2cc5b23d99d2753833</id>
<content type='text'>
Added in 2024 and appears to be unused.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
<entry>
<title>util/cstruct: remove unused package (#19518)</title>
<updated>2026-04-24T23:09:54Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-24T23:09:54Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=4195e34f79639b644d23e49736ba2a17d53e7b48'/>
<id>urn:sha1:4195e34f79639b644d23e49736ba2a17d53e7b48</id>
<content type='text'>
Added in 2022 and appears to be unused.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
<entry>
<title>envknob/logknob: remove unused package (#19515)</title>
<updated>2026-04-24T22:48:06Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-24T22:48:06Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=323198b34874f44d52ec48985e2bc7f660f35580'/>
<id>urn:sha1:323198b34874f44d52ec48985e2bc7f660f35580</id>
<content type='text'>
Added in 2023 and appears to be unused.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
<entry>
<title>wgengine/netstack: absorb all quad-100 traffic locally, never leak to peers</title>
<updated>2026-04-24T19:42:16Z</updated>
<author>
<name>James Tucker</name>
<email>james@tailscale.com</email>
</author>
<published>2026-04-24T02:18:44Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=1b40911611b37947bdc905dec30b2914af540920'/>
<id>urn:sha1:1b40911611b37947bdc905dec30b2914af540920</id>
<content type='text'>
Previously, handleLocalPackets intercepted traffic to the Tailscale
service IP (100.100.100.100 / fd7a:115c:a1e0::53) only for an allow-list
of ports: TCP 53/80/8080 and UDP 53. Any other port returned
filter.Accept, letting the packet fall through to the ACL filter and
wireguard-go, which would attempt a peer lookup. No peer owns the
quad-100 AllowedIP, so after ~5s pendopen.go would log:

    open-conn-track: timeout opening ...; no associated peer node

This is the common "conntrack error no peer found for 100.100.100.100:853"
log spam seen in the wild (e.g. from systemd-resolved or another
resolver speculatively trying DoT on quad-100). It also leaks quad-100
packets onto the tailnet.

Remove the port allow-list so handleLocalPackets absorbs every quad-100
packet into netstack regardless of IP protocol or port. Traffic never
reaches the conntrack / peer-routing layers.

With the allow-list gone, acceptTCP needs a corresponding guard: on a
quad-100 TCP port we don't serve, execution used to fall through to the
isTailscaleIP case (quad-100 is in the tailscale IP range), which
rewrote the dial target to 127.0.0.1:&lt;port&gt; and forwardTCP'd the
connection to whatever happened to be listening on the host's loopback
at that port. Add a hittingServiceIP case that RSTs cleanly instead,
placed before the isTailscaleIP fallthrough.

TestQuad100UnservedTCPPortDoesNotForward is a new integration test that
injects a TCP SYN to 100.100.100.100:853 via handleLocalPackets, stubs
forwardDialFunc, and asserts the dialer is not invoked; it catches
regressions of the acceptTCP recursion/loopback-redirection case.

Fixes #15796
Fixes #19421
Updates #3261
Updates #11305

Signed-off-by: James Tucker &lt;james@tailscale.com&gt;
</content>
</entry>
<entry>
<title>version: use debug.ReadBuildInfo in CmdName on non-Windows</title>
<updated>2026-04-24T16:48:11Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-22T04:38:55Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=006d7e180e4a46112b1905f1e2c2e1060ef31d8b'/>
<id>urn:sha1:006d7e180e4a46112b1905f1e2c2e1060ef31d8b</id>
<content type='text'>
CmdName was re-opening the running executable and scanning it in
64KiB chunks for the Go modinfo markers on every call. The same
modinfo is already parsed at startup and exposed via
runtime/debug.ReadBuildInfo, so prefer that on non-Windows. Windows
still takes the scanning path because its GUI-binary override keys
off the on-disk executable name.

benchstat of BenchmarkCmdName (Linux, before vs after):

    goos: linux
    goarch: amd64
    pkg: tailscale.com/version
    cpu: Intel(R) Xeon(R) 6975P-C
               │  /tmp/old.txt  │            /tmp/new.txt             │
               │     sec/op     │   sec/op     vs base                │
    CmdName-16   556045.5n ± 1%   825.6n ± 1%  -99.85% (p=0.000 n=10)

               │ /tmp/old.txt  │             /tmp/new.txt             │
               │     B/op      │     B/op      vs base                │
    CmdName-16   64.587Ki ± 0%   1.156Ki ± 0%  -98.21% (p=0.000 n=10)

               │ /tmp/old.txt │            /tmp/new.txt            │
               │  allocs/op   │ allocs/op   vs base                │
    CmdName-16     8.000 ± 0%   7.000 ± 0%  -12.50% (p=0.000 n=10)

Fixes #19486

Change-Id: I925c5e28b64815a602459beb6c8dab8779339a6c
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>feature/conn25: add the ability to return addresses to the IP Pools</title>
<updated>2026-04-24T15:48:48Z</updated>
<author>
<name>Fran Bull</name>
<email>fran@tailscale.com</email>
</author>
<published>2026-04-21T14:49:43Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=306fab796cd9d071b412a751cf002890a32788bb'/>
<id>urn:sha1:306fab796cd9d071b412a751cf002890a32788bb</id>
<content type='text'>
This will be used as part of the address assignment expiry work.

Updates tailscale/corp#39975

Signed-off-by: Fran Bull &lt;fran@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ipnlocal/drive: reduce noisey per-peer remote logs (#19493)</title>
<updated>2026-04-24T15:26:33Z</updated>
<author>
<name>kari-ts</name>
<email>135075563+kari-ts@users.noreply.github.com</email>
</author>
<published>2026-04-24T15:26:33Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=aa740cb393c05e973400e05b7485cdda36181ce7'/>
<id>urn:sha1:aa740cb393c05e973400e05b7485cdda36181ce7</id>
<content type='text'>
This drops the per peer "appending remote" log while constructing the remote list, which can get noisy on big tailnets, and keeps logs around remote availability checks, including whether a peer is missing, offline, lacks PeerAPI reachability, lacks sharing permission, or is available.

Updates tailscale/corp#40580

Signed-off-by: kari-ts &lt;kari@tailscale.com&gt;</content>
</entry>
<entry>
<title>go.mod: bump github.com/google/go-containerregistry (#19500)</title>
<updated>2026-04-23T17:39:27Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-23T17:39:27Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=ad9e6c19257a13fd619fbbd07468830925c8e520'/>
<id>urn:sha1:ad9e6c19257a13fd619fbbd07468830925c8e520</id>
<content type='text'>
This drops an indirect dependency on the old github.com/docker/docker
(which was replaced with github.com/moby/moby) and fixes a couple recent
CVEs.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
</feed>
