ERR_CONNECTION_REFUSED Fix Guide
ERR_CONNECTION_REFUSED is an instant TCP RST, not a timeout. Fix it in 3 checks: listening port, bind address, firewall reject rules. Free instant check, no sign-up.
Check your domain for this issue now
Free, no sign-up. Runs the exact check this guide describes and shows what to fix.
Problem
A page fails almost instantly with ERR_CONNECTION_REFUSED (or “This site can’t be reached”). The host is reachable and it answered your SYN, but it answered with a TCP RST instead of a SYN/ACK. Something on the other end is actively saying go away. The lack of a hang is the diagnostic signal: this is a rejection, not a silently dropped packet.
Symptoms
- The error appears immediately, not after a one-to-two-minute wait.
curlreportsConnection refused; the request never starts loading.- It may work from the server itself (
curl localhost) while every other client is refused. - The error is not
ERR_CONNECTION_TIMED_OUT(long hang) orERR_NAME_NOT_RESOLVED(DNS never resolved).
Top 3 Causes
- Nothing is listening on that port - The service crashed, was never started, or is bound to a different port than the URL targets (an app on
8080while the browser hits443). With no socket inLISTENfor that port, the kernel answers the SYN with a RST, exactly as RFC 9293 specifies for a closed port. - The service is bound to loopback only - It listens on
127.0.0.1instead of0.0.0.0, so it serves requests that originate on the host and refuses every connection arriving on the public interface. This is the classic “works locally, refused remotely.” - A firewall actively rejects the connection - A
REJECTrule, or a proxy returning ICMP port-unreachable, sends an immediate rejection. This is the opposite of aDROPrule, which swallows the packet and produces a timeout instead of a refusal.
Diagnose with DechoNet
- Port Check to test the target port from outside your network. A closed (refused) result confirms the browser’s view: either nothing is listening or a reject rule sits in the path. An open result means a process is listening and the problem is higher up the stack.
- HTTP Check to confirm whether the refusal is global or local to your network, by attempting the request from an external vantage point.
- DNS Lookup to confirm the
A/AAAArecord points at the host where the service actually runs, not a previous IP where nothing listens anymore.
If the port hangs and times out instead of refusing, switch to the ERR_CONNECTION_TIMED_OUT fix. If the refusal is specifically on port 443, use the open port 443 closed checklist.
Resolution Checklist
- Confirm the service process is running and in
LISTENon the expected port (ss -lntpornetstat -lntp). - Check the bind address:
0.0.0.0(all interfaces) versus127.0.0.1(loopback only). Loopback-only is the usual cause of “works locally, refused remotely.” - Verify the URL’s port matches where the service listens -
443for HTTPS,80for HTTP, or the explicit:port. - Look for firewall
REJECTrules, or a reverse proxy whose upstream is down, that reject rather than drop. - Confirm DNS resolves to the host where the service actually runs, not an address left over from a previous deployment.
- Re-run Port Check after each change to confirm the handshake now completes.
When to Escalate
- Escalate to whoever owns the service if the port refuses from multiple external networks while the process looks healthy on the host itself - that points at a bind-address or proxy-configuration problem rather than the network.
- Escalate to firewall or network owners if a
REJECTrule is rejecting source ranges that should be allowed.
Related Tools
Related Guides
Share this guide