IPv6 / Dual-Stack
Native dual-stack subscriber service: every subscriber gets an IPv4 address plus a routable IPv6 WAN address and a delegated IPv6 prefix for their LAN, driven entirely by RADIUS.
Overview
AthenaBNG delivers IPv6 alongside IPv4 on the same subscriber session. A dual-stack subscriber receives:
- an IPv4 address, exactly as before (see PPPoE Termination / DHCP/IPoE); and
- an IPv6 WAN address on the access link (a /64 advertised via Router
Advertisements / SLAAC), from the RADIUS
Framed-IPv6-Prefix; and - a delegated IPv6 prefix (the PD, e.g. a /56) for the customer's own LANs,
handed out via DHCPv6 IA_PD, from the RADIUS
Delegated-IPv6-Prefix.
Unlike IPv4, IPv6 is native and globally routable — CGNAT does not apply. The delegated prefix becomes a routed prefix pointing at the subscriber's link.
| Access type | WAN address | LAN delegation | Mechanism |
|---|---|---|---|
| PPPoE | link-local + /64 (Framed-IPv6-Prefix) via RA/SLAAC | /56 (Delegated-IPv6-Prefix) via DHCPv6 IA_PD | IPv6CP → RA + DHCPv6-PD |
| IPoE | /64 via RA (SLAAC) | /56 (Delegated-IPv6-Prefix) via DHCPv6 IA_PD | RS/RA + DHCPv6 IA_PD |
RADIUS is authoritative — no local pool, fail-closed
IPv6 addressing follows one firm rule: RADIUS is the single source of truth, and the BNG never invents a prefix.
- Every subscriber's
Delegated-IPv6-Prefix(the PD) andFramed-IPv6-Prefix(the WAN /64) come only from the RADIUS reply. - There is no local IPv6 pool anywhere — no accel-ppp
ipv6-pool, no pool in the DHCPv6 path. - A session whose RADIUS reply carries no IPv6 attributes simply comes up IPv4-only — the dual-stack degrades cleanly rather than the BNG assigning a made-up prefix.
No RADIUS IPv6 attribute means no IPv6. In the DHCPv6 path this is explicit: an
IA_PD request with no delegated prefix from RADIUS is answered NoPrefixAvail
(and NoBinding on Renew/Rebind), never a locally chosen prefix.
This also gives stable per-subscriber prefixes (they are keyed to the RADIUS identity, not to a lease from a rotating pool) and keeps a single central address authority.
PD length is RADIUS's choice, per-subscriber — not a BNG default. Typical assignments are /56 for residential and /48 for business; the BNG simply routes whatever prefix RADIUS delegates.
PPPoE dual-stack
Status: shipping. PPPoE dual-stack is fully implemented via accel-ppp.
Enable it with the pppoe.ipv6 knob (default deny):
abng# set pppoe ipv6 allow
abng# commit
pppoe.ipv6 accepts the accel-ppp IPv6CP negotiation modes:
| Value | Meaning |
|---|---|
deny | IPv6CP disabled — IPv4-only (default) |
allow | Negotiate IPv6 if the client asks |
prefer | Offer IPv6, fall back to IPv4-only if the client declines |
require | Require IPv6CP — reject sessions that won't negotiate it |
When pppoe.ipv6 is anything other than deny, abngd renders accel-ppp with the
ipv6_nd and ipv6_dhcp modules loaded:
ipv6_ndsends Router Advertisements for the WAN /64 (fromFramed-IPv6-Prefix), and advertises the configured resolvers via RA RDNSS.ipv6_dhcpis the DHCPv6 server that delegates the customer prefix (fromDelegated-IPv6-Prefix) via IA_PD. accel-ppp installs the delegated-prefix route itself (via the PPP peer,route-via-gw), which FRR then redistributes.
There is no ipv6pool module and no [ipv6-pool] section — assignment is
RADIUS-only, fail-closed, exactly as described above.
IPv6 DNS resolvers
pppoe.ipv6_dns is a list of IPv6 resolver addresses advertised to subscribers
(via RA RDNSS and DHCPv6). It is only used when pppoe.ipv6 is not deny.
pppoe:
enabled: true
ipv6: allow
ipv6_dns:
- "2606:4700:4700::1111"
- "2001:4860:4860::8888"
Example: dual-stack PPPoE
pppoe:
enabled: true
ac_name: "AthenaBNG"
ipv6: prefer
ipv6_dns:
- "2606:4700:4700::1111"
- "2001:4860:4860::8888"
radius:
servers:
- host: "10.255.0.10"
secret: "your-secret"
nas_identifier: "AthenaBNG"
nas_ip_address: "10.255.0.1"
With this config and a RADIUS profile that returns the v6 attributes, a PPPoE client negotiates IPv6CP, gets a /64 on its WAN link via RA, and receives its RADIUS-assigned prefix via DHCPv6-PD. A client whose RADIUS profile returns no v6 attributes comes up IPv4-only on the same config.
PPPoE IPv6 uses the same 1492-byte MTU as IPv4. Ensure ICMPv6 "Packet Too Big" messages are permitted through any subscriber/management firewalls so PMTUD works.
IPoE dual-stack (DHCPv6)
IPoE DHCPv6 is not yet shipping. The DHCPv6 wire protocol and the IA_PD response logic are implemented and unit-tested, but the async socket listener, the Router Advertisement sender for IPoE, and the demux DHCPv6-Solicit detection are still in development. Treat this as a preview of the intended behaviour.
The DHCPv6 core in abng-dhcpd already implements the same RADIUS-authoritative,
fail-closed model as PPPoE:
- IA_PD is delegated from the RADIUS
Delegated-IPv6-Prefix. If RADIUS returns no delegated prefix, the client is answeredNoPrefixAvail(NoBindingon Renew/Rebind) — no prefix is ever locally invented. - IA_NA is answered
NoAddrsAvail. The IPoE WAN address comes via SLAAC (Router Advertisements carrying theFramed-IPv6-Prefix), not stateful DHCPv6, so the server never hands out a /128. - Solicit → Advertise (or Reply on Rapid-Commit); Request / Renew / Rebind / Confirm → Reply; Information-Request → DNS-only.
What remains for IPoE to ship: the [::]:547 UDP listener (joining ff02::1:2
on each subscriber interface), the RA sender that accel-ppp's ipv6_nd provides
for PPPoE, DHCPv6-Solicit detection in the demux, and the route installation for
the delegated prefix. Until then, use PPPoE for dual-stack service.
RADIUS attributes
Two standard RADIUS attributes drive IPv6, both returned in the Access-Accept:
| # | Attribute | RFC | Meaning |
|---|---|---|---|
| 97 | Framed-IPv6-Prefix | RFC 3162 | The on-link WAN prefix (typically a /64) advertised to the CE via RA/SLAAC |
| 123 | Delegated-IPv6-Prefix | RFC 4818 | The prefix delegated to the CE's LANs (e.g. a /56), handed out via DHCPv6 IA_PD |
Both are encoded as reserved(1) | prefix-length(1) | prefix octets (the prefix
octets left-aligned and zero-padded). Returning neither attribute yields an
IPv4-only session. See the
RADIUS Attributes Reference for the full list.
Example Access-Accept (dual-stack)
Access-Accept
User-Name = "user1"
Framed-IP-Address = 203.0.113.10
Framed-IPv6-Prefix = 2001:df4:2040:1234::/64
Delegated-IPv6-Prefix = 2001:df4:2040:1200::/56
Athena-Rate-Down = "100mbit"
Athena-Rate-Up = "40mbit"
How IPv6 prefixes are announced (aggregate only)
Upstream, IPv6 differs from the IPv4 plane. Rather than announcing a host route
per subscriber, BGP announces the subscriber aggregate only — a single prefix
(a /52 in the reference deployment, 2001:df4:2040:1000::/52) via
aggregate-address … summary-only. The per-customer /56 (or /48) delegated
prefixes forward locally as connected/kernel routes but are suppressed from BGP
advertisement, so the routing table upstream stays clean.
For the BGP/IS-IS configuration, IPv6 address-family, and aggregate announcement detail, see IPv6 routing & upstream peering and the Routing configuration page.
Next Steps
- PPPoE Configuration — the
pppoe.ipv6/pppoe.ipv6_dnsknobs - DHCP/IPoE Configuration — IPoE / DHCPv6 status
- RADIUS Attributes Reference —
Framed-IPv6-PrefixandDelegated-IPv6-Prefix - Routing — how the subscriber aggregate is announced upstream