V2Ray Setup Guide
for All Platforms
v2rayN desktop installation, Android client setup, subscription management and routing troubleshooting.
For your first connection, follow the Quick Start Guide to import a configuration, select it and verify the connection. Use this page as a reference: follow the section for your operating system to handle installation and permissions, then find help for subscriptions, routing and specific issues. v2rayN is the recommended desktop client; v2rayNG is the primary Android option, with v2flyNG as an alternative using the V2Fly core.
Before you begin: system, architecture and configuration sources
Know what you’re installing and what the client does
V2Ray is a technology name within the proxy ecosystem, not a specific graphical app. A client stores server details, updates subscriptions, generates configuration and launches a core; the core handles protocol communication, inbound listeners and routing. v2rayN is for Windows, macOS and Linux desktops, while v2rayNG and v2flyNG are for Android. Choose your platform first, then the package. You can’t run a desktop app on a phone just by extracting it, and Android app settings aren’t a guide to the desktop interface.
Before installing, note your operating system, processor architecture and intended package format. On Windows, find System type under Settings → System → About; on macOS, check the chip under About This Mac. On Linux, use the commands below to identify the architecture and distribution. On Android, check the device specifications or the architecture reported by an installed app. The architecture supported by your operating system matters more than the processor’s marketing name, especially on older devices or those using a compatibility layer. Choose from the packages available on the download page rather than guessing from a filename.
uname -m
cat /etc/os-release
On Linux, x86_64 usually means x64, while aarch64 usually means arm64. Distribution information helps you choose deb or rpm; it doesn’t identify the processor architecture. On macOS, Apple Silicon uses arm64 and Intel uses x64. An Android arm64 package only works on systems that support that app architecture. If you’re unsure, read the Android download notes before trying the universal version.
Get connection details ready to import
Installing a client won’t automatically give you a working server. Get a single share link or subscription URL from a trusted configuration provider, and make sure it’s still valid. A share link describes one configuration; a subscription URL fetches a set of configurations. They aren’t interchangeable in the import fields. Subscription URLs may contain access credentials, so treat them as sensitive. Don’t include the full URL, user ID or authentication fields in screenshots, logs or support requests.
If your provider offers several protocols or transport options, start with one that’s supported by your client’s core and clearly documented. A connection depends on the address, port, protocol, authentication, TLS settings and transport parameters—not just the server hostname. Being able to open a domain in a browser doesn’t prove that a proxy configuration is correct. For a first test, use a clearly documented single configuration before adding a subscription. This makes it easier to tell subscription-fetch problems from connection problems.
Record your baseline and change one thing at a time
Before installing, note any existing proxy apps, system proxy settings, network interfaces and virtual networking tools. For the first test, run only one client to avoid competing for system proxy settings, listening ports or the default route. Security policies on company devices, managed network rules and local firewalls may restrict virtual interfaces or background listeners. Check what permissions you have; disabling all security protections isn’t an installation step.
| Item | What to record | Why it matters |
|---|---|---|
| Platform and architecture | Operating system and x64 or arm64 | Choose a package that will run on your system |
| Configuration source | Share link or subscription URL | Use the correct import option |
| Existing proxy settings | Any manual proxy or automatic configuration script | Restore the original settings when finished |
| Local listener | Address and port shown in the client settings | Confirm that apps are using the client |
System time is also part of the connection setup. A clock that’s off can affect certificate validity checks and some authentication flows, so enable automatic time synchronization first. Keep a record of your original network settings and back up your configuration before making changes. Backups containing server credentials should be kept somewhere only you can access—not uploaded as public attachments. Once you’re ready, follow the section for your platform. You don’t need to enable system proxy and TUN at the same time.
Windows: Install v2rayN and configure the system proxy
Choose between the desktop and classic WPF editions
Open the Windows downloads section and start with v2rayN. The desktop edition uses a cross-platform UI framework; the classic WPF edition is for Windows. Their layouts and settings may differ. Check the download page’s system requirements and package notes—an app with the same name doesn’t necessarily have the same runtime dependencies. If this is a managed device, confirm that you’re allowed to install software and change proxy settings.
Handle the download according to its actual package type. For an installer, follow the prompts to choose a destination. For an archive, extract all files to a writable folder and launch the app from there; don’t run it from the archive preview. If you put the app in a temporary download cache or a folder that’s cleaned automatically, its configuration, logs or bundled core may be removed. If the app reports a missing runtime, install the dependency required by that package rather than repeatedly swapping unrelated core files.
On first launch, check that the main window loads fully, settings can be saved and the configuration is still there after restarting. A standard system proxy usually doesn’t require running as administrator; start with a normal user account. If the firewall prompts you, verify which app is making the request and which network it applies to. A local proxy is generally for apps on this computer; a browser test doesn’t require opening access to every device on the network. If the system blocks the app, read the reason instead of dismissing every security warning.
Import a subscription and choose a configuration
For a single share link, copy it and use an option such as “Import from clipboard.” Add a subscription URL in the subscription group settings: create a group, enter the URL, save it and then update. Button labels may change between versions, but the sequence is the same: save the URL, fetch the list, then select a configuration to use. Seeing entries in the list only confirms that the import worked; it doesn’t mean the core is running or that a server is reachable.
After updating, check that the configuration’s group, protocol and transport settings match your provider’s instructions. A display name is just a label; it doesn’t tell you whether two configurations are identical. Subscription updates may replace entries, so copy a configuration to a separate group before editing it by hand. If you have several connection options, start with one known-good configuration instead of changing the protocol, port and TLS settings all at once. For details, see Share links vs. subscriptions: how to import them.
System proxy, TUN and permissions
Once the core is running, enable the system proxy in the client and check the address and port in Windows proxy settings. A system proxy sets an entry in the OS settings; only browsers and apps that read those settings will use it. Some apps have their own proxy settings, while others connect directly. So if the browser works but another app doesn’t, the server may not be the problem. An automatic configuration script, manual proxy or browser extension may also override the client’s settings.
TUN mode handles traffic through a virtual network interface. Its coverage differs from the system proxy, and it typically requires elevated permissions and routing changes. Enable it only if your client version, selected core and system support it. First turn off other proxy-routing methods, then grant the permissions requested by the app. If enabling TUN cuts off all network access, turn it off, confirm that the default route has been restored and return to the verified system proxy setup. Then check the logs, interface status and security software alerts.
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess
The PowerShell commands above only show local listeners; they don’t fix connection problems. Compare the results with the actual listening port shown in the client settings. If another app is using that port, change the client’s local port and update the app’s proxy settings to match. Don’t confuse the remote server port with the local proxy port. Enabling “Allow LAN connections” changes which interfaces can listen; for a single-device setup, keep the loopback address unless you have a reason not to.
Exit, startup and upgrade considerations
Closing the window may only minimize the app to the notification area. When you’re done, clear the system proxy set by the client before quitting, so apps don’t keep trying to connect to a local port that’s no longer listening. After enabling launch at sign-in, restart and verify that the client and proxy settings behave as expected; automatic launch doesn’t necessarily mean TUN will obtain permissions automatically. Before upgrading, exit the old process and back up your settings. Afterward, check subscription groups, the selected configuration, listening ports and routing presets—not just whether the main window opens.
macOS: Choose the right chip, install the app and grant network access
Choose the v2rayN package for your Mac’s chip
Check the chip under About This Mac, then open the macOS downloads section. Choose arm64 for Apple Silicon and x64 for Intel. Don’t guess from the screen size or purchase year. Some compatibility environments can run apps built for the other architecture, but a native match makes runtime and permission issues easier to diagnose. When the download finishes, open the DMG and drag the app to the Applications folder as instructed.
After copying the app, launch v2rayN from Applications rather than running it from the disk image. A disk image is just a distribution format; its paths disappear when you eject it, and running the app from there can interfere with saving or updating. If macOS displays a security warning on first launch, verify the file’s source and read the message, then follow the authorization steps provided by the system. Don’t disable system-wide security checks for a single app or paste commands from an unknown source to change permissions.
After launch, check that settings can be saved and the core starts normally. If the interface opens but a bundled executable can’t run because of permissions or an architecture mismatch, the logs will usually show an error at startup. Fix the local execution issue first; changing remote server settings won’t help. If a system update changed an existing authorization, review the new prompt instead of copying permission settings from another Mac.
Import configurations and configure the network proxy
Import a share link from the client’s clipboard option, or add a subscription URL to a subscription group and update it. The macOS clipboard may still contain previous content. If import fails, check that you copied the full link and didn’t include explanatory text or a line break. After importing, select a configuration and start the core. Test with an app that explicitly reads the system proxy; avoid enabling a browser extension with its own proxy settings at the same time.
On macOS, proxy settings are usually tied to a specific network service. Wi-Fi and Ethernet can have different proxy settings, so after switching networks, check the active service rather than relying on the client’s menu bar icon. Open Network settings, select the service in use and confirm that its proxy address and port match the client’s actual listener. If the device uses an automatic proxy configuration script, check how it interacts with the manual proxy.
If macOS asks permission to change proxy settings, confirm that the request comes from the client you’re using before authorizing it. Denying permission may not stop the core from listening locally, but apps won’t automatically use that proxy. To test the connection, enter the proxy address directly in an app. Once the connection works, address the system settings separately. This helps distinguish “can’t set the system proxy” from “the core can’t connect to the server.”
TUN, DNS and waking from sleep
TUN availability depends on the client build, core capabilities and system permissions. Before enabling it, note the current network service and DNS settings, and turn off other virtual networking tools that take over traffic. If the app asks for elevated access or a helper component, follow the instructions for your current version; don’t apply driver installation steps from other platforms to macOS. After enabling TUN, test both domain access and local network resources to make sure routing hasn’t changed paths that should stay direct.
DNS problems may affect only one app. A browser using its own secure DNS may not follow the system or client’s DNS path, so one browser failing doesn’t mean DNS is down everywhere. Try another app, then check the client logs for the domain lookup and connection stages. Visiting a TLS website by IP address changes certificate matching, so it isn’t an equivalent TLS test.
scutil --proxy
scutil --dns
These read-only commands show current proxy and DNS information so you can compare it with the graphical settings. Output may include company configuration or local network details; remove sensitive information before sharing it. After waking from sleep, switching hotspots or changing network services, existing connections may temporarily fail. Reconnect and check the service status before restarting the core. There’s no need to delete the entire app data folder straight away.
Check settings after quitting or upgrading
Restore the proxy settings changed by the client before quitting. If the app crashes, the current network service may still point to a local proxy that’s no longer running. Restarting the client may restore the settings; you can also remove only the proxy entry added for this setup in System Settings, without overwriting existing company settings. After upgrading, check the app path, permissions, selected configuration and routing presets. If you’ve also switched chip architectures, download the matching package instead of migrating the old executable.
Linux: Install deb or rpm packages and integrate with the desktop
Check the distribution and architecture separately
Use v2rayN on Linux desktops. Open the Linux downloads section. Debian, Ubuntu and compatible distributions generally use deb; Fedora and compatible environments generally use rpm. Package format and machine architecture are separate: deb packages, for example, can be built for x64 or arm64. Check /etc/os-release and uname -m before choosing a package. Being able to download a file doesn’t mean it can be installed on your system.
The commands below use a temporary working directory to isolate the package to be installed. They assume the current directory contains exactly one matching package. Keep the real filename used for the download. Copy the selected package to the working directory, check the file list and then install it; don’t run wildcard commands directly in a downloads folder containing old packages. Use only the command set for your distribution: deb or rpm.
# Debian / Ubuntu: confirm the deb file in the current directory
ls -1 ./*.deb
sudo apt install ./*.deb
# Fedora: confirm the rpm file in the current directory
ls -1 ./*.rpm
sudo dnf install ./*.rpm
Installing through the system package manager helps handle dependencies and registers the app with the system. If the architecture doesn’t match, get the right package. If dependencies are missing, check the supported distributions and software sources. Ignoring dependencies isn’t a routine fix. After installation, launch the app from the desktop menu and save settings as your regular user. Running a graphical app as root can leave configuration files owned by root, preventing your regular account from writing to them later.
Import subscriptions and configure the desktop proxy
After launching the client, save and update a subscription group or import a single configuration from the clipboard. On Linux, remote desktops, different display sessions and terminal clipboard tools may use different selections or buffers. If import fails, first check that the graphical client received the expected text. Don’t paste a subscription URL into a public terminal log. Select a configuration and start the core, then check the local listener and startup logs before enabling the system proxy.
Linux “system proxy” settings aren’t a universal gateway used by every app. Desktop environments, browsers, terminal programs and background services may each use different settings. A proxy set in desktop network settings doesn’t mean shell commands will use it; setting environment variables in a terminal doesn’t mean desktop apps will read them. First test with an app that supports explicit proxy settings, then configure the desktop for your use case.
HTTP and SOCKS proxy ports use different protocols and can’t be interchanged; if the client supports a mixed listener, follow its documentation. Proxy environment variables in the terminal may point to an old port, making command-line tests differ from browser results. Check them carefully—shell history and variables may contain credentials, so don’t share them publicly. Use the read-only command below to check listeners, then compare each result with the client settings.
ss -lntup
ip route
ip -6 route
TUN permissions and network manager conflicts
TUN mode usually creates a virtual interface and changes routing. Being able to open the client as a regular user doesn’t mean you have permission to do those things. Prefer the privilege escalation method provided by the client. Don’t grant broad write access to the entire app directory or give unknown files permanent privileges. After enabling TUN, check the virtual interface, default route and DNS status. If the core fails to start, address any clear permission errors in the logs before changing split-routing rules.
NetworkManager, other virtual networking tools, container networks and corporate tunnels may all modify routing. If they conflict, first disable the newly added traffic capture method and restore the original network, then enable each tool one at a time to identify the cause. If local network resources are unreachable, check direct-routing rules for private addresses and routes through the virtual interface rather than sending all traffic through the proxy. If IPv4 works but IPv6 doesn’t, the two may be taking different paths; record the results separately.
Desktop login startup and upgrades
Start with the client’s built-in launch-at-login setting. If your version doesn’t have one, use the desktop environment’s Startup Applications manager to select the installed app. Launching at desktop login isn’t the same as starting a system service at boot: a graphical client depends on the user session and shouldn’t be treated as a headless service. Log out and back in to verify the setup, and check that it hasn’t started duplicate processes.
Before upgrading, exit the old process, install the new package using the same package management method and keep a backup of your user configuration. If you previously launched the app as an administrator and can’t save settings, check the owner of the configuration directory. Fix only the data directory that belongs to the client; don’t recursively change permissions on your entire home folder. For package installation and login startup, see Install v2rayN on Linux and configure autostart.
Android: Configure v2rayNG and v2flyNG
Choose a client, architecture and installation permissions
On Android, v2rayNG is the primary choice and uses the Xray core family. If you need a V2Fly core configuration, consider v2flyNG. Choose based on the capabilities your configuration needs and your existing workflow, not just the app name. Each app stores its own configurations and settings; installing one won’t migrate data from the other. Check the package options and system requirements in the Android downloads section.
On devices that support arm64 apps, the arm64 package is usually the right choice. If you’re unsure of the architecture or the installer reports incompatibility, check the notes for the universal version. A package parsing error may also mean the download is incomplete, your Android version is unsupported or the installed app has a conflicting signature—not necessarily that the architecture is wrong. Allow installation from the source you’re actually using, and revoke that permission afterward if you no longer need it.
If Android reports a signature conflict during an update, don’t uninstall the existing client straight away. First confirm where the old app came from and export a restorable configuration; uninstalling may delete groups, manually added entries and app-routing settings. Keep exported files containing connection credentials somewhere private. Downloading the correct package from the same source is usually easier to diagnose than forcing an overwrite. Whether packages from different sources can update each other depends on the system’s message.
Import from the clipboard or a subscription group
Import a single share link from the clipboard. For a subscription URL, create an entry in subscription settings, save it and update. Android may clear clipboard contents automatically, so open the client soon after copying and check that the text isn’t empty or a webpage description. If the first update fails, note whether the error is about the URL format, connection, response or parsing. Then decide whether you need a working configuration to fetch the subscription.
Select a configuration from the list and tap Connect. The first time the app establishes a local VPN connection, Android displays a permission dialog. This is the system interface Android clients use to route traffic. After granting permission, check the client’s connection status and Android notification, then test with an app. A VPN icon only means the tunnel has been established; it doesn’t confirm that the remote connection or DNS lookup works.
Subscription updates refresh entries based on the content returned by the provider. Manual edits to a subscribed configuration may disappear on the next update. To keep a change, copy the configuration as a separate entry and note its original source. Clients may support different share-link formats, especially configurations with newer transport fields. Even after a successful import, check that the protocol, TLS, transport type and required parameters are all present.
Per-app routing and background operation
Android clients generally work through the system VPN interface, so there’s no need to copy the desktop system HTTP proxy steps. Android usually allows only one VPN service to use this interface at a time. Another tool that relies on the same interface may replace the current connection. For testing, leave only one traffic-routing app enabled; otherwise, another service may take over immediately after the client reports a successful connection.
Before setting up per-app routing, check whether the current mode means “proxy only selected apps” or “bypass selected apps.” These lists work in opposite ways, so selecting the same app can produce different results. Test with one app before expanding the list. After changing it, reconnect as prompted by the client. Per-app routing and domain routing work at different layers: an excluded app’s traffic may never reach the core’s routing rules.
Disconnections when the screen is off are often related to battery optimization, background restrictions or the device manufacturer’s task manager. First check whether the client’s notification is still present and whether its process was stopped, then allow the necessary background activity in system app settings. Don’t start by changing server protocols. Switching between mobile data and Wi-Fi rebuilds the connection; if only one network fails, compare them using the same configuration instead of changing the server and DNS at the same time.
DNS, hotspots and post-update checks
Android Private DNS, a browser’s own DNS resolver and the client’s DNS settings may use different paths. If a domain won’t load, check the logs and compare with the result when disconnected; don’t cycle through random DNS addresses as a standard fix. Other devices connected through your hotspot may not automatically use the Android client’s VPN tunnel. Your phone working doesn’t prove that hotspot devices are using the same route.
After updating the client, check the selected entry, per-app routing list, routing mode and background permissions. A system update may reset some permissions, so verify them again. v2rayNG and v2flyNG may use different setting names; when switching apps, match settings by function rather than assuming a subscription import reproduces all behavior. For help choosing a client, see A comparison of three clients. For your first connection, see the Quick Start Guide.
Subscription management: groups, updates and migration
Share links, subscription URLs and full configurations
vmess:// and vless:// share links usually describe one server configuration. A subscription URL typically makes an HTTP request that returns a set of entries. A full JSON configuration may include inbounds, outbounds, routing and DNS. They serve different purposes. Pasting a subscription URL into a single-server editor, or importing full configuration JSON as a share link, causes a format mismatch. Identify the content type first, then use the matching import option in your client.
A subscription URL opening in a browser doesn’t mean the client can parse it. The response could be a login page, an access notice, a redirect or an unsupported configuration format. Seeing text in a browser doesn’t mean the client accepts every field. If parsing fails, confirm that the response is actually subscription data and check which formats the client supports. Don’t keep reinstalling the client just because the page looks fine in a browser.
Access parameters in a subscription URL may grant access to your account. Don’t send the full URL to a public conversion service, include it in a public configuration example or post a screenshot of your browser history when asking for help. Before using a converter, check the input and output formats, whether you trust the service and which fields might be dropped. Conversion changes the format; it won’t fix an expired account, unreachable server or missing authentication information.
Name groups and verify updates
Create a separate group for each source and give it a short name that identifies where it came from and what it’s for. Keeping test configurations, manual entries and subscription items separate makes it easier to see what an update affects. Don’t rush to delete duplicates in a group. Compare their server addresses, protocols, ports and transport parameters first. The same display name doesn’t guarantee identical configurations, and different names may point to the same server.
Trigger the first update manually and check the result and changes to the list. After it succeeds, consider setting an automatic update frequency. This helps avoid repeated failures if the network isn’t ready or the client hasn’t started. Some clients can update “through the proxy”; use this only if an existing configuration works. Before you have a working connection, this option may make subscription retrieval depend on an exit route that doesn’t exist yet.
An update may replace or remove the currently selected entry, so check your selection afterward. If the number of entries changes, first check whether the provider changed the subscription content rather than assuming local data is corrupted. If a manually configured baseline still connects, you can narrow the problem down to the subscription request or parsing. Keeping old entries after an update fails is usually more useful for diagnosis than clearing every group and trying again.
Separate configuration data from runtime settings when migrating
Moving to another device involves at least two things: server details and local runtime settings. A share link or subscription usually covers only the former; it won’t migrate system proxy settings, listening ports, per-app routing, TUN permissions or launch-at-login. Windows file paths and Linux permissions shouldn’t be copied directly to Android either. Set up a connection from the section for your new platform, then restore your routing preferences one at a time.
| Item | Common migration method | What to check afterward |
|---|---|---|
| Single server | Share link exported from the client | Protocol, TLS and transport fields |
| Subscription source | Add the URL again and update | Groups and current selection |
| Local proxy | Configure it again on the new device | Listening address, port and app entry point |
| Routing and permissions | Restore each setting for the target platform | Rule order, app lists and permissions |
After exporting a backup, verify what it includes. Some exports contain only server details; others include client preferences. Don’t assume any export includes operating-system permissions. Set encryption and access restrictions based on your device’s capabilities. If a subscription URL has been exposed, deleting the local file won’t revoke remote access; use the provider’s supported process to change the access credentials.
Core compatibility and configuration fields
V2Fly and Xray are part of the same open-source ecosystem, but their feature support isn’t identical. Switching cores doesn’t automatically translate configuration semantics to the other implementation. If you see an unknown field, an unsupported transport or a startup failure, read the specific error and check what your provider requires. Configurations such as REALITY require specific core capabilities; choose a compatible client and core instead of copying options into v2flyNG that its core doesn’t support.
For more on identifying formats, see Share links vs. subscription links. For complex configurations, read Understanding the config.json structure. Distinguish fields generated by the client from custom fields you added; a label in the interface isn’t necessarily a core parameter.
Proxy and routing: entry points, exits and rule order
First check whether traffic reaches the core
Routing rules only process traffic that reaches the core. The system proxy provides a local proxy entry point to apps; TUN routes eligible network traffic through a virtual interface; Android app lists determine which apps enter the tunnel. If an app isn’t using the client at all, changing routing won’t affect it. Before troubleshooting split routing, confirm that the app’s entry point matches the local listener, then check rule matching.
In a client, “global” usually means sending traffic that reaches the client through a single exit; it doesn’t automatically force every app on the device to use it. Presets named “bypass mainland China,” “blacklist” or “whitelist” are client-defined. Their actual behavior depends on the generated rules and exit. Don’t infer how every domain will be routed from a preset’s name alone. Presets with the same name may also differ across clients and versions.
A local HTTP, SOCKS or mixed inbound sends traffic to the core. outbounds defines available exits, and routing.rules directs matching traffic to an outbound tag. A tag is a reference, not a reserved magic name. Each rule’s outboundTag must match an actual outbound’s tag; otherwise, the configuration may fail to start or traffic may not be forwarded as expected.
Rule matching and example limitations
Rules are generally checked in order: an earlier match takes precedence over a later fallback. A broad rule placed too early can hide more specific rules. Domain rules suit clearly defined services; IP rules suit private networks or address ranges. Whether an app uses a domain or connects directly to an IP affects what can be matched. Sniffing can provide some additional target information, but it can’t reliably recover a domain from every connection.
The complete configuration below is for learning the structure and testing a local listener. It defines only direct and blocked exits; it doesn’t include a remote proxy server. All inbound traffic goes direct by default, while requests to the documentation example domain are blocked. Before running it, make sure the port isn’t in use. This example demonstrates how the fields relate; don’t paste it over a working server configuration. Check your client’s current interface to see whether it supports importing a full configuration.
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "block"
},
{
"type": "field",
"ip": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"127.0.0.0/8"
],
"outboundTag": "direct"
}
]
}
}
domain:example.com matches the example domain and its subdomains. To match only the exact hostname, use the full: form. Traffic that doesn’t match a rule usually uses the first outbound, so this example puts direct access first. To split traffic through a proxy, define a real, working proxy outbound and reference it in the relevant rules. Adding a tag named proxy alone doesn’t create proxy capability.
Domain strategy, data files and DNS
IPIfNonMatch means the core can resolve the target domain and try IP rules if no domain rule matches; it doesn’t resolve every request to an IP first. AsIs and IPOnDemand resolve at different times, affecting available match information and DNS requests. If you’re unfamiliar with a configuration, keep the client’s default and use the logs to investigate. Don’t treat domain strategy as a universal speed-up switch.
geosite:cn, geoip:cn and geoip:private depend on data the core can read and the classification names it supports. They aren’t built-in dictionaries available in every configuration. If a file or category is missing, update the resources using the method supported by your client. The example above uses explicit private network ranges to avoid relying on external categories, but it doesn’t cover every address that should go direct or define private IPv6 ranges. It isn’t a complete production routing template.
Verify how a rule behaves
Add one rule at a time. After restarting or reloading, confirm the core starts normally, then test a specific target. Check the destination, inbound tag and outbound tag in the connection logs instead of looking only at whether a webpage opens. A site may request content from several domains, so a working homepage doesn’t mean every resource uses the same route. Record what each rule does and where it appears in the order, so you can understand it after updating a preset.
Common configuration issues: troubleshoot by layer
Start with local startup issues
First identify the layer where the failure occurs: app installation, core startup, local listener, traffic capture, remote connection, DNS resolution or the target app. Keep one repeatable test action, such as opening the same destination in the same app on the same network. Don’t change the client, configuration, DNS and routing all at once. Changing several things removes your baseline; even if the connection comes back, you won’t know which change helped.
If the client won’t open, check system requirements, package architecture and runtime dependencies. If the interface works but the Connect button immediately returns an error, check the core startup logs. Start with unknown fields, missing resources, execution permissions and port conflicts. The remote server hasn’t been contacted yet, so changing its address usually won’t help. If settings won’t save, check that the data directory is writable, that there’s enough disk space and whether the app was previously run with different permissions.
If the local proxy port isn’t listening, apps will get a connection refused or timeout error. Check the port in the settings instead of guessing a fixed value from another guide. If another process is using it, identify the process, close the conflicting app normally or change the local port. Don’t terminate system processes at random. After changing the port, update the app’s own proxy settings and the system settings too; otherwise, the core may be working while apps still connect to the old entry point.
Empty subscriptions and remote connection failures
If a subscription list is empty, first check whether the update actually completed. A failed network request and a response that can’t be parsed need different fixes. For a request failure, check URL reachability, the update route and network status. For a parsing failure, check the response format and the client’s supported formats. Make sure the URL wasn’t truncated and that you didn’t copy an account page instead of a subscription. Keep existing working entries; don’t clear every group because of one failed update.
If the core is running but every request fails, check that the right configuration is selected, its details are still valid and system time is accurate. A timeout means something wasn’t completed in time; it doesn’t by itself prove the server is broken. For authentication errors, first check credentials, account status and parameters. For TLS errors, check the server name, certificate requirements and time. Don’t treat skipping certificate verification as a standard fix.
If a configuration fails only on one network, keep the configuration unchanged and switch networks to compare. Wi-Fi, mobile and corporate networks may use different DNS paths and have different egress restrictions. If switching networks fixes the problem, keep checking the failing network and note the stage and logs. Don’t generalize the result to every client. Set protocol parameters according to your provider’s instructions; don’t swap in an option just because its name looks similar.
Browser works, but another app doesn’t
First check whether the failing app reads the system proxy, has its own proxy settings, is excluded by the Android app list or requires UDP. HTTP proxy, SOCKS and TUN have different coverage, and you’ll also need to check whether the remote protocol supports the traffic in question. A client’s built-in test may only check one kind of connection; it doesn’t prove that the target app’s full workflow works.
For DNS problems, compare the resolution and connection errors, and distinguish system DNS, client DNS, browser-specific DNS and Android Private DNS. Don’t disable IPv6 based on a single failed domain. First compare the IPv4 and IPv6 routes and logs, then make a targeted change if needed. If you can’t reach a local service, check private-address routing and TUN routes before sending local traffic through a remote exit.
| Symptom | Check first | Next step |
|---|---|---|
| Core won’t start | Logs, fields, resources and permissions | Restore the last configuration that started successfully |
| App connection refused | Local listener and port | Make sure the client and app use the same entry point |
| Subscription is empty after update | Request result and response format | Check the URL and supported formats |
| Only one app fails | App proxy settings and routing list | Compare using explicit proxy settings |
| Network drops after enabling TUN | Permissions, virtual interface and default route | Disable TUN and restore the baseline |
Stop traffic capture, restore network access and prepare logs
To restore normal network access, first disable TUN or disconnect the Android client, then clear the system proxy set by the client and quit the app. If it has already crashed, check whether the operating system still has a local proxy configured. Don’t remove a proxy originally set by your company; undo only the settings added or changed for this setup. If the network still doesn’t recover, check the default route and DNS status, reconnect the current network service if needed, then restart the device.
When asking for help, include the platform and architecture, client name, stage where the problem occurs, steps already tried and a redacted error excerpt. Remove subscription URLs, authentication fields, full user IDs and unnecessary network details; keep only the context needed to diagnose the issue. Debug logs may include destinations you’ve visited, so restore the normal log level when you’re done. A problem you can reproduce reliably is more useful than a large dump of unfiltered logs.
Should I enable the system proxy and TUN at the same time?
Not for your first test. Verify one traffic-routing method, then decide whether to combine them based on the core and app requirements. If you do, check for duplicate traffic capture and confirm routing and DNS behavior. Turning on both options doesn’t guarantee broader coverage.
Should I keep reinstalling after switching clients doesn’t help?
Stick with one client and one configuration, then check each layer: startup, listener, traffic capture, remote connection and DNS. The shared configuration source, network environment or system settings may be the cause. Back up before reinstalling, and note which layers you’ve already confirmed are working.
Use this page as a reference for troubleshooting by layer. To repeat the minimal connection setup, return to the Quick Start Guide. For a package with the right architecture, visit the client downloads page. For complex fields and outbound references, see Understanding configuration structure. Keep platform setup issues separate from core parameter issues.