Skip to content
MikroTik RouterOS Docs

PPPoE Server: ISP Subscriber Access Configuration

For the impatient: basic PPPoE server with one subscriber.

# Create IP pool for subscribers
/ip pool add name=pppoe-pool ranges=10.0.0.2-10.0.0.254
# Create PPP profile
/ppp profile add name=pppoe-profile local-address=10.0.0.1 \
remote-address=pppoe-pool dns-server=8.8.8.8,8.8.4.4
# Add subscriber
/ppp secret add name=user1 password=pass123 service=pppoe profile=pppoe-profile
# Create PPPoE server on subscriber-facing interface
/interface pppoe-server server add interface=ether2 service-name=MyISP \
default-profile=pppoe-profile disabled=no
# NAT for internet access
/ip firewall nat add chain=srcnat src-address=10.0.0.0/24 action=masquerade

Verify: /ppp active print shows connected subscribers.

What this does: A PPPoE server (Access Concentrator) authenticates subscribers and assigns IP addresses, enabling per-user management, bandwidth control, and accounting. PPPoE is widely used by ISPs and WISPs for subscriber access.

When to use this:

  • Operating as an ISP or WISP
  • Providing authenticated internet access to subscribers
  • Managing per-subscriber bandwidth limits
  • Tracking subscriber usage for billing
  • Integrating with RADIUS for centralized management

Prerequisites:

  • RouterOS 6.x or 7.x
  • Dedicated interface(s) for subscriber connections
  • IP address pool planned for subscribers
  • Understanding of PPP architecture (profiles, secrets)

Critical

Do not assign an IP address to the PPPoE server interface. PPPoE operates at Layer 2 - the PPP tunnel handles IP addressing. Assigning an IP causes routing issues.

ComponentMenu PathPurpose
PPPoE Server/interface pppoe-server serverListens for subscriber connections
PPP Profile/ppp profileDefines session parameters (IP, DNS, limits)
PPP Secret/ppp secretSubscriber credentials (local auth)
IP Pool/ip poolAddress range for subscribers
RADIUS/radius + /ppp aaaExternal authentication server
  1. Subscriber sends PADI (PPPoE Active Discovery Initiation)
  2. Server responds with PADO (Discovery Offer)
  3. Subscriber sends PADR (Discovery Request)
  4. Server responds with PADS (Session Confirmation)
  5. PPP session established with LCP negotiation
  6. Authentication (PAP/CHAP/MSCHAPv2)
  7. IPCP assigns IP address to subscriber

Create a pool of addresses for subscriber assignment:

/ip pool add name=pppoe-pool ranges=10.0.0.2-10.0.0.254

For larger deployments, use multiple ranges or pools:

/ip pool add name=pppoe-pool ranges=10.0.0.2-10.0.255.254

The profile defines default settings for all subscribers using it:

/ppp profile add \
name=pppoe-profile \
local-address=10.0.0.1 \
remote-address=pppoe-pool \
dns-server=8.8.8.8,8.8.4.4 \
change-tcp-mss=yes

Key profile properties:

PropertyPurpose
local-addressRouter’s address on PPP tunnels (gateway for subscribers)
remote-addressPool name or specific IP for subscribers
dns-serverDNS servers pushed to subscribers
change-tcp-mssAdjust TCP MSS to prevent fragmentation (recommended)
rate-limitBandwidth limit (upload/download)

Add users who can authenticate to your PPPoE server:

/ppp secret add \
name=subscriber1 \
password=SecurePass123 \
service=pppoe \
profile=pppoe-profile

For multiple subscribers:

/ppp secret add name=sub001 password=pass001 service=pppoe profile=pppoe-profile
/ppp secret add name=sub002 password=pass002 service=pppoe profile=pppoe-profile
/ppp secret add name=sub003 password=pass003 service=pppoe profile=pppoe-profile

Bind the server to the subscriber-facing interface:

/interface pppoe-server server add \
interface=ether2 \
service-name=MyISP \
default-profile=pppoe-profile \
authentication=mschap2,mschap1,chap \
one-session-per-host=yes \
disabled=no

Key server properties:

PropertyPurpose
interfaceInterface where subscribers connect
service-nameName advertised to subscribers (can be blank)
default-profileProfile applied to all connections
authenticationAllowed auth methods (avoid PAP for security)
one-session-per-hostPrevent multiple sessions from same MAC
max-sessionsLimit total connections (0 = unlimited)

Enable NAT so subscribers can access the internet:

/ip firewall nat add chain=srcnat src-address=10.0.0.0/24 \
out-interface=ether1-wan action=masquerade \
comment="NAT for PPPoE subscribers"
/interface pppoe-server server print

Expected Output:

Flags: X - disabled
0 interface=ether2 service-name="MyISP" max-mtu=1480 max-mru=1480
mrru=disabled authentication=chap,mschap1,mschap2 keepalive-timeout=10
one-session-per-host=yes max-sessions=0 default-profile=pppoe-profile
/ppp active print

Expected Output:

Flags: R - RADIUS
# NAME SERVICE CALLER-ID ADDRESS UPTIME
0 subscriber1 pppoe AA:BB:CC:DD:EE:FF 10.0.0.2 1h23m45s
/interface pppoe-server print

Shows all currently connected subscriber sessions with interface names.

/ppp active print stats

Shows bytes and packets transferred per session.

Create different profiles for different bandwidth tiers:

# 10 Mbps plan
/ppp profile add name=plan-10m local-address=10.0.0.1 \
remote-address=pppoe-pool dns-server=8.8.8.8 \
rate-limit=10M/10M
# 50 Mbps plan
/ppp profile add name=plan-50m local-address=10.0.0.1 \
remote-address=pppoe-pool dns-server=8.8.8.8 \
rate-limit=50M/50M
# 100 Mbps plan
/ppp profile add name=plan-100m local-address=10.0.0.1 \
remote-address=pppoe-pool dns-server=8.8.8.8 \
rate-limit=100M/100M

Assign subscribers to plans:

/ppp secret add name=basic-user password=pass service=pppoe profile=plan-10m
/ppp secret add name=premium-user password=pass service=pppoe profile=plan-50m

Rate-limit format: rx-rate/tx-rate where rx = subscriber upload, tx = subscriber download (from router’s perspective).

Use RADIUS for centralized subscriber management:

# Add RADIUS server
/radius add address=192.168.1.100 secret=RadiusSecret123 service=ppp
# Enable RADIUS for PPP
/ppp aaa set use-radius=yes accounting=yes interim-update=5m
# Create profile (RADIUS overrides these settings)
/ppp profile add name=radius-profile local-address=10.0.0.1 \
remote-address=pppoe-pool change-tcp-mss=yes
# Create server using RADIUS profile
/interface pppoe-server server add interface=ether2 service-name=ISP \
default-profile=radius-profile disabled=no

Serve subscribers on a specific VLAN:

# Create VLAN interface
/interface vlan add name=vlan100-subscribers vlan-id=100 interface=ether2
# Bind PPPoE server to VLAN
/interface pppoe-server server add interface=vlan100-subscribers \
service-name=ISP default-profile=pppoe-profile disabled=no

Serve PPPoE across a range of VLANs without creating individual interfaces:

/interface pppoe-server server add interface=bridge1 \
service-name=MultiVLAN-ISP \
default-profile=pppoe-profile \
pppoe-over-vlan-range=100-150 \
disabled=no

VLAN Conflict

Do not create VLAN interfaces with IDs that overlap with pppoe-over-vlan-range. The PPPoE server manages these VLANs internally.

For subscribers connecting through multiple physical ports:

# Create bridge for subscriber ports
/interface bridge add name=bridge-subscribers
# Add subscriber-facing ports
/interface bridge port add bridge=bridge-subscribers interface=ether2
/interface bridge port add bridge=bridge-subscribers interface=ether3
/interface bridge port add bridge=bridge-subscribers interface=ether4
# Bind PPPoE server to bridge
/interface pppoe-server server add interface=bridge-subscribers \
service-name=ISP default-profile=pppoe-profile disabled=no

Assign a fixed IP to a subscriber (bypassing the pool):

/ppp secret add name=static-user password=pass service=pppoe \
profile=pppoe-profile remote-address=10.0.0.100

The remote-address in the secret overrides the profile’s pool.

Execute scripts when subscribers connect/disconnect:

/ppp profile set pppoe-profile on-up="/log info \"User \$user connected from \$caller-id\""
/ppp profile set pppoe-profile on-down="/log info \"User \$user disconnected\""

Available script variables: $user, $local-address, $remote-address, $caller-id, $interface

PPPoE adds 8 bytes overhead (6 PPPoE + 2 PPP), reducing effective MTU from 1500 to 1492 bytes.

ScenarioPhysical MTUPPPoE MTUNotes
Standard15001492Default, may cause fragmentation
Baby Jumbo15081500Recommended - eliminates fragmentation
VLAN Tagged15041492Additional 4 bytes for VLAN tag

If your network supports it, use baby jumbo frames:

# Set physical interface MTU
/interface ethernet set ether2 mtu=1508 l2mtu=1508
# Server will negotiate 1500 MTU with clients
/interface pppoe-server server set 0 max-mtu=1500 max-mru=1500

Ensure TCP sessions don’t exceed MTU (already handled by change-tcp-mss=yes in profile):

# Additional mangle rule for extra reliability
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
action=change-mss new-mss=clamp-to-pmtu passthrough=yes
SymptomCauseSolution
No PADO responseServer disabled or wrong interfaceCheck /interface pppoe-server server print for X flag
”No PPPoE server”Service-name mismatchSet service-name="" to accept any
Auth failedWrong credentialsVerify /ppp secret print
”RADIUS timeout”RADIUS unreachableCheck /radius print, verify connectivity

Enable debug logging:

/system logging add topics=pppoe,ppp,debug action=memory
/log print where topics~"ppp"
SymptomCauseSolution
Cycles repeatedlyMTU mismatchSet physical interface MTU to 1492 or 1508
Authenticates then dropsProfile misconfigurationCheck pool exists, local-address valid
Works briefly then diesKeepalive timeoutAdjust keepalive-timeout
CheckCommandSolution
NAT configured/ip firewall nat printAdd masquerade rule
Route exists/ip route printVerify PPPoE subnet routed
DNS working/ip dns printVerify DNS servers in profile
Firewall blocking/ip firewall filter printAllow PPPoE interface in forward chain
SymptomCauseSolution
”Access denied”Shared secret mismatchVerify RADIUS secret
TimeoutRADIUS unreachableCheck firewall, UDP 1812/1813
Auth OK but disconnectsProfile/attribute mismatchCheck RADIUS attributes match RouterOS
# Check RADIUS status
/radius print
# Monitor RADIUS requests
/radius monitor 0

Common Mistakes

  • Assigning IP to PPPoE interface - Don’t do it. PPP handles addressing.
  • Using PAP authentication - Sends passwords in cleartext. Use CHAP/MSCHAPv2.
  • Forgetting NAT - Subscribers won’t reach internet without masquerade.
  • MTU issues - Most “partial page loads” are MTU problems. Use baby jumbo or MSS clamping.

PAP sends passwords in cleartext:

/interface pppoe-server server set 0 authentication=mschap2,mschap1,chap

Prevent credential sharing:

/interface pppoe-server server set 0 one-session-per-host=yes

Prevent resource exhaustion:

/interface pppoe-server server set 0 max-sessions=500

Control what subscribers can access:

# Add PPPoE interface list
/interface list add name=pppoe-clients
# Auto-add PPPoE interfaces to list (use profile)
/ppp profile set pppoe-profile interface-list=pppoe-clients
# Apply firewall rules
/ip firewall filter add chain=forward in-interface-list=pppoe-clients \
connection-state=established,related action=accept
/ip firewall filter add chain=forward in-interface-list=pppoe-clients \
action=drop comment="Block inter-subscriber traffic"
PropertyTypeDefaultDescription
interfacestring-Subscriber-facing interface (required)
service-namestring""Name advertised to clients (blank = accept all)
default-profilestringdefaultPPP profile for connections
authenticationenummschap2,mschap1,chap,papAllowed auth methods
max-mtuinteger1480Maximum transmission unit
max-mruinteger1480Maximum receive unit
keepalive-timeouttime10LCP echo timeout
one-session-per-hostyes/nonoOne session per MAC address
max-sessionsinteger0Session limit (0 = unlimited)
pppoe-over-vlan-rangeranges-VLAN IDs to serve PPPoE
disabledyes/noyesEnable/disable server
PropertyTypeDefaultDescription
local-addressIP/pool-Router’s tunnel address
remote-addressIP/pool-Client’s assigned address
dns-serverIP list-DNS servers for clients
rate-limitstring-Bandwidth limit (rx/tx)
change-tcp-mssyes/nonoAdjust TCP MSS
only-oneyes/nonoSingle session per user
interface-liststring-Add sessions to interface list
on-upscript-Script on connect
on-downscript-Script on disconnect