Commit Graph
4931 Commits
Author SHA1 Message Date
Kristoffer Dalby dfa06e1aac state: say a taken name is already taken 2026-10-28 19:06:05 +00:00
Kristoffer Dalby bf03d4c01b 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 19:06:05 +00:00
Kristoffer Dalby ab6f08ebc9 auth: answer a logout that deletes an ephemeral node as authorised 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 0449866cf3 cli: show a node's own ephemeral flag instead of its key's 2026-10-28 19:06:05 +00:00
Kristoffer Dalby d0f0344265 gen/client/v1: regenerate for the node ephemeral flag 2026-10-28 19:06:05 +00:00
Kristoffer Dalby c0f974ad7a 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 19:06:05 +00:00
Kristoffer Dalby f00b4f3bd6 db, types: add a nodes column for the ephemeral flag
The migration fills it from the key each node references.
2026-10-28 19:06:05 +00:00
Kristoffer Dalby 600ee410ad db: remove unused RenameNode 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 58ea96d9ff state: bump duplicate node names loaded from the database 2026-10-28 19:06:05 +00:00
Kristoffer Dalby b952522dc2 state: cut a label so its -N suffix fits in 63 bytes 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 09380277ac state: treat extra DNS record names as taken node names 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 40902d57be 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 19:06:05 +00:00
Kristoffer Dalby d48b62096a 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 19:06:05 +00:00
Kristoffer Dalby 54253965cd hscontrol: arm the ephemeral GC at pre-auth key registration 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 93dbfa0a41 hscontrol: skip garbage collecting a node that is no longer ephemeral 2026-10-28 19:06:05 +00:00
Kristoffer Dalby c73615d6f9 db: wrap the sequential IP allocator so freed addresses are reused 2026-10-28 19:06:05 +00:00
Kristoffer Dalby ef142db36b 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 19:06:05 +00:00
Kristoffer Dalby c5b9317c45 noise: stop serving metrics inside the tunnel
Any machine key reached it, bypassing metrics_listen_addr. No client
asks for it.
2026-10-28 19:06:05 +00:00
Kristoffer Dalby 85852dcb7d hscontrol: bound client-chosen text in request logs
Clip at the sinks: handler errors, the request line, SSH local_user.
2026-10-28 19:06:05 +00:00
Kristoffer Dalby be2f5333f4 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 19:06:05 +00:00
Kristoffer Dalby 6153b4fde3 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 19:06:05 +00:00
Kristoffer Dalby 70fc2db938 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 19:06:05 +00:00
Kristoffer Dalby 1f42a50489 .github: regenerate integration test workflow 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 4e77265b3c 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 19:06:05 +00:00
Kristoffer Dalby 27d693665c 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 19:06:05 +00:00
Kristoffer Dalby fd0fc9077c 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 19:06:05 +00:00
Kristoffer Dalby 0d725e494b 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 19:06:05 +00:00
Kristoffer Dalby 719d8a90fa 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 19:06:05 +00:00
Kristoffer Dalby 292005b6d4 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 19:06:05 +00:00
Kristoffer Dalby d96873434d 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 19:06:05 +00:00
Kristoffer Dalby f0bb724ee5 state: forget a node's SSH check approvals when it is expired 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 20886d61c5 state: honour SSH check approvals only while the source keeps its owner 2026-10-28 19:06:05 +00:00
Kristoffer Dalby a36c33e8e7 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 19:06:05 +00:00
Kristoffer Dalby 809035d7a6 state: serialise registrations presenting an unused single-use key 2026-10-28 19:06:05 +00:00
Kristoffer Dalby b4066260f0 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 19:06:05 +00:00
Kristoffer Dalby 974bfb0a96 state: undo a failed re-registration without reverting newer writes 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 6cb7d520ef state: write node rows from the NodeStore under persistMu 2026-10-28 19:06:05 +00:00
Kristoffer Dalby ef577487b2 state: apply map requests only under the node key that authorised them 2026-10-28 19:06:05 +00:00
Kristoffer Dalby d3cc4ad861 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 19:06:05 +00:00
Kristoffer Dalby f2b075083d 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 19:06:05 +00:00
Kristoffer Dalby b140580d37 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 19:06:05 +00:00
Kristoffer Dalby b9d35f5397 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 19:06:05 +00:00
Kristoffer Dalby b26dd72046 policy, state: log only the routes auto-approval adds 2026-10-28 19:06:05 +00:00
Kristoffer Dalby e94f1a065f poll: hold the map session's node as a view 2026-10-28 19:06:05 +00:00
Kristoffer Dalby e800362a66 policy/matcher, types: compare a node's routes to matchers as ranges 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 064d35bb36 policy/matcher: binary-search ranges in overlap checks 2026-10-28 19:06:05 +00:00
Kristoffer Dalby 5f7d34d53e 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 19:06:05 +00:00
Kristoffer Dalby 0eea9cadf4 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 19:06:05 +00:00
Kristoffer Dalby 9b14bf4860 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-28 19:06:05 +00:00
Kristoffer Dalby 7240ad2029 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-28 19:06:05 +00:00