PPPoE Configuration
Configure PPPoE subscriber termination via accel-ppp.
Overview
The pppoe section configures the PPPoE server (accel-ppp), which:
- Terminates PPPoE sessions from subscribers
- Negotiates PPP protocol (LCP, IPCP)
- Integrates with RADIUS for authentication and IP assignment
- Applies per-subscriber QoS rules
accel-ppp is managed by abngd: it is unmasked and auto-started at boot when
pppoe is enabled, and its configuration is rendered on commit. RADIUS
authentication supports PAP, CHAP, and MS-CHAP (v1/v2). The rendered config
does not emit a literal wildcard service-name, so clients that send an empty
Service-Name are accepted.
PPPoE sessions appear in show subscribers. This works via accel-ppp's
pppd-compat module: abngd renders the config with pppd_compat loaded and a
[pppd-compat] section that runs ip-up / ip-down hook scripts (installed at
/opt/athena-bng/etc/hooks/pppoe-up.sh and pppoe-down.sh). The hooks call
abng-notify, which registers and clears the session in abngd.
Configuration Options
enabled
Enable or disable PPPoE (optional).
pppoe:
enabled: true
Type: Boolean
Required: No
Default: false
Valid values: true, false
CLI:
abng# set pppoe enabled true
Note: Requires radius.servers to be configured.
ac_name
Access Concentrator name advertised in PPPoE (optional).
pppoe:
ac_name: "AthenaBNG"
Type: String
Required: No
Default: "AthenaBNG"
Constraints: 1-64 characters
Purpose: Identifies the BNG in PPPoE PADO frames.
CLI:
abng# set pppoe ac_name "AthenaBNG"
mtu
Maximum Transmission Unit for PPP (optional).
pppoe:
mtu: 1492
Type: Integer
Required: No
Default: 1492
Constraints: 1280-1500 bytes
Purpose: PPP MTU (Ethernet MTU 1500 - 8 bytes for PPPoE header).
CLI:
abng# set pppoe mtu 1492
mru
Maximum Receive Unit for PPP (optional).
pppoe:
mru: 1492
Type: Integer
Required: No
Default: 1492
Constraints: 1280-1500 bytes
Purpose: Maximum size of PPP frames to receive.
CLI:
abng# set pppoe mru 1492
lcp_echo_interval
LCP Echo Request interval in seconds (optional).
pppoe:
lcp_echo_interval: 30
Type: Integer
Required: No
Default: 30
Constraints: Positive integer (seconds)
Purpose: Keepalive interval for PPP link monitoring.
CLI:
abng# set pppoe lcp_echo_interval 30
lcp_echo_failure
LCP Echo Request failures before disconnect (optional).
pppoe:
lcp_echo_failure: 3
Type: Integer
Required: No
Default: 3
Constraints: Positive integer
Purpose: Disconnect session after N failed echo requests.
CLI:
abng# set pppoe lcp_echo_failure 3
ipv6
Enable IPv6 dual-stack (IPv6CP) for PPPoE sessions (optional).
pppoe:
ipv6: allow
Type: String
Required: No
Default: "deny"
Valid values: deny, allow, prefer, require
| Value | Meaning |
|---|---|
deny | IPv6CP disabled — sessions are IPv4-only (default) |
allow | Negotiate IPv6 if the client requests it |
prefer | Offer IPv6, falling back to IPv4-only if the client declines |
require | Require IPv6CP — reject sessions that will not negotiate it |
When set to anything other than deny, abngd renders accel-ppp with the
ipv6_nd (Router Advertisements / RDNSS for the WAN /64) and ipv6_dhcp
(DHCPv6 IA_PD for the delegated prefix) modules. Both the WAN prefix
(Framed-IPv6-Prefix) and the delegated prefix (Delegated-IPv6-Prefix) come
only from RADIUS — there is no local IPv6 pool, so a session whose RADIUS
reply carries no IPv6 attributes comes up IPv4-only (fail-closed).
CLI:
abng# set pppoe ipv6 allow
See IPv6 / Dual-Stack for the full model.
ipv6_dns
IPv6 DNS resolvers advertised to subscribers via RA RDNSS / DHCPv6 (optional).
pppoe:
ipv6: allow
ipv6_dns:
- "2606:4700:4700::1111"
- "2001:4860:4860::8888"
Type: List of IPv6 addresses
Required: No
Default: Empty (advertise none)
Note: Only used when ipv6 is not deny.
CLI:
abng# set pppoe ipv6_dns ["2606:4700:4700::1111", "2001:4860:4860::8888"]
Example Configurations
Minimal PPPoE Configuration
pppoe:
enabled: true
Uses all defaults:
- AC Name: "AthenaBNG"
- MTU/MRU: 1492
- LCP Echo: 30s interval, 3 failures
Full PPPoE Configuration
pppoe:
enabled: true
ac_name: "AthenaBNG-01"
mtu: 1492
mru: 1492
lcp_echo_interval: 30
lcp_echo_failure: 3
Dual-Stack (IPv6) PPPoE Configuration
pppoe:
enabled: true
ac_name: "AthenaBNG-01"
ipv6: prefer
ipv6_dns:
- "2606:4700:4700::1111"
- "2001:4860:4860::8888"
Subscribers whose RADIUS profile returns Framed-IPv6-Prefix /
Delegated-IPv6-Prefix come up dual-stack; those without come up IPv4-only. See
IPv6 / Dual-Stack.
Configuration via CLI
Enable PPPoE
abng> configure
abng# set pppoe enabled true
abng# commit
Set AC Name
abng# set pppoe ac_name "MyBNG"
abng# commit
Set MTU/MRU
abng# set pppoe mtu 1492
abng# set pppoe mru 1492
abng# commit
Set LCP Parameters
abng# set pppoe lcp_echo_interval 60
abng# set pppoe lcp_echo_failure 5
abng# commit
Verification
View PPPoE Configuration
abng> show configuration | match "^pppoe:"
pppoe:
enabled: true
ac_name: AthenaBNG
mtu: 1492
mru: 1492
lcp_echo_interval: 30
lcp_echo_failure: 3
View PPPoE Sessions
abng> show subscribers pppoe
┌────┬───────┬──────────┬───────────────┬────────────┬──────────┐
│ ID │ Type │ Username │ IP Address │ Interface │ Speed D/U│
├────┼───────┼──────────┼───────────────┼────────────┼──────────┤
│ 1 │ PPPoE │ user1 │ 203.0.113.10 │ ppp0 │ 100M/40M │
│ 2 │ PPPoE │ user2 │ 203.0.113.11 │ ppp1 │ 50M/20M │
└────┴───────┴──────────┴───────────────┴────────────┴──────────┘
Check accel-ppp Logs
sudo journalctl -u accel-ppp -f
Integration with RADIUS
PPPoE requires RADIUS for authentication and IP assignment:
pppoe:
enabled: true
ac_name: "AthenaBNG"
radius:
servers:
- host: "10.255.0.10"
secret: "your-secret"
nas_identifier: "AthenaBNG"
nas_ip_address: "10.255.0.1"
RADIUS attributes used:
- User-Name — Subscriber username
- User-Password / CHAP-Password — Subscriber credentials (PAP/CHAP/MS-CHAP)
- Framed-IP-Address — Assigned IP address
- Framed-IP-Netmask — Subnet mask
- Framed-IPv6-Prefix — WAN
/64for IPv6 (dual-stack; advertised via RA/SLAAC) - Delegated-IPv6-Prefix — Delegated PD (e.g.
/56) handed out via DHCPv6 IA_PD - Session-Timeout — Session timeout in seconds
- Athena-Rate-Down / Athena-Rate-Up — Optional per-subscriber download/upload rates
- Acct-Session-Id — Session ID for accounting
The two IPv6 attributes are honored only when pppoe.ipv6 is not deny, and are
the sole source of a subscriber's IPv6 (no local pool). See
IPv6 / Dual-Stack.
Integration with QoS
PPPoE sessions can have per-subscriber QoS rules:
qos:
enabled: true
default_down: "100mbit"
default_up: "40mbit"
default_overhead_profile: "pppoe_ethernet"
QoS is applied when:
- PPPoE session is established
- RADIUS returns rate attributes (Athena-Rate-Down, Athena-Rate-Up)
- CAKE shaping is applied per subscriber — downstream on the PPP interface and upstream via a per-session IFB device
The subscriber's rate reaches abngd via the radattr file: accel-ppp writes
the RADIUS reply attributes to <radattr-prefix>.<ifname> (configured
radattr-prefix=/run/accel-ppp/radattr; the accel-ppp unit provides
/run/accel-ppp via RuntimeDirectory=accel-ppp). The ip-up hook reads
Athena-Rate-Down / Athena-Rate-Up from that file and passes them to abngd.
No rate = unmetered. A session whose RADIUS reply carries no rate attribute is reported unshaped; there is no implicit default rate.
Validation Rules
| Field | Validation |
|---|---|
enabled | Boolean |
ac_name | 1-64 characters |
mtu | Integer 1280-1500 |
mru | Integer 1280-1500 |
lcp_echo_interval | Positive integer (seconds) |
lcp_echo_failure | Positive integer |
ipv6 | One of: deny, allow, prefer, require |
ipv6_dns | List of valid IPv6 addresses |
Best Practices
- AC Name — Use a descriptive name (e.g., "AthenaBNG-Brisbane")
- MTU/MRU — Use 1492 for standard PPPoE (1500 - 8 byte header)
- LCP Echo — Use 30s interval with 3 failures for standard keepalive
- RADIUS — Always configure RADIUS servers before enabling PPPoE
- QoS — Enable QoS for per-subscriber rate limiting
- Monitoring — Monitor PPPoE session count and churn rate
Troubleshooting
No PPPoE Sessions Appearing
- Check PPPoE is enabled:
show configuration | match pppoe - Check VLAN demux is enabled:
show configuration | match demux - Check VLAN interfaces are created:
show vlans - Check RADIUS is reachable:
radtest testuser testpass <radius-ip> 1812 <secret> - Check accel-ppp logs:
journalctl -u accel-ppp -f
Sessions Disconnecting Frequently
- Check LCP echo settings:
show configuration | match lcp_echo - Check network stability:
ping -c 100 <upstream-router> - Check RADIUS timeout: Increase
lcp_echo_failureif RADIUS is slow - Check accel-ppp logs:
journalctl -u accel-ppp -f
Sessions Not Getting IP
- Check RADIUS is configured:
show configuration | match radius - Test RADIUS:
radtest testuser testpass <radius-ip> 1812 <secret> - Check RADIUS returns Framed-IP-Address
- Check abngd logs:
journalctl -u abngd -f
Next Steps
- DHCP Configuration — DHCP/IPoE server settings
- RADIUS Configuration — RADIUS servers and AAA
- QoS Configuration — CAKE traffic shaping
- IPv6 / Dual-Stack — dual-stack subscriber service
- Configuration Overview — All configuration sections