Skip to main content

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

ValueMeaning
denyIPv6CP disabled — sessions are IPv4-only (default)
allowNegotiate IPv6 if the client requests it
preferOffer IPv6, falling back to IPv4-only if the client declines
requireRequire 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 /64 for 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:

  1. PPPoE session is established
  2. RADIUS returns rate attributes (Athena-Rate-Down, Athena-Rate-Up)
  3. 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

FieldValidation
enabledBoolean
ac_name1-64 characters
mtuInteger 1280-1500
mruInteger 1280-1500
lcp_echo_intervalPositive integer (seconds)
lcp_echo_failurePositive integer
ipv6One of: deny, allow, prefer, require
ipv6_dnsList of valid IPv6 addresses

Best Practices

  1. AC Name — Use a descriptive name (e.g., "AthenaBNG-Brisbane")
  2. MTU/MRU — Use 1492 for standard PPPoE (1500 - 8 byte header)
  3. LCP Echo — Use 30s interval with 3 failures for standard keepalive
  4. RADIUS — Always configure RADIUS servers before enabling PPPoE
  5. QoS — Enable QoS for per-subscriber rate limiting
  6. Monitoring — Monitor PPPoE session count and churn rate

Troubleshooting

No PPPoE Sessions Appearing

  1. Check PPPoE is enabled: show configuration | match pppoe
  2. Check VLAN demux is enabled: show configuration | match demux
  3. Check VLAN interfaces are created: show vlans
  4. Check RADIUS is reachable: radtest testuser testpass <radius-ip> 1812 <secret>
  5. Check accel-ppp logs: journalctl -u accel-ppp -f

Sessions Disconnecting Frequently

  1. Check LCP echo settings: show configuration | match lcp_echo
  2. Check network stability: ping -c 100 <upstream-router>
  3. Check RADIUS timeout: Increase lcp_echo_failure if RADIUS is slow
  4. Check accel-ppp logs: journalctl -u accel-ppp -f

Sessions Not Getting IP

  1. Check RADIUS is configured: show configuration | match radius
  2. Test RADIUS: radtest testuser testpass <radius-ip> 1812 <secret>
  3. Check RADIUS returns Framed-IP-Address
  4. Check abngd logs: journalctl -u abngd -f

Next Steps