For desktop users who have enabled the system proxy in v2rayN but still can’t connect from a browser or command line. First verify the local proxy endpoint, then check browser extensions, the source of the system proxy settings, terminal environment variables, and bypass rules. Comparing explicit proxy requests with direct connections can help pinpoint whether the issue is in app settings, the local listener, or the remote connection—without repeatedly switching nodes while requests follow the same path.
The system proxy doesn’t route every app automatically
v2rayN’s “System Proxy” setting mainly adds a local proxy address to the operating system’s proxy configuration. Whether an app uses that configuration depends on the app. Browsers usually honor the system proxy, but extensions, launch options, or enterprise policies can override it. Command-line tools such as curl typically use their own options and environment variables, so a checked box in the tray menu doesn’t prove that terminal traffic is going through the client.
Also distinguish between a request reaching the client and a request going through a remote proxy. Even after a request reaches the local endpoint, routing rules may send it directly. The system proxy determines which endpoint an app uses; routing rules determine the outbound path. They’re separate settings. VMess and VLESS are node protocols, not proxy types to enter in a browser. A browser connects to the local HTTP or SOCKS endpoint provided by the client.
- Only the browser fails: Check extensions, browser-specific proxy settings, and the system proxy address first.
- Only the terminal fails: Check whether the command supports proxies, along with its options, environment variables, and bypass list.
- Both browser and terminal fail: Check whether the local port is listening, then inspect core logs and the node connection.
- Only certain domains fail: After verifying the endpoint, check domain routing, name resolution, and the destination server’s response.
Verify the v2rayN local listening port first
This example uses 127.0.0.1:10808 as a local endpoint with HTTP proxy support enabled. It’s an example for troubleshooting, not a value used by every version or configuration. In v2rayN, open Settings → Parameter Settings and look for the local listening port and endpoint type. Labels may vary by version; use the names shown in your current interface. If HTTP and SOCKS use separate ports, choose the HTTP port.
In Windows PowerShell, first confirm that the port is listening, then send a request through the explicit proxy. This example uses curl.exe to avoid PowerShell environments where curl is interpreted as a different command. Keep v2rayN running during the test, and make sure the current node and core are started.
Get-NetTCPConnection -State Listen -LocalPort 10808
curl.exe -I --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/
This command limits the bypass list to local addresses, so the example domain still uses the specified proxy. Receiving an HTTP response from the destination confirms that this request reached the proxy channel and connected to the destination. If the logs show that a direct-connection rule matched, however, that doesn’t prove the request went through a remote node. A 200 Connection established response only confirms that the HTTP CONNECT tunnel was accepted; check the destination’s response as well.
Isolate browser extension conflicts in three steps
If the explicit proxy test succeeds but the browser still fails, first check what’s controlling the browser’s proxy settings. Multiple proxy extensions can conflict—for example, one may set a fixed proxy while another enables an automatic configuration script. The mode shown by an extension’s icon may not match the proxy mode saved in the operating system.
-
Disable proxy extensions
In Chrome, go to Menu → Extensions → Manage extensions. In Edge, go to Menu → Extensions → Manage extensions. Temporarily disable every extension that changes proxy settings, noting their original states, then fully quit and restart the browser. Closing the current tab isn’t enough.
-
Check the system proxy endpoint
In Windows 11, go to Settings → Network & internet → Proxy and check whether the address and port under “Use a proxy server” match the endpoint currently listening in v2rayN. If “Use setup script” is enabled, note the script address and confirm that it’s the configuration you intend to use.
-
Test with extensions restored one at a time
Visit the same test address again. If disabling extensions fixes the problem, re-enable one proxy extension and explicitly choose either “Use system proxy” or the correct fixed proxy configuration. Change one setting at a time and test the same URL to avoid changing the cache, node, and routing rules all at once.
In Firefox, also go to Settings → General → Network Settings → Settings and make sure “Use system proxy settings” is selected—not an old manual proxy or automatic proxy configuration URL. If the browser says its proxy settings are managed by your organization, contact your device administrator. Reinstalling v2rayN usually won’t remove a browser policy.
- Incognito mode isn’t fully isolated: Extensions may be allowed to run in incognito, and system proxy settings and device policies still apply.
- A new tab isn’t a new process: The browser process may retain proxy options from startup. If needed, use Task Manager to confirm that the browser has fully exited.
- Don’t change certificates first: A standard HTTP CONNECT proxy doesn’t require installing a root certificate in the browser. If you see a certificate error, check the system clock, destination domain, and network first.
Configure terminal proxies with environment variables
A terminal is just the environment where programs run; it doesn’t route every program through the system proxy. curl typically reads proxy environment variables, while other commands may use their own configuration files or command-line options. First verify connectivity with the explicit --proxy option from the previous section, then set the variables. This helps distinguish an unavailable proxy from a program that isn’t reading its proxy settings.
Windows PowerShell: set variables for the current session
Get-ChildItem Env: | Where-Object Name -Match '^(http_proxy|https_proxy|all_proxy|no_proxy)$'
$env:http_proxy = "http://127.0.0.1:10808"
$env:https_proxy = "http://127.0.0.1:10808"
$env:no_proxy = "localhost,127.0.0.1"
curl.exe -I --connect-timeout 10 --max-time 20 https://example.com/
https_proxy applies to HTTPS destination requests, but its value can still be http://127.0.0.1:10808. The URL scheme describes the local proxy service: curl uses HTTP CONNECT to establish a tunnel. It doesn’t mean the HTTPS destination is accessed in plain text. Don’t change the endpoint to https:// just because the variable name contains HTTPS.
macOS and Linux: mind the variable name’s capitalization
env | grep -iE '^(http_proxy|https_proxy|all_proxy|no_proxy)='
export http_proxy="http://127.0.0.1:10808"
export https_proxy="http://127.0.0.1:10808"
export no_proxy="localhost,127.0.0.1"
curl -I --connect-timeout 10 --max-time 20 https://example.com/
In case-sensitive environments, curl’s HTTP proxy variable should be lowercase: http_proxy. Setting only uppercase HTTP_PROXY may not work. Support varies between tools, so check the relevant documentation. Start with session-only settings; once they work, consider adding them to a shell startup file. This avoids automatically using an incorrect port every time you open a terminal.
Check bypass rules alongside direct-connection results
no_proxy or NO_PROXY lists destinations that should bypass the proxy. If it includes the test domain—or is set to *—the program may connect directly even when the proxy variables are correct. Another common issue is an old all_proxy value pointing to a SOCKS port that’s no longer listening. Precedence varies between programs, so check all relevant variables rather than only https_proxy.
| Test result | Check first | Next step |
|---|---|---|
| Explicit proxy works; default request fails | Where the app gets its proxy settings | Check environment variables, app-specific settings, and bypass lists |
| Explicit proxy fails; direct connection works | Local endpoint or proxy outbound connection | Check the listening port, endpoint protocol, and core logs |
| Terminal works; browser fails | Browser override settings | Disable proxy extensions and check system proxy settings and browser policies |
| Both requests fail | Network or destination connection | Check basic connectivity first, then investigate name resolution, the handshake, and the destination server |
In Windows, use the commands below to access the same destination. The first explicitly uses the local proxy; the second explicitly connects directly with --noproxy "*". On macOS and Linux, use curl as the command name. The example domain is only for comparing connectivity. It’s normal for both direct and proxied requests to succeed, and this doesn’t reveal the exit location.
curl.exe -I --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/
curl.exe -I --connect-timeout 10 --max-time 20 --noproxy "*" https://example.com/
Bottom line: keep the request path consistent
If the explicit proxy works but the default request fails, first fix how the app reads proxy settings instead of switching nodes. Investigate routing and the remote connection only if requests still fail after confirming they use the same local endpoint.
Use curl errors to identify where the request fails
Browser messages such as “Can’t reach this site” are often too vague to diagnose the problem. curl error codes help distinguish failures at the local endpoint, proxy protocol, or TLS stage. The snippets below are common examples; timings, addresses, and additional details vary by operating system and curl version.
Error: curl: (7) Failed to connect
Cause and fix: The connection to the specified address failed. If the output points to 127.0.0.1, check that the v2rayN core is running, the port is correct, and a listener is present. Don’t start by troubleshooting remote TLS.
Error: curl: (5) Could not resolve proxy
Cause and fix: The proxy hostname couldn’t be resolved. Check the address spelling, URL scheme, and quotes in the proxy variable. For a local endpoint, use the actual loopback address and port.
Error: curl: (6) Could not resolve host
Cause and fix: The destination hostname couldn’t be resolved. First check whether the request is unexpectedly connecting directly and whether you’re using a SOCKS mode that resolves names locally. Then inspect the resolution path in the logs; this error doesn’t necessarily mean the node timed out.
Error: curl: (28) Connection timed out
Cause and fix: The connection wasn’t completed within the time limit. Use the address shown in the error and the core logs to distinguish a connection to the local endpoint from a later remote connection. Then check the node address, port, and network reachability.
Error: curl: (60) SSL certificate problem
Cause and fix: Certificate verification failed. Check the system clock, certificate trust chain, and whether the network is intercepting traffic. Don’t disable certificate verification and treat the problem as solved.
For more detail, add -v to the original command to inspect the connection address, proxy variable hints, and handshake stage. Before sharing logs, remove subscription URLs, authentication details, proxy credentials, and sensitive request headers. You don’t need to share your full configuration, and you shouldn’t post the complete list of terminal environment variables in a public forum.
Restore your settings and confirm the results
After testing, keep just one clear way of controlling the proxy. If your browser normally uses the system proxy, set extensions to follow the system settings. When the terminal needs a proxy, configure variables for that session. Don’t keep system proxy settings, a fixed proxy extension, an automatic configuration script, and multiple old environment variables as “backups”—it’ll be difficult to reconstruct the request path the next time something breaks.
- Clean up the Windows session: Restore the values you recorded before testing. If a variable wasn’t set originally, use the command below to remove the one you added.
- Clean up other shell sessions: Restore the previous values first. Use
unsetonly for variables that weren’t set before testing. - Client cleanup: If you no longer need the system proxy, select “Clear system proxy” under “System Proxy” in the v2rayN tray menu, then exit the client. Menu labels may vary by version.
- Record the results: Note the actual port, endpoint type, what controls the browser’s proxy, and the results of explicit proxy and direct-connection tests. Use the same conditions if you need to test again.
# PowerShell: remove only variables added for this test that were not originally set
Remove-Item Env:http_proxy, Env:https_proxy, Env:no_proxy -ErrorAction SilentlyContinue
# Bash / Zsh: remove only variables added for this test that were not originally set
unset http_proxy https_proxy no_proxy
If the explicit proxy works but certain domains still use the wrong outbound route, read the routing rules guide. If neither the local endpoint nor the node connection can be established, continue with connection troubleshooting. Verify the endpoint and app settings separately before changing DNS, routing, or node options so you can tell which change actually fixed the problem.