Mac VPN Setup from Scratch: macOS Install, Permissions and Verification Guide

The VPN client on macOS runs on a system extension, and installing, authorizing, importing a subscription, and verifying connectivity are four separate steps. If any one of them goes wrong, the only message you see is “can't connect.” This article walks through them in order and covers the common permission errors.

The hard part of using a VPN on a Mac isn't clicking Connect — it's the steps before it: the client has to install a system extension, macOS has to allow it under Privacy & Security, and a new VPN configuration appears in Network settings. Skip any of these, or have the system deny them, and the symptom is always the same “can't connect” — which beginners easily misread as a server fault and start switching nodes.

This guide splits the first-time VPN setup on macOS into five stages: preparation, installation, authorization, subscription import, and verification. Each step spells out which screen to open, what you'll see, and what to do next. The examples use the VPNWS macOS client; the same flow applies to other clients built on system extensions.

Prep Checklist: three things to confirm first

Before installing, spend two minutes on three things: chip type, macOS version, and whether this Mac has any leftover VPN configuration. The first two decide which installer you download and where the authorization prompt shows up; the third decides whether your first connection gets overridden by a stale profile.

  • ✅ Confirm your chip type: open the menu in the top-left corner → About This Mac, and check whether the Chip field says Apple silicon or Intel; then download the installer for that architecture.
  • ✅ Note your macOS version: newer releases moved extension management into General → Login Items & Extensions, while older ones keep it at the bottom of Privacy & Security. Knowing where to look in advance saves confusion later.
  • ✅ Make sure the admin password is available: installing a system extension and writing a VPN configuration both require administrator approval, and a guest account can't do it.
  • ✅ Check for leftover configurations: open System Settings → Network and delete any VPN entry with the same name before installing.
  • ❌ No email needed: signing up for this service takes only a username and password — no email address required, so there's no need to create a mailbox just to receive a verification message.

Install and First Launch: from download to menu bar icon

The macOS client ships as a .dmg disk image: double-click to mount it, then drag the app into Applications. Two things trip up newcomers here — running the app straight from the mounted image, and not knowing how to allow it after macOS blocks it.

  1. Open the client download page, choose macOS, and download the .dmg for your chip type.
  2. Double-click the .dmg and drag the app icon into Applications; eject the disk image before opening the app from Launchpad or Finder. Running it straight from the image points the system extension at a temporary mount point, which tends to break after a restart.
  3. If the first launch reports “cannot verify the developer,” go to System Settings → Privacy & Security, click Open Anyway at the bottom of the page, then reopen the app from Launchpad.
  4. Once launched, the app usually doesn't sit in the Dock — it lives in the menu bar at the top-right of the screen. Click the menu bar icon to see the connection toggle, the current server, and latency.
  5. Don't rush to click Connect here — the first connection triggers the system extension authorization, which we'll handle separately in the next step.

Since macOS 10.15, the system no longer loads third-party kernel extensions, and VPN clients use the Network Extension framework instead. That's why Settings shows “System Extension” rather than the “Kernel Extension” of older tutorials — the two live in different places and are authorized in completely different ways, so following an old guide will leave you hunting for a button that isn't there.

System Extension and Network Permissions

This is the only step in the whole flow that needs the administrator password, and it's where people get stuck most often. macOS is designed so that an extension must be allowed by the system before it can load; until it is, the client looks perfectly normal, but clicking Connect does nothing and no clear error appears.

The first time you click Connect, macOS shows an authorization dialog asking for your login password or Touch ID confirmation. After you confirm, the system usually asks for a restart — the network extension has to be loaded by the system's network daemon, and it won't take effect otherwise. Once you're back, System Settings → Network should show a new VPN configuration, and the VPN toggle in the menu bar can connect and disconnect directly.

If no dialog appears, or it flashes by: open System Settings → Privacy & Security, where blocked extensions are listed at the bottom of the page. Click Allow and enter your password again. From macOS 15 on, the network extension switch moved to General → Login Items & Extensions, which has a dedicated section for managing network extensions — make sure it's turned on.

Still can't connect after authorizing? Check in this order

  • Confirm you really did restart: without a restart after authorizing the extension, the system silently drops connection requests and the status stays on “Connecting.”
  • Confirm there's only one VPN configuration: when an old and a new profile share a name, macOS may connect to an extension that no longer exists.
  • Confirm this Mac isn't restricted by a configuration profile: on devices managed by an employer or school, extension installation can be blocked outright by policy.
  • Try a different server: if the status reaches “Connected” but drops shortly after, the problem is more likely on the network side than the permissions side.

Bottom line: most “can't connect” reports on macOS aren't a server problem — the extension was never allowed, or it was allowed without a restart.

Clear these two steps first, and troubleshooting servers or protocols afterwards takes far less time.

Subscription Import: getting servers into the client

With the client installed and permissions granted, the next step is telling it which servers are available. That's what the subscription link does: it already contains the server addresses, ports, and protocol parameters (commonly VLESS, Trojan, Hysteria2, and others). Import it and the client fetches the server list automatically — you don't fill in a single field by hand.

Import methodHow to do itBest for
Clipboard importCopy the subscription link and choose “Import from clipboard” in the clientThe usual choice on desktop; avoids typos
Manual pastePaste the link into the client's subscription field and save to fetchWhen the clipboard is held by another app, or the pasted text gets truncated
QR code importScan the QR code shown in your user panel with the clientImporting the same account on an iPhone or iPad

After a successful import, servers are grouped by region, and switching is just a click on a node in the list — no re-import needed. This service currently covers 120+ countries and 220+ servers; the full regional breakdown is on the servers page. When servers are added or removed, click “Update subscription” once in the client to sync — no reinstall required.

A subscription link is as good as your account credentials — it carries your token. Don't post it in public groups or forums, and don't screenshot it together with the link: whoever gets it can spend your traffic allowance. To use another device, sign in to your own account and copy a fresh link.

Verify It Works: four checks and the expected results

A “Connected” status doesn't mean traffic is actually going through the server. On macOS, verification comes down to four points: exit IP, DNS resolution, routing behavior, and disconnect behavior. The first two take one terminal command each; the last two you can confirm with a single side-by-side visit.

CheckHow to check on a MacExpected result
Exit IPRun curl ifconfig.me in TerminalIt returns an IP in the server's location, not the one assigned by your local ISP
DNS resolutionRun scutil --dns | grep nameserver in TerminalThe first resolver in the list is not your ISP's default DNS
Routing behaviorOpen a site hosted in mainland China and one hosted overseas, and compare load timesThe China site connects directly and loads normally; the overseas site goes through the server and loads reliably
Disconnect behaviorDisconnect in the client, then refresh the page you just openedIt either falls back to a direct connection or clearly fails to load — not a state where you assume traffic is still routed

DNS is the easiest of the four to overlook. If resolution requests still go to your local ISP, two things follow: the domains you visit are visible to the local network, and CDNs place content nodes closer to the resolver rather than to you — which shows up as “connected but slow.” So when verifying, always check the first nameserver in the scutil --dns output; it should point to the server side, not to your home router's address.

Options like a kill switch can wait until later. Their job is to block traffic when the connection drops unexpectedly, so you don't fall back to a direct connection without noticing. But leaving it on during first-time setup means that if the extension fails to load, you'll see “no internet at all,” which makes it harder to tell which step went wrong.

Routing Rules: which traffic goes through the server and which goes direct

Routing rules decide which traffic goes through the server and which connects directly. The macOS client usually offers three modes: Global (everything through the server), Rule (decide by list), and Direct (nothing through). Rule mode is the easiest for daily use: mainland China sites and your local network go direct, overseas sites go through the server — it saves data and is faster.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      { "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" },
      { "type": "field", "ip": ["geoip:cn"], "outboundTag": "direct" },
      { "type": "field", "network": "tcp,udp", "outboundTag": "proxy" }
    ]
  }
}

The rules above match in order and stop at the first hit: the first two send traffic matching the mainland China domain list (geosite:cn) and IP list (geoip:cn) to the direct outbound, and the last sends all remaining TCP/UDP traffic to the server outbound. The order can't be reversed — put the last rule at the top and everything gets pushed through the server, which makes China sites noticeably slower and burns through data faster.

Once the rules are active, double-check two things

  • Keep DNS and rules consistent: if domains go direct but DNS queries are sent overseas, China sites resolve to overseas nodes and end up slower than before.
  • Exclude local network addresses: printers, NAS devices, and corporate intranet addresses should stay direct, not get swept into the server by a rule.

Common Error Fixes

The table below covers the five most common messages on macOS. In most cases the cause isn't the client itself but system permissions or leftover configuration.

SymptomLikely causeFix
“System extension blocked” messageAllow wasn't clicked in Privacy & SecurityClick Allow at the bottom of the page, enter the admin password, and restart when prompted
Clicking Connect spins forever, then returns to “Not connected”The extension was allowed but the Mac wasn't restarted, or an old VPN configuration is still presentRestart once; then delete the leftover configuration under System Settings → Network and reconnect
Shows Connected, but the browser can't open pagesDNS didn't switch along with it, or a routing rule sent the traffic directCheck the first nameserver with scutil --dns; switch to Global mode temporarily — if it works, it's a rule problem
The browser works, but terminal commands don't go through the serverThe client runs in system proxy mode, so only apps that honor the system proxy are routedSwitch to TUN / enhanced mode (global routing) and reconnect; command-line tools will then be captured
Stops working after closing the lid and waking the MacThe network extension fails to renegotiate on wake, while the status still reads “Connected”Disconnect and reconnect manually; enable an option such as auto-reconnect after wake in the client

If your case isn't in the table, do a clean-slate pass first: disconnect → delete the VPN configuration under System Settings → Network → restart → authorize once more. Extension state on macOS occasionally lingers, and clearing it is faster than guessing at causes one by one.

Wrapping Up: Launch at Login, Menu Bar, and On-Demand Connection

Once the flow works end to end, a few more settings make daily use on a Mac smoother.

  • Launch at login: from macOS 13 on, add the client to Open at Login under System Settings → General → Login Items. Don't enable it in both places — turning on the client's own startup option as well can leave you with two menu bar icons.
  • Menu bar resident: connect, disconnect, and switch servers all from the menu bar, without opening the main window each time.
  • On-demand connection: the VPN configuration supports on-demand rules, such as connecting automatically when you join a particular Wi-Fi network. Spend a few days in manual mode first and turn it on once the servers prove stable — otherwise network switches can trigger repeated reconnects.
  • Multiple devices: one account allows unlimited simultaneous connections, so a Mac and an iPhone can be online at the same time without switching back and forth.

Payment supports Alipay, WeChat Pay, and USDT; prices and data packs are on the plans page, and refunds are available within 30 days, no questions asked.

  • 120+ Countries / regions covered
  • 220+ Servers to switch between
  • Unlimited Simultaneous devices
  • 30 days No-questions-asked refund

Summary: with a first-time setup on a Mac, order matters more than tricks — grant permissions, import the subscription, then verify the exit.

Once all three are done, switching servers or adjusting routing is just a matter of menu clicks.

VPNWS

120+ countries / 220+ servers, unlimited simultaneous devices, and a 30-day no-questions-asked refund. Sign-up takes only a username and password — no email address required.

Start Free Trial