Guide  →  PPPoE & RADIUS on RouterOS

PPPoE + RADIUS on MikroTik:
the reasoning behind the script

The generator builds the config in seconds. This page covers the part that actually matters if you're running a WISP: why each piece exists, and where new deployments usually break.

Why PPPoE instead of static IPs or plain DHCP

A wireless ISP connects and disconnects subscribers constantly — someone stops paying, moves, or gets a plan upgrade. Static IP assignment means manually tracking every lease by hand, and plain DHCP gives you no clean way to authenticate a subscriber before handing them a connection at all.

PPPoE solves both problems at once. Every session starts with a login (username and password), so a subscriber literally cannot get an IP address without authenticating first. When their session ends — router reboot, someone unplugs the antenna, they stop paying — the IP and the rate-limit profile attached to it are released automatically. There's no lease to clean up and no orphaned static route sitting on your router six months later.

The trade-off is a small amount of protocol overhead per packet, which is exactly why the MTU/MRU settings in the generated script matter — more on that below.

What RADIUS is actually doing

RADIUS is an AAA protocol — Authentication, Authorization, Accounting. RouterOS can authenticate PPPoE logins against a local list of secrets, but that doesn't scale past a handful of subscribers, and it gives you no usage data. RADIUS moves all three jobs off the router and onto a server built for it — SAS4, GalaxyRAD, or anything else that speaks RFC 2865.

Authentication

When a subscriber's PPPoE client sends a username and password, RouterOS forwards it to the RADIUS server named in /radius. The server checks it against its own subscriber database and replies accept or reject — RouterOS never needs to know the password itself.

Authorization

On accept, the RADIUS server can hand back attributes — which profile to apply, what static IP to assign via Framed-IP-Address, session timeout limits. This is how a billing platform pushes a "10 Mbps package" or "expired, redirect to payment page" decision onto the router without anyone touching RouterOS directly.

Accounting

This is the part people skip and then wonder why their billing platform shows no usage data. The line set use-radius=yes accounting=yes interim-update=5m tells RouterOS to send accounting packets to the RADIUS server: a Start packet when the session begins, Interim-Update packets every 5 minutes with live byte counts, and a Stop packet with the final total when it ends. Without accounting=yes, your billing platform has no idea how much data anyone used.

Why 5 minutes specifically: shorter intervals (1–2 min) give more real-time-looking usage graphs but add router and RADIUS server load across hundreds of sessions. Longer intervals (15m+) mean a router crash between updates loses more unaccounted usage. 5 minutes is the balance most SAS4/GalaxyRAD deployments settle on.

The full exchange, step by step

Subscriber MikroTik Router RADIUS Server 1. PPPoE login (user/pass) 2. Access-Request 3. Access-Accept + attributes 4. Session established 5. Accounting-Start 6. Interim-Update (every 5m) 7. Accounting-Stop (session ends) Never sees the RADIUS secret Forwards, doesn't store passwords Owns the subscriber database

Reading the generated script

In order, here's what each block in the generator's output actually does and why it's in that order:

BlockPurpose
/ip firewall natOne masquerade rule — every subscriber shares the router's WAN IP going out.
/radiusRegisters the AAA server and its shared secret, on the standard 1812/1813 ports.
/ppp aaaThe switch that actually turns on RADIUS for PPP — easy to forget, and the #1 reason "I added RADIUS but it's not authenticating."
/ip poolA fallback IP range, used only if RADIUS doesn't return a Framed-IP-Address for a session.
/ppp profileDNS servers and the rate-limit, formatted rx-rate/tx-rate — from the router's perspective, so rx is upload from the subscriber and tx is download to them.
/interface pppoe-server serverBinds everything to your subscriber-facing interface.
/ip firewall filterCloses Winbox and Telnet on the WAN side — optional, but there's rarely a good reason to leave router management reachable from the public internet.

Where new deployments actually break

MTU and MRU

PPPoE adds 8 bytes of overhead to every packet. If max-mtu and max-mru aren't set to 1480 (down from Ethernet's standard 1500), subscribers get intermittent issues that look like a bad connection but are actually packet fragmentation — sites that load fine but images or video randomly stall. This is one of the most common "why does my PPPoE feel flaky" support tickets, and it's a one-line fix.

CGNAT on the WAN side

If your uplink is satellite internet or any other connection behind Carrier-Grade NAT, you don't get a public IP on the WAN interface at all — which means you can't reach the router remotely for monitoring or emergency changes without a separate tunnel (a VPS-hosted VPN, a reverse SSH tunnel, or a paid static-IP add-on if your provider offers one). This has nothing to do with the PPPoE/RADIUS config itself, but it's worth planning for before you have 40 subscribers and a router you can't reach at 2am.

RADIUS timeout with no fallback

If the RADIUS server is unreachable, new sessions fail to authenticate — existing sessions keep running, but nobody new can log in until it's back. Some operators add a second /radius entry pointing at a backup server for exactly this reason; RouterOS will fail over automatically if the first one stops responding.

Test before you trust it: after importing any generated script, connect one test subscriber first — not your whole base. Confirm the session actually shows up in your RADIUS platform's accounting logs with a nonzero byte count before rolling it out further.

Every parameter, explained

FieldAcceptsDefaultNotes
WAN interfaceInterface name (e.g. ether1)ether1Must face your uplink, not subscribers. Required.
Subscriber-side interfaceInterface name (e.g. ether2)ether2Must be different from the WAN interface. Required.
Router gateway IPIPv4 address10.10.10.1Becomes local-address in the PPP profile — the router's own IP inside the subscriber subnet.
Client pool rangeTwo IPv4 addresses, start-end10.10.10.2-10.10.10.254Fallback only — used when RADIUS doesn't return Framed-IP-Address. Should share the gateway IP's subnet.
DNS serversComma-separated IPv4 addresses8.8.8.8,1.1.1.1Pushed to subscribers via the PPP profile.
RADIUS server IPIPv4 addressnone — placeholder if blankRequired for a working config. No sensible default exists.
Shared secretTextnone — placeholder if blankMust match the secret configured on your RADIUS server exactly. Required.
Service nameText, no spacesisp-pppoeCosmetic — shown in /interface pppoe-server server print.
Profile nameText, no spacesdefault-radiusReferenced by both the PPP profile and the PPPoE server block — must match between the two, which the generator handles automatically.
Upload / Download limitNumber + optional K/M/G5M / 10MBecomes rx-rate/tx-rate — from the router's perspective, so upload here is what the subscriber sends.

Full example: a 40-subscriber WISP on satellite backhaul

A realistic scenario end to end: a small WISP with a satellite internet uplink on ether1, an antenna sector on ether2, and SAS4 as the RADIUS/billing platform running on a local VPS at 10.0.0.5.

FieldValue used
WAN interfaceether1 (satellite modem in bridge mode, CGNAT — see the note below)
Subscriber-side interfaceether2 (sector antenna)
Router gateway IP10.10.10.1
Client pool range10.10.10.2-10.10.10.254 (fallback only — SAS4 assigns real IPs per plan)
RADIUS server IP10.0.0.5 (SAS4 on a local VPS reachable from the router)
Upload / Download5M / 10M default profile — SAS4 overrides per subscriber plan via RADIUS attributes

Because satellite internet sits behind CGNAT, this router has no public IP on ether1 — remote management goes through a WireGuard tunnel to the VPS running SAS4, not directly to the router. See the security guide for that setup.

Common mistakes and how to fix them

SymptomLikely causeFix
Subscribers connect but RADIUS shows no accounting dataaccounting=yes missing from /ppp aaa, or RADIUS not listening on port 1813Confirm /ppp aaa print shows accounting=yes; check the RADIUS server's accounting log for incoming packets
Logins fail with "no response from RADIUS"Shared secret mismatch, or RADIUS server unreachable from the routerRe-check the secret matches exactly on both sides; ping the RADIUS IP from the router's terminal
Connection works but feels intermittently slow, images/video stallMTU/MRU mismatch — PPPoE overhead not accounted forConfirm max-mtu=1480 max-mru=1480 in the PPPoE server config, not the Ethernet default of 1500
Upload and download speeds are swappedMisreading rate-limit=rx/tx as download/uploadRemember rx is what the subscriber sends (upload), tx is what they receive (download) — from the router's point of view
Can't reach the router remotely after applying the firewall blockManaging the router through the same WAN interface the script just hardenedSet up a VPN tunnel (WireGuard) before hardening, or test the firewall rules on a device you can reach physically first

Best practices

  • Test every new script on one subscriber before rolling out to the rest of the network.
  • Keep a second /radius entry pointing at a backup server if your billing platform supports failover.
  • Never reuse the router's admin password as the RADIUS shared secret.
  • Document your actual interface names and IP scheme somewhere outside the router — a router that needs a factory reset shouldn't take your network map with it.
  • Re-check MTU/MRU first whenever a subscriber reports "slow but not disconnected" — it's the most common false lead in PPPoE troubleshooting.
RouterOS version: this generator's output is built and tested against RouterOS v7.x. It hasn't been separately verified against RouterOS v6.

Continue with verification

Use the RouterOS v7 RADIUS troubleshooting checklist when the server times out, the secret is rejected, or accounting is missing. For a clean step-by-step baseline, see the PPPoE server configuration script guide.

Ready to generate your config?

Fill in your interfaces and RADIUS details and get a ready-to-import .rsc file in seconds.

Open the generator →