Skip to content

403 Forbidden through a proxy: find out who refused

Most 403s seen through a proxy come from the website: the tunnel opened, the site read the request and declined it. A 403 that arrives as the answer to CONNECT, before any TLS, comes from the proxy, which refused the destination. curl -v shows which: look for 200 Connection established before the 403.

Reviewed by John Hale. Last updated .

What it looks like

From the website: the tunnel opened first
> CONNECT example.com:443 HTTP/1.1
< HTTP/1.1 200 Connection established
...
> GET /account HTTP/2
< HTTP/2 403
< content-type: text/html

From the proxy: no tunnel
> CONNECT 192.168.1.10:443 HTTP/1.1
< HTTP/1.1 403 Forbidden
* CONNECT tunnel failed, response 403
curl: (56) CONNECT tunnel failed, response 403

What does 403 Forbidden mean through a proxy?

403 means the server understood the request and refuses to fulfil it (RFC 9110, section 15.5.4). Unlike 401, signing in is not expected to help, and sending the same request again gets the same answer.

Through a proxy, two different servers can send it. For an HTTPS URL your client first asks the proxy to open a tunnel with CONNECT. A 403 in reply to CONNECT is the proxy refusing that destination. Once the proxy has replied 200, everything after it comes from the website, and the proxy can neither read nor change it.

A plain http:// URL has no tunnel: the proxy forwards the request and passes the site's response back, so read the response body and headers to tell the two apart.

What causes a 403 through a proxy?

Most likely first.

  1. The website refused this request. Sites refuse requests that do not look like their usual visitors: missing or inconsistent headers, no cookies, an unusual TLS client, or a page that needs a signed-in session. This is the most common source of a 403 through a working proxy.
  2. The website refuses the exit's network. Many sites score addresses by network type and history. Datacenter ranges and addresses with recent abuse reports are refused more often than residential ones, and some sites refuse every range they know belongs to a proxy or VPN.
  3. The exit is in a country the site does not serve. Streaming, banking, betting and some retail sites answer 403 to countries outside their market. Check where the exit actually is; IP databases often disagree about cities.
  4. The proxy refused the destination. Providers refuse private and reserved addresses such as 127.0.0.1, 10.0.0.0/8 and 192.168.0.0/16, keep their own blocked lists, and sometimes refuse ports. This 403 replaces the tunnel.
  5. Another proxy in between. Office and school proxies answer 403 for blocked categories, and some providers send 403 instead of 407 to an address that is not on their IP whitelist.

How do you tell who sent the 403?

  1. See which side answered

    If no 200 Connection established line appears before the 403, the proxy refused. A 200 followed by HTTP/2 403 means the website did.

    Proxy's answer, then the site's
    curl -v -x http://HOST:PORT -U "USER:PASS" https://TARGET/ -o /dev/null 2>&1 \
      | grep -iE "^(> CONNECT|< HTTP|< x-proxy-reason|\* CONNECT)"

  2. Read the website's response

    The headers and body often name what refused you: a challenge page, a firewall reference ID or a notice about your country.

    Save the headers and body
    curl -s -D - -o 403-body.html -x http://HOST:PORT -U "USER:PASS" https://TARGET/ | head -20

  3. Compare without the proxy and with another exit

    If the site answers 200 directly and 403 through every exit, it refuses the proxy network or the exit's country. If only some exits get a 403, it is scoring individual addresses.

    Direct, through the proxy, and the exit's address
    curl -s -o /dev/null -w "direct: %{http_code}\n" https://TARGET/
    curl -s -o /dev/null -w "proxy: %{http_code}\n" -x http://HOST:PORT -U "USER:PASS" https://TARGET/
    curl -s -x http://HOST:PORT -U "USER:PASS" https://api.ipify.org; echo

  4. Repeat it in a real browser

    A browser profile on the same proxy runs JavaScript and keeps cookies. If the browser loads the page and curl gets a 403, the site is refusing the shape of the request, not the address. The IP leak test inside that profile shows where the exit really is.

How do you fix a 403 through a proxy?

  • A 403 from the proxy

    Check the hostname and port, use the site's public hostname instead of an internal address, and ask the provider whether the destination is on its blocked list.

  • A 403 from the website

    Read the site's terms and robots.txt first: a different exit address does not make a refused request permitted. Where the access is allowed, send the headers a browser sends for that page, keep cookies across requests in one session, and request pages in the order a visitor would.

  • Match the exit to the site

    Use an exit in a country the site serves, a sticky session when the site ties cookies to an IP, and residential exits where it refuses datacenter ranges. Slow down too: a 403 often follows a burst the site counted as abuse. If the site offers an API, use that.

If you use TrueProxies

A 403 in reply to CONNECT, with no reason, means the destination is a private or reserved address, such as 127.0.0.1 or 192.168.0.0/16, or one TrueProxies blocks. On SOCKS5 the same refusal is reply 0x02, connection not allowed by ruleset.

Every 403 inside an open tunnel is the website's answer. The gateway does not use 403 for logins or limits: those come back as 407 with a reason in X-Proxy-Reason.

Residential IPv4 Standard and Premium target by country, region, city and ASN, and Unlimited Bandwidth by country, city and ASN. Moving to an exit in the site's own country, or to a sticky session that keeps its cookies on one IP, changes the request the site sees; it does not change the site's rules. Under the acceptable use policy you are responsible for following the terms of every site you reach through the service.

Test the proxy from outside your network

The free proxy checker connects from our servers and reports the failed stage as a code, so you can tell a proxy problem from one on your computer or network.

Run the proxy checker

Questions about 403 Forbidden through a proxy

Is a 403 through a proxy a ban on the IP?

Not necessarily. Headers, cookies, request rate, path, country and the address's network type all feed a 403. Compare the same request from another exit and from a browser before concluding the address is refused.

Why do I get 403 through the proxy but 200 without it?

The site treats your own connection and the exit differently: by network type, country, history, or the other traffic it has seen from that address. Try an exit in your own country and a browser on the same proxy to narrow it down.

Why does the proxy return 403 for localhost or an internal IP?

Public proxies refuse private and reserved destinations so they cannot be used to reach their own internal networks. Use the target's public hostname.

Will rotating IPs fix a 403?

Only if the site refuses particular addresses. If it refuses the request's shape or the whole network type, every new exit gets the same answer.