Proxy Connected but No Internet? Check System Proxy, DNS, and Rules
Check system proxy settings, port conflicts, DNS, rule matches, and node connectivity to find out why a connected proxy can't access the internet.
1. Distinguish Client Status from Actual Requests
A Clash client showing “Connected” may only mean that the Mihomo core is running, the system proxy is enabled, or an Android VPN interface has been established. It doesn't prove that browser requests are reaching the core or that the selected node can connect to the site you're trying to reach. Trace the request through each step: “app → local listener → rules and policy groups → outbound node → destination service.”
First, note three things: Can no websites load, or only some? Is the problem limited to the browser, or do other apps fail too? After disabling the proxy, do sites that normally connect directly work again? Retest the same full URL each time so you're comparing like with like.
| Observed symptom | Check first | Next evidence to gather |
|---|---|---|
| No new connection appears when you visit a website | System proxy, app-specific proxy, TUN interception | Test with an explicitly specified local proxy |
| Connection to the local port is refused immediately | Core startup status, listening port, port conflicts | Process listening on the port |
| Logs show a domain resolution timeout | DNS upstreams, node hostname resolution, DNS routing | Specific failing domain and resolver |
| Request matched DIRECT or REJECT | Rule order, rule sets, policy groups | Rule actually matched |
| Proxy node selected, but outbound connection times out | Node address, authentication, transport settings, network restrictions | Compare results across nodes and networks |
2. Check That the System Proxy Actually Points to Mihomo
The system proxy tells apps that follow system settings which proxy endpoint to use; it doesn't automatically route traffic from every program. Some browser extensions, terminal tools, games, and other VPN software may use their own network settings. Temporarily disable browser proxy extensions and other proxy clients, leaving just one proxy endpoint active.
Check System Settings and the Local Address
- Windows 11: Open Settings → Network & internet → Proxy and check the address and port under “Manual proxy setup.” If you use a setup script, make sure it still controls browser traffic.
- macOS: Open System Settings → Network → your current network service → Details → Proxies. Check the web proxy, secure web proxy, or SOCKS proxy. Menu names may vary slightly between OS versions.
- Android: The system VPN indicator means a VpnService interface is active. Also check that the client hasn't excluded your browser from per-app proxying.
The examples below use 127.0.0.1:7890 as the local mixed-proxy endpoint. 7890 is only an example, not a fixed port for every client. Check the active configuration or the client's port settings for the actual value. external-controller is the control interface, not a web proxy port.
Test Without Relying on System Proxy Settings
On Windows, use curl.exe in PowerShell to avoid differences caused by an alias with the same name in older environments. On macOS and Linux, replace curl.exe below with curl. The example targets https://example.com/; if that address isn't reachable on your network, use a known-working HTTPS URL instead.
curl.exe -v --connect-timeout 10 --max-time 20 --noproxy "" -x http://127.0.0.1:7890 https://example.com/ -o NUL
On macOS and Linux, replace the output target NUL with /dev/null. --noproxy "" prevents any bypass list in your environment from affecting this explicit proxy test. The 10- and 20-second limits are troubleshooting parameters, not measured node speeds.
- If the command succeeds but the browser fails, check the system proxy, browser extensions, separate proxy settings, and cached connections first.
- If you see a connection error for
127.0.0.1, check the local port first—not DNS. - If CONNECT succeeds but a TLS or remote connection error follows, the request has at least reached the proxy endpoint. Continue checking the outbound connection.
3. Port Conflicts and Core Startup Failures
An open client window doesn't mean the core loaded its configuration successfully. Check the core logs for address already in use, configuration parsing failures, rule set loading errors, or permission errors. If an old process is occupying the local port, your browser may even be connecting to a different proxy.
Identify the Listening Process
In Windows PowerShell, query the TCP listening port, then use the returned process ID to identify the program. These commands only query information; they don't stop any processes.
Get-NetTCPConnection -LocalPort 7890 -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-Process -Id 1234
1234 is an example process ID. Before running the second command, replace it with the actual OwningProcess value returned by the first. On macOS, run lsof -nP -iTCP:7890 -sTCP:LISTEN; on Linux, run ss -lntp 'sport = :7890'. You may need additional permissions to view details for processes owned by other users.
Keep the System Proxy in Sync with the Active Configuration
# Example local mixed-proxy listener; shown to illustrate the relevant fields
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
This isn't a complete subscription configuration; don't use it to replace your nodes and rules. If you change the port to 7891, update the system proxy and test command too. Some clients generate the final configuration by applying overrides or merging settings, so check the “active configuration,” not just the original subscription. Keeping the loopback address limits access to the local machine; you don't need to enable LAN access to fix local internet connectivity.
4. DNS Troubleshooting: Distinguish Destination and Node Hostnames
“DNS failure” can mean at least two things: the destination site's domain failed to resolve, or the proxy server's own hostname couldn't be resolved. The latter can cause timeouts across multiple sites even when their DNS responses are fine. When checking logs, note the exact domain involved; don't assume the node is down just because you see timeout.
Check System Resolution, Then Core Logs
nslookup example.com
nslookup usually queries the DNS server selected by the system; with TUN interception or network redirection, the request may be intercepted as well. Its results don't represent every DNS path used by Mihomo. Browser secure DNS, encrypted system DNS, and the core's built-in DNS may also take different routes.
- Check whether DNS is enabled: Confirm the value of
dns.enablein the active configuration and that the configurednameserveris reachable from your current network. - Check encrypted DNS dependencies: DoH or DoT upstreams specified by hostname need a working bootstrap resolution path.
default-nameservercan resolve DNS server hostnames, so check how it relates to your upstream addresses. - Check proxy node resolution:
proxy-server-nameserveris used to resolve proxy node hostnames. If it's configured, make sure those resolvers are available; otherwise, the node may depend on itself to resolve its hostname before it can connect. - Check rule dependencies: If settings such as
respect-rulesmake DNS connections follow routing rules, review the associated proxy and direct resolvers too. Avoid creating a circular dependency between DNS resolution and proxy routing.
After switching from Fake-IP to another resolution mode, apps may still hold old addresses. On Windows, run ipconfig /flushdns to clear the system cache, then fully close and reopen the browser. Clearing the system cache doesn't necessarily clear the browser's own cache, DoH cache, or existing connections. Make a new request and compare it with the logs.
Don't change the DNS mode, every upstream, and the TUN setting all at once. First confirm one known-working resolution path, then restore settings one by one. For field definitions, see the DNS configuration guide.
5. Rule Matches and Policy Groups: Check the Actual Route, Not Just the Mode
Mihomo's rule mode evaluates rules in order. Usually, the first matching rule determines where a request goes; the final MATCH catches requests not handled by earlier rules. If an earlier rule sends the destination domain to DIRECT, a later proxy rule won't reroute it.
Check These Four Details in the Connection View
- Does the destination domain and port match the site you just tested? HTTPS usually uses TCP
443. - The matched rule type and rule content, especially domain rules, rule sets, and fallback rules.
- The policy group that matched, and the node or
DIRECTultimately selected by that group. - Whether the failure occurred during resolution, dialing, the proxy handshake, or TLS.
Clear the connection list in the client or note the test time, then open the target site once. If a reused connection makes the result hard to interpret, close that connection and try again. A policy group name is only an entry point; groups may be nested, so trace the route to the final outbound node.
Use Global Mode Only for a Brief Comparison
Temporarily switch to Global mode and explicitly select a node. If the same destination works in Global mode but fails in Rule mode, focus on rule order and policy group selection. If both modes fail, continue checking the node and network. Global mode won't fix a dead node or automatically capture traffic from apps that never reach the core.
Failed rule set downloads can also affect configuration loading or routing. Check the rule-providers update logs and local cache status. Don't delete all your rules just to get a website working temporarily; identify the specific matched rule, then adjust only the necessary order or policy. Restore Rule mode when troubleshooting is complete.
6. Node Availability: A Latency Reading Doesn't Guarantee Website Access
A latency test is a single probe to a specific test URL, at a specific time, over your current network. A latency reading doesn't mean other domains, video services, or UDP traffic will work. A node appearing in the list also doesn't mean its subscription address, port, or credentials are still valid.
- Try a different node on the same network: Keep the browser, destination URL, and proxy mode unchanged; switch only the node. If another node works immediately, check the original node or its server status first.
- Try a different network with the same node: Switch from Wi-Fi to a mobile hotspot and revisit the same destination. If the result changes, investigate the network's DNS, firewall, or routing conditions.
- Check when the subscription was last updated: Confirm the update succeeded and the client isn't still using an old cache. After updating, check whether client overrides are replacing node settings.
- Check protocol settings: For a manual configuration, verify the server address, port, authentication, TLS server name, and transport settings. Which fields are required depends on the protocol; don't copy settings from a different protocol.
connection refused commonly means the destination port isn't listening or the connection was actively rejected. i/o timeout means the request timed out; that line alone can't tell you whether the server failed or packets were dropped somewhere along the network path. For certificate errors, check the system clock, destination domain, and TLS settings. Don't hide handshake errors by permanently skipping certificate verification.
If only a login page or a particular site fails, check the HTTP status code returned by the site. 403, 429, or an account restriction isn't the same as a local proxy port that won't start. First confirm the response came from the destination service, then consider exit IP policies or restrictions imposed by the site.
7. Additional Checks for TUN, Per-App Proxying, and Browser Protocols
If an explicit HTTP proxy test works but access fails with TUN enabled, that distinction is useful. TUN depends on a virtual network interface, routing, and permissions. If tun.auto-route, interface detection, or DNS hijacking is enabled, check for conflicts with other VPNs, virtual machine networks, and security software.
Isolate the TUN Path on Desktop
- Note the current TUN and system proxy settings, then temporarily disable TUN.
- Use only the explicit proxy command above to test the same URL and confirm the local endpoint and node connection.
- If the explicit proxy works, re-enable TUN and check the startup logs for permission issues, virtual interface creation, and route updates.
- If direct access still fails after closing the client, check for leftover system proxy settings, other VPNs, and routing issues. Don't blindly delete system routes.
Check Whether Android Is Routing the App
Android usually allows only one regular app VPN service to be active at a time. Switching to another VPN, an ad-blocking VPN, or a network tool in a work profile may replace the original client. In per-app settings, “Only proxy selected apps” and “Bypass selected apps” mean opposite things; make sure the browser is in the intended list. If the problem starts only after the screen locks, check background restrictions and battery optimization before rewriting rules.
Check HTTP/3 Only If the Browser Is the Problem
HTTP/3 uses QUIC, which typically involves UDP 443. A successful explicit HTTP proxy command doesn't prove the browser's QUIC path is working. If the issue is clearly limited to the browser, temporarily disable HTTP/3 for comparison. If that changes the result, investigate UDP outbound traffic, node support, and TUN routing. Disabling the protocol isn't a universal fix for website access problems.
8. Restore Settings and Prepare a Minimal Issue Report
Once you've identified the failing layer, restore temporary changes one by one, including Global mode, DNS upstreams, and browser protocol settings. Keep only changes that actually solved the problem. Retest a site that connects directly, one that requires a proxy, and the original failing destination. Finally, check that the system connects as expected after closing the client.
If you still need to report the issue, the information below will make it easier to diagnose than a screenshot that just says “Connected.” Include only the log excerpts needed to reproduce the problem, and don't expose subscription credentials, node passwords, or control interface tokens.
- Operating system version, client version, actual Mihomo core version, and whether client overrides are in use.
- Whether the system proxy or TUN is enabled, local listening address and port, and per-app proxy settings.
- When the issue occurred, destination domain, network in use, and whether all destinations fail.
- Result of the explicit proxy command, matched rule, final policy group, and selected node.
- Which of the node change, network change, or TUN disable tests changed the result.