Configuration layers and validation basics
The client interface, proxy core, and operating system network settings are three separate layers. v2rayN manages servers, subscriptions, and routing, then generates or launches the core configuration. The system proxy determines whether certain apps use the local proxy. TUN uses a virtual network interface to capture eligible traffic. Seeing that the client is running only confirms that a startup action completed; it does not validate DNS resolution, routing, or the remote connection at each stage.
Distinguish interface settings from native configuration
Standard server entries usually have their configuration generated by the client, so they can be adjusted in the interface. A custom configuration may be passed directly to a specified core, in which case some client routing, DNS, or port options may no longer affect the generated configuration. Before making changes, identify which type of entry you are using. Otherwise, the interface may save your changes while the active configuration remains unchanged. Do not edit temporary generated files directly; the client may regenerate them the next time you switch servers or restart.
The JSON examples in this guide mainly use Xray-style fields. Snippets labeled “merge into existing config” are not standalone configurations. v2rayNG commonly uses an Xray core, while v2flyNG follows the V2Fly core line; similar field names do not make their complete configurations interchangeable. v2rayN's TUN component may also run separately from the proxy core. Check the current component's DNS and routing syntax instead of applying proxy-core fields to the interception component.
| Layer | Primary role | Check first |
|---|---|---|
| Client management | Subscriptions, entries, and config generation | Current entry and selected configuration |
| Proxy core | Protocols, DNS, routing, and outbounds | Startup errors and active outbound tags |
| System network | System proxy, virtual interfaces, and routing | Proxy entry point and interface assignment |
Establish a reproducible baseline connection
Before you begin, save a working configuration and note the selected server, system proxy mode, local listening port, and routing setup. Do not include subscription URLs or credentials in public records. Turn off TUN and use one app known to follow the system proxy to access a test destination. Then check the client log for the corresponding connection. If the basic proxy is not working, adding FakeDNS, custom outbounds, or complex routing will only make the cause harder to isolate.
Do not rely on a single website for validation. Prepare a destination that should connect directly, one that should use the proxy, and a local or LAN service. For each, record whether it resolves, whether a connection is established, and which outbound appears in the log. Browser caches can hide DNS changes, and existing background connections may keep using the old route. After changing routing, start a new connection; if needed, fully close the test app before repeating the same checks.
Change one layer at a time
Recommended order: organize subscriptions, configure routing, adjust DNS, then enable TUN and FakeDNS. After each change, check the startup log and run the same set of connection tests. If something breaks, undo only the most recent change rather than switching off several options at once. This keeps the results meaningful and helps identify whether the route, DNS response, or system interception scope caused the change.
For troubleshooting, record only the client name, core, configuration type, action that triggered the issue, and redacted logs. To update a client, choose the installer for your system in the download center. If the basic connection still times out, see the Troubleshooting guide. Updating is not a substitute for diagnosing the issue; in particular, do not delete your only working configuration or rollback notes before updating.
Subscription groups and server filters
The main purpose of subscription groups is to keep sources separate, not to change connection protocols. Create a separate group for each source so you can control its update scope, entry ownership, and disablement independently. In v2rayN, add a name and URL through the subscription-group settings. In v2rayNG and v2flyNG, manage sources in the subscription settings. Menu labels vary by client, but the process is the same: add a source, update it, then check what was imported.
Group by source, then choose what to show
Name groups by purpose, such as “Daily,” “Backup,” or “Manual.” Do not include credentials, full subscription URLs, or billing details in group names. Keep sources separate even when they provide similar entries. If one source stops updating, you can disable its group without sorting through a mixed list. Store manual entries in a separate group to keep them apart from subscription entries.
Keep the full query string when entering a subscription URL. Some subscriptions use a token in the URL to identify your account, and removing anything after the question mark can break updates. If you import a URL from a QR code or clipboard, check for leading or trailing spaces, line breaks, and full-width punctuation. Do not submit URLs containing credentials to public conversion services. Prefer a trusted local method for format conversion; see the subscription URL format guide for details.
Know when filtering takes effect
“Search,” “display filter,” and “import filter” are not the same. Search usually changes only what appears in the list; it does not delete servers. An import filter may prevent non-matching entries from being added to the group. Deletion changes the local set of entries. Before adjusting a filter, read its description and check whether it affects the next subscription update. If you are unsure, use list search rather than entering a complex expression in the subscription settings.
If your client supports regular expressions, use simple, well-scoped rules to filter names. Test on a small number of entries before applying a rule to an entire source. Providers control subscription names, which may include prefixes, spaces, or multiple languages, so a name match does not establish geographic location. If filtering returns no results, remove the filter and update again to confirm the source contains entries. Then check case sensitivity, separators, and regex syntax.
^(Daily|Backup)-
^(?!.*Test).*$
These are two independent regex examples. The first matches names beginning with “Daily-” or “Backup-”; the second excludes entries whose names contain “Test.” Use them only in fields explicitly marked as supporting regular expressions; a standard search box may not interpret these symbols. Name filters are for organizing lists, not proving protocol compatibility, service availability, or the route a connection will take.
Check entry changes after updating
After updating a specific group, check that protocol, address, port, and transport settings were parsed correctly. A change in entry count may result from updates at the source, filtering rules, or differences in format recognition; it does not necessarily mean the client lost configuration. If the entire group disappears or is empty, check the update response and parsing errors first, then restore the previous filter settings. Repeatedly clicking Update will not fix an incompatible format and may trigger rate limits at the source.
Do not rely on manually renaming subscription entries or changing their transport settings as a permanent fix. The next update may overwrite those changes or recreate the entry. If a temporary adjustment is necessary, copy the entry into a manual group, label its purpose, and record how it differs from the original. Leave the subscription entry unchanged so you can tell whether the issue comes from the source data or your local changes.
Switching groups does not necessarily switch the server currently in use. After an update, confirm the selected entry again, especially if the previous one was removed or recreated. On mobile, check whether the service needs a restart to load changes. Trust the active destination and outbound in the startup log rather than the list highlight alone. Once the list is organized, move on to routing so source management issues are not mistaken for routing problems.
Routing rules in practice and match order
Routing sends traffic to a selected outbound; it does not fix server protocol settings. In Xray-style configurations, rules are generally checked in order, and the first match determines the path. Put specific domain rules before broad category rules, and make sure LAN protection rules are not shadowed by a catch-all proxy rule. Connections that match no rule still need a defined default route. In native configurations, the first outbound usually handles unmatched traffic; with client-generated configurations, check the actual behavior.
Define the intent before writing match conditions
Before you start, describe three types of traffic in plain language: destinations that must connect directly, destinations that must use the proxy, and destinations that should be blocked. Do not add a large batch of rules and try to infer their purpose from the results. In v2rayN, select a routing profile under “Routing settings” and edit its rules. Mobile presets cover common routing needs, while custom rule options vary by client. If you import a complete native configuration, confirm whether interface routing settings still affect the generated config.
For domain matching, full: matches an exact domain, domain: matches a domain and its subdomains, keyword: checks for a keyword, and regexp: uses a regular expression. Prefer the first two for specific services to avoid keyword matches on unrelated domains. geosite: references a domain category, while geoip: references an IP category. The relevant data files must exist and contain the categories you use.
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["full:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
}
]
}
}
This routing snippet is intended to be merged into a complete configuration that already has direct and proxy outbounds. It places an exact-domain exception before a regional category so the broader rule cannot override it. It does not define a default outbound or create a proxy server, and cannot run as a standalone file. Replace the example domain with a specific destination you need to handle, then check the order of the surrounding rules.
Where domain and IP conditions differ
Multiple domain conditions in one rule usually match if any one of them matches, while conditions from different categories generally all need to match. Putting both a domain and an IP condition in one rule does not mean “match either domain or IP.” Split them into separate rules if either one should match. Also check whether domain information is available: if an app connects directly to an IP address, a domain rule cannot infer the original name. Sniffing does not work for every protocol either.
AsIs does not trigger DNS resolution for routing. IPIfNonMatch tries to resolve the domain for IP matching when no domain rule matches, while IPOnDemand triggers resolution earlier. These options control when routing performs the resolution it needs; they are not global DNS proxy switches. If you use IP category rules, also check the route taken by DNS requests. A rule may be correct but never get a chance to match if the DNS request cannot reach its resolver.
Use logs to confirm exceptions are working
After saving rules, reconnect and check the destination domain, match result, and outbound tag. If only one app behaves unexpectedly, first check whether it sends a domain or an IP to the proxy, then check whether it uses its own encrypted DNS. If all exceptions fail, check rule order, whether the correct profile is loaded, and whether the tags are spelled correctly. Outbound tags must match exactly; a rule referencing a nonexistent tag cannot provide a valid route.
Geographic routing has limitations: a domain category and the address it currently resolves to may point to different regions, and content delivery networks can change their routing dynamically. Add explicit exceptions for destinations that need them rather than assuming category data captures every aspect of a connection. For more on rule syntax and precedence, see the routing syntax and priority notes. If access slows after a change, restore the previous profile for comparison before adding more rules.
DNS setup and resolution paths
Break DNS issues into three questions: who makes the query, who handles it, and which route the query takes to reach its upstream resolver. The browser, operating system, proxy core, and TUN component may all handle DNS. Changing the DNS address in the client does not mean every app immediately uses it; app-level encrypted DNS, system caches, and existing connections can all affect what you observe.
Define what the built-in DNS does
A proxy core's built-in DNS is generally used for internal domain resolution, routing decisions, or specific outbound behavior. It does not necessarily become the system's default resolver. With a system proxy, some apps resolve domains through the system first and send the resulting IP to the proxy; others pass the domain to the proxy entry point. These paths behave differently. Taking over system DNS queries usually requires DNS interception through TUN or corresponding system settings.
v2rayN may expose separate DNS settings for different cores. In v2rayNG, interpret remote DNS, local DNS, and related routing options in the context of the current mode; do not assume that “remote” means traffic must use the proxy. Keep the client's default setup initially, verify that a standard connection works, then adjust upstream resolvers and domain routing. Before replacing the DNS configuration, note the purpose of existing rules and fallback resolvers.
{
"dns": {
"servers": [
{
"address": "223.5.5.5",
"domains": ["geosite:cn"],
"skipFallback": true
},
"1.1.1.1"
],
"queryStrategy": "UseIP"
}
}
This Xray-style DNS snippet shows domain-based resolver selection and a fallback resolver; it is not guaranteed to suit every network. domains selects a server for the specified domains, while skipFallback prevents that server from handling normal fallback queries for other domains. It does not mean the selected domains can never be tried against another server; the full fallback behavior depends on other options too. Verify upstream reachability and routing in the active configuration.
Encrypted DNS and bootstrap resolution
When an encrypted DNS service is addressed by domain name, the client must resolve that name before it can establish the encrypted connection. This is the bootstrap resolution problem. If bootstrap resolution depends on the same service that has not connected yet, the process loops. Use a known-reachable bootstrap path or a static mapping supported by your core. Simply replacing a regular DNS address with an encrypted one does not guarantee the resolution path is complete.
The proxy server's domain name is part of this chain too. If the server address can only be resolved through the proxy, but the proxy must connect to that server first, startup will stall on the initial lookup. Check whether the server domain resolves before the service starts, then check whether upstream traffic is mistakenly routed back to itself. Encrypted DNS protects queries in transit; it does not fix routing, server certificates, or an incorrect system clock.
IPv4, IPv6, and cache effects
UseIP allows results of both address types; it does not guarantee working IPv6 connectivity on your system. If the network returns an IPv6 address but the route is unavailable, an app may wait for the connection to fail before falling back, making the first load slow. Compare the actual IPv4 and IPv6 paths before choosing an IPv4-only query strategy. Disabling one query type also cannot override apps that resolve names themselves or connect directly to IP addresses.
System lookup tools show results from the system resolver, but do not necessarily prove that the proxy core's built-in DNS is working. Check client logs and app connection records as well. After making a change, account for system, browser, and core caches. Clearing or restarting them one at a time is more informative than repeatedly changing upstream resolvers. A successful visit while a cache is still valid does not prove the new resolver handled the query.
If a domain resolves but cannot be reached, check whether the returned address matches the routing outbound instead of continuing to troubleshoot DNS. If only short LAN names fail, check the search domain and whether local DNS is being intercepted. Internal business domains, printer names, and home network devices may depend on local DNS. Set explicit local-resolution exceptions rather than sending everything to a public resolver.
TUN mode and system traffic interception
The system proxy works only for apps that follow proxy settings. TUN creates a virtual network interface and uses system routes to pass eligible IP traffic to the interception component, so it can handle some apps that ignore the system proxy. It does not force every connection to a remote server. After traffic is intercepted, DNS, routing rules, and outbound selection still determine whether it connects directly, uses a proxy, or is blocked.
Check the baseline before enabling TUN
First confirm that the same server works in system proxy mode, then close other network interception tools that might compete for the default route. In v2rayN, open the TUN settings from the main interface and enable the relevant option. If you lack the required permissions, restart as prompted by the client. Desktop operating systems authorize virtual interfaces, route tables, and firewall changes differently; do not apply administrator steps from one system to every platform.
On Android, system VPN permission enables traffic interception. v2rayNG and v2flyNG request the required permission when you first start the service. Typically, only one VPN service at a time can occupy this slot for a user. System authorization on Android differs from desktop TUN implementations, so do not import desktop virtual interface settings unchanged. If you enable per-app proxying, check the allowlist or exclusion list separately.
| Check | System proxy | TUN or system VPN interception |
|---|---|---|
| Must apps follow proxy settings? | Usually yes | Mostly determined by interception scope |
| Who handles DNS queries? | Usually the app or system | Depends on DNS interception settings |
| LAN access | Affected by proxy bypass settings | Affected by system routes and routing rules |
| Permissions | Usually requires only proxy setting changes | Requires interface or system VPN permission |
Prevent loops and unintended LAN interception
Connections to the proxy server itself must leave through a physical network interface, not re-enter the same interception entry point, or they will loop. Clients usually handle the necessary bypasses and interface binding, but custom routes, manual gateway settings, or multiple interception tools can break this assumption. If all connections drop as soon as TUN is enabled, exit TUN first and confirm the basic proxy works again. Then check the default route, server address bypass, and actual outbound interface.
Direct LAN access has two parts: whether the system route can send traffic to the local interface, and whether proxy rules assign private addresses to the direct outbound. Even with the latter configured correctly, access to a printer or gateway can fail if the former is overridden. Test with the device's explicit local IP first, then its name. If the IP works but the name does not, check local DNS rather than changing all your routes.
Validate traffic interception step by step
After enabling interception, test a browser, an app that normally ignores the system proxy, and a LAN service in turn. A working browser does not prove that all apps are covered; it may still be using the system proxy. To distinguish the paths, temporarily disable the system proxy during a controlled test and observe TUN alone. Restore your intended setup afterward. Enabling both entry points is not necessarily wrong, but it makes app traffic harder to diagnose.
UDP apps also depend on the server protocol, remote support, and local firewall; TUN cannot add these capabilities. If some connections work while others stall, first check whether the issue is limited to UDP, IPv6, or larger packets, then decide whether to investigate MTU. Do not reduce MTU without a comparison test: an excessively low value increases fragmentation and processing overhead and may not address the actual cause.
If the network does not recover after you exit TUN, stop the service normally through the client first. Then check for leftover system proxy settings, virtual interfaces, or incorrect routes. Do not delete all network interfaces or leave the firewall disabled as a workaround. For detailed setup steps, see v2rayN TUN virtual adapter setup. For timeouts on mobile, follow the connection timeout troubleshooting checklist.
FakeDNS and domain mapping
FakeDNS assigns a synthetic IP to a queried domain and keeps an internal mapping between the name and address. When the app connects to that address, the interception component can recover the original domain for routing or pass it to the proxy outbound for resolution. A synthetic address is not the destination server's real IP or a new remote server. FakeDNS preserves domain context when an app might otherwise resolve a name to a real IP and lose that information.
A complete mapping path is required
FakeDNS requires at least three parts to work together: queries must reach the designated resolver, connections to synthetic addresses must be captured by the same interception path, and the domain must be recoverable when the connection is handled. Adding a name to the DNS server list without intercepting the corresponding traffic may cause the app to send the synthetic IP through the normal gateway. Conversely, sniffing alone does not route system DNS queries to FakeDNS.
First identify which component handles synthetic addresses. The TUN component in v2rayN may already provide its own fake-IP feature, so do not add Xray FakeDNS on top without checking. Each component may assign addresses and maintain its own cache; domain recovery can fail if the mapping is missing. The settings and supported features in v2rayNG and v2flyNG also vary. Check the current client and core instead of assuming similar names mean identical implementations.
{
"fakedns": [
{
"ipPool": "198.18.0.0/15",
"poolSize": 65535
}
],
"dns": {
"servers": ["fakedns"]
}
}
This is an Xray-style feature snippet, not a complete DNS interception setup. The address pool uses a reserved test range, but that does not mean it is conflict-free in your environment. If your LAN, corporate network, or another virtual interface already uses the range, choose a different setup first. Pool size determines mapping capacity, not the concurrent connection limit. Increasing it cannot fix missing query interception or domain recovery.
Inbound recovery and sniffing limitations
When Xray directly handles the relevant traffic, the inbound must also enable the recovery mechanism that works with FakeDNS. Configure the inbound that receives connections to synthetic addresses, not an arbitrary listening entry. The snippet below shows a common sniffing setup and must be adapted to the actual inbound structure. If an interception component already restores the domain upstream, follow that component's configuration instead.
{
"sniffing": {
"enabled": true,
"destOverride": ["fakedns"]
}
}
Standard HTTP or TLS sniffing and FakeDNS mappings come from different sources. Sniffing attempts to obtain a domain from the app protocol; FakeDNS relies on a previous DNS query record. Some protocols, encrypted handshakes, and direct IP requests do not provide a usable domain. Sniffing cannot be relied on to recover every destination name. Check the current core's options to determine whether sniffing affects routing only or also replaces the connection target.
Cache, switching, and compatibility
After enabling FakeDNS, query a domain that is not cached. Confirm that the app receives a synthetic address, then check whether the connection recovers the domain. After stopping the service or switching interception components, an app may retain an old synthetic IP that the new service cannot map, making some sites suddenly unreachable. Clear the relevant DNS cache and restart the app rather than enlarging the address pool or repeatedly switching remote servers.
LAN service discovery, apps that check resolved addresses, and diagnostic tools that rely on real IPs may not work well with synthetic addresses. Add explicit real-resolution exceptions for these destinations and verify that they cover both DNS and the connection path. A browser's built-in encrypted DNS may also bypass the interception resolver, causing different requests in the same app to take different paths. Record that setting during troubleshooting.
If FakeDNS provides no clear benefit, a standard DNS setup is easier to maintain. To roll back, stop interception, restore DNS settings, clear caches, restart the app, then test direct and proxied destinations. Do not just remove the FakeDNS fields while the system continues to use stale synthetic addresses. Restore both the configuration and caches to get a reliable comparison.
Managing multiple subscriptions and update strategies
Subscription groups keep sources separate; multiple-subscription management handles update schedules, duplicate entries, current selections, and failover between sources. The goal is not to combine everything into one ever-longer list. Each update should make it clear which source changed, which entries were affected, whether the active server is still available, and which configuration to keep if something fails.
Set clear boundaries for each source
Separate daily, backup, and test sources by purpose, and keep manual configurations separate. A backup source does not mean automatic failover: a subscription only provides server data and does not inherently add health checks or switching logic. Switching servers in the client usually changes the path for new connections; existing connections may not move. Reconnect when testing a backup source so old sessions do not affect the results.
Do not deduplicate entries from different sources by name alone. A name is just a display field; protocol, address, port, user ID, TLS, and transport settings determine whether connection configurations are the same. Even the same address may use different credentials or serve a different purpose. Conversely, one service may appear as a new entry when its name changes. Compare redacted connection settings before hiding or deleting duplicates.
Schedule updates when you can observe them
Set automatic update intervals based on source requirements and how often you use them; frequent refreshing is not inherently better. Updates depend on the current network and may connect directly or use the client's existing proxy, depending on settings. If a source URL is reachable only through a proxy but the proxy is not yet connected, first establish a working connection or use a trusted offline import method. Otherwise, subscription updates and proxy startup can depend on each other.
If a batch update fails, update one source on its own first to distinguish a general network problem from a source-specific response issue. Record the request error, whether the response is recognizable content, and which parsing step failed. A successful request does not guarantee a valid subscription response; an expired authorization may return a webpage or a message instead. Changing local protocol fields repeatedly will not help. Check the URL, access, or source service status first.
| Symptom | Check first | Keep as rollback |
|---|---|---|
| All sources fail to update | Local network and update request path | Existing working servers |
| One source imports no entries | Response format and import filters | That group's original config and filters |
| Current entry stops working after an update | Whether the entry was replaced or removed | Verified backup source |
An update failure does not mean the service has stopped working
Subscription updates and server connections follow separate request paths. If a source is temporarily unreachable, entries already stored locally may still connect. Conversely, a successful subscription update does not prove that every server works. Do not delete an entire group after one failed update or treat update success as connection verification. Keep the last working data and record subscription requests and server connections separately to identify the responsible layer.
If a source changes its URL, update the address in the existing group first and confirm that its filters and update options still apply. If you need a new group, import and verify a connection from the new source before disabling the old one. Do not delete the old group before testing the new URL; an unrecognized format would leave you without a reference or rollback path. Clearly label disabled old groups to avoid selecting them or sending unnecessary requests later.
Backups, migration, and access scope
When moving to another device, handle subscription URLs, manual servers, and local routing separately. A subscription can retrieve a server list, but it may not include local DNS, group filters, app exclusions, or custom outbounds. Export coverage varies by client, so check each setting after restoring. Do not assume a desktop configuration folder can be imported directly into a mobile client, especially if it uses another core's syntax.
Backups may contain credentials. Store them somewhere access-controlled and separate from public tutorial materials. For troubleshooting, share only the structure and redacted fields; do not upload an entire account subscription. After organizing multiple subscriptions, verify at least one daily and one backup source. Record whether local ports, routing profiles, and DNS remain consistent after switching sources; a source change should not also alter unconfirmed global settings.
Custom outbounds and configuration rollback
An outbound determines how a connection leaves the proxy core, and routing rules reference it by tag. Common uses include direct, proxy, and block paths, or connecting to another proxy entry already running on the local machine. Custom outbounds are for specific routing needs, not a replacement for importing a standard server. Before you start, know which service each tag refers to, where it listens, and what happens if that service stops.
Tags link configuration components
tag is a user-defined identifier; it does not create protocol capabilities. If a routing rule refers to proxy, the configuration must contain an outbound with that exact name. Similar names are not interchangeable. In native Xray configurations, the first outbound usually handles traffic that matches no rule, so outbound order matters. Client-generated configurations may add their own default rules; check the active configuration structure rather than just a partial snippet in the editor.
This complete Xray-style configuration can be used to test a local connection path: a local app connects to a SOCKS inbound, regular destinations are forwarded to another local SOCKS service, and private addresses connect directly. It contains no remote server credentials and assumes that the referenced upstream service is listening on the specified port. Do not route the upstream service back to the current inbound, or forwarding will loop.
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "local-in",
"listen": "127.0.0.1",
"port": 10810,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": false
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 10809
}
]
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {}
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
Check protocols and ports before rules
Before using this, confirm that 10810 is available and that 10809 provides a SOCKS service. Do not enter an HTTP proxy port as a SOCKS outbound just because both are called proxy ports. These are example test ports, not client defaults. The listening address is limited to the local loopback interface to avoid exposing an unauthenticated entry point to the LAN. For remote access, design authentication, firewall rules, and access scope separately.
This example disables UDP on the inbound and is intended for TCP path testing only. It does not mean the same setup can support every UDP app. To add UDP, check support in the inbound, upstream SOCKS service, and the rest of the connection path. A direct or block outbound is only a definition; it is used only when a routing rule selects it or it becomes the default. Adding an outbound named block does not automatically block any destination.
Limits when integrating custom configurations
When using a custom configuration in v2rayN, select a core that matches the file syntax and check how the client identifies the local listening port. Some management options may no longer modify the file, while system proxy settings may still point to an old port. Mobile import capabilities differ from desktop, so use a configuration type supported by the current client. Being able to save a file does not mean the service will start as expected.
Chaining multiple proxies adds dependencies and makes troubleshooting harder. Verify the upstream and downstream separately before connecting them, and check whether either layer intercepts the other's outbound traffic. If you only need different routes for a few domains, use clear routing rules and separate outbounds rather than adding unnecessary proxy layers. For protocol comparisons, see common protocol differences; actual capabilities still depend on the connection path.
Roll back in reverse order
If startup fails, read the first clear error and address the specific cause: JSON syntax, an unknown field, a port conflict, or a missing outbound reference. If startup succeeds but connections fail, check whether the upstream is listening, the protocols match, and the default outbound is correct. If you temporarily increase log detail, reproduce only the necessary request, then restore the normal level afterward. Avoid retaining logs that include destination details.
To roll back, first disable newly added interception and custom entries, then restore the previous routing and DNS settings. Finally, select a verified server and establish a new connection. Restore the system proxy port too if you changed it. Recording each change as “purpose, change, validation, rollback” is easier to maintain than keeping a large configuration with no clear source. For the initial setup, follow the quick-start guide. For specific symptoms, continue with Troubleshooting.