How to Read V2Ray Runtime Logs: What “connection refused” and Other Common Errors Mean

Start with the first meaningful error, using its timestamp and connection stage, then troubleshoot in order: listening, resolution, dialing, handshake, and authentication. The last log line is not always the root cause; full context matters more than one error phrase.

At a glance

Useful for diagnosing connection failures, inaccessible websites, or suddenly unavailable subscription nodes in v2rayN, v2rayNG, and v2flyNG. You’ll learn to distinguish access logs from error logs, understand common English errors, and narrow the cause down through ports, DNS, time, protocol settings, and server status.

First identify which part of the connection the log recorded

A proxy request does not send a webpage directly from the client to the remote node. With the local SOCKS port 127.0.0.1:10808 commonly used by v2rayN, the browser or another app first connects to the local inbound. The core then resolves the node domain, establishes a TCP or UDP connection, completes a TLS or REALITY handshake, and finally authenticates with protocols such as VMess or VLESS. A failure at any stage may appear in the interface simply as “connection failed.”

So don’t capture only the final word in the log. Find the timestamp for clicking “Test latency,” opening a webpage, or starting a configuration, then read 10 to 30 lines upward. Repeated entries such as retry and failed to process outbound traffic are often only higher-level summaries; the actual cause is usually in an earlier dial, lookup, handshake, or authentication line.

Application requestLocal inboundDomain resolutionRemote dialingHandshake and authenticationProxy outbound

Access logs confirm whether a request reached the core. They commonly show the target domain, target port, inbound tag, and selected outbound tag. Error logs show where the connection stopped. If no new access log entry appears, first check the system proxy, TUN, or the app’s own proxy settings. If the target address appears in the access log and the error log then reports a dialing failure, focus on the node address, port, and network path.

Set the log level and preserve useful context

Log levels are usually debug, info, warning, error, and none. Use warning or error for everyday operation to limit output. When diagnosing connection issues, start with info; switch temporarily to debug only when handshake parameters or routing matches remain unclear. Restore the original level afterward to prevent continuous log growth.

In v2rayN 7.x, open “Settings” → “Parameter Settings” → “Core Type” to confirm whether the current node uses the Xray core or the V2Fly core, then watch the log area on the main screen after restarting the core. After changing the log level or Core Type, stop and restart the current configuration; an existing process will not adopt the new parameters automatically.

  1. Set a fixed test time

    Clear the log, or note its current ending timestamp. Within 10 seconds, perform only one “Test real connection latency” action or open one test page.

  2. Confirm the core type

    In v2rayN 7.x, open “Settings” → “Parameter Settings” → “Core Type” and verify which core the node actually uses, so you do not inspect logs from the wrong process.

  3. Raise the log level

    Reproduce the issue once with info; switch to debug only if routing, handshake, or DNS details are missing.

  4. Restart the core

    Stop the current service and start it again. Confirm that the new log shows a listener on 127.0.0.1:10808 or on the port configured for the client.

  5. Save the complete excerpt

    Keep 10 to 30 lines before and after the error, and record the node protocol, transport, port, and reproduction steps.

To inspect the generated core configuration directly, look at the top-level log object. The example below writes error and access records to standard output; the exact file location is managed by the client. Manual changes to a temporary configuration generated by the client may be overwritten at the next startup, so use the client’s settings whenever possible.

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": "info"
  }
}

The same approach applies to v2rayNG 1.10.x and v2flyNG on Android: start the target configuration, open the log viewer from the main-screen menu, and reproduce the issue immediately. The system may restrict background processes. If logs stop updating after switching apps, keep the client in the foreground for one test; do not assume “no new logs” means the node is working.

Use the exact error text to diagnose network and port issues

connection refused means the TCP connection reached an address, but the target actively rejected the connection on that port. Unlike a simple timeout, a refusal usually returns quickly. Common causes include a server process that is not listening on the port, an incorrect port, DNS resolving to the wrong host, or a local inbound port mistakenly being used as the remote port.

context deadline exceeded means an operation exceeded its deadline. This can happen during DNS lookup, TCP connection setup, the TLS handshake, or while waiting for a remote response. The message alone does not prove that the node is down; check whether the preceding line identifies a specific target, such as dial tcp, lookup, or TLS handshake.

Error: connect: connection refused

Cause and fix: The target host explicitly rejected the specified TCP port—verify the server address and port in the subscription, then test again on another network. If every network is refused immediately, contact the node provider to confirm that the server is listening.

Error: context deadline exceeded

Cause and fix: Resolution, dialing, or the handshake did not finish before the deadline—check the previous line to identify the stage, then test DNS, switch networks, and verify the transport and security parameters.

Error: failed to find an available destination

Cause and fix: The core could not obtain a usable destination address, or every candidate address failed to connect—check the node domain spelling, DNS response, and routing rules, then restart the core after making changes.

Error: address already in use

Cause and fix: The local listening port is already occupied by another process—close duplicate client processes, or open “Settings” → “Parameter Settings” and change the local SOCKS port from 10808 to an unused port. Update the app’s proxy settings accordingly.

Error: no such host

Cause and fix: The node domain could not be resolved—check for extra spaces or characters in the domain, switch to a working DNS service, and resolve it again. Do not mistake a subscription remark for the server address.

Elapsed time can help identify where a timeout occurs. A local port conflict usually appears within one second of startup; a remote port refusal often returns within a few hundred milliseconds to several seconds. A deadline exceeded only after roughly 10 seconds is more consistent with packet loss along the network path, a firewall silently dropping traffic, or no response during the handshake. Timing alone cannot prove the cause, but it helps prioritize checks.

Log pattern Check first Recommended action
Error appears at startup Local listening ports Check whether 10808 or 10809 is occupied, then close duplicate processes
Refused after a few hundred milliseconds Remote address and port Verify the subscription parameters and retest the same node on another network
Timeout after about 10 seconds DNS and network path Check the resolution result, network reachability, and remote status
Only domains fail DNS and domain routing Compare with an IP target and check DNS outbound handling and split-routing rules

Handle invalid user and handshake authentication errors

Messages such as invalid user, invalid account, or authentication failures usually mean that the connection has reached protocol processing, but the identity information submitted by the client does not match the server configuration. For VMess, check the UUID, server time, and whether the node has been disabled. For VLESS, check the UUID, encryption field, Flow, and security method. An extra space introduced while copying a node can also invalidate authentication parameters.

VMess is sensitive to system time. If a desktop or Android device clock is significantly out of sync, authentication may fail even when the address and port are correct. Enable automatic date and time and automatic time zone in the system, then restart the client. Do not simply adjust the minutes manually in the interface; the time zone and second-level drift also need to be corrected.

Error: invalid user

Cause and fix: The UUID or account status does not match the server—update the subscription again instead of manually filling in missing characters. If only one node reports the error, confirm that its account is still active.

Error: invalid account

Cause and fix: The protocol account parameters failed validation—compare the original subscription content and verify the UUID, VMess alterId, or VLESS Flow, then delete the old node and import it again.

Error: TLS handshake timeout

Cause and fix: TCP connected, but the TLS handshake did not complete in time—verify the server name, system time, and network quality, then test again on another network.

Error: bad certificate

Cause and fix: The certificate does not match the target name, or its status is invalid—check that the TLS server name comes from the subscription and do not replace the required domain with the node’s IP address.

Error: rejected proxy request

Cause and fix: The server rejected the protocol request—verify the VMess or VLESS type, transport, security, and Flow parameters, and make sure the client has not applied an old configuration from another node.

When using WebSocket, gRPC, or REALITY, verify the transport layer as well as the authentication parameters. Common WebSocket issues include a mismatched path, an incorrect Host, and an HTTP 404 response. For gRPC, check serviceName. For REALITY, check serverName, the public key, shortId, and the fingerprint. A reachable address proves only that the TCP path exists; it does not prove that these fields are correct.

  • VMess: Check the UUID, alterId, encryption method, system time, transport type, and TLS settings.
  • VLESS: Check the UUID, Flow, transport type, security method, and server name.
  • WebSocket: Check path and Host. Slashes and letter case in the path must match the server configuration.
  • gRPC: Check serviceName; do not enter the node remark or domain in this field.
  • REALITY: Check the combination of serverName, public key, shortId, fingerprint, and Flow. Do not change just one field and reuse the configuration without verifying the rest.

Distinguish node failures, subscription issues, and routing

If every node in the same subscription fails at once, first check the local environment, subscription update result, DNS, and system time. If only one node fails, changes to that node’s address, port, or account status are more likely. If node testing succeeds but a specific website does not open, focus on routing rules, split DNS, and the destination site connection instead of repeatedly reimporting the subscription.

A typical routing issue is that the target domain appears in the log but the wrong outbound tag is selected. For example, a domain that should use the proxy is sent to direct, or a local-network address is sent through the proxy outbound. After changing the rules, reload the configuration and check the outbound tag for the same target again; do not rely only on the client’s status icon.

Symptom Likely direction Next step
No node starts Local port or core Check duplicate processes, Core Type, and configuration-generation errors
Every node times out while dialing Current network or DNS Switch networks and check whether the node domain resolves
Only one node reports invalid user Node account parameters Update the subscription and verify the UUID, Flow, and account status
Latency test succeeds but webpages fail System proxy or routing Check the app proxy, system proxy, and outbound tag
Only UDP apps fail UDP forwarding and network restrictions Confirm that UDP is enabled on the inbound and check whether the node protocol supports it

A successful subscription update only means that the client received a subscription response; it does not mean every node in the subscription is reachable. After updating, check the node count, update time, and whether key fields changed. If the list is empty, first check the subscription-group filters. If old nodes remain, confirm that the client updated the correct subscription group.

Follow a fixed sequence for the final diagnosis

Efficient troubleshooting depends on sequence, not random setting changes. First confirm that the core is listening on the local port, then confirm that the request reaches the inbound. Next check DNS, remote dialing, transport handshake, and protocol authentication. A later stage is meaningful only after the previous one passes.

For example, if the log first shows accepted tcp:example.com:443 and then shows connection refused for the node address, the path from the app to the local inbound is working; there is no need to keep adjusting the system proxy. Focus instead on the remote node port. Conversely, if opening a webpage produces no new access log entry, first check whether the browser or system is actually pointing to 127.0.0.1:10808.

  1. Check the listener

    After starting the client, confirm that the log contains no address already in use and that the local inbound port is listening successfully.

  2. Check the request

    Open the fixed test page and confirm that the access log shows the target domain and port 443. If it does not, check the system proxy or app proxy.

  3. Check resolution

    Search for lookup, no such host, and the node domain to confirm that DNS returned a usable address.

  4. Check dialing

    Use refused, timeout, or unreachable to distinguish a rejected port, a path timeout, and an unreachable network.

  5. Check the handshake

    Verify the TLS, REALITY, WebSocket, or gRPC parameters, then check the VMess or VLESS authentication fields.

  6. Restore the log level

    After locating the issue, change debug back to warning or the original setting, then restart the core.

Is the last log line the root cause?

Not necessarily. Read 10 to 30 lines upward and look first for the earliest lookup, dial, handshake, or authentication error; the final line is often only a summary of repeated failures.

Why is latency reported but webpages still won’t open?

A latency result only shows that one type of test received a response. Check whether the system proxy is enabled, then see whether the target domain appears in the access log and whether routing selected the correct outbound.

Still seeing invalid user after updating the subscription?

Delete the old node from that subscription group and update it again. Confirm that the node UUID and Flow have changed. If only one node continues to fail, verify the account status.

What does it mean if switching networks fixes the issue?

It suggests that the client configuration may be usable, so the original network’s DNS, port policies, or connection quality deserve closer inspection. Return to the original network, retest the same node, and compare the stages shown in the logs.

Should debug logging stay enabled?

No. Enable it temporarily only while reproducing the issue, save the useful excerpt, then restore warning or the original level to reduce disk writes and irrelevant output.

When sharing troubleshooting details, include the client name and version series, core type, node protocol, transport, error time, and a complete log excerpt. Redact credentials, subscription URLs, UUIDs, public keys, and other private connection details as needed, but keep the stage markers, target port, and outbound tag around the error.

Download V2Ray ClientChoose an installer for your platform