You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
changelog: normalise 0.29.0 BREAKING and Changes sections
Move HA subnet router health probing above BREAKING so the layout
matches every other release. Drop **User deletion**: / **Node Expiry**:
bold prefixes redundant with the #### subgrouping. Fill missing PR
refs: #3202 (hostname rewrite), #3263 (sshTests + SSH rule validation),
#3194 (HA probe), #3251 (randomize_client_port removal), #3268
(trusted_proxies).
- Admin rename (`headscale nodes rename`) now validates via `dnsname.ValidLabel` and
174
-
rejects labels already held by another node (previously coerced invalid input silently).
156
+
### Hostname sanitisation
157
+
158
+
Hostnames are now santised using Tailscales `magicdns` sanitisation rules, matching Tailscale SaaS behavior. This means that hostnames with non-ASCII characters, special characters, or reserved DNS label characters are now transformed into valid DNS labels for MagicDNS. This improves our previously too strict sanitisation that rejected hostnames based on our guesswork and not based on the Tailscale upstream behaviour.
175
159
176
160
Examples that previously regressed and now work:
177
161
@@ -184,11 +168,24 @@ Examples that previously regressed and now work:
- The `GivenName` collision policy changed from an 8-char random hash suffix (`laptop-abc12xyz`) to a monotonic numeric suffix (`laptop`, `laptop-1`, `laptop-2`, …), matching Tailscale SaaS. Empty / all-non-ASCII hostnames now fall back to the literal `node` instead of `invalid-<rand>`. MagicDNS names change on upgrade for any node whose previous label was a random-suffix form; the raw `Hostname` column is unchanged.
188
+
- The `GivenName` collision policy changed from an 8-char random hash suffix (`laptop-abc12xyz`) to a monotonic numeric suffix (`laptop`, `laptop-1`, `laptop-2`, …), matching Tailscale SaaS. Empty / all-non-ASCII hostnames now fall back to the literal `node` instead of `invalid-<rand>`. MagicDNS names change on upgrade for any node whose previous label was a random-suffix form; the raw `Hostname` column is unchanged.[#3202](https://github.com/juanfont/headscale/pull/3202)
192
189
193
190
#### ACL Policy
194
191
@@ -214,7 +211,7 @@ Examples that previously regressed and now work:
214
211
215
212
- The `randomize_client_port` server-config key was removed; the
216
213
toggle now lives in the policy file as a top-level
217
-
`randomizeClientPort` field, matching the Tailscale-hosted schema.
214
+
`randomizeClientPort` field, matching the Tailscale-hosted schema.[#3251](https://github.com/juanfont/headscale/pull/3251)
218
215
Headscale refuses to start when the old key is set. Move it to the
219
216
policy file referenced by `policy.path`:
220
217
@@ -236,16 +233,6 @@ Examples that previously regressed and now work:
236
233
-`headscale nodes register` is deprecated in favour of `headscale auth register --auth-id <id> --user <user>`[#1850](https://github.com/juanfont/headscale/pull/1850)
237
234
- The old command continues to work but will be removed in a future release
238
235
239
-
### HA subnet router health probing
240
-
241
-
Headscale now actively probes HA subnet routers to detect nodes that are connected but not
242
-
forwarding traffic. The control plane periodically pings HA subnet routers via the Noise
243
-
control channel and fails over to a healthy standby if the primary stops responding. This is
244
-
enabled by default (`node.routes.ha.probe_interval: 10s`, `probe_timeout: 5s`) and only
245
-
active when HA routes exist (2+ nodes advertising the same prefix). Set `probe_interval` to
246
-
`0` to disable. This complements the existing disconnect-based failover, catching "zombie
247
-
connected" routers that maintain their control session but cannot route packets.
248
-
249
236
### Changes
250
237
251
238
#### ACL Policy
@@ -286,7 +273,7 @@ connected" routers that maintain their control session but cannot route packets.
286
273
-`headscale policy check --bypass-grpc-and-access-database-directly` validates `user@` tokens against the live user database [#3160](https://github.com/juanfont/headscale/issues/3160)
287
274
- Remove deprecated `--namespace` flag from `nodes list`, `nodes register`, and `debug create-node` commands (use `--user` instead) [#3093](https://github.com/juanfont/headscale/pull/3093)
288
275
- Remove deprecated `namespace`/`ns` command aliases for `users` and `machine`/`machines` aliases for `nodes`[#3093](https://github.com/juanfont/headscale/pull/3093)
289
-
-**User deletion**: Fix `DestroyUser` deleting all pre-auth keys in the database instead of only the target user's keys [#3155](https://github.com/juanfont/headscale/pull/3155)
276
+
- Fix `DestroyUser` deleting all pre-auth keys in the database instead of only the target user's keys [#3155](https://github.com/juanfont/headscale/pull/3155)
290
277
-`headscale policy check` evaluates the `tests` block when invoked with `--bypass-grpc-and-access-database-directly`; without the flag it warns instead of running the tests against empty data [#1803](https://github.com/juanfont/headscale/issues/1803)
291
278
292
279
#### API
@@ -306,7 +293,7 @@ connected" routers that maintain their control session but cannot route packets.
306
293
- Tagged nodes (registered with tagged pre-auth keys) are exempt from default expiry
307
294
-`oidc.expiry` has been removed; use `node.expiry` instead (applies to all registration methods including OIDC)
308
295
-`ephemeral_node_inactivity_timeout` is deprecated in favour of `node.ephemeral.inactivity_timeout`
309
-
- Add `trusted_proxies` to gate `True-Client-IP` / `X-Real-IP` / `X-Forwarded-For` (previously honoured from any client)
296
+
- Add `trusted_proxies` to gate `True-Client-IP` / `X-Real-IP` / `X-Forwarded-For` (previously honoured from any client)[#3268](https://github.com/juanfont/headscale/pull/3268)
310
297
311
298
#### Debug
312
299
@@ -318,9 +305,9 @@ connected" routers that maintain their control session but cannot route packets.
318
305
319
306
- Remove old migrations for the debian package [#3185](https://github.com/juanfont/headscale/pull/3185)
320
307
- Install `config-example.yaml` as example for the debian package [#3186](https://github.com/juanfont/headscale/pull/3186)
321
-
-**Node Expiry**: Fix userowned reregistration with zero client expiry and no default storing `0001-01-01 00:00:00` in the database instead of NULL [#3199](https://github.com/juanfont/headscale/pull/3199)
308
+
- Fix user-owned re-registration with zero client expiry and no default storing `0001-01-01 00:00:00` in the database instead of `NULL`[#3199](https://github.com/juanfont/headscale/pull/3199)
322
309
- Pre-existing rows with `0001-01-01 00:00:00` are not backfilled; they clear themselves the next time the node re-registers
323
-
-**Node Expiry**: Fix tailscaled restart on a node with no expiry resetting `NULL` to `0001-01-01 00:00:00` in the database, affecting both tagged and untagged nodes [#3197](https://github.com/juanfont/headscale/pull/3197)
310
+
- Fix `tailscaled` restart on a node with no expiry resetting `NULL` to `0001-01-01 00:00:00` in the database, affecting both tagged and untagged nodes [#3197](https://github.com/juanfont/headscale/pull/3197)
0 commit comments