Configuration Guides / Desktop & Android Clients

Advanced V2Ray Configuration
Routing, DNS & TUN

Follow each configuration layer from subscription source to final outbound.

New to V2Ray? Start with the Getting Started guide to import a profile, connect and verify it. This page covers fine-tuning an existing working connection. Use v2rayN on desktop; on Android, choose v2rayNG or v2flyNG based on your preferred core. See the client page for downloads and architecture details.

  • Subscriptions & Filters
  • Rule Order
  • DNS & Traffic Capture
  • Configuration Rollback

01 / Configuration Sources

Subscription Groups & Server Filters

What Groups Do—and Don't Do

Subscription groups organize configuration sources; they don't route traffic. A group typically stores a subscription URL, update options and the server entries generated from that source. Moving a server into a group won't automatically route particular websites through it. The active connection and routing rules determine which outbound a site uses. Keep these roles separate to avoid mistaking list organization for network policy.

In v2rayN, open subscription group management, create a clearly named group, then enter the subscription URL provided by the source. Name groups by purpose or source—for example, “Everyday” and “Backup”—rather than using hard-to-distinguish initials. Save the group, update it, then check the server list to confirm the imported entries. Menu locations vary between versions, so look for the feature by name and description.

Subscription URLs often contain access credentials, so treat them like account details. Hide the URL and QR code before sharing screenshots, and never paste the full link into public logs. A URL opening in a browser doesn't guarantee that it returns data the client can use. A login page, notice or converted response may be downloaded as plain text, leaving the update marked as complete but no usable entries in the list.

Filter Servers

Filters can narrow the visible list or control which entries are kept after an update, but their scope varies by client. Some affect only what's displayed; others exclude entries during subscription parsing. Start with a simple name keyword and verify how the filter works: note what appears before, save the condition, update the group, then clear the filter and check again. Combine conditions only after you understand their effect.

If the input explicitly supports regular expressions, use the pattern below to match either of two purpose words in a name. The pipe means “or,” and parentheses group alternatives. Pasting a regex into a plain-text search field won't have the same effect. Names come from the subscription source and may change; region abbreviations, rate labels and protocol names aren't consistently formatted, so keep filters broad.

Name Filter · Regex Example
(Daily|Backup)

First check whether the filter is set to include matches or exclude them. The same expression produces opposite results in each mode. If the list is empty, don't reinstall the client. Clear the filter, select all groups, remove any search term, then update a single source. If the entries reappear, the issue is with display or filtering—not the server connection settings.

Updates & Manual Changes

Subscription entries are usually regenerated from remote data. Direct edits to an entry's address, port or transport settings may be overwritten on the next update. For changes you need to keep, copy the entry into a separate manual profile with a distinct name, and note when and why you made the copy. This preserves the original subscription entry while making it clear which profile is no longer managed by the source.

On Android, manage subscriptions from v2rayNG and v2flyNG by source as well. Importing a QR code is useful for a single profile; importing a subscription is for ongoing batch updates. These are different data relationships. When moving from another device, identify whether the export contains a single connection, a subscription URL or the app's complete settings, then use the matching import option. Don't keep trying unrelated formats.

If an update fails, keep your existing working entries and check the system clock, whether the subscription has expired, and whether the update request requires an existing proxy. Some clients can update through the active proxy; others use a direct connection. Start with one group and a network path that you know is reachable, then consider automatic updates after it succeeds. Don't make every source depend on an untested connection.

Once the list is organized, choose one profile as a test baseline and leave automatic switching and complex filters off for now. Confirm the connection works with the standard system proxy before moving on to routing and DNS. Source management answers “Where did this profile come from?”; connection testing answers “Does it work?” Track these checks separately to narrow down later issues.

02 / Matching & Outbounds

Routing Rules in Practice

Match Conditions & Rule Order

Routing rules are checked in order, and the first match determines the outbound. Put specific exceptions before broad rules and keep the fallback last. If a rule sends all ports through the proxy first, a later rule for direct access to private addresses will never run. Before editing, list what should connect directly, use the proxy or be blocked, then translate that list into ordered rules.

Within a single rule, conditions of different types usually all have to match; multiple entries in the same domain array usually mean any one can match. For example, specifying both a domain and a port means traffic must match that domain and use that port—not the domain or the port. To make either condition match independently, use two rules. Misunderstanding how conditions combine can be harder to spot than a typo.

Common domain patterns include full:example.com for an exact domain and domain:example.com for that domain and its subdomains. Plain strings and regex patterns match more broadly and can catch similarly named targets. Use an exact domain for a specific exception rather than starting with a loose keyword. A domain doesn't include a protocol, path or URL parameters.

Minimal Split-Routing Example

This example shows direct routing for private addresses and common mainland China domains and IP ranges, with other TCP and UDP traffic sent through a proxy. Merge the object into the main configuration's routing section. It requires usable Geo data files and assumes outbounds named direct and proxy already exist. Tags are references, not connections the configuration creates automatically.

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

IPIfNonMatch lets the core try resolving a domain and continue checking IP rules when no domain rule matches. It doesn't guarantee that every app request includes a domain, or that the final outbound uses the result of that lookup. If a request contains only a destination IP, domain rules may not apply. Restoring domain information may require inbound sniffing or another mechanism; adding more domains alone won't solve it.

Geo rules depend on the data files and how they classify destinations. A service may use multiple domains, content delivery addresses and third-party resources, so direct access to its homepage doesn't mean all its traffic goes direct. To add an exception for a service, inspect the actual request destinations and add only the domains you need. Don't put entire public cloud ranges on the direct list; that can broaden the policy far beyond the intended service.

Verify Routing Rules

Test TargetExpected ResultCheck First
LAN deviceReachable through the direct outboundPrivate-address rules and local routing
Specific domain exceptionMatched to the intended tagDomain pattern and rule order
Unlisted, ordinary destinationSent to the fallback outboundLast rule and tag

Change one set of rules at a time and compare results with the same test target. Browser caches, reused connections and background app processes can keep old connections alive. After saving, restart the core and close the app's existing connections. In the logs, check the destination domain, destination address and outbound tag. A successful connection alone doesn't prove that the expected rule matched.

Blocking ad categories can be a standalone rule near the top, but broad categories aren't suitable for every resource. If enabling one breaks sign-in, payments or CAPTCHA, disable that rule and test again, then add exceptions for necessary domains above it. Blocking requires an existing block outbound, usually using the blackhole protocol. Adding a tag named block won't make it work on its own.

Also distinguish system proxy mode from core routing mode. The system proxy determines whether an app sends requests to the client; core routing determines how the client forwards requests it receives. Traffic that never reaches the client isn't handled by these rules. See System Proxy and Routing Modes Explained for how the layers relate. When troubleshooting, confirm the traffic entry point first.

03 / Name Resolution

DNS Configuration

The DNS Resolution Path

Start DNS tuning by making the query path consistent, then consider response speed. A single connection may involve the system resolver, a browser's encrypted DNS, client-side DNS and resolution by a remote server. To know whether a change helped, identify who sends the query, which outbound it uses and who consumes the result. Changing one server address alone rarely controls the entire resolution path.

A system proxy mainly forwards requests from apps that follow proxy settings; it doesn't necessarily capture system DNS. A browser may send a domain to the proxy or resolve it locally first. Other programs may contact a fixed DNS address directly. So adding a DNS server in the client doesn't mean every query on the device will use it. Check browser settings, system network settings and the scope of the client's DNS capture separately.

Choose remote or direct DNS according to your routing goals. For direct destinations, a resolver reachable on the current network is often appropriate. For proxied destinations, confirm that DNS requests follow the intended path. If an encrypted DNS server is specified by hostname, that hostname must be resolved first. This bootstrap lookup can create a dependency loop if it relies on the resolver it's trying to reach.

Core DNS Example

This is a partial dns object for the main configuration. It directs mainland China domains to a specified server and uses a DoH address for other queries. The example illustrates how to assign resolvers by domain; it isn't suitable for every network. Verify which outbound carries DoH requests with the specific core and configuration in use. Don't assume they use a proxy just because of the address prefix.

Main Config · dns
{
  "dns": {
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "domains": ["geosite:cn"]
      },
      "https://1.1.1.1/dns-query"
    ]
  }
}

domains specifies which domains should preferentially use a server, but what happens after a failed query also depends on fallback options and the core implementation. It isn't a strict network isolation policy. To ensure a class of queries never reaches another resolver, check the fallback fields and failure behavior supported by your core, then verify the actual network path. Don't rely on this snippet alone.

Here, queryStrategy limits the core's DNS query strategy. It doesn't disable IPv6 in the operating system or stop every app from making its own queries. Choosing IPv4 can help isolate dual-stack issues, but it's not a general speed boost. If your network and server handle IPv6 correctly, test it separately before deciding whether to keep IPv4-only settings. Don't hide a problem indefinitely.

Caching & Layered Testing

After changing DNS settings, old results may remain cached by the system, browser, app or core. Close the target app and restart the client, then flush caches using the method provided by your system. Compare results for the same domain and note the resolved address and actual connection address. Reloading a page once doesn't prove the new settings took effect: resources may be cached locally or use a reused connection.

If an address works but its domain doesn't, start with DNS. If the domain resolves but the connection fails, check routing and the remote connection next. A successful lookup only means an address was returned; it doesn't mean that address suits the current network path. Some services return different endpoints based on the resolver's location. Sending a direct-resolved address through a remote outbound can cause unnecessary detours or connection failures.

If only the browser is affected, temporarily turn off its custom Secure DNS and test again with system settings. If only one app has a problem, check whether it uses its own resolver or a fixed address. Decide on the final policy after testing. Temporarily disabling a setting helps narrow down the issue; it isn't a recommendation to use one DNS setup on every network.

Client form fields such as “Remote DNS” and “Direct DNS” may be converted by the configuration generator into multiple core objects. Prefer configuring DNS through the same set of form fields rather than adding a conflicting setup in custom JSON. If you need manual changes, inspect the generated file for duplicate objects and overrides, then document the working changes separately.

04 / Traffic Entry

TUN Mode

System Proxy & Virtual Network Interfaces

TUN mode uses a virtual network interface to send IP traffic selected by routing rules into the processing chain. It's useful for apps that don't follow system proxy settings. TUN addresses traffic capture; it doesn't fix the remote server, protocol parameters or DNS configuration. If a standard system proxy connection doesn't work yet, fix that first. Enabling TUN at the same time adds more possible failure points.

v2rayN's TUN feature may be implemented by a separate networking component managed by the client. Don't assume the TUN option in the interface adds a fixed field to the Xray main configuration. The actual traffic entry, routing and DNS capture depend on the component in use. Before editing configuration manually, identify which component owns the file and don't mix fields from different implementations in one JSON object.

On Android, v2rayNG and v2flyNG capture traffic through the system VPN interface and require approval for the connection request. The VPN icon in the status bar means the interface is up, not that the remote connection works. Desktop and Android differ in how traffic enters, permissions and app filtering. Don't copy a platform's exact toggle settings to another; carry over routing goals and testing methods instead.

Enablement Order & Permissions

Before enabling TUN, save a working configuration and turn off other network tools that modify the default route. Grant the client only the permissions it requires. Desktop systems may need administrator privileges, a background service or a virtual network interface component; follow the client's prompts. Don't leave security protections disabled just to pass one test. Identify the missing permission and use the authorization method supported by the client.

For the first test, keep settings to a minimum: one verified remote connection, simple routing and a clearly defined DNS path. After startup, check that the virtual interface appears, the expected routes are present and ordinary apps can reach their destinations. If the system proxy works but TUN doesn't, focus on the entry component, permissions and route capture—not on importing all your subscriptions again.

PlatformCheckCommon Conflicts
WindowsPermissions, virtual interface and route priorityOther virtual interfaces and security software policies
macOS / LinuxService permissions, interface and DNS statusSystem network manager or existing tunnel
AndroidVPN approval, app scope and background operationAnother VPN service using the system interface

Routing Loops & LAN Access

The client-to-server connection must avoid being captured by the client's own TUN again, or it may loop. Automatic routing usually adds safeguards or exceptions for outbound traffic, but manually adding routes can break them. If all network access stops immediately after startup, turn off TUN and check whether access returns. Then inspect the server route and default route rather than adding more global rules.

Test access to LAN printers, shared folders and admin pages separately. A direct rule for private addresses only controls traffic that reaches the core; the operating system's routes determine whether that traffic enters the virtual interface at all. If LAN access fails, check both layers: whether the system has a valid LAN route and whether the client selects the direct outbound for traffic it receives.

UDP, real-time communication and some game traffic also depend on server support, network restrictions and the TUN component. A website working while one app fails doesn't prove that the whole mode is broken. Check the app's transport type and whether app filtering excludes it, then verify that the outbound supports what it needs. Test the actual app instead of relying on a single website.

MTU determines the maximum packet size sent through the virtual interface. Consider it during troubleshooting only if specific sites hang, large requests fail or a connection stalls after setup. Start with the client's default and note any changes in behavior. Don't blindly copy a fixed value from online: the underlying network, tunnel encapsulation and route conditions all matter.

Decide whether to enable the system proxy alongside TUN only after testing each separately. Having both entry points active may work, but it makes the app's actual route harder to identify. During testing, use one entry point at a time; combine them only if your apps need it. Compare the mode selection guide to check global mode, mainland China bypass and traffic entry settings.

05 / Domain Mapping

FakeDNS

Virtual Addresses & Original Domains

FakeDNS returns a virtual address from a configured pool for a domain and keeps a mapping between the address and domain. When the app connects to that virtual address, the paired traffic entry restores the original domain and passes it to routing and the outbound. FakeDNS isn't a public resolver and doesn't give the destination website a new address. Its purpose is to preserve domain information and reduce the impact of local resolution on later routing decisions.

This mechanism requires DNS queries and connections to follow the same controlled path. If only the DNS query goes through FakeDNS and the subsequent connection bypasses the client, the app will try to reach an address that isn't the real server. Conversely, if the connection reaches the client but the browser resolves the domain using its own encrypted DNS, the client may never create a mapping and can't restore the domain as expected.

Don't treat FakeDNS as an ordinary DNS server address to enter in system settings. First confirm that the client and traffic entry component explicitly support the relevant mode, then configure DNS capture, address-pool routing and mapping restoration using the same implementation. The TUN component managed by v2rayN may use its own virtual address mechanism. Similar feature names don't mean you should enable a second, core-level FakeDNS setup as well.

Xray Partial Configuration

This example shows three related layers in Xray: the top-level address pool, the DNS server list and a sniffing object to merge into the target inbound. The pool uses a reserved benchmarking address range, not public destination addresses. This snippet doesn't create a transparent inbound or add system routes; without those requirements, copying it won't enable FakeDNS across the device.

Main Config · Address Pool & DNS
{
  "fakedns": [
    {
      "ipPool": "198.18.0.0/15",
      "poolSize": 65535
    }
  ],
  "dns": {
    "servers": ["fakedns"]
  }
}
Target Inbound · Merge Sniffing
{
  "sniffing": {
    "enabled": true,
    "destOverride": ["fakedns"],
    "routeOnly": false
  }
}

ipPool defines the virtual address range, and poolSize sets the mapping pool capacity. Pool addresses are identifiers, not real remote destinations to send through a direct outbound. Before configuring the pool, check whether your LAN, other tunnels or test networks already use the same range. Overlapping addresses can send some connections to the wrong physical or virtual interface.

In destOverride, fakedns restores the destination from its mapping. This example explicitly sets routeOnly: false because restoring the domain only for routing while keeping the virtual address as the actual connection target wouldn't achieve the intended result. Regular HTTP or TLS sniffing and FakeDNS mapping are different mechanisms; don't treat them as interchangeable just because their field names look similar.

Compatibility & Troubleshooting

After enabling FakeDNS, check whether a regular domain resolves to an address in the configured pool, then verify that its connection is restored to the correct domain. If the result is still a real public address, check whether the query enters the intended DNS path. If you get a virtual address but the connection fails, check that traffic to the pool returns to the paired entry component and that it uses the same mapping state.

Some programs check address types locally, reject reserved addresses or pass resolved addresses to another device. FakeDNS may not suit these cases. LAN device discovery, services that require real addresses and certain network diagnostic tools may need real-DNS exceptions configured as the client supports. An exception must cover both DNS and routing; setting the virtual address range to direct alone isn't enough.

After a restart, the system or an app may still have an old virtual address cached even though the new process has a different mapping table. This can cause partial failures after restarting even if everything worked before. Clear relevant caches and restart the target app before deciding the configuration is wrong. Don't add old virtual addresses to permanent hosts entries or save them as fixed service addresses.

If ordinary DNS and domain sniffing already meet your routing needs, there's no reason to enable FakeDNS just to add more settings. It's for specific cases where domain information needs to be preserved, not a universal network optimization. Test it with one app, keep a configuration backup that's easy to restore, then expand use gradually if it helps.

06 / Sources & Lifecycle

Managing Multiple Subscriptions

Sources, Use Cases & Test Baselines

The goal of managing multiple subscriptions is to keep sources traceable and updates recoverable—not to combine every entry into one long list. Create a separate group for each source and note its purpose in the name or description. You can use different update schedules for everyday use, temporary testing and backup connections, but labels aren't guarantees of quality. Verify each source independently.

When adding a source, import it on its own and run one manual update before making it the default. Check that the client recognizes the protocol, server address and required transport fields, then test one profile. If the source returns a format your client doesn't support, request a compatible subscription format instead of importing multiple copies and hoping one works.

Entries with the same name from different sources aren't necessarily duplicates. The same display name may refer to different addresses, ports, transports or credentials; one address may also host multiple services. Compare actual connection parameters when deduplicating and preserve the source relationship. Deleting by name alone may remove a backup; merging by address alone may combine connections with different purposes.

Update Strategy

Automatic updates should come only after manual updates work reliably. Confirm a working update path for each group before setting a schedule. Frequent requests rarely help when the source hasn't changed and may trigger access limits. If your client supports group-level options, manage groups separately so one failing source doesn't block all updates or cause important profiles to disappear during bulk cleanup.

Before updating, note the source and key connection details of the current default profile. The remote source may rename, remove or replace entries, and the client's saved selection may change as a result. After updating, confirm the selected profile is still the one you expect, then test your most-used apps. An “Update successful” message usually confirms only that the download and parsing completed.

Include the network used for updates in your plan. If every subscription can be updated only through the current proxy, losing that connection may leave you without a way to get a replacement. Keep a verified, independent backup profile if possible, and label it clearly as not updating automatically. A backup needs periodic manual tests; an outdated entry in the list isn't a reliable fallback.

Details to RecordPurposeNotes
Source and group nameTrack update and format issuesDon't record the full sensitive URL
Update pathNote whether requests use a direct or proxied connectionTest before automating
Manual changesSeparate source data from local changesNote whether updates overwrite changes
Rollback configurationRestore the verified baseline connectionCheck regularly that it still works

Migration & Sensitive Data

When moving to a new device, export settings using the client's supported method and distinguish server profiles, subscription URLs and complete app settings. A full backup may contain account credentials, local listener addresses and custom routes; don't share it like an ordinary document. Note the settings you need before migrating, then check permissions and system integration on the new device. Copying data doesn't automatically copy all system state.

Moving between desktop and Android requires extra care around feature differences. Server connection parameters may be shared, but app filtering, VPN approval, TUN components and file paths aren't interchangeable. Import connection data first, then configure traffic entry and routing for the new platform. Copying an entire custom configuration without checking it can cause startup failures due to mismatched paths or component fields.

Before removing an old source, check that no default profile, rule or manual copy still depends on it. Save any profiles you need before deleting the subscription group, then check the list and active selection. If a subscription URL appeared in a public screenshot or error report, replace it through the source's account tools. Deleting the local group won't invalidate a URL that's already been exposed.

Treat subscription updates and server switching as separate actions. One updates configuration data; the other chooses the active connection. They don't need to happen together. If an app misbehaves after an automatic update, first check whether the default profile changed, then check whether its connection parameters changed. This avoids mistaking a remote entry change for a DNS or routing problem.

07 / Outbound Design

Custom Outbounds

Tags & Protocol Objects

An outbound defines how to establish the next connection after receiving traffic. outboundTag in a routing rule is only a reference; it must match the tag of an actual outbound object. Tags are case-sensitive, so use short names that clearly describe their purpose. A rule pointing to a missing tag won't create a connection automatically and may cause errors during startup checks or forwarding.

First distinguish client-generated outbounds from manually added ones. v2rayN usually generates a remote connection object from the selected server, and switching servers may recreate it. Direct edits to a temporary file may be lost on restart. Use the client's documented custom configuration option and confirm whether it merges with, replaces or takes over the main configuration.

This standalone example defines direct and blocked outbounds, plus one that forwards traffic to another SOCKS service on the local machine. It doesn't include remote server credentials. It assumes that service is listening at the specified address and isn't the current entry point. Check the listening port before copying this; forwarding traffic back into the same processing chain can create a loop.

Main Config · outbounds
{
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    },
    {
      "tag": "local-socks",
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 10810
          }
        ]
      }
    }
  ]
}

freedom means the core makes a direct connection from its current network context; it doesn't bypass every other networking tool on the machine. If the system's default route points to another tunnel, a direct outbound may still use that tunnel. To identify the actual path, check both operating system routes and client logs. A tag named direct doesn't prove that traffic uses the physical network.

blackhole discards matching traffic. A block outbound is useful for destinations that should never connect, but it shouldn't be a default patch for configuration mistakes. If a service fails, check whether it matched a blocking rule before changing anything else. Silent drops can cause long waits, so list and verify block rules separately during troubleshooting.

Connect Rules & Set the Default Outbound

The rule below routes a documentation example domain through the local SOCKS outbound. Add it before any broad fallback rule. The example domain is for syntax only; replace it with the target your use case requires. For a larger service, identify its actual request domains instead of routing every port through the local service and changing the path for unrelated apps.

{
  "type": "field",
  "domain": ["full:example.com"],
  "outboundTag": "local-socks"
}

When no rule matches, the core usually uses the default outbound, often related to the first item in the outbound array. The example above puts direct first, so replacing the original configuration with this snippet doesn't mean unmatched traffic will still use the proxy. Keep the existing remote outbound and set the fallback deliberately, or check the array order to ensure it matches your intended behavior.

Chaining Limitations

Forwarding traffic to a local service and chaining outbounds inside the core are different configuration approaches. The first connects to another listening port and lets that service handle the traffic. The second depends on chaining fields supported by a particular core. Field names and behavior vary between cores; don't copy transport settings from one implementation to another. Prefer a method the client explicitly supports and makes easy to inspect.

After adding another hop, test each segment separately. First verify the local SOCKS service, then confirm the core can connect to its port, and finally check that the routing rule matches. If each hop works on its own but the full chain fails, check where DNS is resolved, UDP support and any additional encapsulation requirements. Change one side at a time so you can identify what caused the result.

Once a custom outbound is stable, document its purpose, tag mapping and recovery steps. Keep sensitive connection settings in the protected client configuration, not in ordinary maintenance notes. Change only the rules you need day to day, rather than rewriting every outbound when a subscription changes. Keeping source management separate from outbound design makes updates and rollback easier to control.

08 / Compatibility & Verification

Protocols, Cores & Configuration Validation

Clients, Cores & Protocols

The client handles the interface, subscription management and system integration; the core parses configuration and handles connections. Project V is the starting point for this technology ecosystem. V2Fly and Xray are different core families. Both using JSON doesn't mean their fields are fully compatible. The capabilities of v2rayN depend on the selected component; v2rayNG uses Xray as its core, while v2flyNG targets the V2Fly core.

Choose a core based on server requirements, not its name. VMess and VLESS are protocol-layer concepts; TCP and WebSocket are transport options; TLS and REALITY are different secure connection mechanisms. Check the protocol, transport, security parameters and flow control as a set. The client must support what the server requires; you can't swap one element independently.

REALITY and XTLS Vision aren't generic speed-boost options that work with any configuration. They require compatible server parameters and core support, and correct fields alone don't guarantee a valid combination. If an existing profile won't connect, check the complete connection requirements from the server provider and confirm which core the client is using. See REALITY and XTLS Vision Explained for the technical details.

Configuration Generation & Field Compatibility

Before changing cores, keep the working configuration and note how client options map to the generated file. Some interfaces let you choose fields but then transform or ignore them based on the selected component; custom objects may instead be passed directly to the core. Check the generated output, startup logs and actual behavior to determine compatibility. A similarly named option in the interface isn't proof of support.

Validate configuration in this order: syntax, structure, then network behavior. Check JSON for trailing commas, unclosed quotes and duplicate keys first. Then verify the object containing each field, tag references and file paths. A successful startup means the core accepted the configuration, not that every rule behaves as intended. For more on core differences, see Xray vs. V2Fly Cores.

The choice of desktop UI framework doesn't replace the need to check core compatibility. The v2rayN desktop and classic WPF editions mainly differ in interface, platform and runtime requirements; protocol support still depends on the core and configuration in use. If only the interface has changed, look for an equivalent feature rather than changing a working protocol to match a tutorial screenshot. See Desktop vs. WPF Editions for help choosing a version.

Layer-by-Layer Verification & Rollback

Use a consistent verification order: test the remote connection with the standard system proxy, check private addresses and domain exceptions, verify the DNS path, then enable TUN and FakeDNS. After each new layer, test the same app and destination, and keep the previous working state. If something fails, you can roll back the last change instead of rebuilding the entire configuration.

Collect logs for the same failed request. Note the time, destination and entry point, then check nearby messages for DNS, routing and connection errors. Before sharing logs, hide server credentials, subscription URLs and unrelated browsing records. Posting large amounts of unrelated output can expose sensitive information and obscure the lines relevant to the issue.

Classify failures as specifically as possible. “Can't connect” could mean the core won't start, the entry point receives no traffic, DNS fails, the outbound can't connect, or the target app doesn't respond. Each case has a different place to check. If only one app is affected, compare the same destination in other apps. If the whole system is affected, check shared layers such as the interface, system proxy and default route.

A Rule Change Had No Effect—What Should I Check?

Confirm that you edited the configuration currently in use, then restart the core and close the app's old connections. Next, check whether the request reaches the client and which outbound it actually matches. Finally, look for an earlier broad rule that may be taking precedence over the new one.

The System Proxy Works, but TUN Doesn't. Should I Change Subscriptions?

Keep the verified connection. First check permissions, the virtual interface, outbound routing loops and DNS capture. Revisit the server configuration only if logs show that the remote connection itself is failing. Don't replace every source while troubleshooting a traffic entry problem.

The Core Won't Start After Switching. How Do I Recover?

Restore the original core and its matching configuration, then confirm the baseline works again. Check the new core's support for the protocol, transport and custom fields one by one, removing or rewriting incompatible parts. Changing only the core name while reusing an unchecked custom configuration isn't enough.

Keep two clearly named configurations: a working baseline with minimal settings and your current advanced setup. Record how they differ, when to use each and how to roll back—without copying sensitive information. After a network change, source update or component change, test the baseline connection first, then re-enable advanced features. A short, repeatable troubleshooting path makes future issues easier to diagnose.