Skip to main content

How to Set Up a Captive Portal on Starlink: A Guide for Maritime, Transport, and Remote Sites

This technical guide explains how to bypass Starlink's native CGNAT limitations to deploy a secure, GDPR-compliant captive portal for guest WiFi. It covers network architecture, VLAN segmentation, and cloud RADIUS integration for maritime, transport, and remote enterprise sites.

📖 5 min read📝 1,197 words🔧 2 worked examples3 practice questions📚 8 key definitions

Listen to this guide

View podcast transcript
How to Set Up a Captive Portal on Starlink: A Guide for Maritime, Transport, and Remote Sites [INTRODUCTION - approx 1 minute] Right. So you've got Starlink. You've got the dish on the roof of your ferry terminal, or bolted to the mast of a vessel, or pointed skyward from a remote construction camp. The internet is working. Brilliant. But here's the problem nobody warned you about: Starlink, out of the box, gives you a pipe. Just a pipe. No authentication. No branding. No GDPR-compliant consent capture. No way to know who's on your network, how much bandwidth they're burning, or whether you're even legally covered under data protection law. That's the gap this episode fills. I'm going to walk you through exactly how to layer a proper enterprise captive portal on top of Starlink - covering the architecture, the CGNAT problem you'll hit immediately, VLAN segmentation for maritime and remote sites, and how platforms like Purple integrate into this stack. Whether you're running a ferry route, a remote hotel, a motorway services site, or a construction camp, this is the same fundamental problem, and the solution is the same. Let's get into it. [TECHNICAL DEEP-DIVE - approx 5 minutes] First, let's understand what Starlink actually gives you at the network layer. Starlink delivers connectivity via low-Earth orbit satellites. The dish connects to a router - either the native Starlink router or, in the Business and Maritime tiers, an ethernet adapter that lets you plug in your own hardware. The key technical constraint you need to understand immediately is CGNAT - Carrier-Grade Network Address Translation. On standard Starlink plans, you're behind a shared public IP. You don't get a dedicated public IP address, and you cannot accept inbound connections. That's not a bug - it's how Starlink manages IP address space across millions of subscribers. Why does CGNAT matter for captive portals? Because traditional captive portal architectures often rely on inbound connections - for RADIUS authentication callbacks, for management access, for portal redirect logic. If your captive portal system requires a static public IP or inbound port forwarding, it will not work reliably behind Starlink's CGNAT. Full stop. The solution is a cloud-native RADIUS architecture. Instead of your on-site controller trying to receive inbound authentication requests, the authentication flow goes outbound - from your on-site hardware to a cloud RADIUS server. Purple's platform does exactly this. The controller on site initiates an outbound connection to Purple's cloud RADIUS infrastructure. The splash page is hosted in the cloud. The authentication exchange completes via that outbound tunnel. CGNAT is irrelevant because you never need an inbound connection. Now, the second thing you need to do is bypass the native Starlink router. The Starlink router is a consumer-grade device. It has no VLAN support, no captive portal functionality, no per-user bandwidth controls, and no integration points for enterprise authentication systems. You need to put it into bypass mode - or use the ethernet adapter on Business and Performance hardware - and replace it with a managed enterprise router. The platforms we work with most commonly in this context are Cisco Meraki, HPE Aruba, Ruckus, Juniper Mist, and Ubiquiti UniFi. All of them support VLAN tagging, RADIUS integration, and the walled garden configuration that captive portals require. Let me walk through the VLAN architecture you should implement. On a maritime vessel, you typically need at minimum three VLANs. VLAN 10 for guest or passenger WiFi - this is where the captive portal sits. VLAN 20 for crew or staff - typically on a separate SSID with different authentication. VLAN 30 for operations, navigation systems, or IoT devices - completely isolated from the other two, with strict firewall rules preventing any lateral movement. On a remote construction camp or transport hub, the same logic applies: guest access, staff access, and operational systems should never share a broadcast domain. The captive portal flow itself works like this. A passenger or guest connects to the open SSID on VLAN 10. Their device's Captive Network Assistant - the CNA - detects that internet access is blocked. On iOS, a pop-up appears. On Android, a notification fires. On Windows, a browser window opens. All of these redirect to Purple's splash page, hosted in the cloud. The visitor completes the login journey - email registration, social login, or a voucher code - and consents to your terms. Purple's splash page server sends a one-time authentication token back to the on-site controller. The controller forwards this to Purple's cloud RADIUS server. RADIUS returns an Access Accept. The controller removes the captive portal restriction for that device's MAC address. The visitor is online. The walled garden is a critical configuration step. Before authentication completes, the only domains the device can reach are those required for the portal to load - Purple's splash page infrastructure, any social login endpoints, and the CNA detection URLs that operating systems use. Everything else is blocked. You configure this walled garden in your enterprise router or wireless controller. Purple provides the specific domain list you need to whitelist - refer to the support documentation at support.purple.ai for the current list. One more thing on the technical side: SSL certificates. If you're using a Cisco WLC, there's a known issue where the web authentication redirect lands on an HTTP URL, not HTTPS. Modern browsers throw a security warning. The fix is to install a publicly trusted SSL certificate on the WLC and configure the virtual hostname to match the certificate's Common Name. Purple has a dedicated support article on this for Cisco Catalyst 9800 series controllers - I'll link it in the show notes. [IMPLEMENTATION RECOMMENDATIONS AND PITFALLS - approx 2 minutes] Let me give you the three things that most commonly go wrong in Starlink captive portal deployments. Number one: not accounting for CGNAT on day one. Teams order the hardware, configure everything on the bench, test it on a standard broadband connection, and it works perfectly. Then they deploy it behind Starlink and authentication breaks. The fix is to choose a cloud RADIUS provider - like Purple - before you start, and confirm that your chosen platform uses outbound-only authentication flows. Do not assume any captive portal platform handles CGNAT gracefully. Ask the question explicitly. Number two: flat network design. I see this constantly on vessels and remote sites. The Starlink goes in, someone plugs a consumer WiFi router into it, and suddenly crew, guests, navigation systems, and CCTV cameras are all on the same subnet. One compromised crew device can reach operational systems. One guest streaming 4K video saturates the link for everyone. VLAN segmentation is not optional on a shared satellite connection. It is the difference between a managed network and a liability. Number three: forgetting about the CNA on macOS. Apple's macOS does not allow cookies in the CNA browser session. Purple's captive portal requires a session cookie to maintain the login journey. On macOS laptops, the CNA pop-up will redirect visitors to neverssl.com - a plain HTTP site that triggers the redirect correctly without SSL interference. Make sure your support staff know this, and consider adding a note to your splash page for laptop users. On the hardware side: for maritime deployments, use the Starlink Performance kit - the aluminium-encased unit designed for harsh environments. It's rated for 10-year survivability and operates on both AC and DC power. For remote land sites, the standard Business kit is usually sufficient, but plan for a UPS if power stability is a concern. [RAPID-FIRE Q AND A - approx 1 minute] Quick questions I get asked all the time. Can I use the native Starlink router for a captive portal? No. It has no VLAN support and no RADIUS integration. Bypass it. Do I need a static IP for Purple's captive portal to work? No. Purple's cloud RADIUS architecture works behind CGNAT. No static IP required. What happens when Starlink goes offline mid-session? Authenticated sessions typically persist until the session timeout expires. New authentications will queue until connectivity restores. Configure your session timeout to match your expected outage window. Is this GDPR compliant? Yes, when configured correctly. Purple captures conscious-choice opt-ins with explicit consent at the splash page. Data is processed in line with GDPR and Purple holds ISO 27001 certification. Can I run multiple sites from one dashboard? Yes. Purple's platform manages 80,000 plus live venues from a single pane of glass. Remote sites, vessels, and transport hubs all appear in the same management interface. [SUMMARY AND NEXT STEPS - approx 1 minute] Right, let's wrap up. The core message is this: Starlink solves the connectivity problem at remote and maritime sites. It does not solve the access control, compliance, or analytics problem. You need an enterprise layer on top. The three things to do this week: first, confirm your Starlink hardware tier and whether you have ethernet adapter access for bypass mode. Second, select an enterprise WiFi controller from the supported hardware list - Cisco Meraki, HPE Aruba, Ruckus, Juniper Mist, or Ubiquiti UniFi are all solid choices. Third, talk to Purple about the Connect plan - it's the starting point for captive portal deployment and includes cloud RADIUS, the splash page editor, and GDPR-compliant consent capture. The full written guide with architecture diagrams, worked examples, and configuration references is at purple.ai. If you're deploying in a maritime or transport context specifically, the guides section has a dedicated article on this exact setup. Thanks for listening. Next episode, we're covering RADIUS authentication configuration for multi-site enterprise networks - same audience, same depth. See you there.

header_image.png

Executive Summary

Starlink delivers high-speed satellite connectivity to remote locations, but its native consumer-grade router lacks the security, authentication, and compliance controls required for enterprise environments. For IT managers operating maritime vessels, remote construction camps, or transport hubs, deploying a captive portal on Starlink presents a specific technical challenge: Starlink operates behind Carrier-Grade Network Address Translation (CGNAT), which breaks traditional inbound RADIUS authentication flows.

This guide details how to bypass the native Starlink hardware and integrate a cloud-managed captive portal using enterprise routing equipment. By implementing outbound cloud RADIUS authentication and strict VLAN segmentation, network architects can deliver a secure, branded, and legally compliant Guest WiFi experience while isolating critical operational systems. Purple provides the identity management layer to capture first-party data and enforce bandwidth quotas, ensuring a single guest cannot saturate the satellite uplink.

Technical Deep-Dive

The CGNAT Constraint

Starlink manages its IPv4 address space using CGNAT. Your terminal shares a public IP address with other subscribers, meaning you cannot accept inbound connections or configure traditional port forwarding.

Traditional on-premise captive portal controllers often expect to receive inbound authentication callbacks from a RADIUS server. When deployed behind Starlink, these inbound packets drop at the CGNAT boundary, breaking the login flow.

The architectural solution is an outbound-only authentication model. Instead of the controller waiting for an inbound request, it initiates a secure outbound tunnel to a cloud-native RADIUS server. Purple's platform uses FreeRADIUS servers backed by cloud databases to handle this authentication [1]. The on-site controller passes the client details to Purple, which processes the login and returns an Access-Accept packet through the established outbound connection, entirely bypassing the CGNAT limitation.

architecture_overview.png

Bypassing the Native Hardware

The Starlink router provides a flat, unmanaged network. It does not support 802.1Q VLAN tagging, per-user bandwidth limits, or enterprise authentication.

To deploy a captive portal, you must remove the Starlink router from the routing path. On standard kits, this requires enabling bypass mode in the Starlink app and using the ethernet adapter. For maritime and enterprise deployments using the High Performance or Flat High Performance kits, you connect the Starlink power supply directly to the WAN port of an enterprise router.

Purple integrates with all major enterprise hardware vendors. The canonical hardware list for this architecture includes Cisco Meraki, HPE Aruba, Ruckus, Juniper Mist, and Ubiquiti UniFi. These platforms provide the necessary features to configure walled gardens, tag VLANs, and forward authentication requests to Purple's cloud RADIUS.

Walled Garden Configuration

Before a user authenticates, their device must be able to reach the captive portal infrastructure. This requires configuring a walled garden—a list of permitted domains accessible pre-authentication.

When a device connects to the open SSID, its embedded Captive Network Assistant (CNA) attempts to reach a predefined URL to check for internet access [1]. When this request is intercepted by the controller, the CNA launches a pseudo-browser to display the captive portal.

Your walled garden must allow access to Purple's splash page servers, static content delivery networks (Cloudfront), and any required social login endpoints (such as Google or Microsoft Entra ID). If these domains are blocked, the CNA cannot load the login page, and the user remains stranded offline.

Implementation Guide

1. Network Segmentation

Never deploy a flat network over a shared satellite link. You must isolate traffic using VLANs to protect operational integrity.

For a maritime vessel or remote site, implement a minimum of three VLANs:

  • VLAN 10 (Guest WiFi): The public-facing network where the captive portal resides. Apply strict per-user bandwidth quotas (e.g., 5 Mbps down / 1 Mbps up) to prevent link saturation.
  • VLAN 20 (Staff Network): A secure network for crew or employees, authenticated via WPA3-Enterprise or secure passphrases.
  • VLAN 30 (Operations/IoT): A highly restricted network for bridge navigation, SCADA systems, or point-of-sale terminals. Deny all inbound traffic from VLAN 10 and VLAN 20.

2. Controller Configuration

Configure your enterprise router to point to Purple's RADIUS servers.

  1. Set the primary and secondary RADIUS IP addresses provided in your Purple portal.
  2. Configure the shared RADIUS secret.
  3. Set the redirect URL to your custom Purple splash page.
  4. Input the walled garden domains required for the portal to load.

3. Handling SSL Certificates (Cisco Specific)

If you deploy Cisco Catalyst 9800 Series controllers, you may encounter an issue where the initial redirect uses HTTP (e.g., http://192.168.0.2/login.html ). Modern desktop browsers expect HTTPS and will display a "Your connection is not private" warning, degrading the user experience [2].

To resolve this, you must install a publicly trusted SSL/TLS certificate on the Cisco WLC. Ensure the Virtual IPv4 Hostname on the controller matches the Common Name (CN) specified in the certificate [2]. This secures the web authentication process and satisfies browser security requirements.

Best Practices

Mitigating macOS CNA Limitations

Apple's macOS restricts cookies within the CNA pop-up browser. Purple requires a temporary session cookie to maintain the login journey through the authentication flow [1].

When a macOS user connects, the CNA pop-up will recommend they open a full system browser (like Safari or Chrome) and navigate to neverssl.com [1]. This plain HTTP site triggers the controller's redirect cleanly without SSL interference, allowing the portal to set the required cookie and complete the login. Ensure your support staff understand this behavior to assist users.

Bandwidth Management

Starlink provides high bandwidth, but it is finite. A single user downloading a 50 GB game update can trigger throttling for the entire site.

Use your enterprise controller to enforce per-user speed limits. Purple's platform allows you to configure data quotas (e.g., 1 GB per day) and time limits. Once a user hits their quota, Purple revokes access via RADIUS CoA (Change of Authorization) or the user is prompted to purchase a premium tier.

comparison_chart.png

Troubleshooting & Risk Mitigation

The Portal Fails to Load

If the captive portal does not appear when a device connects:

  1. Check the Walled Garden: Ensure all Purple domains and social login endpoints are whitelisted. If a required script is blocked, the page will hang.
  2. Verify DNS: The client device must receive a valid DNS server via DHCP to resolve the walled garden domains.
  3. Test with HTTP: Open a browser and navigate to an HTTP site (like neverssl.com) to force the redirect.

Authentication Fails

If the user sees the portal but cannot get online after submitting their details:

  1. Check RADIUS Reachability: Ensure your enterprise router can reach Purple's RADIUS IPs over ports 1812 and 1813.
  2. Verify the Shared Secret: A mismatched RADIUS secret will cause the server to silently drop packets.
  3. Confirm Outbound NAT: Ensure the router is correctly translating the source IP of the RADIUS packets to the Starlink WAN IP.

ROI & Business Impact

Deploying an enterprise captive portal transforms Starlink from a raw internet pipe into a managed business asset.

For Hospitality and Transport operators, it provides the mechanism to capture first-party data. When 440 million logins occur across Purple's network annually, venues gain visibility into visitor demographics, dwell times, and repeat visit frequencies. This data feeds directly into marketing platforms to drive loyalty and revenue.

Furthermore, it ensures compliance. Providing open WiFi without capturing explicit consent exposes the organisation to data privacy risks. Purple's captive portal captures conscious-choice opt-ins, ensuring your network operations align with GDPR, CCPA, and ISO 27001 standards.

References

[1] Purple Support, "Captive Portal", https://support.purple.ai/hc/en-gb/articles/13856885831069-Captive-Portal [2] Purple Support, "Cisco WLC Captive Portal Certificate Setup", https://support.purple.ai/hc/en-gb/articles/31098410273693-Cisco-WLC-Captive-Portal-Certificate-Setup

Key Definitions

CGNAT (Carrier-Grade Network Address Translation)

A method used by ISPs to share a single public IP address among multiple customers.

Starlink uses CGNAT, which prevents IT teams from configuring port forwarding or accepting inbound connections to local controllers.

Captive Network Assistant (CNA)

A mini-browser embedded in operating systems (iOS, Android, Windows) that detects when internet access is blocked and automatically opens to display a login page.

The CNA is what triggers the pop-up on a guest's phone when they connect to the WiFi, driving them to the Purple splash page.

Walled Garden

A restricted network environment that allows access only to specific, approved web domains before a user authenticates.

IT teams must configure the walled garden to include Purple's servers and social login domains, otherwise the captive portal will fail to load.

RADIUS (Remote Authentication Dial-In User Service)

A networking protocol that provides centralized authentication, authorization, and accounting management.

Purple uses cloud-hosted FreeRADIUS servers to securely authenticate users after they complete the splash page journey.

VLAN (Virtual Local Area Network)

A logical subnetwork that groups a collection of devices, isolating their traffic from other devices on the same physical network.

Essential for maritime and remote deployments to separate untrusted guest traffic from critical operational systems.

Bypass Mode

A configuration setting that disables the routing and WiFi functions of a consumer router, turning it into a simple bridge.

Required on standard Starlink hardware to allow an enterprise router to manage the network and handle captive portal redirection.

Session Cookie

A small piece of data stored temporarily by a browser to remember state during a specific browsing session.

Purple requires a session cookie to maintain the login state. macOS CNA blocks these, requiring a redirect to an HTTP site like neverssl.com.

Change of Authorization (CoA)

A RADIUS extension that allows a server to dynamically modify the authorization attributes of an active session.

Used by Purple to instantly revoke network access or throttle speeds when a user exceeds their defined data quota.

Worked Examples

A 200-room remote eco-lodge installs Starlink to provide guest internet. Within three days, guests complain of slow speeds, and the operator notices the Starlink connection is throttled. How should the IT team resolve this?

The IT team must bypass the native Starlink router and install an enterprise controller (e.g., HPE Aruba or Ubiquiti UniFi). They configure two VLANs: one for staff and one for guests. On the guest VLAN, they deploy Purple's captive portal. They configure the controller to enforce a hard speed limit of 5 Mbps per user. Within the Purple portal, they set a daily data quota of 1 GB per device. When a guest hits the limit, they are disconnected to preserve bandwidth for others.

Examiner's Commentary: This approach directly addresses the root cause: uncontrolled bandwidth consumption. By moving to an enterprise controller, the venue gains the ability to shape traffic. Purple provides the policy enforcement layer, ensuring fair usage across all 200 rooms while capturing valuable guest data.

A maritime ferry operator deploys Starlink. They configure a captive portal using an on-premise RADIUS server located at their headquarters. The ferry's local controller attempts to authenticate guests by sending RADIUS requests back to HQ, but all logins fail. Why, and how is it fixed?

The logins fail because Starlink uses CGNAT, meaning the ferry does not have a dedicated public IP. If the HQ RADIUS server attempts to send packets back to the ferry, or if the architecture relies on inbound connections, the CGNAT boundary drops the traffic. The fix is to migrate to a cloud-native RADIUS architecture like Purple. The ferry's controller initiates an outbound connection to Purple's cloud RADIUS, bypassing the CGNAT restriction entirely.

Examiner's Commentary: This scenario highlights the most common architectural failure when deploying on satellite links. Understanding that CGNAT breaks inbound routing is critical. Shifting to an outbound-initiated cloud RADIUS model is the only reliable enterprise solution.

Practice Questions

Q1. You are deploying Starlink at a remote retail site. You have enabled bypass mode and connected a Cisco Meraki MX router. Users connect to the guest SSID, but the captive portal page never appears. The screen remains blank. What is the most likely configuration error?

Hint: Consider what domains the device needs to reach before authentication is complete.

View model answer

The walled garden configuration is incomplete or missing. Before authentication, the device must be able to reach Purple's splash page servers and any associated content delivery networks. If these domains are not whitelisted in the Meraki controller, the Captive Network Assistant cannot load the page.

Q2. A maritime IT director wants to use their existing on-premise RADIUS server located at their London headquarters to authenticate crew members on a vessel equipped with Starlink. Why will this architecture fail, and what is the recommended alternative?

Hint: Think about how Starlink handles public IP addresses and inbound routing.

View model answer

It will fail because Starlink uses CGNAT, meaning the vessel does not have a dedicated public IP and cannot accept inbound connections from the London HQ. The recommended alternative is a cloud-native RADIUS architecture, where the vessel's local controller initiates an outbound connection to a cloud RADIUS server, bypassing the CGNAT restriction.

Q3. A hotel operator reports that guests using Apple MacBooks are unable to complete the login process. The pop-up appears, but the session drops before authentication finishes. Windows and Android users are unaffected. How should the support team instruct the MacBook users?

Hint: Consider how macOS handles cookies within the Captive Network Assistant.

View model answer

macOS does not allow cookies within the CNA browser session, which Purple requires to maintain the login state. The support team should instruct MacBook users to open a full system browser (like Safari) and navigate to an HTTP site such as neverssl.com. This will cleanly trigger the redirect and allow the cookie to be set.