Reference Guide · Advanced Setup

V2Ray Advanced Setup

Configure subscriptions, routing, and DNS in layers. Set the traffic entry point first, then check rules and outbounds, and finish with name resolution and virtual addresses.

Before you begin, complete the import, connection, and verification steps in the Quick Start Guide →. This page is a reference for working configurations. Use the sections below to investigate routing, DNS, or traffic-capture issues that come up during setup. For desktop, start with v2rayN; on Android, use v2rayNG, with v2flyNG as an alternative using the v2fly core.

Subscription Management domain / ip DNS / FakeDNS TUN / VPN

Subscription Groups & Server Filters

Subscription groups manage configuration sources, not where traffic goes. A group typically stores a name, subscription URL, and filter criteria. When updated, the client fetches the URL and converts the response into server entries. Server labels help you identify entries but do not determine their actual exit location. Before adding one, check whether you have a subscription URL that provides a list of configurations or a share link for a single server; they belong in different places.

Create Groups by Source

In v2rayN, open Subscription Group Settings, add a group, enter a recognizable name, and save the subscription URL. Return to the main window and update the group from the subscription menu. In v2rayNG, open Subscription Group Settings from the side menu; some versions call it Subscription Settings. Save your changes, return to the server list, and update subscriptions. Menu labels can vary, so look for the screen where you can edit a group name and subscription URL.

Use the group name to record the source and purpose, such as “Work backup” or “Personal testing.” Avoid using the full URL if it contains access credentials. Treat subscription URLs as confidential: anyone who has one may be able to retrieve your configuration list. Before sharing screenshots, logs, or problem reports, remove tokens, query parameters, and account details from URLs. Include only the protocol and error type so you do not expose a working configuration.

For the first update, keep all entries and confirm that labels, protocols, and transport settings are generated correctly. Test a known working configuration before adding filters. This helps distinguish a subscription parsing problem from a filter that matches nothing. Avoid changing the subscription URL and filter expression at the same time; if the list comes back empty, you will not know which change caused it.

Start with Simple Filter Keywords

Server filters usually match label text; they do not identify a server’s actual geographic location. Copy a distinctive word from a server label, save it as the only filter condition, update the group, and check which entries remain. Case, spaces, full-width punctuation, and changes to labels made by the provider can all affect matching. A location in a server label does not guarantee that the connection exits from that location.

Filter fields vary across clients and versions: some accept plain keywords, others regular expressions, and separators for multiple keywords may differ. Use the example below only when the field explicitly supports regular expressions. The vertical bar means “or”; it does not set priority. If the field accepts plain text only, test each keyword separately instead of assuming it will understand regex syntax.

(?i)(Work|Backup)

This expression matches “Work” or “Backup” in a label when the field supports the corresponding regex syntax; it does not affect routing. Keep a local copy of the original expression. Before changing it, clear the old condition and enter one new condition at a time. Add exclusions, parentheses, and more complex combinations gradually, updating the group after each change. Check one entry that should remain and one that should be excluded.

Troubleshoot an Empty Update, One Layer at a Time

First, temporarily clear the filter and update the same group again. If entries return, the problem is the matching logic or changed labels. If the list is still empty, check whether the subscription URL has expired or returns a login or error page. Opening a URL in a browser does not mean the client receives a parseable subscription. Some URLs require a specific response format; a web page cannot be used as the subscription body.

Updating a subscription usually regenerates its entries, so manually edited labels or connection parameters may not survive. For configurations that must remain unchanged, copy them into separate local entries and note their source; you will then need to keep their server parameters in sync yourself. See How to Import Subscription Links for import methods and formats, and Filtering Multiple Subscription Groups for keyword examples.

Routing Rules & Match Order

Routing rules determine which outbound handles a connection that has already reached the core. They do not make an app use the proxy automatically, nor can they fix an unavailable server. Before working with routes, distinguish the entry point, match criteria, and outbound: the entry receives connections, criteria check domains, destination IPs, or ports, and the outbound connects directly, through a proxy, or blocks traffic. If an app never reaches the entry point, even a complete set of rules has no effect.

Check the Tags in the Generated Configuration

v2rayN and v2rayNG provide routing settings for editing rules and presets through a graphical interface. Before editing, check the active configuration or runtime logs to confirm the actual tags for proxy, direct, and block outbounds. The example assumes outbounds tagged proxy, direct, and block. These are readable labels, not proof that your client uses those exact tags.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["full:blocked.example"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": ["domain:example.com", "geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private", "geoip:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

This routing snippet illustrates rule order; it is not a complete client configuration. Replace the example domains with domains used by your services, and make sure the referenced rule sets are available. Rules are checked from top to bottom, and the first match determines the route. The final catch-all rule handles all remaining TCP and UDP traffic, so it must not precede specific rules; otherwise, later domain and IP conditions will never be checked.

Know the Limits of Domain and IP Conditions

full: matches an exact domain; domain: matches a domain and its subdomains; geosite: references a domain set; and geoip: references an IP set. When a rule includes both a domain and a port, a connection usually has to match both conditions—not either one. To route “this domain or this IP” directly, create two separate rules.

domainStrategy controls whether the routing stage resolves domains for matching. AsIs uses the original destination where possible; IPIfNonMatch attempts resolution and then checks IP rules if no domain rule matches; IPOnDemand may trigger resolution when a rule requires an IP check. This is not a DNS server list, and it does not guarantee that the core will handle lookups performed directly by an app.

When a domain resolves to a shared service IP, IP-based classification alone may send different services through the same outbound. For services that need precise routing, use specific domain rules and place them before broader rules. Software may depend on multiple domains for sign-in, images, verification, and updates, so adding only the main site may not be enough. Use connection logs to identify dependencies instead of routing all traffic through a broader rule.

Sniffing & LAN Rules

Enable traffic sniffing to try to recover domain information from supported connection content and route by domain. It cannot identify every protocol or decrypt encrypted content. A connection made only to an IP address may not yield a domain. If an app behaves unexpectedly after sniffing is enabled, check how sniffing overrides the destination, then revert that setting on its own. Changing DNS and routing at the same time makes the cause harder to identify.

Direct LAN access usually requires private IP rules, and may also depend on the client’s Bypass LAN setting, system routes, and TUN exclusions. A direct rule in the core does not guarantee that all LAN traffic bypasses the virtual interface. Do not route private address ranges through a remote server without a specific reason. Configure enterprise network domains and addresses to match the actual network plan, especially when remote and local private ranges overlap.

For verification, keep the same server selected and test an exact domain, a categorized domain, and an unmatched destination in turn. Check the outbound tag in the logs. If edits have no effect, confirm that the modified routing profile is active and whether the connection needs to be restarted. If a category data set is missing, fix the loading error rather than blindly adding a broader direct rule. For basic concepts, see the Help Center.

DNS Setup & Resolution Paths

DNS problems are often mistaken for server failures. A visit usually begins by resolving the destination address and then establishing a connection, but the browser, operating system, and proxy core may each perform lookups. Changing the DNS address in a client only affects requests that the client actually handles. First find out which component receives the domain, then choose a resolver, query strategy, and transport. Do not simply enter the same address in every DNS field.

Distinguish the Three Resolution Paths

First, an app uses the system resolver and passes the destination IP to the proxy. Second, it passes the domain to a local proxy, which resolves it in the core or remotely. Third, the app uses encrypted DNS itself, making the lookup look like an ordinary encrypted connection. All three paths can coexist on one device. If one browser works but another app does not, that alone does not prove the client’s DNS setup is right or wrong overall.

Configuration LayerPrimary RoleWhere to Check
App & System DNSResolves names before traffic reaches the proxyApp network settings; system network settings
Core DNSResolves names for routing decisions and specified requestsClient DNS settings; generated configuration
TUN DNS CapturePasses specified DNS requests to a handling componentTUN settings, virtual interface, and logs

v2rayN provides DNS settings in its settings pages, while TUN DNS may be configured separately. In v2rayNG, check DNS settings, VPN mode, and the FakeDNS toggle together. v2flyNG uses the v2fly core, so do not copy Xray-specific fields without checking compatibility. Even when option names look alike, use the generated configuration and confirm that the core accepts it.

Set Up Basic Resolution First

Start with FakeDNS off and verify that ordinary DNS works and the server address resolves. A startup dependency can arise if the server address is a domain and the encrypted DNS used to resolve it must itself go through a proxy that has not started yet. Provide a reachable baseline resolver for the server domain or use a connection address explicitly supplied by the provider, while keeping the TLS hostname and SNI correct.

{
  "dns": {
    "hosts": {
      "resolver.home.arpa": "192.168.1.53"
    },
    "servers": [
      {
        "address": "192.168.1.53",
        "domains": ["domain:home.arpa"]
      },
      "1.1.1.1"
    ],
    "queryStrategy": "UseIP"
  }
}

This is a classic DNS configuration snippet. Replace the home resolver address with one that exists on your network and is reachable; home.arpa is intended for home-network naming. The example shows how specific domains and general queries can be handled separately; it does not mean the server array is a strict, sequential failover list. Matching, fallback, and parallel-query behavior depend on the core and additional options, so verify them in the logs.

Handle Address Families & Encrypted DNS

The query strategy determines which address families are returned. Having an IPv6 address on your device does not mean the current server, remote exit, and destination all have working IPv6 connectivity. If only some sites take a long time to load, temporarily query IPv4 only as a comparison. Once you identify the issue, fix the IPv6 route or exit capability. Disabling an address family permanently is not a universal fix for DNS problems.

Encrypted DNS requires you to consider initial resolution of the resolver’s hostname, certificate validation, and connection routing together. If the resolver goes through the proxy, check how the server hostname resolves before the proxy starts. If it goes direct, confirm that your local network can reach it. Changing DNS transport does not change the outbound used by application traffic; routing app traffic through a proxy does not mean all DNS requests follow the same path.

Test with a known, valid fully qualified domain name. Check whether it resolves, which address family it returns, and which outbound handles the subsequent connection. If resolution succeeds but TLS fails, check the system clock, SNI, and certificate rather than cycling through resolvers. For related issues, see TLS Handshake and Certificate Troubleshooting. For internal domains, first check the designated resolver and private-network routes instead of repeatedly retrying through a public resolver.

TUN Mode & Traffic Capture Scope

TUN receives IP traffic through a virtual network interface and is useful for apps that ignore system proxy settings. It is not a different server protocol, and it does not guarantee that every app will work correctly. First verify that ordinary proxy mode works, then enable virtual-interface capture. This separates server availability from system routing problems. On desktop, start with an existing v2rayN configuration; do not treat TUN as a random switch to try when a connection fails.

Desktop TUN & Android VPN Mode

v2rayN’s system proxy is intended for apps that honor proxy settings; TUN captures traffic at the network-interface level and covers more traffic. They are not interchangeable. On Android, v2rayNG uses the system VPN service to receive app traffic. Its settings may include VPN mode and proxy-only mode. Proxy-only mode usually requires apps to connect to a local listening port themselves; it does not make the whole device use that entry automatically.

When enabling desktop TUN, the client may require administrator privileges or system network authorization. First confirm that the system allows a virtual interface to be created, then check the logs for a successful startup. On Windows, check permissions and security software that may block network traffic. On macOS, check system authorization and leftover proxy settings. On Linux, check interface creation permissions and route changes. Do not disable all security controls to troubleshoot; address only blocks supported by the logs.

The first time v2rayNG connects, Android displays a system VPN authorization prompt. Verify the app name before approving it. Other VPN tools may compete for traffic capture, and background restrictions can interrupt the service. If the connection stops after switching apps, first check battery optimization, background permissions, and whether another network tool has taken over. Do not keep changing server transport settings without evidence.

Check Routing and DNS in Order

Before starting TUN, note the default network interface, existing system proxy, and other running network tools. After startup, confirm that the virtual interface appears, routes are installed, and the server connection is not sent back into that interface. The remote server connection needs a valid route out. If it is captured again and again, a routing loop may form, leaving the whole device offline or causing repeated connection attempts in the logs.

TUN DNS capture and core DNS settings may be handled by different components. First verify that ordinary domains resolve, then test an IP destination and LAN resources. If domains fail but IP traffic works, focus on DNS. If both fail, check the interface, default route, and outbound connection first. Do not enable FakeDNS while the virtual interface is still broken; that adds another address-mapping variable.

Traffic Entry MethodRequirements for CoverageCommon Limitations
System ProxyApps read system proxy settings or are configured manuallySome apps ignore these settings
Desktop TUNInterface permissions, routing, and DNS must work togetherRouting loops, subnet conflicts, and UDP support
Android VPN ModeSystem authorization and app capture scope must be correctPer-app selection and background restrictions

Per-App Proxy & LAN Access

v2rayNG’s per-app proxy setting controls which apps are included in VPN capture. First check whether the screen is set to proxy only selected apps or bypass selected apps, then choose the apps accordingly. Do not infer the setting’s meaning from the checkmarks alone. Save, restart the connection, and fully close and reopen the test app; existing connections may continue using the old route.

On desktop, per-process routing may be provided by the TUN implementation. Do not assume that adding a process name to a classic V2Ray routing rule will work. For app-specific handling, use an option the current client explicitly supports, and account for child processes and updaters. Excluding an app from traffic capture is a different layer from routing its domain directly: the former may keep traffic out of the core entirely, while the latter selects a direct outbound after traffic enters.

If LAN printers, shared folders, or internal services stop working, first check Bypass LAN and excluded subnets. If a work network and home network use overlapping private IP ranges, configure specific destinations instead of routing every private range remotely. After disabling TUN, confirm that system routes and proxy settings have been restored before testing again. For installation and permissions, see the Client Downloads page and macOS Installation and Authorization Guide.

FakeDNS & Virtual Address Mapping

FakeDNS does not return the destination server’s real address to the app. Instead, it assigns an internal virtual address and stores a mapping to the domain. When the app connects to that address, the traffic-capture component must recover the domain and apply routing and outbound rules. The point is to preserve domain information, not to make the virtual address reachable on an ordinary network. Outside the mapping environment, the address usually has no meaning as a destination.

Meet All Traffic-Capture Requirements

For FakeDNS to work, DNS queries must enter its processing path, and connections to the virtual addresses must be captured by the same traffic-handling setup. If only one part works, resolution may succeed while connections fail. A browser using encrypted DNS on its own may bypass FakeDNS. An app with a cached address may keep using a real IP, making behavior appear inconsistent across the same device.

In v2rayNG, check Enable FakeDNS alongside VPN mode, DNS settings, and sniffing options. A graphical toggle may generate several core settings, so comparing one boolean value is not enough. v2rayN’s TUN DNS may use a similar mechanism in its traffic-capture component, but its configuration fields and state may differ from those in the Xray core. Do not paste a snippet from one client into another without checking compatibility.

v2flyNG uses the v2fly core, so confirm supported features in the current interface and by checking whether the configuration parses. If you encounter an unknown field, use the configuration structure supported by that core rather than dismissing the warning and continuing. The client, interface toggle, and core configuration are separate layers. A feature with the same name does not guarantee compatible fields, especially when moving DNS settings between clients.

How the Mapping Pool and Sniffing Work Together

{
  "fakedns": [
    {
      "ipPool": "198.18.0.0/15",
      "poolSize": 65535
    }
  ]
}

This shows only a mapping-pool snippet from an Xray configuration that supports this structure; it is not a complete FakeDNS setup. DNS must also use FakeDNS, the relevant inbound must recover the domain, and the virtual address range must be captured. ipPool sets the allocation range, while poolSize sets the mapping capacity; neither represents the number of servers or network performance. Prefer a compatible configuration generated by the client. Do not add this snippet alone and start testing.

The mapping range must not overlap with your current network or other virtual networks. Corporate lab networks and other tunnel tools may already use the same range, so plan around any conflicts. Do not add the virtual address pool to the traffic-capture bypass list, or app connections will go directly onto the ordinary network. Do not treat the range as a real destination in a remote direct-routing policy either; the mapping must be resolved at the correct local processing layer.

Traffic sniffing and FakeDNS can work together, but they do different things. Standard sniffing tries to recover a domain from connection content; FakeDNS recovery relies on an existing mapping. If that mapping is gone when a connection arrives, ordinary sniffing may not be enough to recover the domain. A client restart, an evicted mapping, or out-of-sync components can leave an app holding a virtual address with no corresponding domain.

When to Use FakeDNS & How to Recover

FakeDNS may be worth testing after the basic connection works if you need reliable domain-based routing and the entry point usually sees only IP addresses. Apps that connect to fixed IPs, discover LAN devices, or validate DNS results may not work well with it. For those apps, consider explicit traffic-capture exclusions or ordinary DNS instead of changing more global settings without a specific reason.

After enabling FakeDNS, test a regular web page, then sign-in, media, and background services. If only some apps fail, note whether they use their own encrypted DNS, connect to fixed IPs, or were already running when FakeDNS was enabled. Fully close the app and retry. If the issue persists, disable FakeDNS without changing anything else and test the same destination to determine whether address mapping is the cause.

When reporting a problem, share only the domain, traffic-capture mode, and outbound tag; there is no need to publish your full configuration. If disabling FakeDNS fixes the issue and enabling it brings it back reliably, check DNS capture, address-pool routing, and mapping recovery. If both modes fail, return to server connectivity and ordinary DNS rather than adjusting unrelated FakeDNS settings.

Managing Multiple Subscriptions & Update Policies

With multiple subscriptions, the challenge is not importing them but keeping track of their sources, purposes, and changes after updates. Create a separate group for each source, then note its purpose in the label or a local record. Avoid combining every link into one list with no clear source. When a URL expires, its format changes, or entries are withdrawn, separate groups make it easier to find the impact and keep other working configurations.

Separate Sources, Server Selection, and Routing

Subscription groups manage sources, the currently selected server determines the proxy exit, and routing rules decide which connections use that exit. Keep these roles distinct. A configuration in a “Work” group does not automatically route work apps through it, and changing the group filter may not change the active server. After making a change, check the current selection on the main screen rather than just the group shown in the list.

When organizing subscriptions, record each source’s type, group name, filter criteria, and method for verifying that it works. Keep the record local rather than including it in public screenshots. A simple table can list which services to test after a manual update, but do not put subscription tokens or connection passwords in a shared document. If source credentials are exposed, replace them using the provider’s supported process; renaming the group does not secure them.

Manage local entries separately from subscription-generated entries. Local entries are useful for parameters you need to maintain manually; subscription entries are designed to update with their source. After copying an entry, note who is responsible for maintaining it: if the subscription server changes its port, authentication, or TLS settings, the local copy usually will not update. Otherwise, the list can fill with configurations that look identical but have different parameters.

Update Manually Before Enabling Automatic Updates

Run a manual update for each group first. Confirm network access, successful parsing, and the expected filter results. Then set automatic updates based on how often the source changes; if the current interface offers no such option, keep updating manually. Android background restrictions may delay scheduled tasks, and automatic updates do not mean the client will switch servers immediately when a connection fails. Treat these as separate issues.

Some clients let you choose whether subscription updates use the current proxy. When the existing connection works, test fetching subscriptions through it. On first startup or when the current server is down, confirm that another update path is available. Do not make every source depend on the same failed outbound. Keep one independently usable configuration before changing update settings so that update and connection requirements do not lock each other out.

After an update, check whether the current selection is still valid. A source may rename, remove, or replace entries; the client may select a replacement or retain a reference to an entry that no longer works. Keeping a familiar label does not guarantee that it still points to the same server. Before testing important services, check the actual connection parameters and outbound in the logs instead of relying on the entry’s previous position in the list.

Handle Duplicate Names, Entries, and Format Changes

Different sources may use the same label, and the same server may appear more than once under different labels. Duplicate labels do not mean the parameters match; identical parameters do not mean the sources have the same update lifecycle. Before removing anything, compare the address, port, protocol, transport, and TLS settings, then decide whether to keep a local copy. Do not bulk-delete by name alone; you could remove a valid configuration used for another purpose.

Set and verify filters separately for each group. If a source changes its naming scheme, existing keywords may stop matching every entry while another source continues to work. Temporarily clear the filter for the affected group; there is no need to reset all client settings. If the source changes its response format, ask the provider for the subscription URL intended for your client rather than repeatedly importing web page content.

When moving to a new device, migrate the group structure first, then update and test each group. Do not immediately overwrite all DNS, routing, and traffic-capture settings. Subscription contents usually do not replace local policies in full. Keep working configurations on the old device until the new one is verified, then clean up exported files. For downloads and architecture choices, start at the Downloads page. Review your process with Practical Server Keyword Filtering.

Custom Outbounds & Configuration Boundaries

An outbound defines how a connection leaves the core. Direct, proxy, and block are common outbound types; routing rules refer to them by tag. Custom outbounds are for specific needs, such as a fixed exit or unusual topology, and should not be the starting point for a first-time setup. First verify a connection with a standard server entry in v2rayN or v2rayNG. This reduces conflicts between configuration generated by the GUI and configuration you write yourself.

Know Which Configuration Layer Accepts the Snippet

Clients may offer server editing, custom configuration, routing editors, or extra configuration fields. These inputs accept different formats: some require complete JSON, others take just an object or array. Before pasting, read the field instructions and inspect the generated configuration after saving. A full configuration includes inbounds, outbounds, routing, and other sections. Running a snippet that contains only outbounds as a complete configuration may leave apps with no inbound to connect to.

{
  "outbounds": [
    {
      "tag": "local-egress",
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 10810
          }
        ]
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "rules": [
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "local-egress"
      }
    ]
  }
}

The example sends a specified domain to a SOCKS service already running on the local machine; the rest depends on the full configuration. It defines neither an inbound nor a remote server. Before using it, confirm that a service is listening on the example port. When merging the snippet into an existing configuration, preserve the default outbound order or explicitly add a final routing rule. In classic configurations, unmatched connections usually go to the first outbound, so changing its position can affect everything.

Check Tags, Ports, and Loops

tag is an internal reference name. Keep it unique and make sure it matches the outboundTag used by routing rules. Similar spelling does not make two tags the same. If you rename a tag, update every reference and restart the connection. If the configuration reports that an outbound does not exist, check the generated tags first rather than changing the server address. This is a configuration-structure error that occurs before any remote connection is attempted.

Local forwarding must not send an outbound back to its own inbound. For example, if the core accepts SOCKS requests on a port and sends outbound traffic back to that same port, it creates a loop. When chaining services, map the flow from app to inbound, core, next service, and remote endpoint, and confirm every listening address and port. For port conflicts, see How to Fix a Local Listening Port Conflict.

Listening on 127.0.0.1 allows access only from the same machine, which is suitable for local forwarding. Do not expose a listener on all interfaces just to fix a connection problem. If other devices on your LAN need access, configure authentication, access controls, and a firewall separately. A local address in a custom outbound refers to the device running the core, not the remote server. This is easy to misunderstand when copying configurations between devices.

UDP, TLS, & Differences Between Cores

Using SOCKS for the next hop does not guarantee that UDP will work. The inbound, core, next-hop service, and final server must all support the required forwarding; if any link does not, only TCP may work. A web page loading successfully does not prove every traffic path is functional. Test the protocols you actually need instead of using one successful page to judge the whole chain.

The TLS server name is used for certificate validation and the handshake. Do not clear it just because the connection address is an IP. If a configuration fails, check the actual service parameters instead of relying on certificate verification being disabled. When changing outbound protocols, review transport, authentication, and TLS fields together. Changing only the protocol name while keeping unrelated fields from the old structure is not a valid migration.

Xray and v2fly share some configuration concepts, but supported fields, protocol extensions, and defaults are not identical. When moving a custom configuration from v2rayNG to v2flyNG, first verify a minimal working setup, then add extensions one at a time. Subscription updates may also overwrite client-generated outbounds, so back up custom configuration separately and confirm that it is the active configuration—not another standard entry in the list.

Verify Configuration & Recover One Layer at a Time

The goal of verifying advanced settings is not to see whether a page loads once. You should be able to explain where a request enters, how its domain is resolved, which rule it matches, and which outbound handles it. Establish a minimal working baseline, then add subscription filters, routing, TUN, and FakeDNS one at a time. Keep a recoverable state at every step so you can narrow down problems instead of reinstalling the client.

Use a Consistent Test Set

A baseline should include one verified server, ordinary DNS, a simple routing rule, and a clearly defined traffic entry method. Choose a fully qualified domain you use regularly, a LAN resource, and a service that requires the proxy as fixed test cases. Keep the device network and server unchanged during testing. If you switch Wi-Fi while changing resolvers, you cannot tell which change affected the result.

Before each change, note the original value, what you plan to change, and the expected result. For example, after adding an exact-domain direct rule, expect the outbound tag in the logs to change—not just a vague improvement in “stability.” Save, restart the connection, close the test app’s existing connections, and try again. For subscriptions, first verify that entries are generated; for TUN, check the interface and routes; for FakeDNS, confirm that virtual addresses can be resolved back to domains.

Observed SymptomCheck FirstControl Test
Subscription update returns no entriesFilter criteria, URL, and response formatClear the current group’s filter and update manually
Domain resolves but connection failsOutbound, TLS, and destination portUse the baseline configuration for the same destination
Everything breaks after enabling TUNPermissions, system routes, and routing loopsDisable TUN and test with the regular proxy
Problems persist after disabling FakeDNSApp cache and stale virtual addressesRestart the connection and test app, then compare

Use Logs to Identify the Failing Stage

Configuration parsing errors usually occur at startup and involve fields, syntax, or tags. Listener failures often involve port conflicts or permissions. Timeouts after a connection attempt begins require checking the network and remote endpoint. Find the first error rather than copying repeated connection failures that follow it. If an earlier layer has not succeeded, later errors may only be symptoms; changing a later layer will not fix the cause.

Temporarily increasing log detail can help identify the destination and outbound, but do not leave verbose logging enabled. Logs may contain domains, addresses, and activity. Redact them before sharing. Check screenshots for subscription URLs, connection credentials, and full share links as well. After troubleshooting, restore your usual log level and remove temporary files you no longer need so sensitive configuration is not left in your Downloads folder or shared directories.

A single service may open several connections. If the main page loads but sign-in fails, a dependency domain may be following a different rule. Image failures may involve a resource domain, DNS result, or address family. Add and verify rules for the failed request instead of routing all traffic the same way after seeing one problem. If needed, briefly test a simpler routing setup for comparison, then restore your original policy.

Roll Back Changes in Reverse Order

If problems began after several changes, first undo the most recent one: disable the newly added FakeDNS, restore ordinary DNS, remove new routing rules, and finally disable TUN or VPN capture to return to the original entry method. Test the same cases after each rollback. Do not clear groups, delete servers, and reset system networking all at once; even if service returns, you will not know what caused the original issue.

If the network remains unavailable after stopping the client, check for leftover system proxy settings, virtual routes that were not restored, and other network tools that are still running. Do not immediately delete unknown interfaces or change system routes in bulk. Preserve the current state and identify what each item belongs to first. If only a browser is affected, check its own proxy and encrypted DNS settings. If only one app fails, check per-app capture and its network options.

To retrace the setup, return to the Quick Start Guide and repeat the import, mode, connection, and verification steps. For a specific symptom, use the Help Center. Choose an installation package on the Downloads page. The snippets in this guide explain individual configuration layers; they are not complete configurations. Before using one in your environment, check the client, core, and generated configuration structure.