Commit Graph
4957 Commits
Author SHA1 Message Date
Kristoffer Dalby 11ae125a9f 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-30 14:55:37 +00:00
Kristoffer Dalby 78329ec0ea state: say a taken name is already taken 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 88fc804ed0 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-30 14:55:37 +00:00
Kristoffer Dalby a67caf1e6e auth: answer a logout that deletes an ephemeral node as authorised 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 534368a786 cli: show a node's own ephemeral flag instead of its key's 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 898b42c4f7 gen/client/v1: regenerate for the node ephemeral flag 2026-10-30 14:55:37 +00:00
Kristoffer Dalby b3b427daef 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-30 14:55:37 +00:00
Kristoffer Dalby 5d69e54093 db, types: add a nodes column for the ephemeral flag
The migration fills it from the key each node references.
2026-10-30 14:55:37 +00:00
Kristoffer Dalby 4d05c505ac db: remove unused RenameNode 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 9c808311e8 state: bump duplicate node names loaded from the database 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 4bd0d63294 state: cut a label so its -N suffix fits in 63 bytes 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 5da704c7fe state: treat extra DNS record names as taken node names 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 41c388f45a 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-30 14:55:37 +00:00
Kristoffer Dalby 961f3558dd 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-30 14:55:37 +00:00
Kristoffer Dalby 6c91e3fbcd hscontrol: arm the ephemeral GC at pre-auth key registration 2026-10-30 14:55:37 +00:00
Kristoffer Dalby 9b509f62f6 hscontrol: skip garbage collecting a node that is no longer ephemeral 2026-10-30 14:55:37 +00:00
Kristoffer Dalby eeccada116 db: wrap the sequential IP allocator so freed addresses are reused 2026-10-30 14:55:37 +00:00
Kristoffer Dalby eb833d1dc3 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-30 14:55:37 +00:00
Kristoffer Dalby dab63820fa hscontrol: bound client-chosen text in request logs
Clip at the sinks: handler errors, the request line, SSH local_user.
2026-10-30 14:55:37 +00:00
Kristoffer Dalby 5c5fc4feb7 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-30 14:55:37 +00:00
Kristoffer Dalby 6aed0d5f07 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-30 14:55:36 +00:00
Kristoffer Dalby 706155d1f1 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-30 14:55:36 +00:00
Kristoffer Dalby 6c1418277e .github: regenerate integration test workflow 2026-10-30 14:55:36 +00:00
Kristoffer Dalby d7a0349ef3 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-30 14:55:36 +00:00
Kristoffer Dalby 9127edbd6d 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-30 14:55:36 +00:00
Kristoffer Dalby cd09ccaf34 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-30 14:55:36 +00:00
Kristoffer Dalby 20117e7060 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-30 14:55:36 +00:00
Kristoffer Dalby 177920d84e 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-30 14:55:36 +00:00
Kristoffer Dalby 27f0858880 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-30 14:55:36 +00:00
Kristoffer Dalby 164c8ece40 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-30 14:55:36 +00:00
Kristoffer Dalby 40063d6213 state: forget a node's SSH check approvals when it is expired 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 3766d31c18 state: honour SSH check approvals only while the source keeps its owner 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 49333eb32b 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-30 14:55:36 +00:00
Kristoffer Dalby f7b1d0c3ec state: serialise registrations presenting an unused single-use key 2026-10-30 14:55:36 +00:00
Kristoffer Dalby b0347ccccc 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-30 14:55:36 +00:00
Kristoffer Dalby 7e29163300 state: undo a failed re-registration without reverting newer writes 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 09aba4e488 state: write node rows from the NodeStore under persistMu 2026-10-30 14:55:36 +00:00
Kristoffer Dalby b4f970f93c state: apply map requests only under the node key that authorised them 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 4b4ce87cd0 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-30 14:55:36 +00:00
Kristoffer Dalby 4e433f7a04 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-30 14:55:36 +00:00
Kristoffer Dalby ffd4f34841 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-30 14:55:36 +00:00
Kristoffer Dalby be07e0f536 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-30 14:55:36 +00:00
Kristoffer Dalby 3719b4db0d policy, state: log only the routes auto-approval adds 2026-10-30 14:55:36 +00:00
Kristoffer Dalby bcc951ec54 poll: hold the map session's node as a view 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 05a5c11a20 policy/matcher, types: compare a node's routes to matchers as ranges 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 926998d553 policy/matcher: binary-search ranges in overlap checks 2026-10-30 14:55:36 +00:00
Kristoffer Dalby 3c62eb17bb 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-30 14:55:36 +00:00
Kristoffer Dalby 5314508846 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-30 14:55:36 +00:00
Kristoffer Dalby 9093e0108b types: derive subnet and exit routes in one pass
Emit each approved route once, in announcement order.
Skip derivation when no routes are approved.
2026-10-30 14:55:36 +00:00
Kristoffer Dalby 2dc2dfc8cd state: skip route comparison for writes that leave routes alone
Reuse immutable route inputs when classifying NodeStore writes.
Only derive routes when an announcement or approval changes.
2026-10-30 14:55:36 +00:00