This guide is for anyone seeing “core startup failed,” finding that a node is selected but web pages won’t load, or encountering repeated handshake errors. First distinguish client messages from access and error logs, then check the local listener, DNS, server connection, and protocol handshake in sequence. Change one variable at a time and verify the result against the complete error chain for the same request. Don’t assume a single log line means the node is down.
Identify which layer produced the log
v2rayN, v2rayNG, and v2flyNG are clients; V2Ray and Xray are the cores that handle connections. A subscription download can fail in the client’s updater before the core receives any request. By contrast, entries containing module paths such as proxy/vless/outbound or transport/internet usually indicate that the core is processing the connection. These problems require different starting points for troubleshooting.
In v2rayN, start with the log area in the main window, then check the logging options under Settings → Parameter Settings. In v2rayNG, open Logs from the main-screen menu and check the log level in Settings; menu locations and translations can vary by version. Note the client version and the core name and version shown in the startup log rather than simply writing “V2Ray.” v2rayNG uses the Xray core, while v2flyNG uses the v2fly core, so don’t infer the error format from the app name alone.
| Log source | Key question answered | Check first |
|---|---|---|
| Client message | Was the configuration imported and the subscription downloaded? Did the process start? | Subscription URL, startup path, generated configuration |
| Access log | Did the request reach the core? What was the destination, and which outbound was selected? | Inbound port, routing tag, app proxy settings |
| Error log | At what step did the connection stop, and what error did the underlying layer return? | Listening, DNS resolution, dialing, TLS, and protocol authentication |
How to read log levels and error chains
Common V2Ray/Xray loglevel values are debug, info, warning, error, and none. For troubleshooting, try info first and switch to debug if you need more detail. Setting the level to error filters out warnings and informational messages; with none, no output doesn’t prove the connection is working.
{
"log": {
"loglevel": "info"
}
}
This is only the logging section of a core configuration, not a complete file you can replace your configuration with. When a client generates the configuration, change the relevant option in the UI whenever possible; edits to a generated file may be overwritten when you switch nodes. The access and error fields, as well as how the client starts the core, determine where access and error logs go. Raising the log level doesn’t guarantee that logs will be written to disk.
- Check the time first. Note when you start a test or refresh a page, then look for entries from roughly 10 seconds before and after. This helps avoid mixing in requests from background apps.
- Match related entries. If entries include a connection ID in square brackets, use it to link the lines. If not, compare the destination address, port, and timestamp.
- Read from the outer layer inward.
failed to process outbound trafficis usually a high-level summary; a later message such asconnection refusedorlookup ...is more likely to point to the direct cause. - Find the first error. A failed startup can cause every subsequent test to time out. Fix startup errors before diagnosing failed requests.
This flow helps identify which layer to check; not every protocol follows exactly the same sequence. For example, a server address that is already an IP doesn’t need to be resolved first, and routing rules may trigger separate DNS lookups. Use the current configuration and logs to guide your diagnosis.
Connection timeouts, refused connections, and DNS failures
A “timeout” means an operation took longer than allowed, but doesn’t tell you whether the problem was local DNS, the remote port, or a handshake response. First identify the destination in the error: it could be the proxy server, a direct-connection website, or a subscription server. Don’t change all your DNS and routing rules just because you see a timeout.
Error: i/o timeout
Cause and fix: A read, write, or connection operation didn’t finish in time. Use the destination shown earlier in the log to identify the stage, then test the server port and handshake separately. A timeout alone doesn’t mean the password is wrong.
Error: connection refused
Cause and fix: The connection was actively refused, often because nothing is listening on the destination port or the destination rejected it. Check the server port and service status. If the destination is 127.0.0.1, first check whether the local core started.
Error: no such host
Cause and fix: The current resolution path couldn’t find a usable result for the hostname. Check the server hostname for typos, system DNS, and the core’s DNS configuration, and make sure the resolver itself is reachable.
Error: failed to find an available destination
Cause and fix: None of the candidate destinations could establish a usable connection. The cause may be DNS resolution, dialing, or exhausted retries. Expand the error chain and address the specific underlying error rather than changing DNS based on this message alone.
Check DNS resolution and the port separately on Windows
These commands use reserved example domains to demonstrate the checks. Before running them, replace the domain and port with the current node’s actual server address and port. Don’t enter the website you want to visit or the TLS serverName unless it happens to be the server address.
Resolve-DnsName server.example.com
Test-NetConnection server.example.com -Port 443
Resolve-DnsNamechecks the system’s DNS resolution path; its result may differ from the core’s built-in DNS. If the system can resolve the name but the core can’t, check the core’s DNS servers and routing.TcpTestSucceeded : Trueonly confirms that this TCP connection succeeded. It doesn’t verify the UUID, TLS, WebSocket path, or remote forwarding.- A failed TCP test doesn’t tell you whether a UDP-based transport is working. First confirm the transport in use, then choose an appropriate diagnostic method.
TLS handshake failures and clock skew
A handshake failure means the connection stopped during security negotiation or protocol initialization, but certificates aren’t always to blame. Once TCP is reachable, check the security type, server name, certificate, transport settings, and authentication fields in that order. VLESS UUID validation and TLS certificate verification happen at different layers; fixing the certificate name doesn’t mean the UUID is correct.
Error: x509: certificate has expired or is not yet valid
Cause and fix: The certificate’s validity period doesn’t match the device’s current time. First check the system date and time synchronization, then ask the server maintainer to check whether the certificate has expired.
Error: x509: certificate signed by unknown authority
Cause and fix: The certificate chain isn’t trusted in the current environment. Check that the server provides the full certificate chain, inspect the local trust store, and look for certificate substitution on the network. Don’t disable certificate verification as a workaround.
Error: tls: handshake failure
Cause and fix: The peer terminated TLS negotiation. Possible causes include SNI, protocol policy, or server configuration. First check that TLS is enabled and the server name is correct, then compare with the server logs from the same time.
Error: EOF
Cause and fix: The connection ended while data was being read. This message alone doesn’t identify the cause. Check whether it occurred during the handshake or data transfer, verify the port, transport, path, and authentication details, and review the preceding errors.
Sync the clock before checking node settings
- On Windows, go to Settings → Time & language → Date & time, enable automatic time setting, and sync. Run
w32tm /query /statusto check the time service status; an error may simply mean the service isn’t running yet. - On Android, open Settings, search for “Date & time,” and enable automatic time setting. Check the actual date and time; changing only the displayed time zone won’t correct the system clock.
- With VMess, a clock difference between the client and server can cause authentication to fail. Sync both clocks; don’t just change the time zone displayed on your phone. VLESS doesn’t use the same VMess time-based authentication, but TLS still requires the correct time to verify certificates.
- Compare the server address, port, UUID, security type,
serverName, WebSocketpathand Host, or gRPCserviceName, one by one. Use only the values supplied by the server; don’t troubleshoot by changing fields at random.
Port conflicts: get the core running first
If the log contains bind, address already in use, or Windows’ Only one usage of each socket address, start by checking the local listening address. If the local inbound fails to start, the browser has nowhere to connect even if the system proxy is enabled. This is separate from whether the remote server’s port is open.
For example, if the log says binding to 127.0.0.1:10808 failed, use PowerShell to find the listening process. If the reported port is different, change the port in the command as well.
Get-NetTCPConnection -LocalPort 10808 -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-Process -Id 1234
In the second command, 1234 is an example process ID. Replace it with the OwningProcess value from the first command’s results. If no entry appears, check whether the log refers to a UDP listener, whether the process has already exited, or whether the error is from an earlier startup.
- If the listener is a duplicate client instance, exit the extra instances normally from the system tray, then start one instance and test again.
- If another program that you need is listening on the port, change the local listening port in the client’s parameter settings. Update any apps using a manual proxy to use the new port too.
- Restart the core after making changes. Confirm that the startup log looks normal, then test a web page. Don’t terminate system processes you don’t recognize.
- An error such as
permission deniedoraccess permissionsmay also involve reserved system ports or security policies. Don’t assume it’s always a duplicate process, and don’t rely on running as administrator indefinitely to hide the cause.
How to create a reproducible troubleshooting record
If you switch nodes, change DNS, enable TUN, and adjust routing all at once, even a successful connection won’t tell you which change worked. A better approach is to stick with one destination, one node, and one connection method, and match each test to the corresponding log timestamps. The steps below apply to similar issues on both desktop and Android.
- Record the baseline: Note the client and core versions, current network, proxy connection method, and destination. Pause unnecessary background downloads.
- Check startup: Restart the connection and first address startup errors such as configuration parsing failures, listener failures, and missing resources.
- Send a single request: Note the time, refresh one page once, and keep the logs from about 10 seconds before and after the request.
- Find the deepest error: Identify whether the issue is local listening, DNS resolution, remote dialing, TLS, or protocol authentication, then run the relevant checks.
- Change one thing: For example, correct only the system time or the incorrect port. Retest the same destination and compare whether the specific error disappears or moves to the next stage.
- Restore the log settings: When finished troubleshooting, exit debug mode and note what fixed the issue. Before sharing logs, remove UUIDs, subscription tokens, full subscription URLs, and personal browsing records. Keep module names and the structure of the error chain.
For more on outbound tags and routing rules, see Configuration Field Reference. If the log shows a request using a direct outbound, check the routing match; don’t mistake a failed direct connection for a failure to connect to the proxy server.
Common questions: what logs can’t tell you on their own
If there are warnings in the log, does that mean the connection won’t work?
No. Visit a specific destination at a known time, then find the entries for that request. Background retries, canceled connections, and failures to reach individual destinations can all generate warnings. Use a warning for troubleshooting only when the same request repeatedly fails with a reproducible error.
Why is there nothing in the core log when a subscription update times out?
The client may download subscriptions itself. First check the update message and confirm the subscription URL is still valid, then check the subscription proxy setting for your version. Try updating through a proxy only if the current proxy is already working; an empty core log doesn’t mean the subscription server is fine.
The node test succeeded, but my browser still won’t load pages. What should I check next?
First confirm what the test checks. A TCP port test isn’t the same as loading a web page. Check the access log while making a browser request. If there’s no entry, check the system or browser proxy settings. If there is an entry, check the outbound tag and any subsequent errors.
Can I send the maintainer just the last line of the log?
It’s better to include the full error chain for the same connection, the request time, client and core versions, and relevant log entries from about 10 seconds before and after the failure. The final EOF or timeout is often just the outcome; the preceding dialing address and handshake error point to where to start troubleshooting.