When troubleshooting v2rayN, first check whether the core is running, then find out whether the connection is stuck at the local listener, DNS lookup, remote port, or protocol handshake. This guide is for users who have imported a subscription but still can’t open webpages. Use common error messages, Windows commands, and one-change-at-a-time tests to narrow “it doesn’t work” down to a specific, fixable issue.
Read the full error chain, not just the last line
v2rayN manages configuration, subscriptions, and proxy settings; the selected core handles the actual connection. Status messages in the main window and core output may come from different layers. A successful subscription update only means the configuration was retrieved. A core startup message doesn’t prove that the remote server is reachable.
Check the log or information area at the bottom of the main window. Note when a failure occurs, then expand that error to see its context. Menu names and wording can vary by version. This guide uses the Windows desktop app; before changing settings, check your actual configuration under Settings → Parameter settings rather than guessing from screenshots.
-
Keep test conditions consistent
Choose one server and one webpage, and pause other apps that are retrying continuously. Note whether System proxy and TUN are enabled, and don’t switch between them while troubleshooting.
-
Find the first failure
Note the current time, then reopen the target webpage once. Check only the errors around that attempt so you don’t mistake an earlier log entry for the current issue.
-
Keep the surrounding error details
Keep a few lines before and after the error. Look for the destination address, port, and most specific underlying cause. Before sharing logs, redact subscription URLs, user IDs, and authentication details.
-
Change one thing at a time
Change only one setting per test: port, DNS, server, or transport. Save, restart the core, and retry the same destination. Note whether the error changes.
Local listener failure: check the proxy port first
If the core exits as soon as it starts, don’t change the node yet. The app must first connect to the local proxy listener before it can reach a remote server. In logs, 127.0.0.1 is the local loopback address. The troubleshooting steps for “connection refused” differ completely depending on whether the error is at the local listener or the server.
Error: address already in use
Cause: The address and port the core is trying to listen on are already in use, possibly by another instance of the client or a different listening process.
Fix: Check which process is using the port. Close any confirmed duplicate instance, or change the local listening port under Settings → Parameter settings. Update any apps where you’ve manually configured the proxy as well.
Error: Only one usage of each socket address
Cause: This common Windows socket error usually means the same address and port can’t be bound more than once.
Fix: Identify which process owns the port. Don’t terminate an unfamiliar system process. Close any duplicate app, then restart the core.
Run the read-only query below in PowerShell. This example checks 10808; replace it with your local port if it’s different. If the first command returns nothing, no matching TCP listener was found at that time. It doesn’t check UDP or confirm remote connectivity.
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
ForEach-Object { Get-Process -Id $_.OwningProcess }
Connection refused vs. timed out: tell an active rejection from no response
Once the local listener is working, check the remote address and port the log is trying to reach. A refused connection usually means a rejection was received; a timeout means the operation didn’t complete within the allotted time. Neither error alone tells you whether your account is valid, and not every timeout is a DNS issue.
Error: connection refused
Cause: No service is listening on the destination port, or an intermediary is actively rejecting the connection. Windows may also show No connection could be made because the target machine actively refused it.
Fix: First check whether the destination in the error is local. Then verify the server port in your subscription. If the remote configuration is correct but connections are still refused, ask your service provider to check the listener and firewall.
Error: i/o timeout
Cause: A network read or write didn’t complete in time. This can happen while connecting to the server, during the handshake, or while forwarding data.
Fix: Use nearby messages such as dial tcp, TLS errors, or read errors to identify the stage. Retry the same node on another network; don’t just increase the timeout.
Error: context deadline exceeded
Cause: An operation exceeded its deadline. It could be a subscription fetch, DNS request, or connection test.
Fix: Identify which operation triggered the error, then check whether it uses a direct connection or the proxy. A failed subscription request doesn’t mean every node is unusable.
| Observed symptom | Check first | What you can’t conclude yet |
|---|---|---|
| Connection to the local proxy port is refused | Whether the core is running and the app is using the correct port | Whether the remote server is available |
| Connection to the remote TCP port times out | Address, port, network path, and server firewall | Whether the user ID is correct |
| TCP connects, but TLS fails | Server name, certificate, system time, and TLS settings | Whether proxy protocol authentication succeeded |
Bottom line: check protocol settings after the port is reachable
If the connection is still timing out while dialing over TCP, check the network path and remote listener first. SNI, transport paths, and user IDs are more relevant once the handshake has started.
DNS lookup failure: identify which domain failed
DNS translates domain names into IP addresses. The name that failed to resolve in the log could be the node’s server, the destination website, or the hostname of a DNS service. Identify the name before troubleshooting to avoid repeatedly changing DNS just because a webpage won’t load.
Error: no such host
Cause: The current DNS resolution path didn’t return a valid result for this hostname. Possible causes include a typo, missing DNS records, or the resolver in use.
Fix: Check the full domain in the error. Make sure the subscription doesn’t contain extra spaces or an outdated address, then check both system DNS and the core’s DNS settings.
Error: failed to lookup ip
Cause: The DNS query didn’t return the required IP address. Check the following timeout or lookup error for more detail.
Fix: Check the DNS address used by the core and how traffic to it is routed. In particular, see whether DNS requests depend on a proxy outbound that isn’t connected yet.
- Check Windows DNS: In PowerShell, run
Resolve-DnsName -Name example.comto see whether system DNS resolution is working. When troubleshooting a node, query the actual hostname it uses. - Check the core: Review its current DNS and routing settings. Successful system DNS resolution doesn’t mean the remote DNS server configured in the core is reachable.
- Don’t replace addresses blindly: Don’t copy a resolved IP address into every field of a TLS node. The server address, SNI, and HTTP Host may serve different purposes; follow the service provider’s requirements.
If only one destination website fails while the node server remains reachable, focus on that site’s DNS results, the route it matches, and the destination service. Routing rules decide which outbound connection handles traffic; they don’t automatically make every domain resolvable.
TLS handshake failures: check the time, server name, and transport settings
TLS can still fail after a TCP connection is established. TLS sets up a protected connection; proxy protocols such as VMess and VLESS have their own configuration requirements. A reachable port doesn’t mean the TLS handshake, transport, and proxy authentication have all succeeded.
Error: x509: certificate has expired or is not yet valid
Cause: The certificate’s validity period doesn’t match the time used for verification. The server certificate may have expired, or your device’s date and time may be wrong.
Fix: In Windows, go to Settings → Time & language → Date & time, check the clock, and sync it. If the time is correct but the error persists, contact your service provider about the certificate.
Error: x509: certificate signed by unknown authority
Cause: The current trust store can’t verify the certificate chain. The server may be missing part of its certificate chain, or a certificate may have been substituted somewhere on the network.
Fix: Check whether you’re on a network that requires a dedicated certificate, and ask your service provider to verify the full certificate chain. Don’t disable certificate verification as a routine fix.
Error: tls: handshake failure
Cause: The other end didn’t complete TLS negotiation. Possible causes include the server name, protocol settings, or connecting to the wrong server port.
Fix: Compare the TLS setting, SNI, and port with a valid subscription. For REALITY, also verify the matching parameters, including the public key, shortId, and server name.
EOF and connection reset by peer describe a connection that was closed; they aren’t specific authentication errors. A transport mismatch, incorrect WebSocket path, reverse proxy misconfiguration, or the destination service closing the connection can all cause similar messages. Check which stage failed instead of reinstalling the client just because you see EOF.
- For WebSocket, compare the path and Host with the server configuration. Don’t guess at capitalization or change path characters.
- For gRPC, verify the service name against the server configuration. Don’t reuse a WebSocket path.
- For VLESS or VMess, check that the protocol type, user ID, and related settings match. Save any required custom settings before updating the subscription.
- Make sure the selected core supports the current configuration. The v2rayN interface, core program, and subscription are separate components; updating one doesn’t automatically update the others.
No request in the logs: check the system proxy and routing entry point
If no matching request appears in the core when you open a webpage, the app may not be sending traffic to the client, or the current log level may simply omit access details. No log entry proves neither that the node is working nor that traffic is bypassing the proxy.
-
Check the proxy entry point
In the v2rayN main window or tray menu, check the current status under System proxy. If you need the system proxy, select Set system proxy, then confirm that the address and port recorded in Windows match the local listener.
-
Check app settings
See whether the browser or target app has its own direct connection setting, a different proxy port, or a proxy extension. An app’s own settings may not follow the system proxy.
-
Check the route
Once a request reaches the core, check its outbound tag and the active routing rules. Traffic routed directly won’t automatically use a selected server.
-
Temporarily enable detailed logs
Under Settings → Parameter settings, look for the log-level options. If needed, temporarily switch to debug, reproduce the issue once, then restore the previous level. Avoid keeping sensitive destination addresses in logs longer than necessary.
Common questions and what to include in a bug report
The latency test shows a number. Why won’t webpages load?
First check whether the test was a TCP test or a real connection test. A TCP test mainly confirms that the port is reachable; it doesn’t verify all proxy authentication or website access. Retry one specific webpage and compare the handshake and routing logs from the same time.
A subscription update timed out. Should I switch nodes first?
First confirm that the subscription fetch failed. In Subscription groups, check whether the update uses a direct connection or the proxy. If it’s set to update through the proxy, you’ll need a working proxy connection first. Don’t post your full subscription URL when asking for help publicly.
It works on another network. Do I still need to change the protocol?
Keep the original settings and record how the same node and port behave on both networks. The difference points toward the network path, DNS resolution, or access restrictions, but check the error stage too. Don’t immediately rewrite the protocol or transport settings.
Should I share my entire configuration and all logs?
No. Share the client version, core name and version, operating system, proxy mode, reproduction time, and redacted error context. Remove subscription tokens, user IDs, passwords, and private keys. Include only the field names and error details needed to diagnose the issue.
Before reporting the issue, make one final pass in order: confirm the local port is listening, the app is actually using the proxy, the server hostname resolves as expected, and the remote port is reachable. Then check TLS and proxy protocol settings. If you manage the server, check its listener, firewall, certificate, and error logs at the same time. If you use a subscription service, share the steps you’ve already confirmed with the provider; that’s more useful than simply saying “it timed out.”
Bottom line: let the failure stage guide your next step
After each test, note what changed, where the error occurred, and whether the result was different. If the error changes from a dialing timeout to a certificate error, you’ve moved on to the next layer. There’s no need to reset every setting and start guessing again.