This checklist is for cases where v2rayN or v2rayNG is running and shows a connected status, but browsers and other apps still cannot access the internet. Check the node, system time, DNS, routing, and traffic interception in that order to avoid repeatedly changing subscription or protocol settings.
First, identify what “Connected” actually means
A client showing that it is running does not mean the remote node has completed a usable data exchange. After v2rayN starts the Xray or V2Fly core, this only confirms that the local process is running and the configuration passed basic parsing. In v2rayNG, a key icon at the top or an Android VPN connection likewise only confirms that Android’s traffic interception service has been established. Whether the remote address resolves, the port is reachable, and the protocol parameters match still requires a real connection test.
A web request passes through the application, local proxy entry, routing rules, proxy outbound, and remote response in sequence. Failure at any point can look like a browser loading forever, an immediate connection reset, or only certain websites being unavailable. Do not change DNS just because the client tray icon changed color, and do not keep switching routing modes before confirming that the node works.
| What you observe | Most likely failure point | Next action |
|---|---|---|
| All node tests time out | Local network, node address, or remote port | Disable the system proxy first, then check basic network access and node connectivity |
| The real connection test is normal, but the browser cannot load pages | System proxy, browser-specific proxy, or routing rules | Check the local port and the proxy entry used by the browser |
| Domains fail, but a known direct address responds | DNS lookup path | Change the DNS settings, restart the core, and test again |
| Only specific domains fail | Custom routing, domain rules, or DNS split routing | Temporarily switch to global proxy mode to confirm whether the rules are responsible |
Step 1: Verify node availability and system time
In the v2rayN node list, select the current node and run a real connection latency test first. A regular Ping only checks whether the host responds to ICMP; it does not prove that a VMess, VLESS, or other proxy connection can complete its handshake. A real connection test establishes an outbound connection through the active core, making it a better first filter. If several nodes in the same subscription all time out, update the subscription first, then cross-test two nodes with different addresses and ports.
Record the exact results during testing. For example, if node A returns a real connection latency of 186 ms three times in a row while node B times out above 5,000 ms each time, use node A for the remaining checks. High latency does not always make a node unusable, but repeated timeouts, refused connections, or immediate handshake failures usually cannot be fixed by changing browser settings.
- In the v2rayN main window, select a node and run the real connection latency test; do not substitute Ping results.
- Switch between at least two subscription nodes and wait for each test to finish. Avoid starting too many connections in parallel.
- Open the runtime log and confirm that a new outbound entry appears during the test rather than an old result being reused.
- In v2rayNG, tap the test option for the current configuration, then switch to another node and repeat once.
- If every test fails over Wi-Fi, try another working network to distinguish a node issue from restrictions on the current network.
Clock drift can also affect connections that require time validation. In Windows, open Settings → Time & language → Date & time, enable automatic time setting, and sync immediately. On Android, open the system date and time settings and enable network-provided time. If the device clock differs from the standard time by several minutes, correct it, then fully stop and restart the client core.
Error: dial tcp: i/o timeout
Cause and fix: A TCP connection to the remote address and port was not completed within the time limit — switch to another node from the same subscription and retest on a different network. If every node times out, check address resolution and network restrictions.
Error: connect: connection refused
Cause and fix: The target address is reachable, but its port refused the connection — update the subscription and switch nodes; repeatedly changing the local port will not fix a refusal from the remote end.
Error: invalid user
Cause and fix: The server rejected the current user parameters — update the subscription again and confirm that the user ID, encryption method, and additional node parameters were not edited manually.
Step 2: Locate DNS resolution failures
If the node test succeeds but a page waits indefinitely after you enter a domain, DNS is the next thing to check. DNS converts domain names into reachable addresses; a working proxy outbound does not guarantee that the combination of local DNS, core DNS, and the system’s private DNS is correct. This is especially common after importing a custom configuration, changing split-routing rules, or enabling encrypted DNS, when lookups may be sent through an unsuitable route for the current network.
In v2rayN 7.x, open Settings → Parameters to review the basic settings and DNS options. If you use a custom DNS configuration, save the original content first, then restore the client defaults for comparison. Restart the core after making changes; closing a browser tab is not enough to make the core reload its configuration. In Windows, you can also run the built-in query command in a terminal to see whether the system can resolve the name.
nslookup example.com
ipconfig /flushdns
nslookup returning an address only proves that the system lookup path produced a result; it does not mean the core uses the same DNS. If the system lookup succeeds while the v2rayN log continually reports DNS failures, check the core DNS configuration and routing rules. If the system lookup itself times out, restore the network adapter’s DNS to automatic, clear the cache, and test again.
Error: failed to find an available destination
Cause and fix: The outbound target did not resolve to a usable address, commonly because the node or target domain failed DNS resolution — check that the node address is complete, restore the default DNS, and restart the core.
Error: no such host
Cause and fix: The DNS lookup returned no record for the host — make sure the server domain in the subscription has no extra spaces, then test the system DNS and core DNS separately.
Error: context deadline exceeded
Cause and fix: A lookup or connection exceeded its deadline — use the surrounding log entries to determine whether the timeout occurred during DNS resolution or the remote connection instead of declaring the node dead from this line alone.
Step 3: Use global proxy mode to rule out routing mistakes
Routing rules decide whether a request goes through the proxy, connects directly, or is blocked. If custom rules match a domain, IP range, port, or inbound tag incorrectly, the node itself may work while a particular website or app remains inaccessible. Rules are usually evaluated in a defined order; an overly broad direct rule can intercept a request before a later proxy rule gets a chance to match.
The most direct diagnostic is not to delete the rules immediately, but to switch temporarily to global proxy mode and open the same domain. If global mode works while the original routing mode fails, the problem is likely within the split-routing configuration. Restore the original mode after testing and inspect each custom rule’s match target and outbound action.
| Test scenario | Global proxy result | Original routing result | Interpretation |
|---|---|---|---|
| Same browser, same domain | Accessible | Inaccessible | Check domain and IP split-routing rules first |
| Same node, multiple domains | All fail | All fail | The issue is more likely with the node, DNS, or traffic entry |
| Browser works, standalone app fails | Browser works | App does not work | The app may not follow the system proxy and may require TUN or an in-app proxy |
| Domain works, fixed IP fails | Inconsistent results | Inconsistent results | Check IP rules, destination port, and protocol restrictions |
VMess and VLESS are node connection protocols, while routing rules decide which requests are handed to that node. They are separate layers. Changing protocol parameters cannot fix an incorrect direct rule; conversely, switching to global proxy mode cannot fix an incorrect user ID, transport parameters, or server port.
Conclusion: Use global proxy mode for diagnosis, not as the default answer
If the same node works in global mode but fails in split-routing mode, keep the node configuration and focus on rule order and outbound actions. Do not keep rotating nodes and adding more variables.
Step 4: Check the v2rayN system proxy and local ports
On Windows, macOS, and Linux desktops, whether an app enters the proxy chain depends on whether it reads the system proxy, has its own proxy configured, and whether TUN is enabled. While the v2rayN core is running, it usually listens on a local SOCKS or HTTP entry. If the system proxy does not point to the actual listening port, the browser may connect directly or fail completely because it is pointing to an old port.
In v2rayN, open Settings → Parameters and check the local SOCKS, HTTP, or mixed entry port. A common setup uses 127.0.0.1:10808 for SOCKS and may use 127.0.0.1:10809 for HTTP, but use the values shown in the current interface. Then choose the automatic system proxy configuration option from the tray menu and confirm that the system proxy address matches the client’s current port.
- Check
127.0.0.1first for the local address; never enter the remote node address as the system proxy. - After changing a port, restart the core and apply the system proxy settings again.
- If the browser has a manual proxy configured, confirm that the protocol and port match, or temporarily switch it to use the system proxy.
- Command-line programs do not necessarily read the desktop system proxy. Check the proxy environment variables or configuration options supported by the program.
- If another process is already using the port, the core may fail to start or be unable to create the corresponding inbound.
| Application type | Settings typically used | What to check |
|---|---|---|
| Common desktop browsers | System proxy or browser-specific proxy | Address, HTTP port, and exception list |
| Command-line terminal programs | Program arguments or proxy environment variables | Whether SOCKS and HTTP proxies are explicitly supported |
| Desktop apps that do not follow the system proxy | TUN interception or an in-app proxy | TUN status, administrator permissions, and routing conflicts |
| Other devices on the local network | The LAN listening address exposed by the client | LAN access switch, firewall, and listening scope |
Error: bind: Only one usage of each socket address is normally permitted
Cause and fix: The local port you selected is already being used by another process — close the conflicting program, or choose an unused port under Settings → Parameters and restart the core.
Error: connection refused 127.0.0.1:10809
Cause and fix: The app tried to connect to local port 10809, but no proxy entry is listening there — check the current HTTP port and update the old port in the app or system proxy settings.
Step 5: Check v2rayNG VPN interception and app scope
On Android, v2rayNG normally captures traffic through the system VPN interface. After the connection indicator appears in the status bar, confirm that the system allows the service to run and check per-app proxying, LAN bypass, routing mode, and battery-management settings. If only one app fails while the browser works, the problem is usually not the node itself but the per-app selection or the app’s own network policy.
First confirm the local port and routing options in v2rayNG settings, then check whether per-app proxying is enabled. With “Proxy only selected apps” enabled, the target app must be in the list; with the inverse exclusion logic enabled, it must not be on the exclusion list. After changing the scope, disconnect, wait a few seconds, and reconnect so the system can rebuild the VPN routes.
v2rayNG says connected, but no app can open anything. What should I do?
Switch to a node that passes the real connection test, then temporarily set the routing mode to global proxy. If it still fails, check Android Private DNS, system time, and the runtime log.
The browser works, but one app always fails. What should I do?
Open the per-app proxy settings and confirm whether the app is selected or excluded. After changing the app scope, disconnect and reconnect; simply swiping the app away is not enough.
The proxy stops working after the device has been locked for a while. What should I do?
In the system app settings, allow v2rayNG to run in the background and check whether battery optimization is restricting the VPN service. Menu names vary across Android devices, so use the system battery-management page as the reference.
Wi-Fi works, but mobile data cannot connect. What should I do?
Test node address resolution and the remote port separately; do not carry over conclusions from Wi-Fi. Also check whether the system restricts v2rayNG from using mobile data.
All existing nodes stopped working after updating the subscription. What should I do?
Manually update the relevant subscription group and confirm that its timestamp has changed, then test two different nodes. If the log reports invalid user parameters, use the configuration newly generated by the subscription instead of a manually edited copy.
When v2flyNG uses the V2Fly core, it follows similar Android traffic-interception logic, but its core support range and log output may differ. Do not apply an Xray-specific v2rayNG configuration unchanged to v2flyNG. If the subscription contains parameters that depend on a particular core, choose a client and core that match the node’s requirements.
Retest in a fixed order and read the logs
After each individual check, retest under the same conditions: the same network, node, domain, and browser. If you change the test target every time, even a recovered page will not reveal the actual cause. Keep the log window open and observe from core startup instead of capturing only the final red error.
Read the log in chronological order. First check whether the local entry received the request, then see which outbound the routing selected, and finally determine whether the failure occurred during resolution, connection, handshake, or the remote response. A single timeout only means that an operation exceeded its deadline; the destination address, outbound tag, and DNS details in the surrounding lines determine what to do next.
- Disable the system proxy or disconnect the Android VPN and confirm that the device itself can access ordinary pages over the basic network.
- Correct the system time, update the subscription, and select a node that passes the real connection test.
- After starting the core, check the log for configuration parsing failures or local port conflicts.
- Temporarily use global proxy mode to test the same domain and rule out custom routing rules.
- Restore the default DNS for comparison, restart the core, and clear the browser or system DNS cache.
- Reapply the system proxy on desktop and verify
127.0.0.1and the actual listening port. - On Android, establish the VPN again and verify the per-app scope, Private DNS, and background-execution permissions.
- After confirming that access is restored, revert personalized settings one at a time and retest after each change.
Error: failed to start
Cause and fix: The core did not enter a running state successfully. Common causes include configuration parsing errors, inaccessible files, or a port conflict — start with the first specific error before this line instead of continuing to test the browser.
Error: proxy/vmess/encoding: invalid user
Cause and fix: The VMess user parameters were rejected — update the subscription again and use the newly generated node configuration, then verify the device time before reconnecting.
Error: transport/internet: failed to dial
Cause and fix: The core could not establish the underlying transport connection — continue reading the destination address and inner error in the same log section to distinguish DNS failure, timeout, refusal, or mismatched transport parameters.
Conclusion: Prove that the previous layer works before moving on
Check the node only after its real connection succeeds, check routing only after DNS works, and finally verify the system proxy or VPN interception. This order narrows “connected but no internet” down to one setting that can be changed.