At a glance

This guide is for cases where you’ve imported your own service into Shadowrocket and the connection toggle works, but domains won’t load. Check server connectivity, Global Routing, DNS, rules, and network conditions in that order. Change one variable at a time to distinguish DNS failures from connection problems or website issues. Configuration snippets explain troubleshooting methods only; no servers or subscriptions are provided.

1. Why Normal Latency Doesn’t Mean a Website Will Load

A latency test only reflects the network path covered by its test method. If it checks only whether a connection to the server port can be established, it doesn’t confirm that a target domain resolves or that the server can reach the website. Even an HTTP test reflects only the test URL and network path at that moment; it can’t replace checking the website that’s actually failing.

When you open an HTTPS site in a browser, the process typically involves resolving the domain, connecting to the destination, negotiating TLS, and sending an HTTP request. DNS provides the address associated with a domain; it won’t fix expired server credentials or remove access restrictions imposed by a website. Even if the connection appears normal, identify which stage the request is getting stuck at.

Observed symptomWhat it tells youWhat to check next
The server latency test returns a resultThe path covered by the test is respondingResolution of the target domain and the actual request
A domain lookup returns an A or AAAA recordAn IPv4 or IPv6 address was returnedWhether the address is reachable and TLS succeeds
The webpage returns HTTP 403The request reached an HTTP service that respondedThe website’s access policy and restrictions on the network exit
Only one website failsThe issue may be limited to that domain or pathThe relevant rule, resolution result, and website status

Takeaway: First identify where the failure occurs

Keep the failing domain and the exact error message. If an HTTP status code is available, investigate the website’s response first; don’t start by changing DNS.

2. Establish a Repeatable Baseline

Before you begin, back up the current configuration in Config and note the selected server in Home and the current Global Routing mode. If you recently updated a subscription you already use, note whether the server address, port, or authentication details changed. A successful subscription refresh only means the request to retrieve its contents worked; it doesn’t confirm that every service listed is usable.

  1. Record a Failing Example

    Choose one domain that fails and one that usually works. Record the full error message, the time, and whether you’re on Wi-Fi or cellular. Use the same pages for each test to avoid confusing results caused by changing the test target.

  2. Check the Server

    In Home, verify the selected server and run an available latency or connectivity test. If the server itself won’t connect, check its address, port, and credentials against the details for your existing service before investigating DNS settings.

  3. Record the Routing Mode

    Open Home → Global Routing and note whether the current mode is Proxy, Direct, Config, or Scene. Keep it fixed while troubleshooting. If you use Scene, confirm which scene is active so a network change doesn’t also alter routing behavior.

  4. Rule Out Automatic Reconnection

    Check Settings → On Demand. If you need to compare behavior with the connection off and on, note the original setting, then temporarily disable automatic activation to prevent the connection from restarting as soon as you turn it off. Restore the original setting when you’re done.

  5. Change One Setting at a Time

    Change just one setting, save, reconnect, and revisit the same domains. Record the result, then decide whether to keep or undo the change. Don’t change the server, DNS, and entire configuration at the same time.

3. Distinguish System DNS from Configuration Overrides

In Config, open the configuration currently in use, enter edit mode, and check whether dns-server is set under [General]. Don’t check only a different, inactive configuration. If other DNS-related settings are in use, record those too so you can account for settings that may override the field you change.

system means to use the DNS provided by the system. It’s useful as a baseline, but it doesn’t mean every network will return the same result: Wi-Fi, cellular, and the device’s DNS settings can all affect system resolution. If you specify a resolver manually, confirm that it’s reachable on the current network, not just that its address is entered correctly.

# Relevant fields shown for reference only; do not use this snippet to replace the entire configuration.
[General]
dns-server = system

The snippet above shows where the field goes. For testing, edit the relevant line in the existing [General] section, leave the other settings intact, and avoid adding duplicate sections or fields. Note the old value before saving, reconnect, and test again. If there’s no improvement, restore the old value before checking the next layer.

ItemMeaningWhat to check
AThe IPv4 address associated with a domainOnce an address is returned, check whether the IPv4 route is reachable
AAAAThe IPv6 address associated with a domainDistinguish between receiving an address and having a working IPv6 route
Traditional DNSUsually uses UDP 53, with TCP 53 when neededWhether the current network blocks queries or returns unexpected results
DNS over HTTPSDNS queries sent over HTTPS, usually using TCP 443Whether the resolver endpoint is reachable and how its domain is resolved initially
DNS cacheReuses a previous result while it remains validWhether you’re still seeing an old connection or result after changing the configuration

Encrypted DNS changes how queries are sent; it doesn’t automatically fix every DNS problem. Queries can still time out if the resolver endpoint is unreachable or its domain can’t be resolved initially. A browser or another app may also use its own DNS method and return different results from Shadowrocket. Use the same app throughout your tests.

4. Use Error Messages to Tell Missing Records, Server Failures, and Timeouts Apart

The following are common raw status codes or error strings used in DNS diagnostics; they aren’t necessarily displayed exactly as written in every Shadowrocket screen. Browsers may show only a general error. Check the logs, request details, or lookup results available to you rather than inferring the cause from “This site can’t be reached” alone.

Error: NXDOMAIN

Cause: The responding resolver says the queried domain doesn’t exist. A typo, an expired domain, or an unexpected DNS response could cause this result.

Fix: Check the full domain name, then compare results on another network. If the issue occurs on only one resolution path, record both results and check the current DNS source and any local overrides.

Error: SERVFAIL

Cause: The resolver couldn’t complete the query. Possible causes include an upstream query failure, an issue with the domain’s authoritative service, or a validation problem. This doesn’t mean the domain doesn’t exist.

Fix: Test another known-working domain to see whether the issue affects just one domain. Then, without changing the routing mode, retry using a resolution method you’ve confirmed is reachable.

Error: connection timed out

Cause: The requested operation didn’t complete in time. Classify it as a DNS timeout only if you’ve confirmed the timeout occurred during the DNS query.

Fix: First identify whether the resolver, server, or destination website timed out. Then check the relevant port and network path so you don’t mistake a TCP timeout to the website for a DNS issue.

A missing AAAA record isn’t necessarily an error; some domains publish only A records. Likewise, a successful query with no record of the requested type is different from NXDOMAIN. Record the query name, record type, and response status instead of noting only that there’s “no IP.”

5. After Resolution Succeeds, Check Global Routing and Rules

Proxy, Direct, Config, and Scene in Global Routing are routing modes, not DNS server options. Proxy routes through a proxy; Direct connects directly; Config follows the active configuration; and Scene follows the active scene’s settings. Switching modes can help you compare results, but it doesn’t prove that one mode always performs all resolution locally or remotely.

If the same domain works in Proxy but fails in Config, check which rule is actually matched in Config. If it works in Direct but fails in Proxy, also check the route from the server to the destination website. Neither symptom alone proves there’s a DNS problem.

# Explains rule syntax and order only; this is not a complete configuration to use as a replacement.
[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.0.2.0/24,REJECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
  • DOMAIN-SUFFIX,example.com,DIRECT matches the domain and its subdomains. Check whether the failing domain matches an earlier rule with an unexpected policy.
  • IP-CIDR matches an address range. 192.0.2.0/24 in this example is a documentation range, not a real service address.
  • no-resolve prevents an IP rule from triggering a DNS lookup just to match that rule. It doesn’t disable DNS for the entire configuration or prevent a request from resolving an address at another stage.
  • GEOIP matches based on the region associated with an IP address. Whether a domain request needs to be resolved depends on the available address and rule parameters.
  • FINAL goes at the end and handles requests that didn’t match any earlier rule. Make sure the fallback policy points to the intended route; checking a single domain rule isn’t enough.

Takeaway: If an address is returned but the site still fails, check the matched policy

Keep DNS unchanged and compare access in Proxy and Config. If the difference is consistent, focus on the rule and its selected route instead of making more DNS changes.

6. Compare Wi-Fi, Cellular, and IPv6

If the same configuration fails on Wi-Fi but works on cellular, the network environment is an important variable, but that doesn’t prove Wi-Fi DNS is at fault. The network may also restrict server ports, affect IPv6 routing, or require sign-in first. After switching networks, reconnect and confirm that Global Routing and the selected server haven’t changed with the active scene.

  • Complete network sign-in first: If public Wi-Fi requires a login, complete its sign-in process before testing Shadowrocket. Redirects or blocked connections before sign-in can make several websites fail at once.
  • Test the same domain: Visit the same page on both networks. Record whether DNS returns a result, whether the connection times out, and whether an HTTP status code appears; don’t compare latency alone.
  • Check the IPv6 route: If a domain returns AAAA but the current network can’t connect over IPv6, pages may stall or some resources may fail. First confirm which address family the failing request actually uses, then run a temporary comparison. Disabling IPv6 isn’t a universal fix.
  • Account for cached results: Reconnect and reopen the test page. An app may keep its own DNS cache or connection pool, so you may need to quit and reopen it. Reconnecting alone doesn’t guarantee that every app’s cache is cleared.

7. Common Questions and When to Stop Troubleshooting

Latency is always normal. Should I just change DNS?

First, check the server and Global Routing in Home, then see whether the failing domain returns an address. If you already have an HTTP or TLS error, investigate that layer. Treat DNS as the main variable only when the failure occurs during resolution.

I changed dns-server. Why hasn’t anything changed?

In Config, confirm that you edited the active configuration, then check for duplicate fields or other settings that take effect. Save, reconnect, reopen the test app, and test the same domain again. Also consider the app’s own DNS settings and cache.

Only one website won’t load. Do I need to rebuild the configuration?

First, check the domain spelling, its resolution result, and which rule it matches in Config. Then compare Proxy and Direct. Keep other working sites as controls; don’t replace the entire configuration just for one domain.

The subscription refreshed successfully. Why won’t websites load?

Refreshing a subscription and opening a website are separate requests. Go back to Home and confirm which server is actually selected, verify its settings against the details for your existing service, then check the destination domain, routing, and DNS in the order described here. A successful refresh doesn’t confirm that a connection works.

Before you finish troubleshooting, retest both the original failing domain and the working control domain. Restore any temporarily disabled On Demand or original scene settings. Keep only the smallest set of changes that explains the improvement, and undo tests that made no difference. If you need to contact support for your existing service, provide the time of failure, network type, relevant errors, and a redacted configuration snippet. Remove subscription tokens, passwords, and other authentication details.