Mikrotik Walled Garden

Having the correct Walled Garden hosts on your Mikrotik Hotspot is essential for the proper functioning of Powerlynx.

It is crucial to maintain the following Walled Garden hosts:

Your Powerlynx URL, e.g., one.powerlynx.app

Another one is *.digitaloceanspaces.com. This Walled Garden record allows connections to DigitalOcean to load logos for splash pages.

While these two previous Walled Garden hosts are required, you might need to add additional hosts here in case you are using one of the available payment systems.

For example, if you are using the PayPal payment system in Powerlynx, you need to add another Walled Garden record with this host - *paypal*. If you use Payfast, then add this record - *payfast*.

So, if you use the PayPal payment gateway in Powerlynx, your list of Walled Garden rules should look like this:

/ip hotspot walled-garden
add dst-host=*.digitaloceanspaces.com
add dst-host=*paypal*
add dst-host=*betacdn.net
add dst-host=myurl.powerlynx.app
add dst-host=*.akamaiedge.net
2 Likes

If you use the Stripe payment gateway in Powerlynx, your list of Walled Garden rules should look like this:

/ip hotspot walled-garden
add dst-host=*.digitaloceanspaces.com
add dst-host=*powerlynx.app
add dst-host=*.cloudfront.net
add dst-host=*.fastly.net
add dst-host=*.fontawesome.com*
add dst-host=*arcot.com*
add dst-host=*stripe*
add dst-host=*.akamaiedge.net
add dst-host=*apple-pay-gateway*
add dst-host=hcaptcha.com
add dst-host=*betacdn.net
add dst-host=*pay*apple*
add dst-host=*.amazonaws.com

Thank you for the instruction @mike

2 Likes

Payfast walled garden hosts
It is crucial to enable connections to various banks in South Africa, as Payfast redirects customers to the 3D authentication page during the payment process.

/ip hotspot walled-garden
add dst-host=*.digitaloceanspaces.com
add dst-host=*.powerlynx.app
add dst-host=*payfast*
add dst-host=*.fnb.co.za
add dst-host=.api.ravepay.co
add dst-host=*.bankserv.co.za
add dst-host=*.cardinalcommerce.com
add dst-host=*.capitecbank.co.za
add dst-host=*oppwa.com
add dst-host=*.absa.co.za
add dst-host=*.africanbank.co.za
add dst-host=*.bidvestbank.co.za
add dst-host=*.fnb.co.za
add dst-host=*.investec.com
add dst-host=*.nedbank.co.za
add dst-host=*.sasfin.co.za
add dst-host=*.standardbank.co.za
add dst-host=*.ubank.co.za
add dst-host=dsecureprd.fnb.co.za
add dst-host=acs.nedsecure.co.za
add dst-host=*ctpe.net
add dst-host=*ppipe.net
add dst-host=secure.stitch.money
add dst-host=ol.css
add dst-host=ipapi.co
add dst-host=3dsecureprd.fnb.co.za
add dst-host=*.cloudfront.net  
add dst-host=*.kxcdn.com
2 Likes

Using Safaricom Mpesa
Which are the walled garden to allow and how

Hi,
For Safaricom Mpesa you need only 2 walled garden hosts:

/ip hotspot walled-garden
add dst-host=*.digitaloceanspaces.com
add dst-host=*.powerlynx.app

I see that our logo is not displayed on our Payfast Payment gateway. Is there perhaps another line that must be entered into the walled garden to have this displayed?

Do you mean that you do not see the logo when you are redirected to Payfast to make a payment? On their page? If that’s the case, it seems that we need to detect the host where they store logos and other files.

In our situation, we store splash page logos in the Digital Ocean S3 service, and we need to allow this host *.digitaloceanspaces.com. I assume they have something similar.

Hi Mike

Yes, we are not able to see the logo when directed to Payfast to make a payment.

On this topic, from the Payfast Gateway, when wanting to make a payment via Samsung Pay and Scapscan (Continue Payment in App) do not work either.

Something to note is that the client needs to fill in the Credit Card details completely, every time they want to make a payment via “Credit & Cheque card”. Normally when I, for instance, make an online payment on a website, the Google Pay would automatically do an autofill. Is it possible to have the autofill also part of the walled garden?

There is a feature in Powerlynx called “Trial sessions” which we developed for cases where we can’t detect some Walled Garden hosts but still need the client to make a payment.

When a customer selects the “Pay with Payfast” button, Powerlynx creates a trial session on a router for the client and the client is authorized on a server. This allows them to access the internet for a specific period of time in order to make a payment. There is no need to configure Walled Garden hosts when using this feature, as it is automatically skipped. The customer will not be informed that they have free internet access for a certain period of time, as we do not want to provide this information :laughing:

After making a payment, the trial session will be replaced with a normal session based on the data plan settings. A CoA packet will be sent to the router to adjust the speed as well.

In my example (from the screenshot above), I allow my customers to have a trial session of 60 minutes to make a payment (although I believe 5-10 minutes will be sufficient). The speed will be 2mbps/1mbps, and after the session times out, customers will not be able to access this option again for the next 60 minutes (due to the blocking threshold setting).

Hi,

the walled garden does not work with HTTPS as it cannot see into the header. as a result the payment gateway(payfast) does not work. We have added the hosts to WALLED GARDEN IP list(but you cannot do regex expressions in IP list.

IIt redirects to payfast, the payment is processed, my bank account gets charged, but when it redirects back to the powerlynx URL it never goes beyond that point. The same as the other user complained previosly with stripe.

This is NOT a walled garden issue, this is a problem with HTTPS.

what is the solution?

Hi,

The Walled Garden is completely unreliable, so we are focusing on improving trial sessions. Have you tried it?

Hello, We are having issues with ABSA customers. They are unable to auth the payment via the internet banking. We have various hosts on walled garden pertaining to Absa but we still have complaints. Do you have any up to date additions? If not, will the trial session work ? What exactly triggers it to activate?

Hi @Fr0zon,

Short version: with ABSA this is almost certainly not a missing walled-garden host, and no host list can fix it. Let me explain why, then answer the trial-session question.

1. ABSA approves card payments with SureCheck — a push to the banking app

ABSA’s 3-D Secure step is SureCheck: the cardholder gets a push notification in the Absa Banking App and taps Approve. SMS OTP is only a fallback after three failed SureCheck attempts.

That splits the payment across two different network paths:

Path What it needs Can the walled garden cover it?
Browser → 3DS/ACS page the ACS hostname + its assets Yes, in principle
Phone → APNs/FCM push → Absa app non-HTTP ports, rotating IPs No — structurally

The MikroTik hotspot walled garden dst-host table handles HTTP and HTTPS only. Apple’s APNs needs a persistent TLS connection on TCP 5223, FCM needs TCP 5228–5230, and both Apple and Google explicitly tell you not to allowlist their IP ranges because they rotate. So if the guest’s phone is on your hotspot while unauthenticated, the approval push may simply never arrive — and there is no line you can add to fix that.

The test that settles it in two minutes, with no config change: have the guest pay with the phone on mobile data (WiFi off on the phone), while the browsing device stays on the hotspot. If the payment then goes through, the push path was the problem.

2. Why “the host is in my list and it still fails” happens

Worth knowing, because it explains a lot of the inconsistency people see:

  • The walled garden matches off the router’s DNS cache, not TLS SNI. RouterOS watches the unauthenticated client’s own DNS lookups and permits the resolved IPs. So if the device uses DoH / DoT / Android Private DNS — now the default in Chrome, Firefox and iOS — the router never sees the lookup, never caches the IP, and the host stays blocked no matter what is in your list. That is also why it works on one phone and not the next.
  • dst-host takes a domain only. A URL path inside dst-host (e.g. 3ds.capitecbank.co.za/acs/) can never match — path is a separate parameter.
  • Never pin IPs for Azure/AWS/Cloudflare-fronted hosts; use host wildcards.

3. Host-list hygiene — dead lines to drop, lines worth adding

These are dead today (all NXDOMAIN as of this week, or unmatchable syntax), so they can go:

/ip hotspot walled-garden
remove [find dst-host="acsabsa.dnslb.bankserv.co.za"]
remove [find dst-host="3dsbrowser.capitecbank.co.za"]
remove [find dst-host="3dsbrowser.capitecbank.*"]
remove [find dst-host="3dsbrowser.capitecbank.co.za/"]
remove [find dst-host="3ds.capitecbank.co.za/acs/"]
remove [find dst-host="authentication.cardinalcommerce.com/ThreeDSecure/"]
remove [find dst-host="t.clarity.ms/collect"]
remove [find dst-host="connect.facebook.net/en_US/fbevents.js"]

ABSA’s current ACS hostname could not be identified from public DNS — acsabsa.dnslb.bankserv.co.za is gone, while its siblings in the same zone are still live. Don’t guess a replacement; the broad *absa* and *bankserv* entries already cover far more than a single hostname would.

And these are the additions actually worth having:

/ip hotspot walled-garden
add dst-host=*capitec*
add dst-host=authentication.cardinalcommerce.com
add dst-host=acs-challenge.apata.io
add dst-host=acs21.nedsecure.co.za
add dst-host=*.americanexpress.com

Note *capitec* rather than *.capitec.* — the latter does not match 3ds.capitecbank.co.za, which is live. The same logic is why *absa* is the right shape for a bank estate: it even catches the lb-absa.co.za apex.

One more thing while we’re in this topic: you can drop *.digitaloceanspaces.com from your list. It is still in our older posts and docs, but Powerlynx no longer stores splash-page assets there — *.powerlynx.app plus the CDN entries you already have cover it. We’re cleaning that up in the documentation.

To be straight with you: the above is hygiene, not the fix. If SureCheck is the blocker, a tidier list will not change the outcome.

4. Trial sessions — what triggers them, and one important caveat

What triggers a trial session: it fires the moment the guest presses “Pay with <gateway>” on the splash page. Not on association — there is no button for the guest, and they are never told they have free access. It only happens for a paid plan going out to a gateway (a zero-price plan issues a voucher directly), and only if you have added that location under Config → Captive portal → Trial sessions (the location list is empty by default, so nothing happens until you do).

Why it helps: a trial session authorises the device via RADIUS, and an authenticated hotspot user bypasses the walled garden entirely. So arbitrary bank / 3DS / ACS hosts become reachable, DoH or not, without you having to guess a single hostname.

Defaults worth changing before you rely on it:

  • Session time: 5 minutes — often too short for a bank 3DS journey. Raise it.
  • 2 trial sessions in a row, then blocked for 60 minutes — past that quota the next pay-click silently gets no trial and falls straight back to walled-garden-only. This is the usual cause of “it worked for me twice and then stopped”.
  • Speeds default to 2 Mbps / 1 Mbps, no data cap.

Use this as a test, not just as a workaround. Because a trial session removes the walled garden from the equation entirely, it makes a very clean A/B — and the cleanest way to run it is on an iPhone or iPad (see the caveat below for why not Android):

  1. Enable trial sessions for the location, raise the session time to 15 minutes.
  2. Have someone attempt the ABSA payment on an iOS device, with the phone receiving the SureCheck push on the hotspot.
  3. If the payment now completes → the walled garden was the blocker, and we should work out which host was missing.
  4. If it still fails on iOS with a trial session active → the walled garden is ruled out, and the SureCheck push path is your problem. That is the outcome I would expect.

Either way you learn something definite, and step 4 saves you from chasing hostnames for weeks.

The caveat, and please read it before rolling this out: trial sessions break the checkout on Android 11 and newer. Authorising the device makes Android mark the network as validated, and the system captive-portal window (the CNA WebView) auto-closes the instant that happens — taking the payment page with it, mid-checkout. iOS keeps the window open and is unaffected, which makes the whole thing look intermittent rather than broken. If your guests are mostly Android, this will hurt more than it helps; a workaround there is to get the guest into a normal browser rather than the captive-portal popup.

What would help us dig further

If you can, a short video of one failed attempt would tell us a lot:

  1. does the ABSA page reach “waiting for approval”?
  2. does the push ever land on the phone — and is that phone connected to the hotspot at the time?
  3. what does the browser show at the moment it fails?

Also handy: your RouterOS version, and whether the guest devices have Private DNS / DoH enabled.

Please send that to support@powerlynx.app rather than posting it here — a checkout recording can catch card details or personal data on screen, and a ticket also lets us look at your tenant and NAS configuration directly. Feel free to reference this thread in the email, and we’ll keep the general findings public here so others hitting the same ABSA wall benefit from them.