Skip to content
MikroTik RouterOS Docs

PPPoE Server and Client in RouterOS: A Complete Guide

RouterOS Version: 7.x+ Difficulty: Intermediate Estimated Time: 30 minutes

PPPoE (Point-to-Point Protocol over Ethernet) encapsulates PPP packets in Ethernet frames, enabling IP address distribution based on username authentication over Layer 2 networks. RouterOS supports both PPPoE client (for connecting to ISPs) and PPPoE server (Access Concentrator for providing subscriber access).

Common use cases:

  • ISP subscriber connection - Connect to provider via PPPoE client
  • ISP service delivery - Provide subscriber access with authentication
  • Bandwidth management - Per-user rate limiting via PPP profiles
  • RADIUS integration - Centralized authentication and accounting

Key concepts:

  • PPPoE operates at Layer 2 - do not assign IP addresses to PPPoE interfaces
  • MTU is reduced to 1492 bytes due to 8-byte PPPoE overhead
  • Connection phases: Discovery (PADI/PADO/PADR/PADS) then Session (LCP/Auth/IPCP)
MenuPurpose
/interface pppoe-clientPPPoE client configuration
/interface pppoe-server serverPPPoE server configuration
/ppp profileConnection profiles (addresses, rate limits)
/ppp secretUser credentials for local authentication
/ppp activeActive PPPoE sessions
/ppp aaaRADIUS and accounting settings
PropertyTypeDefaultDescription
namestringpppoe-out[i]Interface identifier
interfacestring-Physical interface to run PPPoE on (required)
userstring""Username for authentication
passwordstring""Password for authentication
service-namestring""Target service name; blank accepts any
ac-namestring""Access Concentrator name; blank accepts any
allowenummschap2,mschap1,chap,papPermitted authentication methods
profilestringdefaultPPP profile to use
max-mtuinteger1460Maximum Transmission Unit
max-mruinteger1460Maximum Receive Unit
keepalive-timeoutinteger60Echo packet timeout in seconds
add-default-routeyes/nonoAutomatically add default route
default-route-distancebyte1Administrative distance for default route
dial-on-demandyes/nonoConnect only when outbound traffic detected
use-peer-dnsyes/nonoAccept DNS servers from peer
disabledyes/noyesWhether client is disabled
PropertyTypeDescription
statusenumCurrent connection state
ac-macMACAccess Concentrator MAC address
local-addressIPAllocated client IP address
remote-addressIPGateway/server IP address
mtuintegerEffective MTU
uptimetimeConnection duration
encodingstringEncryption/encoding details
StatusDescription
dialingSending PADI, waiting for PADO
verifying passwordAuthentication in progress
connectedSession established successfully
disconnectedSession not active
terminatingSession being closed
PropertyTypeDefaultDescription
interfacestring-Client-facing interface (required)
service-namestring""Server identifier; "" accepts all clients
default-profilestringdefaultPPP profile for clients
authenticationenummschap2,mschap1,chap,papAllowed authentication methods
max-mtuinteger1480Maximum Transmission Unit
max-mruinteger1480Maximum Receive Unit
keepalive-timeouttime10Echo interval before disconnect
max-sessionsinteger0Client limit; 0 = unlimited
one-session-per-hostyes/nonoDisconnect previous session if MAC reconnects
pppoe-over-vlan-rangeinteger-VLAN IDs for tagged clients (v7+)
disabledyes/nonoWhether server is disabled
PropertyTypeDefaultDescription
namestring-Profile name
local-addressIP/pool-IP assigned to server side
remote-addressIP/pool-IP assigned to client (or pool name)
dns-serverIP-DNS server(s) sent to client
rate-limitrx/tx-Speed limit (creates dynamic simple queue)
only-oneyes/no/defaultdefaultLimit user to single connection
change-tcp-mssyes/no/defaultdefaultEnable MSS clamping
bridgestring-Bridge to add interface to
address-liststring-Address list to add client IP
on-upscript-Script executed on connection
on-downscript-Script executed on disconnection
PropertyTypeDescription
namestringUsername for authentication
passwordstringPassword for authentication
serviceenumService type (pppoe, pptp, l2tp, etc.)
profilestringAssociated PPP profile
local-addressIPOverride profile local-address
remote-addressIPStatic IP for this user
routesstringRoutes pushed to client
limit-bytes-inintegerDownload limit in bytes
limit-bytes-outintegerUpload limit in bytes

Connect to ISP with automatic default route:

# Create PPPoE client on WAN interface
/interface pppoe-client add interface=ether1 name=pppoe-wan \
user=myusername password=mypassword \
add-default-route=yes use-peer-dns=no disabled=no
# Set local DNS servers
/ip dns set servers=8.8.8.8,1.1.1.1
# Configure NAT for LAN clients
/ip firewall nat add chain=srcnat out-interface=pppoe-wan action=masquerade
# Verify connection
/interface pppoe-client monitor pppoe-wan once

For failover scenarios with multiple connections:

# Primary connection (lower distance = preferred)
/interface pppoe-client add interface=ether1 name=pppoe-primary \
user=user1 password=pass1 \
add-default-route=yes default-route-distance=1 disabled=no
# Backup connection (higher distance = failover only)
/interface pppoe-client add interface=ether2 name=pppoe-backup \
user=user2 password=pass2 \
add-default-route=yes default-route-distance=10 disabled=no

Provide subscriber access with local authentication:

# Create IP pool for clients
/ip pool add name=pppoe-pool ranges=10.0.0.2-10.0.0.254
# Create PPP profile
/ppp profile add name=subscriber-profile \
local-address=10.0.0.1 remote-address=pppoe-pool \
dns-server=10.0.0.1 change-tcp-mss=yes
# Create PPPoE server on client-facing interface
/interface pppoe-server server add interface=ether2 \
service-name=MYISP default-profile=subscriber-profile \
authentication=chap,mschap1,mschap2 disabled=no
# Create user credentials
/ppp secret add name=customer1 password=custpass1 \
service=pppoe profile=subscriber-profile
/ppp secret add name=customer2 password=custpass2 \
service=pppoe profile=subscriber-profile

Multiple service tiers with rate limiting:

# Create pools for each plan
/ip pool add name=pool-basic ranges=10.10.1.2-10.10.1.254
/ip pool add name=pool-premium ranges=10.10.2.2-10.10.2.254
# Create profiles with rate limits
/ppp profile add name=plan-10mbps \
local-address=10.10.1.1 remote-address=pool-basic \
rate-limit=10M/10M dns-server=10.10.1.1 change-tcp-mss=yes
/ppp profile add name=plan-50mbps \
local-address=10.10.2.1 remote-address=pool-premium \
rate-limit=50M/50M dns-server=10.10.2.1 change-tcp-mss=yes
# Assign users to plans
/ppp secret add name=user1 password=pass1 service=pppoe profile=plan-10mbps
/ppp secret add name=user2 password=pass2 service=pppoe profile=plan-50mbps
# Create server
/interface pppoe-server server add interface=ether2 \
service-name=MYISP default-profile=plan-10mbps \
one-session-per-host=yes disabled=no

Centralized authentication for larger deployments:

# Configure RADIUS server
/radius add address=192.168.1.100 secret=radiussecret service=ppp
# Enable RADIUS for PPP
/ppp aaa set use-radius=yes accounting=yes interim-update=5m
# Create default profile (RADIUS can override)
/ppp profile add name=radius-profile \
local-address=10.0.0.1 remote-address=pppoe-pool \
dns-server=10.0.0.1 change-tcp-mss=yes
# Create PPPoE server
/interface pppoe-server server add interface=ether2 \
service-name=MYISP default-profile=radius-profile disabled=no

Discover available PPPoE servers on a network:

# Scan for PPPoE servers
/interface pppoe-client scan ether1
# Output shows:
# SERVICE-NAME AC-NAME AC-MAC
# ISP-Service ISP-Router AA:BB:CC:DD:EE:FF

Assign fixed IP to specific customer:

# Create user with static IP (overrides pool)
/ppp secret add name=premium-customer password=prempass \
service=pppoe profile=plan-50mbps \
remote-address=10.10.2.100

Execute scripts on connect/disconnect:

# Profile with on-up script
/ppp profile add name=scripted-profile \
local-address=10.0.0.1 remote-address=pppoe-pool \
on-up={
/ip firewall address-list add list=active-pppoe address=$"remote-address"
:log info "PPPoE client connected: $user"
} \
on-down={
/ip firewall address-list remove [find address=$"remote-address" list=active-pppoe]
:log info "PPPoE client disconnected: $user"
}

Standard Ethernet MTU is 1500 bytes. PPPoE adds 8 bytes overhead, leaving 1492 bytes maximum for IP packets.

LayerMax SizeNotes
Ethernet1500Standard frame payload
PPPoE1492After 8-byte PPPoE overhead
TCP payload~1452After IP and TCP headers

When Path MTU Discovery fails (often due to ICMP blocking), TCP connections hang. Solutions:

Via PPP Profile (IPv4 only):

/ppp profile set [find] change-tcp-mss=yes

Via Mangle Rules (IPv4 and IPv6):

# IPv4
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
action=change-mss new-mss=clamp-to-pmtu passthrough=yes
# IPv6 (profile setting doesn't cover IPv6)
/ipv6 firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
action=change-mss new-mss=clamp-to-pmtu passthrough=yes

Some ISPs support MTU 1500 over PPPoE:

# Set physical interface to 1508
/interface ethernet set ether1 mtu=1508
# Set PPPoE client to request 1500
/interface pppoe-client set pppoe-wan max-mtu=1500 max-mru=1500

Symptoms: Client perpetually sends PADI but never connects.

Causes:

  • VLAN header handling issue on switch chip
  • DHCP client running on same interface
  • Modem not in bridge mode

Solutions:

# Check 1: Fix VLAN header handling
/interface ethernet switch port set switch1-cpu vlan-header=always-strip
# Check 2: Remove conflicting DHCP client
/ip dhcp-client print
/ip dhcp-client remove [find interface=ether1]
# Check 3: Verify modem is bridging PPPoE frames
/interface pppoe-client scan ether1
# Should show available servers

Symptom: PPPoE worked before upgrade, now fails.

Cause: Version 7.20 changed behavior where disabled keepalive also disables LCP echo requests.

Solution:

/interface pppoe-client set [find] keepalive-timeout=10

Symptom: Connection works but Telegram, large downloads, or certain sites fail.

Cause: MTU black hole - Path MTU Discovery fails when ICMP is blocked.

Solution:

# Enable MSS clamping in profile
/ppp profile set [find] change-tcp-mss=yes
# Or add mangle rule
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
action=change-mss new-mss=clamp-to-pmtu passthrough=yes

Symptom: After disconnect, client stays down until manual intervention.

Causes:

  • dial-on-demand=yes without traffic
  • Keepalive timeout issue

Solutions:

# Disable dial-on-demand for always-on
/interface pppoe-client set [find] dial-on-demand=no
# Ensure keepalive is enabled
/interface pppoe-client set [find] keepalive-timeout=60
# Watchdog script for persistent issues
/system scheduler add name=pppoe-watchdog interval=5m on-event={
:if ([/interface pppoe-client get [find name=pppoe-wan] running] = false) do={
/interface pppoe-client disable [find name=pppoe-wan]
:delay 2s
/interface pppoe-client enable [find name=pppoe-wan]
}
}

Symptom: Simple queues based on IP don’t affect PPPoE clients.

Cause: PPPoE traffic is encapsulated; queue sees interface, not IP.

Solutions:

# Solution 1: Use rate-limit in profile (recommended)
/ppp profile set [find name=myprofile] rate-limit=10M/10M
# Solution 2: Use address-list and queue tree
/ppp profile set [find] address-list=pppoe-clients
/ip firewall mangle add chain=forward src-address-list=pppoe-clients \
action=mark-packet new-packet-mark=pppoe-down passthrough=no

Symptom: LAN clients can’t access internet.

Cause: Masquerade rule references physical interface instead of PPPoE.

Solution:

# Wrong: out-interface=ether1
# Correct: out-interface=pppoe-wan
/ip firewall nat add chain=srcnat out-interface=pppoe-wan action=masquerade

Problem 7: RADIUS Returns Accept but Client Gets Error 691

Section titled “Problem 7: RADIUS Returns Accept but Client Gets Error 691”

Symptom: Authentication fails despite RADIUS accepting.

Cause: Profile mismatch or missing RADIUS attributes.

Solution:

# Enable debugging
/system logging add topics=radius,ppp,debug
# Verify profile exists
/ppp profile print
# Check RADIUS attributes match RouterOS expectations

Symptom: Server doesn’t respond to clients on bridge interface.

Cause: Bridge filtering or hardware offload affecting PPPoE frames.

Solution:

# Option 1: Run PPPoE server on physical interface
# Option 2: Adjust bridge settings
/interface bridge set [find name=bridge1] protocol-mode=none
Device ClassRecommended SessionsNotes
RB750/hEX100-200Light WISP usage
RB4011/RB5009500-1000Medium deployments
CCR10092000-3000Professional ISP
CCR1036/CCR20045000+Large ISP

Scaling tips:

  • Over 1200 sessions: migrate from simple queues to queue tree
  • Use RADIUS for centralized management at scale
  • Consider address-list marking for efficient QoS
# List all PPPoE clients
/interface pppoe-client print
# Monitor client connection details
/interface pppoe-client monitor [find] once
# Scan for available PPPoE servers
/interface pppoe-client scan ether1
# List PPPoE servers
/interface pppoe-server server print
# View active PPPoE sessions
/ppp active print
# View configured users
/ppp secret print
# Check routes via PPPoE
/ip route print where gateway-status~"pppoe"
# Check PPP logs
/log print where topics~"pppoe"
  • IP Pools (/ip pool) - Address ranges for PPPoE clients
  • RADIUS (/radius) - External authentication and accounting
  • User Manager - MikroTik’s built-in RADIUS server
  • Simple Queues - Auto-created when rate-limit set in profile
  • Queue Tree - Advanced QoS for large deployments
  • Scripts (/system script) - Profile on-up/on-down automation
  • Firewall (/ip firewall) - Protect PPPoE server and clients
  • Address Lists (/ip firewall address-list) - Track connected client IPs
  • DHCP Server - alternative IP assignment method
  • IP Pool - address pools for PPPoE clients
  • NAT - masquerade for PPPoE clients

PPPoE provides authenticated IP connectivity over Ethernet:

  1. Client setup - Specify interface, credentials, enable add-default-route
  2. Server setup - Create pool, profile, server, and user secrets
  3. Enable MSS clamping - Prevents MTU black hole issues
  4. Use rate-limit in profiles - For per-user bandwidth control

Key points:

  • Do not assign IP addresses to interfaces used for PPPoE
  • MTU is 1492 bytes maximum (1500 - 8 byte overhead)
  • Enable change-tcp-mss=yes in profiles to prevent connection issues
  • Use one-session-per-host=yes to prevent duplicate connections
  • RouterOS 7.20+ requires non-zero keepalive-timeout
  • For scale, use RADIUS and queue tree instead of simple queues