Commit Graph
4932 Commits
Author SHA1 Message Date
Kristoffer Dalby 568d14afc0 mapper: cap concurrent map sessions per node
A node chose how many map streams it held, each pinning a session.
The fifth replaces the oldest; same shape as #3468's mapper commit.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 179af840da change: coalesce policy recomputes that carry an origin node
The recompute render ignores the origin and always carries the node's
own entry, so a burst of tag writes cost every node one per write.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby b1c142d9c9 state: say a taken name is already taken 2026-10-28 18:28:22 +00:00
Kristoffer Dalby e66084195b db: succeed on a repeated revoke of an auth key
A repeated v2 DELETE of an auth key now answers 200, as Tailscale does.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 85f4c3f654 auth: answer a logout that deletes an ephemeral node as authorised 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 90df03543f cli: show a node's own ephemeral flag instead of its key's 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 095bd610b1 gen/client/v1: regenerate for the node ephemeral flag 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 8f2ca0d01e db, state: keep the ephemeral flag a node was created with
The flag moves from the key to the node, so a login with another key no
longer changes it. A user claiming a tagged node still clears it. v1
nodes carry the flag.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 50fe50f4f9 db, types: add a nodes column for the ephemeral flag
The migration fills it from the key each node references.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 04dc8e27c6 db: remove unused RenameNode 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 186f78988b state: bump duplicate node names loaded from the database 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 999970edd4 state: cut a label so its -N suffix fits in 63 bytes 2026-10-28 18:28:22 +00:00
Kristoffer Dalby eeea38c627 state: treat extra DNS record names as taken node names 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 568f27bd84 state: save the name NodeStore picks for a new node
The row is committed before the name UPDATE, so a failed UPDATE still
returns the node and registration arms ephemeral cleanup.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby b08c224f59 db, api/v1: revoke rather than delete an ephemeral pre-auth key in use
The v1 list now hides revoked keys, so keys revoked through v2 also drop
out of `headscale preauthkeys list`.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby bebe7da8c4 hscontrol: arm the ephemeral GC at pre-auth key registration 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 27efd57a36 hscontrol: skip garbage collecting a node that is no longer ephemeral 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 88e8dae2ee db: wrap the sequential IP allocator so freed addresses are reused 2026-10-28 18:28:22 +00:00
Kristoffer Dalby f60e4c3f7f state: test that a persist racing a delete cannot resurrect the node
DeleteNode's early persistMu unlock is safe only while node persists
stay UPDATE-only; say so where the lock is declared.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby e8edef2625 noise: stop serving metrics inside the tunnel
Any machine key reached it, bypassing metrics_listen_addr. No client
asks for it.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 68e5bfd755 hscontrol: bound client-chosen text in request logs
Clip at the sinks: handler errors, the request line, SSH local_user.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby e785afd35a mapper: show an expired peer online, without endpoints or DERP
A connected expired node shows online to its peers. Neither its map
entry nor endpoint, DERP or disco patches carry the paths to reach it.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 82d2090511 mapper: trim the Hostinfo sent to peers and to the node itself
As on Tailscale SaaS, the node's own entry keeps Hostname, RequestTags,
RoutableIPs and Services; peers get Hostname, OS, Services without
peerapi-dns-proxy, SSH host keys and AppConnector, and resend on those.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby fd70994523 mapper: keep an expired node authorised in its own entry
Tailscale SaaS sends an expired node MachineAuthorized and no Expired
flag; its past KeyExpiry already moves the client to NeedsLogin.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby ad1b6b5931 .github: regenerate integration test workflow 2026-10-28 18:28:22 +00:00
Kristoffer Dalby f7c630fdf9 state: apply requested tags on a key login that owns them
A requested tag the key's user owns directly, or the key's tags own one
hop away, replaces the key's tags instead of refusing the login.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 9dfd78e42e state: auto-approve routes after an admin tag change
The new tags may approve announced routes. Approval runs once the policy
manager knows the new owner, as after a registration.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 8fb3d320a5 state: drop auto-approved routes when they are withdrawn
Only routes auto-approval alone granted go; approvals from before the
upgrade stay, as do routes an admin set.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 32a78cde83 db, types: add a column for auto-approved routes
It starts empty: the current policy cannot tell which earlier approvals
were automatic, so all of them stay as an admin's.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 98380c2be4 state: auto-approve on registration only when the node key rotates
Registration runs the approval itself, once the policy manager knows the
node's owner, for a new node key or a change to the announced routes.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby dde74266d9 auth: store a client's earlier expiry and expire a tagged node at logout
A client may bring its expiry forward, which turns expiry on for a node
without one, but still cannot push it back. Logout expires tagged nodes
too.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby bebc563035 auth, state: answer an expired node's same-key login with NodeKeyExpired
The client then rotates its node key and logs in again, so no key is
judged under the expired one. The machine stays authorised.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby d3b4e321f3 state: forget a node's SSH check approvals when it is expired 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 94b138e184 state: honour SSH check approvals only while the source keeps its owner 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 56af18051f state: let a pre-auth key that is no longer valid only wake its node
A login that keeps its node key leaves a live node's expiry alone, even
with a valid key, and a wake-up is not refused for the tags it requests.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby fda03f277f state: serialise registrations presenting an unused single-use key 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 690d72b7ee state: auto-approve routes in the NodeStore writer, not on reload
Registration approval runs on the node the writer replaces. A policy
reload approves nothing, and a map request only when its announced
routes change, so neither re-grants a route an admin revoked.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby c3702993ce state: undo a failed re-registration without reverting newer writes 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 26be57d2de state: write node rows from the NodeStore under persistMu 2026-10-28 18:28:22 +00:00
Kristoffer Dalby ab2a2bf4af state: apply map requests only under the node key that authorised them 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 95c6129315 policy: offer exit routes only to viewers whose rules reach the internet
Every destination overlaps /0, so any rule offered a peer's exit routes.
They now need a rule to the internet, the test exit-node visibility
uses; via steering defers them to a regular grant only on that test.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 7f9bc1ef30 mapper: send a router all of its own routes
Its AllowedIPs held only the primaries the policy let it reach. It now
holds every approved route, and PrimaryRoutes the ones it serves.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 49d8424634 policy: reduce merged destination prefixes to the node's own addresses
Adjacent node addresses merge into one prefix, and each node's filter
kept all of it. A prefix made only of node addresses now shrinks to the
node's own; a prefix the policy wrote, or one the node routes, stays.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby f7e2b3c49e api, policy/v2: refuse route prefixes with host bits
Routes are matched as written, so such a prefix never equals the one a
client announces. The approval APIs answer 400 and autoApprovers refuses
it at load and write, with Tailscale's text.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby 8191a88774 policy, state: log only the routes auto-approval adds 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 6cc37f50f5 poll: hold the map session's node as a view 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 3f97e68a20 policy/matcher, types: compare a node's routes to matchers as ranges 2026-10-28 18:28:22 +00:00
Kristoffer Dalby 633d48604e policy/matcher: binary-search ranges in overlap checks 2026-10-28 18:28:22 +00:00
Kristoffer Dalby cce082d24b policy: look up approved routes in a set when auto-approving
Avoid scanning the growing approval list for every announcement.
Use the sorted current routes when identifying additions.
2026-10-28 18:28:22 +00:00
Kristoffer Dalby ff5d0307f9 types, state: reduce a node's routes against the matchers once
Reuse matcher membership and approved subnets across the route list.
Preserve route order and HA co-router visibility.
2026-10-28 18:28:22 +00:00