---
myst:
html_meta:
description: |
The PPPoE server terminates PPPoE sessions from subscribers,
authenticates them locally or via RADIUS, assigns IPv4 and IPv6
addresses, and enforces per-subscriber bandwidth limits.
keywords: pppoe-server, pppoe, radius, ppp, coa, prefix-delegation, vlan
---
(pppoe-server)=
# PPPoE server
Defined in
[RFC 2516](https://datatracker.ietf.org/doc/html/rfc2516), the
{abbr}`PPPoE (Point-to-Point Protocol over Ethernet)` server accepts
PPPoE sessions from subscribers connected over an Ethernet network
and acts as the provider-side endpoint of each session. Service
providers use the PPPoE server to authenticate individual
subscribers, assign them IPv4 and IPv6 addresses, account for their
traffic, and enforce per-subscriber bandwidth limits.
The PPPoE server is configured under `service pppoe-server`. PPPoE
sessions are authenticated in one of the following ways: locally, via
a {abbr}`RADIUS (Remote Authentication Dial-In User Service)` server
as defined in
[RFC 2865](https://datatracker.ietf.org/doc/html/rfc2865), or not at
all.
```{note}
Commits that change `interface`, `client-ip-pool`,
`client-ipv6-pool`, `authentication mode`, `authentication
protocols`, any option under `authentication radius`,
`ppp-options ipv6-peer-interface-id`, or
`ppp-options ipv6-peer-interface-id-secret` restart the PPPoE server
and terminate all active sessions. Adding or removing an interface
under `vpp settings interface` or `interfaces vpp bonding` has the
same effect when the PPPoE server listens on that interface or on
one of its VLANs. All other changes keep active sessions.
```
## Configuration
```{cfgcmd} set service pppoe-server access-concentrator \
**Configure the access concentrator name that the PPPoE server
announces to clients during PPPoE discovery.**
The name may contain letters, digits, hyphens, and underscores.
The default is `vyos-ac`.
```
Example:
```none
set service pppoe-server access-concentrator PPPoE-AC-01
```
```{cfgcmd} set service pppoe-server authentication mode \
**Configure how the PPPoE server authenticates clients:**
- `local`: Clients are authenticated against the locally configured
usernames and passwords.
- `radius`: Clients are authenticated by the configured RADIUS
servers.
- `noauth`: Authentication is not required to connect.
The default is `local`.
In `local` and `noauth` modes, at least one `client-ip-pool` or
`client-ipv6-pool` must be configured. Otherwise, the commit fails.
```
Example:
```none
set service pppoe-server authentication mode radius
```
```{cfgcmd} set service pppoe-server authentication local-users username \ password \
**Create a locally authenticated PPPoE user with the given password.**
In `local` authentication mode, at least one local user must be
configured, and every user needs a password. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server authentication local-users username user01 password secret
```
```{cfgcmd} set service pppoe-server client-ip-pool \ range \
**Configure an IPv4 address range as part of the named client pool.**
Specify the range either as an IPv4 prefix or as an address range
whose endpoints lie within a common /24 network. Repeat the command
to add several ranges to the same pool.
```
Example:
```none
set service pppoe-server client-ip-pool PPPOE-POOL range 192.0.2.10-192.0.2.99
set service pppoe-server client-ip-pool PPPOE-POOL range 198.51.100.0/24
```
```{cfgcmd} set service pppoe-server default-pool \
**Configure the client pool from which IPv4 addresses are assigned by
default.**
A RADIUS-provided address or pool, when present, takes precedence.
A client pool with this name must be configured under
`client-ip-pool`. Otherwise, the commit fails.
In `local` and `noauth` authentication modes, if at least one
`client-ip-pool` is configured but `default-pool` is not set, the
commit succeeds with a warning.
```
Example:
```none
set service pppoe-server default-pool PPPOE-POOL
```
```{cfgcmd} set service pppoe-server interface \
**Configure an interface on which the PPPoE server listens for PPPoE
clients.**
Repeat the command to listen on several interfaces.
At least one listen interface must be configured. Otherwise, the
commit fails.
```
Example:
```none
set service pppoe-server interface eth1
```
```{cfgcmd} set service pppoe-server gateway-address \
**Configure the local IPv4 address of the PPP interfaces created for
client sessions.**
For every session, the PPPoE server creates a PPP interface on the
router, and `gateway-address` becomes its local address. This address
is also sent to clients as their default gateway.
If `gateway-address` is not set, the commit succeeds with a warning,
and IPv4 sessions cannot be established.
```
Example:
```none
set service pppoe-server gateway-address 192.0.2.254
```
## RADIUS authentication
To enable RADIUS-based authentication, the authentication mode needs
to be changed to `radius`. Existing settings, such as local users,
remain in the configuration but are not used while the mode is
`radius`. When the mode is set back to `local`, the PPPoE server uses
the local users again.
```{cfgcmd} set service pppoe-server authentication radius server \ key \
**Configure a RADIUS server by its IPv4 address and the shared
secret.**
The shared secret authenticates the exchange of queries and replies
between the router and the RADIUS server
([RFC 2865](https://datatracker.ietf.org/doc/html/rfc2865)). The same
secret must be configured on the RADIUS server.
A single RADIUS server is a single point of failure. Repeat the
command to configure multiple servers for redundancy.
In `radius` authentication mode, at least one server must be
configured, and every server needs a shared secret. Otherwise, the
commit fails.
```
```{note}
Some RADIUS servers use an access control list that allows or denies
queries. Make sure to add your VyOS router to the allowed client
list.
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 key 'first-radius-secret'
set service pppoe-server authentication radius server 198.51.100.10 key 'second-radius-secret'
```
```{cfgcmd} set service pppoe-server authentication radius server \ priority \<1-255\>
**Configure the weight of the specified RADIUS server when the router
distributes queries across multiple servers.**
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 priority 10
```
```{cfgcmd} set service pppoe-server authentication radius server \ backup
**Configure the specified RADIUS server as a backup, used only when
all other servers have failed.**
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.10 backup
```
### Source address
By default, the router selects the source address of each RADIUS
query based on the route to that server. This address may change if
routing changes. The following command configures a single source
address for all RADIUS queries.
```{cfgcmd} set service pppoe-server authentication radius source-address \
**Configure the source IPv4 address used in all queries to RADIUS
servers.**
Use an address configured on one of the router's interfaces.
Typically, this is a loopback or dummy interface address.
```
Example:
```none
set service pppoe-server authentication radius source-address 192.0.2.1
```
### Advanced options
```{cfgcmd} set service pppoe-server authentication radius server \ port \<1-65535\>
**Configure the UDP port the router uses to send client
authentication requests to the specified RADIUS server.**
The default is 1812.
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 port 1645
```
```{cfgcmd} set service pppoe-server authentication radius server \ acct-port \<1-65535\>
**Configure the UDP port to which the router sends accounting
requests for the specified RADIUS server.**
The default is 1813.
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 acct-port 1646
```
```{cfgcmd} set service pppoe-server authentication radius server \ disable-accounting
**Stop sending accounting requests to the specified RADIUS server.**
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 disable-accounting
```
```{cfgcmd} set service pppoe-server authentication radius server \ fail-time \<0-600\>
**Mark the specified RADIUS server as unavailable for the given time,
in seconds, after it fails to respond.**
The default is 0.
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 fail-time 60
```
```{cfgcmd} set service pppoe-server authentication radius server \ disable
**Disable the specified RADIUS server without removing it from the
configuration.**
```
Example:
```none
set service pppoe-server authentication radius server 198.51.100.9 disable
```
```{cfgcmd} set service pppoe-server authentication radius acct-timeout \<0-60\>
**Configure the time, in seconds, to wait for a reply to
Interim-Update accounting packets before terminating the session.**
Setting the value to 0 keeps the session active regardless of
accounting replies.
The default is 3.
```
Example:
```none
set service pppoe-server authentication radius acct-timeout 30
```
```{cfgcmd} set service pppoe-server authentication radius accounting-interim-interval \<1-3600\>
**Configure the interval, in seconds, at which the router sends
accounting updates for active sessions.**
A RADIUS server may override this interval with the
Acct-Interim-Interval attribute.
```
Example:
```none
set service pppoe-server authentication radius accounting-interim-interval 300
```
```{cfgcmd} set service pppoe-server authentication radius acct-interim-jitter \<1-60\>
**Configure the largest random offset, in seconds, applied to the
accounting update interval.**
Spreading the updates keeps sessions from sending them all at once.
```
Example:
```none
set service pppoe-server authentication radius acct-interim-jitter 10
```
```{cfgcmd} set service pppoe-server authentication radius dynamic-author server \
**Configure the local IPv4 address on which the router accepts
{abbr}`CoA (Change of Authorization)` and Disconnect requests from
the RADIUS server.**
A Disconnect request terminates an active session. A CoA request
changes the authorization attributes of an active session. Both are
defined in
[RFC 5176](https://datatracker.ietf.org/doc/html/rfc5176), Dynamic
Authorization Extensions to RADIUS.
`dynamic-author key` must also be configured. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server authentication radius dynamic-author server 192.0.2.1
```
```{cfgcmd} set service pppoe-server authentication radius dynamic-author port \<1-65535\>
**Configure the UDP port on which the router accepts CoA and
Disconnect requests.**
The default is 1700.
```
Example:
```none
set service pppoe-server authentication radius dynamic-author port 3799
```
```{cfgcmd} set service pppoe-server authentication radius dynamic-author key \
**Configure the shared secret that authenticates incoming CoA and
Disconnect requests.**
```
Example:
```none
set service pppoe-server authentication radius dynamic-author key 'coa-secret'
```
```{cfgcmd} set service pppoe-server authentication radius max-try \<1-20\>
**Configure the maximum number of attempts to send Access-Request and
Accounting-Request queries to a RADIUS server.**
The default is 3.
```
Example:
```none
set service pppoe-server authentication radius max-try 5
```
```{cfgcmd} set service pppoe-server authentication radius timeout \<1-60\>
**Configure the time, in seconds, to wait for a reply from a RADIUS
server.**
The default is 3.
```
Example:
```none
set service pppoe-server authentication radius timeout 10
```
```{cfgcmd} set service pppoe-server authentication radius nas-identifier \
**Configure the value the router sends to RADIUS servers in the
NAS-Identifier attribute.**
In RADIUS, the router acts as a {abbr}`NAS (Network Access Server)`,
a device through which clients get access to the network. The RADIUS
server uses the NAS-Identifier value to identify which NAS originated
a request. The attribute is defined in
[RFC 2865 section 5.32](https://datatracker.ietf.org/doc/html/rfc2865#section-5.32).
```
Example:
```none
set service pppoe-server authentication radius nas-identifier pppoe-gw01
```
```{cfgcmd} set service pppoe-server authentication radius nas-ip-address \
**Configure the IPv4 address the router sends to RADIUS servers in
the NAS-IP-Address attribute.**
NAS-IP-Address identifies the router to the RADIUS server by IPv4
address, as NAS-Identifier does by name. The attribute is defined in
[RFC 2865 section 5.4](https://datatracker.ietf.org/doc/html/rfc2865#section-5.4).
The attribute does not change the source address of RADIUS queries.
```
Example:
```none
set service pppoe-server authentication radius nas-ip-address 192.0.2.1
```
```{cfgcmd} set service pppoe-server authentication radius preallocate-vif
**Create the PPP interface of a session before authentication, so
that the router can send NAS-Port-Id in the Access-Request.**
```
Example:
```none
set service pppoe-server authentication radius preallocate-vif
```
```{cfgcmd} set service pppoe-server authentication radius called-sid-format \
**Configure the format of the Called-Station-Id attribute the router
sends to RADIUS servers:**
- `ifname`: The name of the interface that accepted the request, for
example `eth1`.
- `ifname:mac`: The interface name and its MAC address, for example
`eth1:00:00:00:00:00:00`.
```
Example:
```none
set service pppoe-server authentication radius called-sid-format ifname:mac
```
```{cfgcmd} set service pppoe-server authentication radius rate-limit attribute \
**Configure which RADIUS attribute carries the rate information.**
The default is `Filter-Id`. When using a custom attribute, define it
in the RADIUS dictionaries of both the RADIUS server and the router.
```
Example:
```none
set service pppoe-server authentication radius rate-limit attribute Mikrotik-Rate-Limit
```
```{cfgcmd} set service pppoe-server authentication radius rate-limit enable
**Enable bandwidth shaping of client sessions based on rate
information received from the RADIUS server.**
```
Example:
```none
set service pppoe-server authentication radius rate-limit enable
```
```{cfgcmd} set service pppoe-server authentication radius rate-limit vendor \
**Configure the RADIUS vendor whose vendor-specific attribute carries
the rate information.**
Use a vendor name that exists in the RADIUS dictionaries in
`/usr/share/accel-ppp/radius`.
```
Example:
```none
set service pppoe-server authentication radius rate-limit vendor Mikrotik
```
```{cfgcmd} set service pppoe-server authentication radius rate-limit multiplier \<0.001-1000\>
**Configure the factor by which the router multiplies the rate
received from the RADIUS server.**
Use this option when the RADIUS server sends rates in a unit other
than kbit/s.
The default is 1.
```
Example:
```none
set service pppoe-server authentication radius rate-limit multiplier 0.001
```
### RADIUS attributes
When included in a RADIUS reply, the attributes below determine the
client's IP address and prefix assignment, taking precedence over the
corresponding CLI configuration. If an attribute is omitted, the CLI
configuration applies.
The following table outlines the allocation behaviors for different
RADIUS attributes:
% stop_vyoslinter
| RADIUS attribute | Allocation behavior with the RADIUS attribute | Allocation behavior without the RADIUS attribute |
|---|---|---|
| `Framed-IP-Address` | The IPv4 address carried in the attribute is assigned directly to the client. Example: `192.0.2.50` | IPv4 address assigned from the pool set as `default-pool`. Example: `192.0.2.15` from `PPPOE-POOL` |
| `Framed-Pool` | IPv4 address assigned from a pool named by the attribute value and defined with `client-ip-pool`. Example: `198.51.100.20` from `PREMIUM-V4` | IPv4 address assigned from the pool set as `default-pool`. Example: `192.0.2.15` from `PPPOE-POOL` |
| `Stateful-IPv6-Address-Pool` | IPv6 network assigned from the prefix ranges of a pool named by the attribute value and defined with `client-ipv6-pool`. Example: `2001:db8:aaaa:20::/64` from the prefix `2001:db8:aaaa::/48` of `PREMIUM-V6` | IPv6 network assigned from the pool set as `default-ipv6-pool`. Example: `2001:db8:8002:20::/64` from `IPV6-POOL` |
| `Delegated-IPv6-Prefix-Pool` | Delegated prefix assigned from the delegate ranges of a pool named by the attribute value and defined with `client-ipv6-pool`. Example: `2001:db8:bbbb:100::/56` from the delegate `2001:db8:bbbb::/48` of `PREMIUM-V6` | Delegated prefix assigned from the pool set as `default-ipv6-pool`. Example: `2001:db8:8003::/56` from `IPV6-POOL` |
```{note}
`Stateful-IPv6-Address-Pool` and `Delegated-IPv6-Prefix-Pool` are
defined in
[RFC 6911](https://datatracker.ietf.org/doc/html/rfc6911). If your
RADIUS server does not already define them, add them to its RADIUS
dictionary using the definitions from the
[accel-ppp RFC 6911 dictionary](https://github.com/accel-ppp/accel-ppp/blob/master/accel-pppd/radius/dict/dictionary.rfc6911).
```
% start_vyoslinter
```{note}
A session can be placed into a
{abbr}`VRF (Virtual Routing and Forwarding)` via the RADIUS
Access-Accept packet, or moved to another VRF via a CoA request,
using the `Accel-VRF-Name` attribute. It is a vendor-specific
ACCEL-PPP attribute. Define it on your RADIUS server.
```
### Rename client's session interfaces
If the RADIUS server sends the `NAS-Port-Id` attribute, the router
renames the client's session interface to the attribute value.
The value of the `NAS-Port-Id` attribute must be shorter than 16
characters. If it is 16 characters or longer, the router cannot
rename the interface and terminates the session.
## Automatic VLAN creation
```{cfgcmd} set service pppoe-server interface \ vlan \<1-4094 | start-end\>
**Configure the VLANs of the specified interface on which the PPPoE
server serves clients.**
Specify either a single VLAN ID or a range in the form `start-end`,
for example `500-1000`. Repeat the command to combine several IDs and
ranges on the same interface.
```
Example:
```none
set service pppoe-server interface eth3 vlan 100
set service pppoe-server interface eth3 vlan 500-1000
```
```{cfgcmd} set service pppoe-server interface \ combined
**Serve clients on the base interface in addition to the VLANs
configured with `vlan`.**
Without this option, an interface with `vlan` serves clients only on
those VLANs.
```
Example:
```none
set service pppoe-server interface eth3 combined
```
```{cfgcmd} set service pppoe-server interface \ vlan-mon
**Automatically create VLAN interfaces on the specified interface when
traffic arrives on the VLANs configured with `vlan`.**
The PPPoE server removes a created VLAN interface after 60 seconds
without traffic.
`vlan` must be configured on the same interface. Otherwise, the
commit fails.
```
Example:
```none
set service pppoe-server interface eth3 vlan 100
set service pppoe-server interface eth3 vlan-mon
```
## Bandwidth shaping
Bandwidth rate limits can be set for local users or via RADIUS
attributes.
### Local rate limits
```{cfgcmd} set service pppoe-server authentication local-users username \ rate-limit download \<1-10000000\>
**Limit the download bandwidth of the specified user, in kbit/s.**
Both `download` and `upload` must be configured. Otherwise, the
commit fails.
```
Example:
```none
set service pppoe-server authentication local-users username user01 rate-limit download 20480
```
```{cfgcmd} set service pppoe-server authentication local-users username \ rate-limit upload \<1-10000000\>
**Limit the upload bandwidth of the specified user, in kbit/s.**
Both `download` and `upload` must be configured. Otherwise, the
commit fails.
```
Example:
```none
set service pppoe-server authentication local-users username user01 rate-limit upload 10240
```
### RADIUS rate limits
By default, the rate information is taken from the `Filter-Id`
attribute. Configure it on the RADIUS server in the form
`Filter-Id=2000/3000`, where 2000 is the downstream rate and 3000 the
upstream rate, both in kbit/s.
The following command enables bandwidth shaping based on the rate
information received from the RADIUS server:
```none
set service pppoe-server authentication radius rate-limit enable
```
## Load balancing
Delaying {abbr}`PADO (PPPoE Active Discovery Offer)` replies balances
sessions across PPPoE servers. Clients usually connect to the server
that answers first, so a longer delay steers new clients toward other
servers.
```{cfgcmd} set service pppoe-server pado-delay \<1-999999\>
**Delay PADO replies by the given number of milliseconds while the
number of active sessions stays below every count configured with
`sessions`.**
By default, PADO replies are not delayed. Only one delay may be
configured without `sessions`, and its value cannot be `disable`.
Otherwise, the commit fails.
```
Example:
```none
set service pppoe-server pado-delay 20
```
```{cfgcmd} set service pppoe-server pado-delay \<1-999999 | disable\> sessions \<1-999999\>
**Delay PADO replies by the given number of milliseconds once the
number of active sessions reaches the given count.**
The value `disable` stops the PPPoE server from accepting new
connections at that session count.
Repeat the command with a different delay to configure several
thresholds.
If `disable` is used, it must be configured for the highest session
count of all delays. Otherwise, the commit fails.
```
Example:
```none
set service pppoe-server pado-delay 50 sessions 500
set service pppoe-server pado-delay disable sessions 1000
```
## IPv6 address assignment
```{cfgcmd} set service pppoe-server ppp-options ipv6 \
**Configure whether the PPPoE server negotiates IPv6 with clients:**
- `require`: Requires IPv6 negotiation.
- `prefer`: Asks the client for IPv6 negotiation. Does not fail if
the client rejects it.
- `allow`: Negotiates IPv6 only if the client requests it.
- `deny`: Does not negotiate IPv6.
The default is `deny`.
```
Example:
```none
set service pppoe-server ppp-options ipv6 allow
```
```{cfgcmd} set service pppoe-server client-ipv6-pool \ prefix \ mask \<48-128\>
**Configure an IPv6 prefix as part of the named client pool.**
From this prefix, each client is assigned an individual network of
the configured `mask` length. The client forms its address inside
that network.
Repeat the command to add several prefixes to the same pool.
The default mask is 64.
```
Example:
```none
set service pppoe-server client-ipv6-pool IPV6-POOL prefix 2001:db8:8002::/48 mask 64
```
```{cfgcmd} set service pppoe-server client-ipv6-pool \ delegate \ delegation-prefix \<32-64\>
**Configure an IPv6 prefix from which the named pool delegates
prefixes of the configured `delegation-prefix` length to clients via
DHCPv6 prefix delegation
([RFC 3633](https://datatracker.ietf.org/doc/html/rfc3633)).**
Repeat the command to add several prefixes to the same pool.
The same pool must also have a `prefix` configured with
`client-ipv6-pool prefix`. Otherwise, the commit fails.
```
Example:
```none
set service pppoe-server client-ipv6-pool IPV6-POOL prefix 2001:db8:8002::/48 mask 64
set service pppoe-server client-ipv6-pool IPV6-POOL delegate 2001:db8:8003::/48 delegation-prefix 56
```
```{cfgcmd} set service pppoe-server default-ipv6-pool \
**Configure the client pool from which IPv6 addresses and delegated
prefixes are assigned by default.**
A RADIUS-provided pool, when present, takes precedence.
In `local` and `noauth` authentication modes, if at least one
`client-ipv6-pool` is configured but `default-ipv6-pool` is not set,
the commit succeeds with a warning.
```
Example:
```none
set service pppoe-server default-ipv6-pool IPV6-POOL
```
### Advanced options
```{cfgcmd} set service pppoe-server ppp-options ipv6-accept-peer-interface-id
**Accept the interface identifier that the client proposes for its own
side of the session during IPv6 negotiation
([RFC 5072](https://datatracker.ietf.org/doc/html/rfc5072)).**
By default, the router does not accept it and uses the identifier
from `ipv6-peer-interface-id` instead.
```
Example:
```none
set service pppoe-server ppp-options ipv6-accept-peer-interface-id
```
```{cfgcmd} set service pppoe-server ppp-options ipv6-interface-id \
**Configure the interface identifier used on the router's side of
client sessions:**
- `x:x:x:x`: Use the given fixed interface identifier.
- `random`: Use a random interface identifier.
By default, a fixed interface identifier is used.
```
Example:
```none
set service pppoe-server ppp-options ipv6-interface-id random
```
```{cfgcmd} set service pppoe-server ppp-options ipv6-peer-interface-id \
**Configure the interface identifier used on the client's side of
sessions:**
- `x:x:x:x`: Use the given fixed interface identifier.
- `random`: Use a random interface identifier.
- `ipv4-addr`: Derive the interface identifier from the client's IPv4
address, for example `192:168:0:1`.
- `calling-sid`: Derive the interface identifier from the client's
calling station ID. With `calling-sid`,
`ipv6-peer-interface-id-secret` must also be configured. Otherwise,
the commit fails.
```
Example:
```none
set service pppoe-server ppp-options ipv6-peer-interface-id calling-sid
set service pppoe-server ppp-options ipv6-peer-interface-id-secret 'ChangeMeToARandomKey1234'
```
```{cfgcmd} set service pppoe-server ppp-options ipv6-peer-interface-id-secret \
**Configure the secret key used to derive client interface identifiers
when `ipv6-peer-interface-id` is set to `calling-sid`.**
The secret must be 16 to 128 characters long. It may contain ASCII
letters, digits, and symbols, but not spaces.
```
Example:
```none
set service pppoe-server ppp-options ipv6-peer-interface-id-secret 'ChangeMeToARandomKey1234'
```
## Scripting
Store scripts under `/config` so that they are migrated to a new
image when the system is upgraded.
```{cfgcmd} set service pppoe-server extended-scripts on-change \
**Configure a script to run when the router changes a session
interface upon a RADIUS CoA request.**
The script file must exist and be executable. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server extended-scripts on-change /config/scripts/pppoe-change.sh
```
```{cfgcmd} set service pppoe-server extended-scripts on-down \
**Configure a script to run when a client session is about to
terminate.**
The script file must exist and be executable. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server extended-scripts on-down /config/scripts/pppoe-down.sh
```
```{cfgcmd} set service pppoe-server extended-scripts on-pre-up \
**Configure a script to run before the PPP interface of a client
session comes up.**
The script file must exist and be executable. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server extended-scripts on-pre-up /config/scripts/pppoe-pre-up.sh
```
```{cfgcmd} set service pppoe-server extended-scripts on-up \
**Configure a script to run when the PPP interface of a client session
is completely configured and started.**
The script file must exist and be executable. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server extended-scripts on-up /config/scripts/pppoe-up.sh
```
## Advanced options
### Authentication
```{cfgcmd} set service pppoe-server authentication local-users username \ disable
**Disable the specified user account without removing it from the
configuration.**
```
Example:
```none
set service pppoe-server authentication local-users username user01 disable
```
```{cfgcmd} set service pppoe-server authentication local-users username \ static-ip \
**Assign a fixed IPv4 address to the specified user.**
Without this option, the user's address is allocated from the pool
set as `default-pool`.
```
Example:
```none
set service pppoe-server authentication local-users username user01 static-ip 192.0.2.50
```
```{cfgcmd} set service pppoe-server authentication protocols \
**Configure the authentication protocols the PPPoE server accepts
from clients:**
- `pap`: Password Authentication Protocol
([RFC 1334](https://datatracker.ietf.org/doc/html/rfc1334))
- `chap`: Challenge Handshake Authentication Protocol
([RFC 1994](https://datatracker.ietf.org/doc/html/rfc1994))
- `mschap`: Microsoft CHAP
([RFC 2433](https://datatracker.ietf.org/doc/html/rfc2433))
- `mschap-v2`: Microsoft CHAP version 2
([RFC 2759](https://datatracker.ietf.org/doc/html/rfc2759))
Repeat the command to accept several protocols.
By default, all four protocols are accepted.
```
Example:
```none
set service pppoe-server authentication protocols mschap-v2
```
```{cfgcmd} set service pppoe-server authentication any-login
**Accept any username during PAP, CHAP, and MS-CHAPv1
authentication.**
The password is still checked. MS-CHAPv2 is not covered by this
option.
```
Example:
```none
set service pppoe-server authentication any-login
```
### Client IP pool
```{cfgcmd} set service pppoe-server client-ip-pool \ next-pool \
**Configure the next pool, from which client addresses are allocated
once the specified client pool is exhausted.**
The following requirements are enforced when the configuration is
committed:
- The specified client pool must have a `range`.
- The pool named in `next-pool` must be configured under
`client-ip-pool`.
- The chain of pools must not form a loop.
```
Example:
```none
set service pppoe-server client-ip-pool PPPOE-POOL range 192.0.2.10-192.0.2.99
set service pppoe-server client-ip-pool OVERFLOW-POOL range 198.51.100.10-198.51.100.99
set service pppoe-server client-ip-pool PPPOE-POOL next-pool OVERFLOW-POOL
```
### PPP
```{cfgcmd} set service pppoe-server ppp-options disable-ccp
**Disable {abbr}`CCP (Compression Control Protocol)` negotiation with
clients.**
CCP ([RFC 1962](https://datatracker.ietf.org/doc/html/rfc1962)) is
the part of PPP where the two ends of a session agree on compressing
session traffic. By default, the PPPoE server negotiates CCP.
{abbr}`MPPE (Microsoft Point-to-Point Encryption)` is negotiated as
part of CCP, so `disable-ccp` also disables MPPE, whatever
`ppp-options mppe` is set to.
```
Example:
```none
set service pppoe-server ppp-options disable-ccp
```
```{cfgcmd} set service pppoe-server ppp-options interface-cache \<1-256000\>
**Configure the number of PPP interfaces kept in a cache after their
sessions end, for reuse by new sessions.**
Reusing cached interfaces reduces how often the kernel creates and
deletes interfaces.
By default, interfaces are not cached.
```
Example:
```none
set service pppoe-server ppp-options interface-cache 1000
```
```{cfgcmd} set service pppoe-server ppp-options ipv4 \
**Configure whether the PPPoE server negotiates IPv4 with clients:**
- `require`: Requires IPv4 negotiation.
- `prefer`: Asks the client for IPv4 negotiation. Does not fail if
the client rejects it.
- `allow`: Negotiates IPv4 only if the client requests it.
- `deny`: Does not negotiate IPv4.
```
Example:
```none
set service pppoe-server ppp-options ipv4 require
```
```{cfgcmd} set service pppoe-server ppp-options lcp-echo-failure \
**Configure the maximum number of {abbr}`LCP (Link Control Protocol)`
Echo-Request packets the PPPoE server may send without receiving a
valid reply.**
When the limit is exceeded, the session is terminated. The value must
be a positive integer.
The default is 3.
```
Example:
```none
set service pppoe-server ppp-options lcp-echo-failure 5
```
```{cfgcmd} set service pppoe-server ppp-options lcp-echo-interval \
**Configure the interval, in seconds, between LCP Echo-Request packets
sent to the client.**
The value must be a positive integer.
The default is 30.
```
Example:
```none
set service pppoe-server ppp-options lcp-echo-interval 10
```
```{cfgcmd} set service pppoe-server ppp-options lcp-echo-timeout \
**Configure the time, in seconds, to wait for any client activity.**
Setting this option enables adaptive LCP echo, and `lcp-echo-failure`
is then not used. The value must be a positive integer.
The default is 0, which leaves adaptive LCP echo off.
```
Example:
```none
set service pppoe-server ppp-options lcp-echo-timeout 120
```
```{cfgcmd} set service pppoe-server ppp-options min-mtu \<68-65535\>
**Configure the smallest
{abbr}`MTU (Maximum Transmission Unit)` value, in bytes, that the
PPPoE server accepts from clients.**
If a client tries to negotiate a lower MTU, the PPPoE server rejects
the value and suggests an acceptable one. If the client also rejects
the greater MTU, the PPPoE server disconnects it.
The default is 1280.
```
Example:
```none
set service pppoe-server ppp-options min-mtu 1400
```
```{cfgcmd} set service pppoe-server ppp-options mppe \
**Configure the negotiation of MPPE with clients:**
- `require`: Ask the client for MPPE. If the client rejects it, drop
the connection.
- `prefer`: Ask the client for MPPE. If the client rejects it,
continue without MPPE.
- `deny`: Do not use MPPE.
The default is `prefer`.
A RADIUS server may override this option with the
MS-MPPE-Encryption-Policy attribute.
```
Example:
```none
set service pppoe-server ppp-options mppe require
```
```{cfgcmd} set service pppoe-server ppp-options mru \<68-65535\>
**Configure the preferred {abbr}`MRU (Maximum Receive Unit)`, in
bytes, that the PPPoE server announces to clients.**
By default, no preferred MRU is configured.
```
Example:
```none
set service pppoe-server ppp-options mru 1492
```
### Global
```{cfgcmd} set service pppoe-server description \
**Set a description for the PPPoE server configuration.**
The description may be up to 255 characters long.
```
Example:
```none
set service pppoe-server description 'PPPoE access for example.com subscribers'
```
```{cfgcmd} set service pppoe-server limits burst \
**Configure how many PPPoE discovery requests the PPPoE server accepts
from a single client before it enforces the rate set with
`limits connection-limit`.**
```
Example:
```none
set service pppoe-server limits burst 100
```
```{cfgcmd} set service pppoe-server limits connection-limit \
**Configure the rate of PPPoE discovery requests the PPPoE server
accepts from a single client, for example `10/min` or `60/sec`.**
Requests above this rate are ignored, so the client receives no
reply.
```
Example:
```none
set service pppoe-server limits connection-limit 10/min
```
```{cfgcmd} set service pppoe-server limits timeout \
**Configure how long, in seconds, a single client must send no
requests for its request count to be reset.**
```
Example:
```none
set service pppoe-server limits timeout 60
```
```{cfgcmd} set service pppoe-server log level \<0-5\>
**Configure how much detail the PPPoE server writes to the system
log:**
- `0`: Nothing.
- `1`: Errors.
- `2`: Errors and warnings.
- `3`: Errors, warnings, and basic information.
- `4`: Errors, warnings, and full information.
- `5`: Everything, including debug messages.
The default is 3.
```
Example:
```none
set service pppoe-server log level 4
```
```{cfgcmd} set service pppoe-server mtu \<128-16384\>
**Configure the MTU for client sessions, in bytes.**
The default is 1492.
```
Example:
```none
set service pppoe-server mtu 1460
```
```{cfgcmd} set service pppoe-server max-concurrent-sessions \<0-65535\>
**Limits how many client sessions may start at the same time.**
The value 0 means no limit. By default, the number of sessions
starting at the same time is not limited.
```
Example:
```none
set service pppoe-server max-concurrent-sessions 100
```
```{cfgcmd} set service pppoe-server name-server \
**Configure a DNS server address that clients should use.**
Repeat the command to configure multiple addresses. Both IPv4 and
IPv6 addresses are accepted. At most two IPv4 and three IPv6 name
servers may be configured. Otherwise, the commit fails.
```
Example:
```none
set service pppoe-server name-server 192.0.2.53
set service pppoe-server name-server 2001:db8::53
```
```{cfgcmd} set service pppoe-server service-name \
**Configure a Service-Name the PPPoE server answers to during PPPoE
discovery ([RFC 2516](https://datatracker.ietf.org/doc/html/rfc2516)).**
The name may be up to 100 characters long and may contain letters,
digits, and hyphens.
Repeat the command to configure multiple service names.
If no service name is configured, the PPPoE server accepts any
Service-Name and echoes the client's Service-Name back.
```
Example:
```none
set service pppoe-server service-name internet
```
```{cfgcmd} set service pppoe-server accept-any-service
**Accept any Service-Name in a PADR request, while still announcing
the names configured with `service-name`.**
Use this option when clients select the PPPoE server by the
Service-Name they see in PADO replies.
```
Example:
```none
set service pppoe-server accept-any-service
```
```{cfgcmd} set service pppoe-server accept-blank-service
**Accept a blank Service-Name even when `service-name` is
configured.**
```
Example:
```none
set service pppoe-server accept-blank-service
```
```{cfgcmd} set service pppoe-server session-control \
**Configure what happens when a user who already has an active
session is authorized for a second session:**
- `deny`: Deny the second session.
- `disable`: Disable session control. Users may hold multiple
sessions at once.
- `replace`: Terminate the first session when the second one is
authorized.
The default is `replace`.
```
Example:
```none
set service pppoe-server session-control deny
```
```{cfgcmd} set service pppoe-server shaper fwmark \<1-2147483647\>
**Exclude traffic carrying the given firewall mark from bandwidth
shaping.**
```
Example:
```none
set service pppoe-server shaper fwmark 223
```
```{cfgcmd} set service pppoe-server snmp master-agent
**Configure the PPPoE server to serve
{abbr}`SNMP (Simple Network Management Protocol)` requests for its
own statistics.**
By default, the PPPoE server does not serve these requests itself.
```
Example:
```none
set service pppoe-server snmp master-agent
```
```{cfgcmd} set service pppoe-server thread-count \
**Configure how many worker threads the PPPoE server runs:**
- `all`: One thread per CPU core.
- `half`: One thread per two CPU cores.
- `1-512`: The given number of threads.
A change to this option takes effect when the PPPoE server restarts.
The default is `all`.
```
Example:
```none
set service pppoe-server thread-count half
```
```{cfgcmd} set service pppoe-server wins-server \
**Configure a {abbr}`WINS (Windows Internet Name Service)` server
address propagated to clients.**
Repeat the command to configure a second address.
At most two WINS servers may be configured. Otherwise, the commit
fails.
```
Example:
```none
set service pppoe-server wins-server 192.0.2.11
```
## Operation
### Show
```{opcmd} show pppoe-server sessions
**Show active PPPoE server sessions.**
```
```{opcmd} show pppoe-server statistics
**Show PPPoE server statistics.**
```
```{opcmd} show pppoe-server interfaces
**Show the interfaces on which the PPPoE server listens.**
```
### Reset
```{opcmd} reset pppoe-server all
**Terminate all PPPoE sessions.**
```
```{opcmd} reset pppoe-server interface \
**Terminate the PPPoE session running on the specified PPP
interface.**
```
```{opcmd} reset pppoe-server username \
**Terminate the PPPoE sessions of the specified user.**
```
### Restart
```{opcmd} restart pppoe-server
**Restart the PPPoE server.**
All active PPPoE sessions are terminated.
```
### Maintenance mode
```{opcmd} set pppoe-server maintenance-mode enable
**Stop accepting new PPPoE sessions and shut the PPPoE server down
once the last active session ends.**
```
```{opcmd} set pppoe-server maintenance-mode cancel
**Resume accepting new PPPoE sessions.**
```
## Examples
### Configure PPPoE Server
The following example configures a minimal PPPoE server with local
authentication:
```none
set service pppoe-server access-concentrator PPPoE-Server
set service pppoe-server authentication mode local
set service pppoe-server authentication local-users username test password 'test'
set service pppoe-server client-ip-pool PPPOE-POOL range 192.168.255.2-192.168.255.254
set service pppoe-server default-pool 'PPPOE-POOL'
set service pppoe-server gateway-address 192.168.255.1
set service pppoe-server interface eth0
```
### IPv4
The following example uses ACN as the access concentrator name,
assigns client addresses from the range 10.1.1.100-10.1.1.111, uses
10.1.1.2 as the local address of the PPP interfaces, and serves
clients on eth1 only.
```none
set service pppoe-server access-concentrator 'ACN'
set service pppoe-server authentication local-users username foo password 'bar'
set service pppoe-server authentication mode 'local'
set service pppoe-server client-ip-pool IP-POOL range '10.1.1.100-10.1.1.111'
set service pppoe-server default-pool 'IP-POOL'
set service pppoe-server interface eth1
set service pppoe-server gateway-address '10.1.1.2'
set service pppoe-server name-server '10.100.100.1'
set service pppoe-server name-server '10.100.200.1'
```
### Automatic VLAN creation
```none
set service pppoe-server interface eth3 vlan 100
set service pppoe-server interface eth3 vlan 200
set service pppoe-server interface eth3 vlan 500-1000
set service pppoe-server interface eth3 vlan 2000-3000
```
### Bandwidth shaping for a local user
The following example configures a local user with a download limit
of 20480 kbit/s and an upload limit of 10240 kbit/s.
```none
set service pppoe-server access-concentrator 'ACN'
set service pppoe-server authentication local-users username foo password 'bar'
set service pppoe-server authentication local-users username foo rate-limit download '20480'
set service pppoe-server authentication local-users username foo rate-limit upload '10240'
set service pppoe-server authentication mode 'local'
set service pppoe-server client-ip-pool IP-POOL range '10.1.1.100/24'
set service pppoe-server default-pool 'IP-POOL'
set service pppoe-server name-server '10.100.100.1'
set service pppoe-server name-server '10.100.200.1'
set service pppoe-server interface 'eth1'
set service pppoe-server gateway-address '10.1.1.2'
```
Once the user is connected, the user session uses the configured
limits and can be displayed via `show pppoe-server sessions`.
```none
show pppoe-server sessions
% stop_vyoslinter
ifname | username | ip | calling-sid | rate-limit | state | uptime | rx-bytes | tx-bytes
-------+----------+------------+-------------------+-------------+--------+----------+----------+----------
ppp0 | foo | 10.1.1.100 | 00:53:00:ba:db:15 | 20480/10240 | active | 00:00:11 | 214 B | 76 B
```
% start_vyoslinter
### Load balancing with PADO delays
In the following example, PADO replies are delayed by 20 ms while
fewer than 500 sessions are active, by 50 ms from 500 active
sessions, by 100 ms from 1000, and by 300 ms from 3000. None of these
delays limits the number of sessions.
```none
set service pppoe-server pado-delay 20
set service pppoe-server pado-delay 50 sessions '500'
set service pppoe-server pado-delay 100 sessions '1000'
set service pppoe-server pado-delay 300 sessions '3000'
```
### IPv6 address assignment
The following example enables IPv6 for client sessions and configures
a pool that assigns each client a /64 network and delegates a /56
prefix for use in the client's own network.
```none
set service pppoe-server ppp-options ipv6 allow
set service pppoe-server client-ipv6-pool IPV6-POOL prefix '2001:db8:8002::/48' mask '64'
set service pppoe-server client-ipv6-pool IPV6-POOL delegate '2001:db8:8003::/48' delegation-prefix '56'
set service pppoe-server default-ipv6-pool IPV6-POOL
```
### Dual-stack IPv4/IPv6 provisioning with prefix delegation
The following example serves both IPv4 and IPv6. Each client receives
an IPv4 address, an IPv6 network for the client side of the session,
and a delegated prefix for the client's own network.
```none
set service pppoe-server authentication local-users username test password 'test'
set service pppoe-server authentication mode 'local'
set service pppoe-server client-ip-pool IP-POOL range '192.168.0.1/24'
set service pppoe-server default-pool 'IP-POOL'
set service pppoe-server client-ipv6-pool IPV6-POOL prefix '2001:db8:8002::/48' mask '64'
set service pppoe-server client-ipv6-pool IPV6-POOL delegate '2001:db8:8003::/48' delegation-prefix '56'
set service pppoe-server default-ipv6-pool IPV6-POOL
set service pppoe-server ppp-options ipv6 allow
set service pppoe-server name-server '10.1.1.1'
set service pppoe-server name-server '2001:db8:4860::8888'
set service pppoe-server interface 'eth2'
set service pppoe-server gateway-address '10.100.100.1'
```
```none
vyos@pppoe-server:~$ show pppoe-server sessions
% stop_vyoslinter
ifname | username | ip | ip6 | ip6-dp | calling-sid | rate-limit | state | uptime | rx-bytes | tx-bytes
-------+----------+-------------+--------------------------+---------------------+-------------------+------------+--------+----------+----------+----------
ppp0 | test | 192.168.0.1 | 2001:db8:8002:0:200::/64 | 2001:db8:8003::1/56 | 00:53:00:12:42:eb | | active | 00:00:49 | 875 B | 2.1 KiB
```
% start_vyoslinter