高墙之外❤️

PassWall2 WebSocket 节点连不上怎么办?按 Path、Host、TLS 逐层排查

更新于 2026-11-02 · passwall.lol

简答:PassWall2 WebSocket 节点连不上,先确认是 WS 还是 WSS,再依次检查域名解析、端口、系统时间、TLS、SNI、Host 和 Path。TCPing 有响应只代表端口可达,不代表 TLS 或 WebSocket Upgrade 成功;最终应以 PassWall2、Xray/sing-box 和系统日志共同判断。

定义:PassWall2 WebSocket 节点排查,是从域名解析、TCP 建连、TLS 握手到 HTTP 101 Upgrade 逐层确认节点参数和服务端转发是否匹配。

先看这一张:错误现象对应哪一层

PassWall2 的 WebSocket 节点可能经过“域名解析→TCP 连接→TLS 握手→HTTP 请求→WebSocket Upgrade→协议认证”多个阶段。某一步失败,不一定是同一个原因。先在 PassWall2 节点编辑页记录协议、传输方式、服务器地址、端口、TLS、SNI、Host、Path、UUID 或密码,以及当前使用的核心名称和版本;界面字段可能随版本变化。

PassWall2 WebSocket 常见现象与优先检查项
现象或日志关键词优先判断先检查什么处理动作
timeout、i/o timeout、dial tcpDNS、路由或端口阶段失败域名解析、服务器地址、端口、IPv4/IPv6先用路由器本机查询域名并测试端口,不要先改 Path。
certificate、x509、handshake failureTLS 阶段失败系统时间、SNI、证书域名、TLS 开关、ALPN确认 WSS 节点的 TLS 与证书配置一致,避免直接关闭证书校验。
HTTP 404请求到达 HTTP 服务,但路径不匹配Path 的大小写、前后斜杠、查询参数、反向代理 location把节点中的 Path 与服务端转发路径逐字符对照。
HTTP 400 或 WebSocket 400Upgrade 或请求参数不符合服务端预期Upgrade、Host、Path、Early Data、核心兼容性先关闭 Early Data,再用最小配置复测。
HTTP 403Host、访问策略或认证被拒绝Host、SNI、CDN/反向代理规则、节点是否过期确认 Host 是否为服务端要求的域名,不要把 SNI 自动当成 Host。
502、504反向代理无法连接后端或后端超时Nginx/Caddy 转发地址、端口、Path、后端服务状态检查服务端代理日志和 WebSocket 转发配置。
连接后立即 reset、EOF、unexpected EOF协议、TLS、认证或中间层主动断开协议类型、UUID/密码、TLS、Early Data、Mux关闭复杂选项,使用同一节点在其他客户端交叉验证。

WebSocket 正常升级通常需要服务端返回 HTTP 101,但命令行探测未携带节点认证信息时返回 400,并不能单独证明节点一定失效。判断时要结合核心日志和实际代理请求。

适用范围与最短排查步骤

本文适用于已经导入 PassWall2、节点传输标记为 WS 或 WSS,但出现超时、握手失败、网页打不开或连接后立即断开的情况。PassWall2 本身是 OpenWrt 上的 LuCI 配置界面,具体菜单名称和字段可能随版本、核心及固件变化;项目仓库说明应按路由器架构和包管理器选择对应安装包,节点排查则应以当前生成的核心配置为准。参考:PassWall2 项目仓库。

  1. 先备份。在 PassWall2 的配置或节点页面导出当前配置;如果只能通过 SSH 操作,可先保存相关 UCI 配置和日志。不要一开始同时修改 DNS、分流、TUN、Mux 和节点字段,否则无法判断是哪一项产生影响。
  2. 确认传输类型。在 PassWall2 的节点编辑页确认传输方式确实为 WebSocket。WSS 通常意味着同时启用 TLS;WS 则不能照搬 WSS 的 SNI、证书和端口设置。若订阅备注与节点实际字段冲突,以导入后的字段和服务端提供的参数为准。
  3. 确认核心。在 PassWall2 的核心管理或运行状态页面确认实际使用的是 Xray 还是 sing-box,并记录版本。PassWall2 当前源码会分别生成不同核心的传输字段:sing-box 的 WS 配置包含 path、headers、max_early_data 和 early_data_header_name;不要把一个核心的配置文件字段直接抄到另一个核心中。参考:PassWall2 sing-box 配置生成代码。
  4. 只保留一个测试节点。暂时选定一个 WebSocket 节点作为基准,关闭自动切换、复杂分流和非必要的 Mux;保存后重启 PassWall2,再记录一次日志。
  5. 按 DNS、TCP、TLS、WS 顺序复测。每完成一层就记录结果。DNS 失败不要继续判断 Path;TCP 失败不要先改 Host;TLS 失败也不要用 HTTP 404 来推断 WebSocket 路径。

第一层:从路由器本机检查 DNS、端口和系统时间

SSH 登录路由器后,把下面的 node.example 和 443 替换为节点实际服务器地址和端口。命令是否存在取决于固件,缺少工具时不要把“命令不存在”当成节点故障。

date
nslookup node.example
ping -c 3 node.example
ping -c 3 -4 node.example
ping -c 3 -6 node.example
nc -vz -w 5 node.example 443

OpenWrt 文档将 nslookup、IPv4/IPv6 连通性检查和详细网络输出作为常见排查手段;系统日志可通过 logread 读取。参考:OpenWrt 网络与 HTTPS 排查说明、OpenWrt 安装后的基础检查。

  • DNS 无结果或解析到错误地址:先检查路由器当前 DNS、节点域名是否过期,以及 IPv4 和 IPv6 是否解析到不同目标。
  • IPv4 能通、IPv6 超时:临时在节点或网络设置中限制为 IPv4 进行对照测试。只有在对照测试成功后,才能判断问题与 IPv6 路径有关。
  • 端口不通:优先核对服务器地址和端口,或确认服务端监听与防火墙状态;TCPing 有数值只说明 TCP 层可能可达,不能证明 WS 已升级。
  • 系统时间明显错误:先修复 NTP 或系统时间再测试 WSS。证书校验依赖有效时间窗口,时间错误会让 TLS 诊断失真。

第二层:逐项核对服务器地址、SNI、Host 与 Path

Xray 官方文档把 WebSocket 的 path 定义为 HTTP 请求路径,把 host 定义为 WebSocket HTTP 请求中的 Host;客户端发送 Host 时,优先级是显式 host、headers 中的 Host、最后才是 address。也就是说,SNI 和 Host 不是同一个字段,不能因为两者经常填写同一个域名,就认为它们在所有节点中必须相同。参考:Project X WebSocket 配置文档。

节点字段对照表
字段核对重点常见误填验证方式
服务器地址用于建立 TCP 连接的域名或 IP把 CDN 域名、源站域名和证书域名混填用 nslookup 看解析结果,并与节点资料对照。
端口必须与服务端监听和 TLS 入口一致WSS 使用了非 TLS 端口,或端口被防火墙拦截用 nc -vz 检查 TCP 层。
TLSWS 与 WSS 必须按服务端入口匹配只改传输方式,忘记同步 TLS查看核心日志中的证书或握手错误。
SNITLS 握手时发送的服务器名称填成服务器 IP,或填成与证书不匹配的域名对照证书域名和服务端提供的 SNI。
HostHTTP/WebSocket 请求头中的 Host留空、大小写或域名填错、把 SNI 当 Host对照反向代理的虚拟主机和节点参数。
PathWebSocket 请求路径,需匹配服务端路由漏掉开头斜杠、大小写不一致、误删查询参数逐字符对照,包含前后斜杠和必要参数。
UUID/密码协议层认证信息订阅过期、复制时多空格、协议类型不匹配查看核心日志中的认证失败,而不是只看 HTTP 状态码。

Path 默认值在 Xray 文档示例中为 /,但这不代表你的服务端一定使用根路径。服务端若配置了特定路径,客户端必须填写同一条路径。Path 中的 ed 参数还可能启用 Early Data;如果怀疑兼容性,先删除该参数或在 PassWall2 中关闭对应选项,再进行一次干净复测。

第三层:用日志和 HTTP Upgrade 判断是否真的完成握手

先在 PassWall2 的运行日志页面清空或记录当前时间,然后重新启动该节点并立即查看日志。若界面没有单独的日志入口,可通过 SSH 使用:

logread -f | grep -Ei 'passwall|xray|sing-box|websocket|tls|timeout|reset|certificate'

OpenWrt 的 logread 用于读取系统日志,也支持按关键词跟踪;参考:OpenWrt logread 说明。如果路由器安装了 curl,可以对 WSS 入口做一个基础 HTTP/1.1 Upgrade 探测:

curl -vk --http1.1 \
  -H 'Connection: Upgrade' \
  -H 'Upgrade: websocket' \
  -H 'Sec-WebSocket-Version: 13' \
  -H 'Sec-WebSocket-Key: SGVsbG9XU0tleQ==' \
  'https://node.example/path' \
  -o /dev/null \
  -w '
HTTP %{http_code}
'
  • 出现 HTTP 101:说明该入口完成了 WebSocket 升级,接下来仍要检查协议认证、UUID/密码和 PassWall2 分流。
  • 出现 404:优先修正 Path 或反向代理 location。
  • 出现 400:可能是 Upgrade、Host、Path 或 Early Data 不符合服务端要求;命令没有携带节点认证,因此只能作为入口探测,不能代替核心测试。
  • 出现 403:优先检查 Host、访问策略、CDN/反向代理规则和节点有效期。
  • 出现 301/302:检查是否被强制跳转到其他路径。WebSocket 客户端通常需要直接连接正确的 WS 入口,而不是依赖普通 HTTP 跳转。
  • TLS 连接都建立不了:回到系统时间、SNI、证书域名和 TLS 开关,不要先改 WebSocket Path。

反向代理场景:检查 Upgrade、Connection 和路径转发

如果 WebSocket 入口经过 Nginx,反向代理必须正确处理 HTTP/1.1 Upgrade。Nginx 官方文档明确说明,Upgrade 和 Connection 属于不会自动传递的逐跳请求头,需要显式转发;同时还要关注代理读取超时。参考:Nginx WebSocket 代理文档。

location /your-path/ {
    proxy_pass http://127.0.0.1:BACKEND_PORT;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

上面只是服务端配置对照示例,不应直接复制到未知环境。需要替换的部分包括 location 路径、后端地址、后端端口和 Host 处理方式。若服务端使用 CDN 或其他反向代理,还要确认该入口允许 WebSocket、路径没有被重写、Host 能命中正确的虚拟主机,并查看代理层日志。

  • 客户端 Path 为 /ws,代理却只配置了 /websocket,常见结果是 404。
  • 代理将请求转发到错误后端,常见结果是 502 或连接被重置。
  • 代理没有传递 Upgrade,常见结果是普通 HTTP 响应而不是 101。
  • 代理读取超时过短,可能出现连接建立后空闲一段时间被关闭;此时应结合服务端心跳和代理超时配置判断。

Xray 与 sing-box 的兼容性处理

PassWall2 的源码显示,生成 sing-box 节点时,WebSocket 传输会使用 type、path、Host 请求头,以及可选的 Early Data 字段;Xray 官方文档则使用 wsSettings、path、host 和 headers 等结构。字段名称不同并不等于功能完全不同,实际应以 PassWall2 当前核心生成的配置和对应核心文档为准。

核心切换时的低风险处理顺序
顺序操作判定
1保留服务器地址、端口、协议、UUID/密码、TLS、SNI、Host、Path 不变。避免把核心差异与节点参数变化混在一起。
2关闭 Early Data 或删除 Path 中的 ed 参数。若关闭后恢复,说明可能存在服务端或中间层兼容问题。
3关闭 Mux、复杂分流和自定义 DNS,仅测试一个节点。若基础连接成功,再逐项恢复功能。
4切换另一个已知可用核心进行对照。只有在节点参数不变且日志差异明确时,才可怀疑核心兼容性。

常见教程会把 Xray 的 Early Data 与 sing-box 的 max_early_data、early_data_header_name 对应起来,但这只是配置映射关系,不代表两者在所有版本和服务端实现中完全等价。sing-box 文档要求与 Xray 兼容时使用 Sec-WebSocket-Protocol 作为 Early Data 请求头名称,并强调客户端和服务端需要保持一致;参考:sing-box V2Ray Transport 文档。

复测、交叉验证与回滚

  1. 路由器本机复测:记录 DNS 结果、端口测试结果、核心日志和实际访问时间。
  2. 局域网设备复测:仅在路由器节点已经成功建立连接后,再检查分流、DNS、TUN 或访问控制是否让客户端流量走错出口。
  3. 更换网络复测:可用另一条网络进行对照,但不要把一次成功直接解释为节点永久可用;只记录“该时间、该网络、该节点”的结果。
  4. 逐项恢复:先恢复 DNS,再恢复分流,最后恢复 Mux、Early Data 或其他高级选项。每次只改一项,并保留日志。
  5. 回滚:如果修改后更差,恢复备份的节点字段和 PassWall2 配置,重启相关服务,再确认原来的基准节点状态。不要在无法解释变化时继续叠加配置。

如果所有参数都已逐项核对,但同一节点在不同客户端、不同网络和不同核心中都无法完成连接,才更有理由把问题提交给节点提供方核验;在没有服务端日志或公开状态资料时,不应仅凭路由器端一次失败断言服务端一定故障。

结论:按这个顺序最快定位

推荐顺序:确认 WS/WSS与核心 → 备份配置 → 查 DNS → 测 TCP 端口 → 校准系统时间 → 核对 TLS/SNI → 核对 Host/Path → 查看核心日志 → 关闭 Early Data、Mux 和复杂分流 → 交叉测试 → 恢复配置。

如果你只想先做一个动作,先在路由器本机执行 nslookup 和端口测试,并同时查看 PassWall2 核心日志。这样可以先把“域名或端口根本不可达”和“已经到达 WebSocket 入口但参数不匹配”分开。

常见问题

PassWall2 显示节点有延迟,为什么 WebSocket 还是连不上?

节点延迟测试通常只能说明某种探测请求或 TCP 层有响应,不能证明 TLS、HTTP Upgrade 和协议认证都成功。应查看核心日志,并按 DNS、TCP、TLS、Path、Host、认证顺序复测。

WebSocket 的 Host 和 TLS 的 SNI 必须填写成一样吗?

不一定。SNI用于TLS握手,Host是HTTP/WebSocket请求头中的主机名;某些服务端会要求两者相同,反向代理场景也可能要求不同值。应以节点资料、证书域名和服务端虚拟主机配置为准。

Path 前面少一个斜杠,会导致 PassWall2 WebSocket 连接失败吗?

可能。WebSocket Path由服务端验证时,大小写、前后斜杠和查询参数都可能影响路由。应把 PassWall2 中的 Path 与服务端配置逐字符对照,不能默认根路径一定可用。

HTTP 400 是否说明节点已经彻底失效?

不能直接这样判断。400说明请求到达了某个HTTP入口,但可能是Host、Path、Upgrade、Early Data或认证方式不符合要求;使用curl探测时还可能缺少节点协议认证。应结合核心日志和服务端代理日志判断。

PassWall2 切换 Xray 和 sing-box 后,WebSocket 字段为什么不一样?

两个核心的配置结构和字段名称不同,PassWall2会根据核心生成对应配置。不要直接复制一个核心的配置文件字段;应保留节点基本参数不变,关闭Early Data和Mux后分别测试,再依据日志判断兼容性。

排查时可以直接关闭 TLS 证书校验吗?

不建议把关闭证书校验作为常规修复。它可能掩盖系统时间、SNI或证书域名错误,也会降低连接安全性。应先校准时间、核对SNI和证书域名,并只按当前核心文档确认必要的测试范围。

相关阅读

参考资料

  1. PassWall2 项目仓库与安装说明
  2. PassWall2 sing-box 配置生成源码
  3. Project X WebSocket 配置文档
  4. sing-box V2Ray Transport 文档
  5. Nginx WebSocket 代理文档(nginx.org)
  6. OpenWrt 网络与 HTTPS 排查说明(openwrt.org)
  7. OpenWrt 安装后的基础检查(openwrt.org)
  8. OpenWrt logread 说明(openwrt.org)