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
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:
| Block | Purpose |
|---|---|
/ip firewall nat | One masquerade rule — every subscriber shares the router's WAN IP going out. |
/radius | Registers the AAA server and its shared secret, on the standard 1812/1813 ports. |
/ppp aaa | The switch that actually turns on RADIUS for PPP — easy to forget, and the #1 reason "I added RADIUS but it's not authenticating." |
/ip pool | A fallback IP range, used only if RADIUS doesn't return a Framed-IP-Address for a session. |
/ppp profile | DNS 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 server | Binds everything to your subscriber-facing interface. |
/ip firewall filter | Closes 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
| Field | Accepts | Default | Notes |
|---|---|---|---|
| WAN interface | Interface name (e.g. ether1) | ether1 | Must face your uplink, not subscribers. Required. |
| Subscriber-side interface | Interface name (e.g. ether2) | ether2 | Must be different from the WAN interface. Required. |
| Router gateway IP | IPv4 address | 10.10.10.1 | Becomes local-address in the PPP profile — the router's own IP inside the subscriber subnet. |
| Client pool range | Two IPv4 addresses, start-end | 10.10.10.2-10.10.10.254 | Fallback only — used when RADIUS doesn't return Framed-IP-Address. Should share the gateway IP's subnet. |
| DNS servers | Comma-separated IPv4 addresses | 8.8.8.8,1.1.1.1 | Pushed to subscribers via the PPP profile. |
| RADIUS server IP | IPv4 address | none — placeholder if blank | Required for a working config. No sensible default exists. |
| Shared secret | Text | none — placeholder if blank | Must match the secret configured on your RADIUS server exactly. Required. |
| Service name | Text, no spaces | isp-pppoe | Cosmetic — shown in /interface pppoe-server server print. |
| Profile name | Text, no spaces | default-radius | Referenced by both the PPP profile and the PPPoE server block — must match between the two, which the generator handles automatically. |
| Upload / Download limit | Number + optional K/M/G | 5M / 10M | Becomes 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.
| Field | Value used |
|---|---|
| WAN interface | ether1 (satellite modem in bridge mode, CGNAT — see the note below) |
| Subscriber-side interface | ether2 (sector antenna) |
| Router gateway IP | 10.10.10.1 |
| Client pool range | 10.10.10.2-10.10.10.254 (fallback only — SAS4 assigns real IPs per plan) |
| RADIUS server IP | 10.0.0.5 (SAS4 on a local VPS reachable from the router) |
| Upload / Download | 5M / 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
| Symptom | Likely cause | Fix |
|---|---|---|
| Subscribers connect but RADIUS shows no accounting data | accounting=yes missing from /ppp aaa, or RADIUS not listening on port 1813 | Confirm /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 router | Re-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 stall | MTU/MRU mismatch — PPPoE overhead not accounted for | Confirm max-mtu=1480 max-mru=1480 in the PPPoE server config, not the Ethernet default of 1500 |
| Upload and download speeds are swapped | Misreading rate-limit=rx/tx as download/upload | Remember 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 block | Managing the router through the same WAN interface the script just hardened | Set 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
/radiusentry 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.
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.