Wheelhouse docs

Hand out IPv6 with router advertisements#

You will end up with the router advertising an IPv6 prefix on a segment, so clients configure themselves. This is how IPv6 addressing normally works — there is no IPv6 equivalent of "the DHCP server hands out addresses" as the default path.

Read IPv6: what is configurable and what is not observable first. This part works; inspecting the result mostly happens from the console.

Before you start#

  • The operator role and a licence.
  • A prefix on the segment — usually from a delegated prefix your provider gave you.
  • ICMPv6 accepted in the firewall. Router advertisements are ICMPv6. A router that drops them advertises nothing.

Step 1 — Advertise a prefix#

Network → DHCP → IPv6.

set service router-advert interface eth0 prefix 2001:db8:1::/64
set service router-advert interface eth0 name-server 2001:db8:1::1
set service router-advert interface eth0 default-lifetime 1800
FieldCommandMeaning
Prefixesprefix <p>, one line eachWhat clients build addresses from
Resolversname-server <a>, one line eachRDNSS — the resolver clients should use
Default lifetimedefault-lifetime <s>How long clients treat this router as a default router

Step 2 — Decide about the two flags#

These are the ones people get wrong, because their names describe the protocol rather than the effect.

set service router-advert interface eth0 managed-flag
set service router-advert interface eth0 other-config-flag
FlagTells clients
managed-flag (M)Get your address from DHCPv6, not from the prefix
other-config-flag (O)Get other settings — resolvers, domains — from DHCPv6, but build your own address

Neither flag, with a prefix and an RDNSS: clients build their own addresses and use the resolver from the advertisement. That is the simplest arrangement and the one to start from.

Setting managed-flag without running a DHCPv6 server leaves clients waiting for an address that never arrives.

Step 3 — Run DHCPv6, if you set the M or O flag#

The same page has the DHCPv6 server, under service dhcpv6-server shared-network-name <name> subnet <prefix>. Its rows can be removed from the page; a new scope is written from the console or the config tree.

Step 4 — Make sure ICMPv6 is accepted#

set firewall ipv6 input filter rule 30 action accept
set firewall ipv6 input filter rule 30 description 'ICMPv6 (neighbour discovery, path MTU)'
set firewall ipv6 input filter rule 30 protocol icmpv6

All of ICMPv6, not just echo — neighbour discovery and path MTU discovery live there. This rule is in the ruleset the installer writes, so on most boxes it is already present. A default-drop ruleset.

Check it worked#

From a client on the segment:

bash
ip -6 addr show
ip -6 route show

An address built from the advertised prefix, and a default route via the router's link-local address, is the whole answer.

On the router, from the console, because the pages do not show IPv6 routing:

bash
show ipv6 route
show ipv6 neighbors

Undoing it#

delete service router-advert interface eth0

The page's remove on an interface row stages that. Clients keep their addresses until the lifetime expires; a lifetime of 0 is how you tell them to stop using this router as a default router immediately.

See also#


Checked against ui/src/pages/DhcpExtras.tsx · docs/security.md · docs/install.md

Updated 2026-09-02 ipv6 radvd dhcpv6