Setting up a network client on macOS involves more than dragging an app into Applications. The download source, processor architecture, system extensions, VPN configuration, subscription import, proxy mode, and DNS path can all affect the final result. A “Connected” status in the menu bar only confirms that the client completed a connection action; it does not prove that traffic from your browser, terminal, and other apps is using the intended route.

A reliable sequence is to confirm that the installer matches your device, understand what each permission prompt allows, import the subscription, choose the right traffic-capture mode, and then verify the exit IP, DNS, and routing results separately. When something goes wrong, trace the same chain backward instead of repeatedly reinstalling the client or switching nodes at random.

Confirm the client, architecture, and download source

macOS clients are commonly distributed as disk images, installer packages, or compressed archives. A disk image usually requires dragging the app icon into Applications; an installer package follows the system installation flow; a compressed archive must be extracted before the app is moved. Whichever format you use, obtain the file from the provider dashboard, the project’s official release page, or the client’s built-in update channel.

Mac devices may use Apple silicon or an Intel processor. If the release page provides separate builds, download the one that matches your Mac; a build labeled Universal usually includes both architectures. With an architecture mismatch, the app may fail to open or may rely on a compatibility layer. Check the chip or processor information in “About This Mac” and compare it with the label on the download page.

What to check Details to verify What a mismatch looks like
File source Provider dashboard, official client release page, or in-app update entry macOS cannot verify the developer, or the app behaves differently from the official documentation
Processor architecture Apple silicon, Intel, or Universal label The app will not launch, quits unexpectedly, or asks for an additional compatibility environment
Installation format The installation method for a disk image, installer package, or compressed archive The app is still running from Downloads, making updates and permission states easy to confuse
System compatibility The minimum system requirements and known limitations listed in the release notes The network extension cannot load, or the settings path differs from the guide

If macOS explicitly blocks an app from an unidentified source, do not disable system security controls to get around it. First verify the download URL, developer details, and release notes; if the source cannot be confirmed, download the file again from a trusted entry point. The system’s “Open” confirmation is appropriate for a first-launch prompt from a known developer, not a universal solution for every warning.

Installation takeaway: Being able to open the app only means the program itself runs. Traffic capture depends on subsequent system extensions, VPN configuration, or proxy settings, so installation alone does not prove that the route is active.

Understand system extensions and network permission prompts

When a client first enables the system proxy, TUN, or VPN traffic capture, macOS may request administrator authorization or show prompts such as “Add VPN Configuration,” “Allow Network Extensions,” or filter-related notices. The wording varies by macOS version and client implementation, but the purpose is similar: to let the app establish a system-managed network path.

“Add VPN Configuration” does not mean the app can read all your private files. It allows the client to create a system-approved network configuration and send eligible traffic through the relevant network extension. Administrator authentication approves this system-level change. You can later review the status under Network, VPN, and filter-related sections in System Settings, or remove the configuration from within the client.

Some clients use the Network Extension framework to implement TUN, while others mainly modify the system proxy; some let you switch between both. If macOS says an extension was blocked, keep the client open and check Privacy & Security for pending approvals. After approving it, return to the client and enable the connection again. Restart only when the app explicitly asks you to.

System proxy vs. TUN

A system proxy writes HTTP, HTTPS, or SOCKS proxy settings to macOS. Browsers and apps that follow the system proxy hand their requests to the client, but apps with their own network stack, apps that ignore system proxy settings, or apps using special transport methods may bypass it. This mode makes fewer changes and is useful for first checking web access and basic routing.

TUN mode creates a virtual network interface. The client receives a broader range of IP traffic and then uses rules to decide whether to proxy, connect directly, or block it. It is generally better for terminal tools, development environments, and apps that do not read system proxy settings, but it is also more likely to conflict with other VPNs, filters, security software, or enterprise network extensions.

Traffic-capture method Primary coverage Common limitations Useful troubleshooting scenario
System proxy Apps that read macOS proxy settings Some terminal programs and standalone network stacks may not follow it First confirm that the browser and basic rules work
TUN Traffic routed through the virtual interface and handled by rules May conflict with other network extensions or filters The browser works but other apps do not
Manual proxy A selected app with a separately configured proxy address Configuration is scattered, so app states may differ Isolate and test one app’s proxy support

Import the subscription and identify protocol and route fields

After configuring permissions, copy the subscription URL from the provider dashboard and import it through the client’s “Subscription,” “Configuration,” “Remote Configuration,” or “Profiles” section. Button names vary, but the basic action is the same: save the remote URL, download the configuration, and parse the nodes. If the client supports clipboard import, make sure the clipboard contains only the complete URL, with no leading or trailing spaces, line breaks, or punctuation added by a chat app.

After a successful import, run an update once and check that nodes, policy groups, and rules appear. If you see a subscription name but no selectable routes, the download may have failed, the format may be incompatible, or the remote content may not have been parsed correctly. Check the client log for HTTP status codes, parse errors, and configuration-field warnings instead of pasting the same URL repeatedly.

  1. Copy the currently valid subscription URL from your account dashboard; do not open or forward it on a public page.
  2. Open the client’s subscription or remote-configuration section, paste the URL, and save it.
  3. Update the configuration manually and wait for nodes, policy groups, and routing rules to finish loading.
  4. Choose the policy group that matches the task, then select a specific exit route.
  5. Enable the system proxy or TUN, and confirm that the menu-bar status matches the network configuration in System Settings.
  6. After verifying the exit IP, DNS, and per-app behavior, enable automatic updates or launch at login.

Shadowsocks, VMess, Trojan, VLESS, Hysteria2, and TUIC

These names identify different proxy protocols or transport schemes, not quality tiers. Shadowsocks forwards traffic through an encrypted proxy and usually includes a server, port, encryption method, and credentials. VMess and VLESS are often handled by compatible cores and can be combined with different transport and TLS settings. Trojan commonly carries a proxy connection behind a TLS-like appearance. Hysteria2 and TUIC use QUIC-oriented transport designs, each with its own client-core and network requirements.

Do not manually rewrite ports, transport settings, security parameters, or server names in a subscription based on the protocol name alone. Whether a protocol works depends on complete field support in the client core and on a matching server configuration. Supporting a subscription format does not mean the client supports every protocol inside it. If the import produces “Unknown type” or field-parsing errors, use a client build that supports the protocol or a compatible subscription format provided by the service.

Direct, relayed, and IEPL routes

A direct route connects the client straight to the target node entry point. The path is simpler, but performance depends more on cross-network conditions between the local carrier and the entry point. A relayed route connects to an intermediate node first and then moves to the exit, allowing the provider to adjust part of the path. IEPL is a dedicated-access model for international connectivity; routing and the exit are still handled by the server side.

For macOS clients, these differences are usually encoded in the node configuration. The client connects to the specified entry point; enabling TUN does not turn an ordinary direct route into a dedicated route. Choose routes based on the labels in the subscription, the target region, and the task at hand—not on the protocol name.

Choose Global, Rule, or Direct mode

Common clients offer Global, Rule, and Direct modes. Global mode sends all traffic already captured by the client through the proxy policy and is useful for briefly ruling out rule-matching issues. Rule mode uses domains, IPs, processes, or rule sets to decide between proxying and direct access and is more common for daily use. Direct mode lets captured traffic access destinations directly and is useful for restoring local access or determining whether the proxy path causes an issue.

“Global” only describes how the client handles traffic it has already captured; it does not necessarily mean every connection on the device enters the client. If only the system proxy is enabled, apps that do not read it may still bypass the client. Conversely, after TUN captures traffic, Rule mode can still send local websites, LAN resources, or selected apps directly.

Pay attention to rule order. Specific domain rules should take effect before broad rules, while the final catch-all rule handles requests that match nothing above it. If the same domain appears in multiple rule sets, the client usually uses the first matching result in configuration order. After changing rules, reload the configuration and clear existing app connections so old connections do not continue using the previous path.

Verify the exit IP, DNS, and per-app behavior

Validate the connection from the network layer upward. First check whether the exit IP has changed to the selected region, then identify who resolves DNS requests, and finally test the browser, terminal, and the apps you actually plan to use. This separates an unestablished tunnel from partial app capture, an inconsistent DNS path, or restrictions imposed by the target service itself.

Check the exit IP

Use a trusted IP-check page before and after connecting to view the public exit. The result should match the selected node’s region, while accounting for browser cache, old tabs, and existing long-lived connections. Close and reopen the page, or make the request in a new private window. If the client log says the connection succeeded but the exit has not changed, first confirm that the system proxy or TUN is actually enabled, then check whether the browser uses a separate proxy or secure DNS feature.

Check for DNS leaks and the resolution path

A DNS leak generally means that application traffic goes through the proxy while domain lookups are still sent to an unexpected local resolver, separating the resolution path from the exit path. In system-proxy mode, an app may continue using system DNS. In TUN mode, the client can capture more DNS traffic, but the actual behavior still depends on configuration, rules, and the app’s own encrypted DNS settings.

Do not look only at the resolver’s name. Also confirm whether requests match the client’s DNS rules, whether results have been tampered with, and whether proxy domains resolve correctly before the tunnel is established. Browser-based secure DNS, enterprise network settings, and other network filters can all change the result. When paths conflict, first disable duplicate DNS handlers, then choose a system, remote, or rule-based resolution strategy according to the client documentation.

scutil --proxy
scutil --dns
scutil --nwi
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"

scutil --proxy shows the current system proxy status, scutil --dns helps inspect system resolver settings, and scutil --nwi provides additional network-interface information. These commands describe the system’s current configuration only; they cannot by themselves prove that a specific app follows it, so verify with client logs and real requests as well.

Test by application

A working browser does not mean that terminal tools, development tools, and desktop apps will also work. Browsers commonly follow the system proxy but may have their own proxy extensions; command-line programs may read environment variables or connect directly; apps using QUIC, built-in DNS, or long-lived connections may behave differently. Reconnect from the target app itself and check whether the client log shows its domain, destination IP, and policy.

Effective configuration: The exit region matches expectations, the DNS path is explainable, requests from the target app hit the correct rule, and local resources remain direct as intended. Only after all of these conditions are met should the configuration be considered fully active.

Common permission errors and troubleshooting order

Permission errors often come from leftover extensions, duplicate clients, or unsynchronized system state. The most effective approach is to change one variable at a time. Quit other network clients and filtering tools, confirm that the current app is in Applications, and check System Settings for old VPN configurations or network extensions. Do not keep clicking Allow while multiple clients are running; it becomes difficult to identify which app a prompt belongs to.

Authorization is requested again after approval

This often happens when the app copy has moved, an extension from an older version remains, or the client did not receive the administrator authentication needed to finish installation. Fully quit the app, delete any copy running from a disk image, and keep only the official copy in Applications. Then review VPN and filter status in System Settings, remove configurations clearly belonging to an inactive old client, and reopen the current client.

If System Settings says the extension is allowed but the client still reports that it is not loaded, disable and re-enable the relevant feature so the app can check its state again. Restart macOS only when the release notes explicitly require it. Deleting the app alone may not remove its network extension or VPN configuration; use the client’s uninstall or configuration-removal feature to clean them up.

The connection succeeds but webpages do not open

Switch to Direct mode first to confirm that the local network itself works. If Direct mode also fails, check the current Wi-Fi, enterprise network authentication, and system DNS instead of continuing to change nodes. If Direct works but the proxy does not, inspect the node handshake, subscription validity, protocol compatibility, and DNS logs. If only certain domains fail, check routing rules and resolution results rather than assuming the entire route is unavailable.

The browser works but the terminal does not

This usually means the browser reads the system proxy while the terminal program does not. Enable the client’s supported TUN mode for comparison, or configure the tool’s proxy environment according to its documentation. If the terminal works after TUN is enabled, the issue is the capture scope rather than the remote route. If it still fails, check whether the tool forces its own DNS, UDP, or network interface.

The connection is lost after sleep or wake

After waking, a Mac may switch network interfaces, obtain a new address, or restore an old connection. Disconnect and reconnect the client so routes, DNS, and the virtual interface load again. If the issue continues, check whether the client offers automatic reconnection and confirm that no other tool overwrites the system proxy after wake. If it happens frequently, save logs from before and after wake and compare interface and DNS changes.

Final checks before regular use

Once the configuration works, decide whether to enable launch at login, automatic subscription updates, and automatic reconnection after network changes. Automation should be built on a verified configuration; otherwise the system may repeatedly load broken rules or invalid extensions at startup. Subscription updates can also change node names and policy contents, so confirm afterward that existing policy groups still point to the intended routes.

Keeping essential troubleshooting records makes future diagnosis easier. Include the client version, macOS version, capture mode, selected policy, error time, and redacted log excerpts. Remove subscription URLs, authentication fields, server credentials, and personal paths before sharing logs. When reporting an issue, state which app, which mode, and which step failed; that is more useful than simply saying “cannot connect.”

If the device is managed by a school or company, a configuration profile may restrict VPNs, proxies, or network extensions. These restrictions generally cannot be overridden with ordinary administrator approval; follow the organization’s network policy. On a personal device, periodically remove proxy settings and network extensions left by disabled clients to prevent multiple network components from competing for the same route.