Core Concepts: How Connections Work
Know the Difference Between the Client, Core and Remote Server
Think of a connection as four stages: an app sends a request, a local proxy accepts it, the core processes and forwards it according to its configuration, and the remote server connects to the destination. v2rayN is a graphical client for managing configuration and runtime status; it is not a remote server, and installing it does not automatically provide a working connection. The client manages subscription groups, server selection, system proxy settings and core startup. The core handles protocols, transports and routing. Understanding this distinction helps explain why opening the app and establishing a connection are two separate things.
Project V is the broader ecosystem behind related proxy technologies. V2Fly and Xray are separate core projects. They share some concepts, but their features, configuration fields and support are not always the same. If a share link imports but won’t connect, first check whether the selected core supports that combination—not just which client you’re using. A setting appearing in the graphical interface does not mean every core can apply it. After switching cores, review the generated configuration and startup logs to confirm the settings took effect.
Know the Difference Between Protocols, Transports and Security
VMess, VLESS and Trojan are proxy protocols. TCP, WebSocket and gRPC are ways to transport data. TLS and REALITY concern connection security. These are different layers, not interchangeable options. For example, choosing VLESS still requires the correct transport and security parameters. REALITY is not a universal switch you can enable on its own; it requires matching server-side details, including the public key, server name and other parameters. Use the complete configuration provided by your service provider.
A node is usually a configuration entry that can establish a connection to a remote server. It may contain an address, port, user ID, password and transport parameters. A subscription URL is an endpoint for retrieving a set of configurations; an update may add, remove or change entries. A successful subscription download only confirms that the configuration retrieval worked—it doesn’t prove that every entry is usable. Likewise, a working existing entry doesn’t prove that subscription updates are reachable. Test configuration retrieval and proxy connections separately to make troubleshooting clearer.
Know the Difference Between Local and Remote Ports
A local listening port is where apps such as browsers and terminals connect to the client. The remote port belongs to the server; there’s no reason they have to match. A common local SOCKS port is 10808, but check the current client settings for the actual value. 127.0.0.1 is the local loopback address, not a server address. Entering the remote address as a browser’s local proxy, or putting the local port in a server entry, can both produce what looks like the same timeout.
DNS translates domain names into addresses; routing decides whether a request goes direct, through a proxy or gets blocked. System proxy settings affect only apps that honor them. TUN captures more traffic through a virtual network interface. So enabling the system proxy does not mean every app is covered, and selecting a global routing rule does not mean the system has handed over every connection. For each change, ask two questions: did the request reach the client, and which rule matched it?
Before you start, note your operating system and processor architecture, and make sure you have a working subscription or complete share configuration. Confirm that system time is set to sync automatically. Subscription URLs and share links may contain access credentials, so store them in a private password manager—not a public discussion forum. When asking for help, describe the protocol, transport and stage where the error occurs, and redact credentials from addresses. Make this a habit from your first import, not after a configuration has been exposed.
Choose a Client: Platforms and Cores
Use v2rayN on Desktop
v2rayN is the primary client for Windows, macOS and Linux desktops. Choose a download by checking your operating system first, then your processor architecture, and finally the interface and package format. Don’t judge a release by file size or name, and don’t keep trying to extract a package built for another OS. Open the Download Center and check the platform-specific instructions. If your system reports an unsupported format, recheck the platform and architecture before disabling system protections.
On Windows, you can choose between the desktop edition and the classic WPF edition. The desktop edition uses a cross-platform interface, while the WPF edition retains the classic interface. Menus and configuration storage may differ. If you’re new to v2rayN, start with the desktop edition; if you’re used to the classic interface, choose the WPF edition if it fits your environment. Don’t switch between editions repeatedly to troubleshoot one setting: the interface location, working directory and runtime requirements may all change, making the issue harder to isolate.
| Platform | Client | How to Choose |
|---|---|---|
| Windows | v2rayN Desktop Edition or WPF Edition | Interface preference and runtime environment |
| macOS | v2rayN | Apple Silicon or Intel |
| Android | v2rayNG、v2flyNG | Core requirements and processor architecture |
| Linux | v2rayN | Distribution package format and architecture |
Choose a Package Based on Your Device
On macOS, check About This Mac for your chip. Choose the Apple Silicon download if it lists an Apple chip, or the Intel download if it lists an Intel processor. Don’t guess from the computer’s appearance or purchase year. On Linux, check your distribution’s package system before choosing deb or rpm. A package may also come in x64 for typical desktops or arm64 for other devices. Package format and architecture are separate requirements; both must match.
For Android, v2rayNG is the primary choice and uses the Xray core. v2flyNG uses the V2Fly core and is an alternative when you specifically need that core. Most recent phones use arm64, but device age is only a rough guide; the system environment and processor capabilities don’t always line up. Check your device’s system information if unsure, or choose the universal build. These clients are not identical apps with different names: check supported fields and menu details separately, and don’t assume a newer security feature is available in both.
Choose Based on Configuration Needs, Not Protocol Rankings
Choose a client based on the features your configuration needs. If your service uses a specific transport or security field, confirm that the client’s core supports it before considering interface preferences. There’s no need to rewrite a working configuration just because one protocol sounds newer. Protocol, transport, certificates and network conditions all affect the result; changing a name won’t fix a connection by itself. If you use a subscription, keeping the provider’s fields intact is usually more reliable than guessing. For compatibility issues, note the error and check the supported features.
When migrating, distinguish share formats from client settings. A single share link usually contains only the fields needed for a remote connection; it may not include routing, DNS, local ports or interface preferences. Even if two clients accept the same link, that doesn’t mean they have the same overall setup. After migrating, check the local listener address, system proxy status, active entry and default route. If you’re moving to a new device, first establish a basic connection there. Once it works, move custom rules over one at a time.
At first, run only one client that takes over network traffic on a device. Multiple apps may compete for local ports, system proxy settings or virtual interfaces, making it hard to tell where requests are going even when each interface looks normal. Before switching clients, disable proxy handling in the old one, exit it, then launch the new client. Keeping one known-working configuration as a reference is more useful than installing several clients and testing them in turn. Manage client downloads and service configurations separately: installing the client doesn’t mean you have a service configuration.
Installation and First Launch
Prepare a Writable Folder and Runtime Environment
Before installing, close any old client that’s still running and note the current local port and system proxy status. Follow the system wizard if you’re using an installer. For an archive, extract all files first and launch the client from the extracted folder—don’t run it from the archive utility’s temporary preview. The client needs to read core files and save configuration. A read-only location, temporary folder or restricted shared directory can cause settings not to save or components to go missing. A desktop shortcut is just a launch point; the working files don’t necessarily live on the desktop.
If v2rayN won’t start on Windows, first check whether the system message explicitly says a runtime is missing. Some packages include the required components; others may need a desktop runtime. Follow the installation instructions rather than installing every runtime you can find. Treat the classic WPF and cross-platform editions separately, as their requirements may differ. For permission errors, check that the folder is writable, that security software hasn’t quarantined a file, and where the warning came from. Running as administrator all the time is not a general fix.
First Launch: Platform-Specific Checks
On macOS, move the app to an appropriate Applications folder, then launch it from there. If the system blocks it, check the download source and warning before following the system’s authorization steps. Don’t disable security protections wholesale just to launch one app. If you see an architecture compatibility warning, check your device’s chip. Quit the app before updating it. Replacing files while an old process is still running can leave the interface and active components in different installation states, making troubleshooting harder.
On Linux, install the package that matches your distribution and launch the app from the application menu or installed entry. If you see a dependency or graphical interface error, first determine whether package installation failed or the app failed to launch afterward. For installation issues, check the package format and dependency messages; for launch issues, check the graphical environment, permissions and startup output. Don’t copy commands intended for another distribution. Grant network takeover permissions only when enabling the relevant feature; they aren’t needed just to manage basic settings.
After installing on Android, open the app and review the interface before trying to connect. If Android asks to allow app installations, grant only the permission needed for the trusted source you’re using. You can revoke that source’s installation permission afterward. The VPN permission requested when starting a proxy connection is separate: it creates the local traffic-capture interface, unlike installation permission. If another VPN is already running, disconnect it first. Repeatedly approving the prompt won’t resolve a conflict between two traffic-capture services.
Check the Core and Local Listener
After the first launch, open the settings and check the local listening address and port. Then review the logs for missing core files, configuration parsing errors or port conflicts. Some connection tests won’t work until you import a remote configuration; that’s an expected prerequisite, not proof that installation is broken. If a component was quarantined, check your security software’s history. Once you understand the cause, restore it according to trusted distribution instructions. Don’t download a same-named core file from an unknown source and drop it into the folder.
By default, keep the proxy listener bound to the local loopback address. Exposing it on all network interfaces may let other devices on the same network connect, so it requires appropriate firewall and access controls. If you don’t need access from other devices, leave LAN access disabled. If a port is already in use, close the old client using it or choose another port after checking what the port is for. Update the proxy address in your apps as well; otherwise, the client may use a new port while your browser keeps trying the old one.
Make an initial note of the installation location, client edition, listening port, startup-on-boot setting and whether system proxy is enabled. It shouldn’t contain credentials—just enough to help you restore the environment later. Don’t enable auto-start, automatic subscription updates and TUN all at once. First get a manually launched, minimal setup working, then add automation. If something breaks later, you’ll know whether the installation was already faulty or a new setting changed the network path.
Importing Subscriptions: Groups and Updates
Identify the Address Type First
Before importing, identify whether you have a subscription URL, a single share link or a complete configuration file. A subscription URL is usually a network address for retrieving a set of configurations. A share link often starts with a protocol name and describes one remote configuration. A QR code is just a way to carry text; it may contain either type of link. Pasting everything into the subscription field, or using a subscription website’s login URL as the subscription address, will cause format errors. Identify what you have before choosing an import method.
In v2rayN, open the subscription group settings, add a group name that makes its purpose clear, paste the complete subscription URL into the address field and save. Remove any leading or trailing spaces or line breaks introduced when copying, but don’t delete query parameters; they may identify your account. The group name is a local label. It doesn’t change the remote configuration or mean the subscription has been updated. After saving the group, run an update to retrieve the server entries.
Choose the Right Update Method
If this is your first setup and the proxy isn’t working yet, try an option like “Update current subscription (without proxy)” so the request doesn’t depend on a connection that hasn’t been established. If the subscription provider requires proxy access, first establish and verify a working configuration, then update through the proxy. Neither method is always better; the right choice depends on whether your current network can reach the subscription service. If an update fails, read the error and distinguish DNS resolution, connection timeout, authentication and response parsing failures.
After updating, check that entries for the current group appear in the list. Make sure they aren’t hidden by a search term or group filter. If the list is still empty, review the update log and check what the address returned. Opening a subscription URL in a browser may show a login page, an expired-subscription notice or another webpage. A successful download of that response still doesn’t make it a valid configuration. Don’t upload subscription content with credentials to a public conversion site. If the format is unclear, ask the provider which clients and export methods are supported.
Import from the Clipboard, a QR Code or Encoded Content
In v2rayNG, use the operation menu to import share content from the clipboard, or scan a QR code. Before scanning, check where the image came from; afterward, make sure the protocol and security fields are complete. If you have a subscription URL, save and update it in the subscription group settings instead of importing it as a single server entry. Grant camera access only when scanning. If you already have plain text, the clipboard option is usually simpler. After importing, select the active configuration and grant the VPN permission needed to connect; seeing an entry in the list isn’t enough.
Some subscriptions use Base64 encoding to bundle several share links. Encoding is not encryption, and it doesn’t make the content safe to share publicly. The client usually processes supported formats during a subscription update, so you don’t need to decode them manually first. If the response is actually a different kind of configuration, converting it to Base64 won’t make it compatible. For more on the different methods, see How to Import Subscriptions, Clipboard Links and QR Codes and check each method against the content you have.
Keep Subscription Updates from Overwriting Manual Changes
Subscription entries may be regenerated during the next update, so don’t keep important custom changes only in a subscription entry. Before editing an entry, check whether the client can copy it as a standalone configuration or manage it in a separate group. Note what you changed and why. If subscriptions update frequently, don’t rely on the display name to tell whether an entry is the same: check the protocol, address and key parameters. A changed name doesn’t necessarily mean the service changed, and an unchanged name doesn’t guarantee the fields stayed the same.
Enable automatic updates only after manual updates are reliable, and choose an interval that suits your usage. If an update fails, keep existing working entries instead of immediately deleting and recreating the group. If the provider has revoked access or the service has expired, changing local update modes repeatedly won’t restore access; check the subscription status. When moving to another device, migrate the group and necessary settings, then run an update to confirm they work. Copying an old list with an unclear source may bring expired configurations along.
System Proxy: Connect and Test
Start the Core Before Connecting Apps
After importing a subscription, select the configuration you want and set it as active, then make sure the core is running. Next, choose the system proxy option so apps that read system proxy settings send requests to the local listener. “Clear system proxy” usually removes the system-level proxy setting; it doesn’t necessarily stop the core. “Do not change system proxy” generally preserves the current system setting; it doesn’t mean the proxy is off. Check the current client’s documentation for the exact behavior instead of inferring it from the word “proxy.”
On Windows and macOS, many browsers use system proxy settings, but extensions, custom launch arguments and organizational policies may override them. Linux desktop environments and apps vary more in how they read system proxy settings, so you may need to enter the local proxy manually. Terminal programs often ignore desktop proxy settings. A browser reaching a destination doesn’t prove a command-line tool follows the same route. Likewise, a terminal failure doesn’t immediately mean the system proxy is broken.
Keep Connection Mode and Routing Mode Separate
System proxy settings determine how requests reach the client; routing determines where they go afterward. A common global proxy route sends requests that have reached the core through the proxy, but it doesn’t force every app on the device to use it. Direct routing may still pass through the local core, which then sends the request directly. PAC uses a rules script to decide whether an app uses a proxy; that decision happens at the connection stage, not inside the core’s routing rules. When troubleshooting, use one clearly defined connection method at a time.
On Android, v2rayNG usually captures app traffic through a local VPN interface and may offer per-app proxy settings. Whether selected apps are included or excluded depends on the current mode: the list may mean only those apps are proxied, or that they’re excluded. Don’t assume an app is covered just because its name appears in the list. Test with an ordinary app that has no extra proxy settings, then add others. For browser tests, temporarily disable proxy extensions to avoid overlapping settings.
Test Each Layer, Not Just One Website
First, check the core logs for startup errors. Next, confirm the local port is listening. Then send a request from an app that explicitly supports proxies. Finally, check whether the target app is using the system proxy. You can use the command below to specify a SOCKS endpoint; replace the port with the value in your settings. Here, socks5h sends target-domain resolution through the proxy, which helps distinguish local DNS issues from proxy-path issues. It does not prove that the system proxy is configured correctly.
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --head https://example.com/
Any reasonable HTTP response shows that the request completed at least part of the connection process. A redirect or access-denied response can still be useful for diagnosis; the target doesn’t need to return a success status. If the connection to the local port fails immediately, check the core and listener address. If the local connection succeeds but a handshake error follows, check the remote configuration and system time. A single test site may be unavailable, so cross-check with another known-working destination rather than assuming the whole proxy chain is broken.
Know How to Exit and Roll Back
Before closing the client, clear the system proxy or restore its previous settings, then exit the app. Otherwise, the system may keep pointing to a local port that is no longer listening, leaving the browser unable to connect. Check this after sleep, an unexpected exit or a forced shutdown too. If the previous system proxy was set by your workplace network or another management tool, note its original value instead of deleting it indiscriminately. Restoring connectivity matters more than layering on new settings. If necessary, return to a direct connection and rebuild the simplest working path step by step.
If an explicit proxy command works but the browser doesn’t, check browser extensions, custom proxy settings and stale connection state. If the browser works but the terminal doesn’t, check terminal environment variables and the program’s own proxy options. Troubleshoot each separately; reinstalling the client should not be your first step. For more, see Troubleshooting System Proxy Issues in Browsers and Terminals. During testing, record the target, connection method and stage where the error occurs rather than just noting “works” or “doesn’t work.”
Routing: Rules and DNS
Set the Default Route and Rule Order First
Routing applies rules after a request reaches the core, choosing an outbound path based on its domain, address, port, protocol or other conditions. Before adding rules, decide which outbound will handle unmatched requests, then add only the rules you need. A common setup sends local network addresses direct, proxies selected domains and handles everything else according to the default policy. More rules don’t necessarily mean more precision. Duplicate rules, overly broad conditions and unfamiliar rule sets make results harder to explain. For every rule, know what it matches and why it belongs in that position.
Many cores evaluate rules in order, so the first match determines the outbound. Put narrow, specific exceptions before broader rules. For example, if a domain must use the proxy but a wider domain set is configured for direct access, check which rule comes first. Sending private network addresses direct can keep traffic to routers, printers and file servers off the remote route, but it doesn’t guarantee internal names resolve correctly. Check name resolution and address routing separately; a single rule won’t necessarily fix both.
Read Rule Snippets Without Replacing the Whole Configuration
This is a structural example of Xray routing: send private addresses direct, then route an example domain and its subdomains through the proxy. It isn’t a complete configuration. direct and proxy must match outbound tags that exist in your configuration, and geoip:private requires the relevant address data. Graphical clients usually generate the complete configuration, so don’t replace the entire file with this snippet. If you use the client’s rule editor, express the same intent using its corresponding rule entries.
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
}
]
}
}
The address rule in this example only works when the request includes an address that can match it. If a request contains only a domain and the current domain strategy doesn’t resolve it for matching, the rule won’t necessarily catch every domain that resolves to a private address. Similarly, a domain rule requires the core to know the domain; an app that submits only an address may not provide the original name. Sniffing can recover domain information for some traffic, but it can’t identify every encrypted connection and should not be treated as a guaranteed match.
Treat DNS as a Separate Path
When configuring DNS, ask where the app resolves names, which resolver the client uses, and which route DNS requests take. An app using encrypted DNS may bypass the system resolver; a SOCKS request may resolve names locally or through the proxy. DNS settings in the core don’t necessarily control queries from every program on the system. If a domain won’t open but its direct address works, check the resolution result and query path before changing the remote port. Different resolution paths can return different addresses and change which routing rules match.
Avoid circular dependencies between DNS and proxy connections. For example, a remote server may need its domain resolved before the connection can start. If that DNS request is sent through the same connection that hasn’t been established yet, the process can stall at the starting point. Keep a working path for bootstrap resolution and check how the server domain is resolved. After changing DNS, apps, the system and the core may each retain their own cache. Note the original settings, then clear or restart the relevant components before testing so stale results don’t make the new rules appear ineffective.
Test Routing Rules One at a Time
To test a rule, choose a specific destination and note whether the app provides a domain, what the rule matches and which outbound is selected. If the logs show matching details, temporarily increase the log level for testing, then restore it. A successful connection alone doesn’t prove the rule worked: both direct and proxied requests may succeed. Likewise, a destination blocking the proxy’s exit doesn’t mean the rule failed to match. First prove that traffic reached the core, then confirm the expected rule and outbound, and only then check the destination’s response. This separates routing issues from service issues.
TUN Mode: Traffic Capture and Rollback
Confirm You Need Broader Traffic Capture
TUN receives system traffic through a virtual network interface and passes it to the relevant components for forwarding. It’s useful for apps that ignore system proxy settings and don’t offer their own proxy options, but it isn’t a quick fix for every timeout. If an explicit local proxy test can’t reach the remote server, enabling TUN will usually extend the same failure to more apps. First verify the remote configuration, DNS and routing in ordinary proxy mode. Then move on to this section so you can attribute any new issue to traffic capture rather than an existing problem.
TUN implementations, menu names, network stack options and permission requirements vary across platforms, client builds and selected components. Don’t search for an exact switch based on a screenshot, and don’t assume choosing a proxy core automatically enables every traffic-capture feature. Check the current interface’s descriptions, startup logs and component requirements. Android’s local VPN interface and desktop TUN settings may feel similar, but their permission models and available options are not interchangeable.
Record Your Network Baseline Before Enabling TUN
Before enabling TUN, note your active network adapter, system DNS, any other VPNs and the client’s current connection mode. Exit other programs that change routes and stop any overlapping traffic capture. Then enable TUN and grant the permissions the system requests. Don’t assume every startup failure is caused by insufficient permissions: interface creation, route installation, port conflicts and unsupported configuration are different problems. Adjust permissions only when the error clearly points to them, and follow your platform’s requirements.
Keep the default network stack and basic settings at first; don’t also change the MTU, strict routing or DNS hijacking options. Test in stages: start with a regular website, then an app that previously ignored system proxy settings, and finally LAN devices and recovery from sleep. If websites work but a real-time app doesn’t, first check whether the remote protocol and outbound support its traffic, then check the UDP path and app restrictions. TUN can receive traffic without the remote server being able or willing to forward every transport.
Check for Routing Loops, DNS Issues and LAN Access
When capturing all routes, make sure the client’s own connection to the remote server isn’t sent back through the same virtual interface, which can create a loop. Implementations usually handle this, but custom routes, multiple traffic-capture apps or manual adapter settings can break it. If the core starts normally but the connection drops as soon as TUN is enabled, disable TUN to see whether ordinary proxy mode recovers. Then check whether the remote connection is being captured incorrectly. Don’t delete every entry in the system routing table.
DNS capture and FakeDNS are also separate concepts. DNS capture directs queries through a chosen path; FakeDNS returns virtual addresses and maintains a domain mapping. They can work together, but they aren’t the same switch. With virtual mapping enabled, an app that bypasses the corresponding handling path may receive an address it can’t access directly. Test corporate network names, LAN discovery and apps with their own resolvers separately. Unless you have a clear need, start with ordinary DNS to keep behavior easy to understand.
| Symptom | Check First | Rollback Test |
|---|---|---|
| All apps fail after enabling TUN | Interface, default route, routing loops | Disable TUN and test the explicit proxy |
| Domains fail but direct addresses work | DNS path and cache | Restore the original DNS settings |
| LAN devices are unreachable | LAN bypass rules and name resolution | Test addresses and names separately |
Test Shutdown and Recovery Before You Rely on TUN
After TUN is enabled successfully, also test disabling it, quitting the client, switching networks and resuming from sleep. When it’s off, confirm that virtual-interface routes and DNS settings have been restored and ordinary network access works. If the network is still down after quitting, check whether the system still points to the local proxy, then check the active interface and resolver. After noting the basic state, use the system’s normal network reconnect process to recover. Don’t delete network adapters or clear firewall settings in bulk without knowing what they do.
Consider enabling auto-start only after traffic capture, routing, LAN access and shutdown recovery all pass testing. Automation must also account for the network not being ready or system permissions not yet being granted; don’t test only manual startup from an already logged-in desktop. If something goes wrong, the safest fallback is to disable TUN, restore the original system proxy and DNS settings, then troubleshoot with a verified ordinary proxy configuration. Advanced features are useful when they meet a specific need—not because every switch should be on.
Maintenance: Backups and Troubleshooting
Save a Recoverable Configuration
Good maintenance starts with backups, not updates. Use the client’s export or backup feature where possible, and check whether it includes server entries, subscription groups, routing rules, DNS and interface preferences. If copying the configuration folder, exit the client first to avoid copying files while they’re being written. Check the current installation instructions for the right folder; don’t assume every platform stores it in the same place. Add a brief note identifying the platform, interface edition and features that worked at the time.
Backups may contain subscription credentials, server passwords and private domain names. Store them locally with access controls or in trusted encrypted storage. Keep help-request configurations separate from full recovery backups: remove sensitive information from the former, but preserve the fields needed to restore the latter. A screenshot isn’t a substitute; it usually can’t capture hidden fields or rule order. Before an update, keep a known-working configuration and make sure you can find the restore option. Don’t wait for an update to fail before looking for your old data.
Update the Client, Core and Rule Data Separately
A client update changes the graphical interface and management logic; a core update changes protocol handling; and a routing data update changes matching sets. They aren’t the same thing. Update one component type at a time. After each update, test startup, subscription updates, an ordinary connection and shutdown recovery before moving on. If a previously stable connection suddenly fails, first consider which layer changed most recently. Tracking settings changes is more useful than reinstalling repeatedly; a reinstall may keep old settings or erase evidence without explaining the issue.
A version change may deprecate fields or change defaults, so after updating, check the logs for configuration compatibility warnings. Be especially careful with custom full configurations: they may bypass the client’s configuration generation, so new interface options won’t necessarily appear in the custom file. If you need to roll back, use a method compatible with the old configuration, and don’t let multiple programs write to the same data directory. A migrated configuration database may not work with an older client, so keep a backup from before the change.
Read Logs by the Stage Where the Error Occurs
When troubleshooting, note what happened just before the error: the app wouldn’t open, the core failed to start, the subscription download failed or an app request failed. For startup issues, check runtime requirements and folder permissions. For core startup, check fields, components and ports. For subscription issues, check the URL and retrieval path. For request failures, check DNS, the remote handshake and routing. Keeping the exact error is more useful than saying “connection failed.” Logs may contain addresses and user information; review and redact them before sharing, and don’t upload the entire working directory.
Troubleshoot node timeouts in layers: check system time, the local listener, network reachability and transport parameters. A clock that’s out of sync can affect certificates and handshakes. A port conflict may prevent the app from reaching the intended process; an unreachable server port is a separate issue. For TLS errors, check the server name, certificate status and security parameters. Don’t disable verification as a permanent fix. See Troubleshooting System Time, Ports and TLS Handshakes, and send a new request after each change.
Keep Test Conditions Consistent
When comparing results before and after a change, use the same app, destination and connection method where possible. After switching configurations, an existing connection may keep using its current session; close the test app or reset the connection before making a fresh request. Sleep, switching from wired to Wi-Fi, or joining a network that requires a sign-in can all change the conditions. If the network itself requires authentication, first restore the original proxy settings and complete the sign-in, then launch the client. This prevents a network sign-in page from being mistaken for a subscription or destination response.
Keep logs at the default or a moderate level, and increase detail temporarily only when reproducing an issue. Excessive logs take up space and may expose more browsing metadata. Restore the previous level once the issue is resolved, and clear old logs as needed. Periodically check that the subscription is still valid, backups can be read and the system proxy clears properly when you exit. There’s no need to change stable settings every day. The goal is to limit unknown changes and keep a clear baseline and rollback path for next time.
Advanced Learning Path: From Testing to Customization
Understand How Configuration Fields Depend on Each Other
Once you’ve worked through the earlier sections, advanced configuration is less about finding more switches and more about understanding how settings constrain one another. Start with a known-working configuration and observe how protocol, transport, security and routing fields appear in the core configuration. Focus on parts you can explain; don’t rush to change user IDs, passwords, public keys or other details set by the remote service. Learning configuration syntax is different from changing real credentials. You can practice with redacted snippets, but changing credentials requires matching server-side information.
When learning a protocol, find out what authentication fields it requires, how it carries data, which security mechanisms it supports and whether the current core supports it. Don’t use how new a name sounds to judge compatibility. For example, the server name, public key and short ID in a REALITY configuration must match the server’s requirements. Generating a new set of values locally won’t make an existing server accept them. A field accepting multiple values doesn’t mean every combination is valid. Check the provider’s instructions field by field, and keep the original working configuration for comparison.
Build Small Experiments That Answer Specific Questions
Write down a hypothesis before each test, such as “this terminal doesn’t use the system proxy.” Then change only one condition: try a direct request, specify the local proxy, and only then test environment variables. If the explicit proxy works but the default request fails, investigate app connectivity instead of changing routing and DNS at the same time. Record the request path, error stage and expected outbound—not just whether a webpage opened. Over time, these notes build reusable troubleshooting skills far better than copying a complex configuration.
For a routing test, create a rule for one example domain, verify the match and outbound, then expand to domain and address sets. For DNS tests, compare app-side resolution with proxy-side resolution and account for cached results. TUN tests should include LAN access, network switching and shutdown recovery. Keep a rollback point for each experiment; don’t start the next one before understanding the last. If results contradict your hypothesis, record what happened and narrow down the variables instead of stacking patches just to restore access temporarily.
Understand Configuration Syntax and Generation
In a JSON example, double quotes, commas and brackets are syntax; field names inside strings follow the configuration conventions of a particular component. Standard JSON doesn’t allow comments or trailing commas, so a commented snippet that’s readable online may not be accepted by the core. A configuration parsing successfully only confirms valid syntax. It doesn’t prove that the fields make sense together or that the remote service is available. When an error occurs, distinguish syntax errors, unknown fields, missing outbound tags and connection failures before deciding what to change.
Graphical clients usually generate the runtime configuration from interface settings. Editing the generated file directly may be undone the next time the client starts or you switch entries. For long-term customization, first check which stage is affected by the client’s rule editor, custom snippets or full-configuration option. Prefer the smallest customization that meets your needs instead of maintaining a copy of the entire generated configuration. A custom full configuration makes you responsible for field compatibility, outbound references and future updates. Use it only when you understand those responsibilities, so settings don’t end up with competing sources.
Include Security Boundaries in Your Configuration
A proxy protects traffic along a specific path; it doesn’t automatically anonymize every online activity. Website logins, browser storage, app telemetry and remote service logs each have their own limits. Subscription URLs and share links are sensitive too. Delete copies you no longer use, and if you suspect a leak, change access using the method supported by your provider. Before enabling LAN access or remote management, identify who can connect, how access is restricted and how to confirm the listener is off afterward.
Don’t permanently disable certificate verification to get around one certificate error, and don’t trust unexplained resolvers, rules or management interfaces in an all-in-one configuration from an unknown source. A working connection is only the minimum requirement. A maintainable setup also has a clear source, understandable behavior, appropriate permissions and a reliable shutdown path. On work devices or managed networks, follow your organization’s requirements. For changes involving global routes, system services or firewalls, keep the original state and confirm the scope of your authorization.
You can check your understanding by describing one complete path: how an app connects, which local component handles it, where the domain is resolved, which rule selects the outbound, what the remote server requires and how to recover if something fails. Once you can answer each part, you’ll have a solid foundation for complex routing, virtual address mapping and more granular app traffic capture. Keep a simple, testable configuration you can roll back to, so advanced settings remain optional tools rather than a black box you depend on.