Wheelhouse docs

DHCP and IPv6#

The third tab of DHCP, at /dhcp. It owns two subtrees: service router-advert and service dhcpv6-server.

IPv6 hosts usually do not need a DHCP server. They learn their prefix, their gateway and their resolvers from router advertisements, and build their own addresses from the prefix. That is what the top half of this tab configures. The bottom half is the DHCPv6 server, for the cases where advertisements are not enough.

Where the data comes from#

Two configuration reads, each tolerating an unset path:

  • GET /api/config?path=service router-advert
  • GET /api/config?path=service dhcpv6-server

The interface picker is GET /api/interfaces/detail minus lo, the same list the other tabs use — ui/src/pages/DhcpExtras.tsx (Ipv6Tab).

Router advertisements#

What is configured#

One line per advertising interface, showing the interface, its prefixes, its RDNSS addresses, and badges for the flags that are set:

BadgeSet byMeaning
not a default routerdefault-lifetime 0the advertisement carries prefixes but tells hosts not to use this router as a default gateway
managed (DHCPv6)managed-flaghosts should get their addresses from DHCPv6
other-configother-config-flaghosts should get options — DNS, NTP — from DHCPv6
not sendingno-send-advertthe interface is configured and silent

remove on a row stages:

delete service router-advert interface eth0

The editor#

FieldCommandNotes
Interfacerequired; nothing is staged without it
Prefixesset service router-advert interface <if> prefix <p> per prefixsplit on whitespace or commas
Resolvers (RDNSS)… name-server <addr> per addressIPv6 addresses
Router lifetime (s)… default-lifetime <n>0 advertises prefixes but not a default route
Managed… managed-flagcheckbox
Other-config… other-config-flagcheckbox

If you pick an interface and fill in nothing else, the editor stages the bare node:

set service router-advert interface eth0

A typical LAN, where SLAAC does everything:

set service router-advert interface eth0 prefix ::/64
set service router-advert interface eth0 name-server 2001:db8::53

::/64 means whatever /64 this interface holds, so an interface with a delegated prefix keeps advertising the right thing when the prefix changes. That is what the field hint says: ::/64 = the interface's own.

The DHCPv6 server#

The bottom panel is a reader. It lists every subnet under service dhcpv6-server shared-network-name <net> subnet <prefix> with:

  • the shared network and the prefix,
  • the interface it is bound to,
  • its ranges, shown as the range's prefix when it has one, otherwise start – stop,
  • a prefix delegation badge when prefix-delegation is set,
  • its option name-server values,
  • a remove button that stages delete service dhcpv6-server shared-network-name <net> subnet <prefix>.

There is also no DHCPv6 lease table. GET /api/dhcp/leases runs show dhcp server leases, which is the IPv4 server. Leases handed out by the DHCPv6 server are visible on the router and not in this UI — agent/opmode.go.

When you need it at all#

Most IPv6 LANs need none of this. Reach for DHCPv6 when you want:

  • stateful addresses — a recorded, predictable address per host rather than one the host derived itself;
  • prefix delegation — handing a shorter prefix to a downstream router;
  • options for hosts that ignore RDNSS — a few clients still take DNS only from DHCPv6.

Pair a stateful pool with the Managed flag in the advertisement editor above, or hosts will never ask for it.

What the rest of the product does with IPv6#

Configurable here, and largely invisible everywhere else.

  • Static routes reads show ip route. There is no IPv6 forwarding view.
  • The uplink model looks for 0.0.0.0/0 and has no IPv6 concept at all, so an IPv6 default route is not an uplink as far as that page is concerned.
  • Neighbours reads show arp.
  • The Firewall page is IPv4-first.

This is recorded as a known gap in README.md (Status) and docs/security.md"a dual-stack router can be configured for IPv6 but not usefully inspected for it". Configure IPv6 here; verify it on the CLI.

What breaks if you get it wrong#

  • Advertising ::/64 on an interface with no IPv6 address. Nothing to advertise; hosts get nothing and the panel still shows the interface as configured.
  • Two routers advertising on one segment. Hosts take addresses from both and pick a source address by rules you do not control. Use default-lifetime 0 on the router that should not be a gateway.
  • Managed flag with no DHCPv6 server. Hosts ask for an address, nothing answers, and depending on the client they end up with SLAAC anyway, or with nothing.
  • A pool that overlaps a static address. The same failure as on IPv4, harder to spot.
  • Removing an advertisement to "turn IPv6 off". Hosts keep their addresses until the prefix's lifetime expires. Advertise a zero lifetime instead if you need them to stop quickly.

See also#

  • DHCP — the IPv4 server, reservations and leases.
  • DHCP relay — the second tab.
  • Addressing — putting an IPv6 address on the interface in the first place.
  • DNS — the resolver whose address you are advertising.

Checked against ui/src/pages/DhcpExtras.tsx (Ipv6Tab), ui/src/pages/Dhcp.tsx, agent/opmode.go (handleDhcpLeasesFixed), ui/src/lib/format.ts (isDangerousPath), README.md, docs/security.md.

Updated 2026-09-02 manual network dhcp ipv6 slaac router-advert