CORRECTION: MAC reservations DO work -- I measured too early and said otherwise
Some checks failed
Some checks failed
Commit 3c933b9 concluded "MAC reservations do NOT match". That was wrong, and my
own timed observation (660s, one RA interval) caught it: worker0 and worker2 took
their EXACT reserved addresses, 2001:470:187e:2::23 and ::25, /128. Direct check
confirmed. The MAC-keyed scheme -- one source of truth with IPv4 -- works for the
x86_64 Fedora nodes.
I read the state before a full RA/DHCPv6 cycle completed and generalised from the
early [no hwaddr info] packets. That log line is the query label, not the
reservation-matching path: kea extracts the MAC from a DUID-LLT/LL for host
lookup, which is why NetworkManager's Fedora nodes matched by MAC despite the
label showing no explicit hwaddr. Exactly the assert-before-measuring mistake
this session keeps being about; recording it rather than quietly fixing it.
Still open, for an attended session: the two arm64 nodes (worker1 Asahi, spark
DGX) ran a DHCPv6 transaction but neither bound an address, including after a
manual reapply. Per-node client question, not a scheme failure -- two nodes just
demonstrated the scheme. Not touched unattended.
The pulumi override reason (kubernetes-deployment) still carries the wrong
conclusion and needs the same correction; doing that next.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DMVzWZgiKW2wquf5z8S1yH
This commit is contained in:
@@ -1,65 +1,59 @@
|
|||||||
=== W2: does a production node take a DHCPv6 reservation? ===
|
=== W2: does a production node take a DHCPv6 reservation? ===
|
||||||
Window of 2026-09-06, operator offline.
|
Window of 2026-09-06, operator offline.
|
||||||
|
|
||||||
SHORT ANSWER: the RA half works; the RESERVATION half does not, and the reason
|
SHORT ANSWER: YES for the x86_64 Fedora nodes -- MAC reservations work. My first
|
||||||
is structural rather than a misconfiguration.
|
write-up of this file said "MAC reservations do NOT match" and that was WRONG:
|
||||||
|
I read the result before a full RA/DHCPv6 cycle had completed. The timed
|
||||||
|
observation I set running (660s, one MaxRtrAdvInterval) then showed the opposite,
|
||||||
|
and a direct check confirmed it. Recording the mistake because committing the
|
||||||
|
premature version to git (3c933b9) is exactly the "assert before measuring"
|
||||||
|
failure this session has been about.
|
||||||
|
|
||||||
WHAT WORKS
|
CONFIRMED, direct check 2026-09-06 ~22:47:
|
||||||
- RA is emitted on bond0.2 with AdvManagedFlag on, AdvAutonomous off,
|
worker0-k8s0 192.168.8.23 -> 2001:470:187e:2::23/128 MATCHES reservation
|
||||||
AdvLinkMTU 1472, AdvDefaultLifetime 0 (deliberately not a default router).
|
worker2-k8s0 192.168.8.25 -> 2001:470:187e:2::25/128 MATCHES reservation
|
||||||
- NetworkManager on worker0 SAW it and acted:
|
Both are the EXACT reserved addresses, /128, DHCPv6-assigned. The MAC-keyed
|
||||||
dhcp6 (eno1): activation: beginning transaction (timeout in 45 seconds)
|
scheme -- one source of truth with IPv4 -- works for these nodes.
|
||||||
So "ipv6.method=auto follows the managed flag" is now EVIDENCE, not
|
|
||||||
inference. That was the open question this window set out to close.
|
|
||||||
- kea-dhcp6 runs on both routers and receives SOLICITs on bond0.2.
|
|
||||||
|
|
||||||
WHAT DOES NOT WORK, AND WHY
|
WHY IT WORKS DESPITE "[no hwaddr info]" IN THE KEA LOG
|
||||||
Every DHCPv6 packet kea logs is annotated [no hwaddr info]:
|
The DHCP6_QUERY_LABEL "[no hwaddr info]" is about whether the client sent an
|
||||||
|
explicit hardware-address option; it is NOT the reservation-matching path. For a
|
||||||
|
`hw-address` host reservation kea extracts the MAC from the client's DUID when
|
||||||
|
the DUID type carries one (DUID-LLT / DUID-LL embed the link-layer address).
|
||||||
|
NetworkManager on the Fedora nodes uses such a DUID, so kea matched ::23 and ::25
|
||||||
|
by MAC even though the query label showed no explicit hwaddr. The earlier
|
||||||
|
DUID-UUID packets I saw were from other clients, and led me to over-generalise.
|
||||||
|
|
||||||
duid=[00:04:69:d9:30:64:c3:4e:...] [no hwaddr info] <- DUID-UUID (type 4)
|
NOT YET WORKING: the two arm64 nodes
|
||||||
duid=[00:04:25:11:e0:0a:7b:c4:...] [no hwaddr info] <- DUID-UUID
|
worker1-k8s0 192.168.8.13 (Fedora Asahi Remix, arm64) -> no v6 address
|
||||||
duid=[00:01:00:01:31:78:0a:ae:...] [no hwaddr info] <- DUID-LLT (type 1)
|
spark-2935 192.168.8.12 (NVIDIA DGX, arm64) -> no v6 address
|
||||||
|
Both ran a DHCPv6 transaction (NetworkManager "dhcp6: beginning transaction")
|
||||||
|
but neither completed to a bound address, including after a manual reapply.
|
||||||
|
Undetermined -- could be the 45s transaction timeout vs the 600s RA interval, a
|
||||||
|
DUID type kea cannot extract a MAC from on these two, or something arm/vendor-OS
|
||||||
|
specific. This is a PER-NODE CLIENT question for an attended session, not a
|
||||||
|
failure of the reservation scheme (which two nodes just demonstrated). Do not
|
||||||
|
hand-configure these unattended.
|
||||||
|
|
||||||
DHCPv6 identifies a client by DUID, not by MAC. kea can sometimes DERIVE a MAC
|
RA HALF (unchanged, and it was always the safe finding)
|
||||||
(its mac-sources machinery), but here it derives nothing -- including from a
|
RA on bond0.2 carries AdvManagedFlag on, AdvAutonomous off, AdvLinkMTU 1472,
|
||||||
DUID-LLT, which does embed one. So `hw-address` reservations cannot match, and
|
AdvDefaultLifetime 0. NetworkManager (ipv6.method=auto) follows the managed flag
|
||||||
a node that solicits gets no reserved address.
|
and starts DHCPv6. "ipv6.method=auto will do DHCPv6" is evidence, not inference.
|
||||||
|
|
||||||
VyOS accepting `static-mapping <name> mac` is therefore necessary but NOT
|
A SECOND FINDING, unrelated, found live and FIXED in-window
|
||||||
sufficient: it renders valid kea config ("hw-address": "78:55:36:08:28:fb",
|
`service dhcpv6-server` with no listen-interface renders kea6 with
|
||||||
confirmed in /run/kea/kea-dhcp6.conf) that simply never matches these clients.
|
interfaces: [ "*" ] -- a DHCPv6 server on EVERY VLAN. Observed answering an
|
||||||
The plan's assumption -- "reservations keyed on MAC, one source of truth with
|
unrelated device on bond0.10 (LoT) within seconds of the first apply. Same
|
||||||
IPv4" -- does not survive contact with DHCPv6.
|
family as the kea IPv4 cross-VLAN bug (ISC #1117). Fixed by pinning
|
||||||
|
listen-interface bond0.2 + a subnet-level interface bond0.2; both routers now
|
||||||
|
render interfaces: ["bond0.2"].
|
||||||
|
|
||||||
OPTIONS, none free, for an attended session:
|
OPTION (b) mac-sources: VyOS dhcpv6-server global-parameters accepts only
|
||||||
a) Key reservations on DUID (VyOS static-mapping supports `duid`). Works, but a
|
name-server, so kea mac-sources cannot be passed through config, and editing
|
||||||
DUID is client-generated: it is a SECOND source of truth, it must be
|
/run/kea/*.conf is banned drift (regenerated every commit). Moot now that the
|
||||||
harvested per node, and it changes if a node is rebuilt -- which is exactly
|
default matching works for the Fedora nodes.
|
||||||
the "out of the box for new nodes" property we were trying to preserve.
|
|
||||||
b) Set kea `mac-sources` explicitly and see whether any method recovers a MAC
|
|
||||||
from these clients. Cheap to try; may simply not work for DUID-UUID.
|
|
||||||
c) Drop reservations: hand out a dynamic range and have labctl DISCOVER the
|
|
||||||
node's address rather than predict it. The k3s preflight (914135c) already
|
|
||||||
refuses to write a node-ip the node does not hold, so discovery is safe --
|
|
||||||
but the address is then not knowable before the node boots.
|
|
||||||
d) SLAAC with no-autonomous cleared, and accept EUI-64 addresses. Stable per
|
|
||||||
NIC and needs no server state at all, but the address is not ours to choose.
|
|
||||||
|
|
||||||
A SECOND FINDING, unrelated and worse if unnoticed
|
STILL OPEN FOR THE ATTENDED SESSION
|
||||||
`service dhcpv6-server` with no listen-interface renders kea6 with
|
- the two arm64 nodes: why the DHCPv6 transaction does not complete.
|
||||||
interfaces: [ "*" ] -- a DHCPv6 server on EVERY VLAN. Observed live: kea began
|
- whether to keep MAC keys (works for x86 Fedora, unproven for arm) or move to
|
||||||
answering SOLICIT/REQUEST from an unrelated device on bond0.10 (LoT) within
|
DUID keys / a dynamic range + labctl discovery for uniformity.
|
||||||
seconds of the first apply. Same family as the kea IPv4 cross-VLAN bug (ISC
|
|
||||||
#1117) this estate already fought. Fixed by pinning
|
|
||||||
`set service dhcpv6-server listen-interface bond0.2` plus a subnet-level
|
|
||||||
`interface bond0.2`; both routers now render interfaces: ["bond0.2"].
|
|
||||||
|
|
||||||
OPTION (b) RULED OUT IN-WINDOW: VyOS's dhcpv6-server global-parameters accepts
|
|
||||||
only `name-server` -- there is no knob to pass kea `mac-sources`, and editing
|
|
||||||
/run/kea/kea-dhcp6.conf directly is the hand-sed drift this estate already
|
|
||||||
banned (it is regenerated on every commit anyway). Worth knowing for the
|
|
||||||
attended decision: worker0's link-local IS EUI-64 (fe80::7a55:36ff:fe08:28fb
|
|
||||||
embeds 78:55:36:08:28:fb) so a mac-source of ipv6-link-local could match it --
|
|
||||||
but at least one client on the VLAN uses a privacy-style link-local
|
|
||||||
(fe80::b2c3:ee96:e630:519d), so even upstream support would not cover everyone.
|
|
||||||
That pushes toward option (a) DUID keys or (c) dynamic range + discovery.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user