公众号旧文

一次 HTTP 503 排障:最后竟然是代理背锅

作者:胖子阅读 —

很多人在看到 HTTP 503 时,第一反应通常是:

  • Nginx 挂了
  • 后端服务没启动
  • 服务器资源耗尽

但胖子这次 503,问题根本不在服务器。

今天的情况非常典型:

服务是好的,端口是开的,但访问就是失败。

最后发现,真正的原因居然是:浏览器代理。

一、故障现象

我有一台 NAT VPS,端口映射如下:

65001 → 22(SSH)
65002 → 8080(Web)

访问 Web 服务:

http://45.204.206.6:65002

浏览器返回:

该网页无法正常运作
45.204.206.6 目前无法处理此请求。
HTTP ERROR 503

二、第一反应:服务器是不是挂了?

先从最基础的检查开始。

第一步:本机测试服务

curl -I http://127.0.0.1:8080

返回:

HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.12

说明:

  • Web 服务正常
  • 程序正在运行

第二步:检查端口监听

ss -lntp

看到:

0.0.0.0:8080  python3

说明:

  • 端口正常监听
  • 没有端口冲突

第三步:怀疑 NAT 转发

NAT VPS 的端口是通过网关转发的。

我做了一个本机测试:

curl http://127.0.0.1:65002

结果连接失败。

这个结果是正常的,因为 65002 是网关端口,本机并不会监听它。

第四步:抓包(关键一步)

为了确认流量是否进入服务器,我使用 tcpdump 抓包:

tcpdump -i any port 8080

然后在浏览器访问:

http://45.204.206.6:65002

结果非常奇怪:

0 packets captured

也就是说:

服务器完全没有收到任何请求。

三、矛盾出现了

为了确认端口状态,我又测试了一次:

nc -zv 45.204.206.6 65002

返回:

open

这说明:

  • 端口是开放的
  • 有服务响应

但同时服务器却没有收到请求。

这就出现了一个逻辑矛盾。

四、排障思路一度走偏

当时我的判断是:

  • NAT 转发是不是失效了
  • 端口是不是被别人占用了
  • 服务商是不是配置错了

甚至都已经准备提交工单。

但问题始终解释不通:

端口 open,但服务器抓不到流量。

五、关键转折

后来我突然想到一件事:

我的浏览器一直开着代理。

于是做了一个简单测试:

关闭代理,再访问一次。

结果页面秒开。

六、真正的原因

问题终于明确:

服务商拦截了来自代理节点的访问。

访问路径实际上是这样的:

使用代理时:

浏览器(代理IP)
        ↓
NAT 网关
        ↓
被拦截(未转发到服务器)

关闭代理后:

真实IP
    ↓
NAT 网关
    ↓
正常转发 → 8080

也就是说流量在网关层就被丢弃了。

服务器根本没有收到请求。

七、为什么会这样

很多 NAT VPS 商家都会做一些访问限制,例如:

1、防滥用策略

禁止用户运行:

  • Web 面板
  • 反向代理
  • 对公网开放的 Web 服务

2、屏蔽机房 IP

拦截来源包括:

  • VPS
  • Cloudflare
  • 扫描器

3、端口差异策略

不同端口策略不同:

22(SSH)   → 放行
Web端口     → 严格限制

SSH 可以正常连接,但 Web 访问可能被拦截。

八、为什么 tcpdump 抓不到包

原因很简单:

客户端
   ↓
商家 NAT 网关
   ↓
(被丢弃)
   ↓
服务器

流量在 网关层就被丢弃了。

因此服务器完全看不到请求。

九、整个排障路径复盘

步骤 结论
本机 curl 服务正常
端口监听 正常
tcpdump 抓包 没有流量
nc 测试 端口 open
最终定位 代理被拦截

十、最后的总结

HTTP 503 并不一定意味着服务故障。

有时候真正的问题是:

你根本没有被允许访问这台服务器。

在使用 NAT VPS 时,这类问题其实很常见:

表面看起来是:

  • 端口问题
  • 服务问题

但本质往往是网络被限制。

所以以后如果遇到类似情况,可以先问自己一个问题:

流量真的进入我的服务器了吗?