对话笔记直发:5.2 x-ui新服务器Cloudflare与Reality节点排查修复。分类:网络基建。

x-ui新服务器Cloudflare与Reality节点排查修复

时间

2026-05-02

用户目标

  • 在新服务器 你的服务器IP(已脱敏) 上继续处理 x-ui
  • 保持当前 Cloudflare Tunnel 架构
  • 优先复用现有证书、现有域名体系、现有 x-ui 配置
  • 不破坏已经可用的面板、订阅和节点
  • 所有修改前先备份数据库和关键配置
  • 重点排查并修复:
    • VLESS + WS + TLS 节点在客户端无法连接的问题
    • Reality 节点分享链接和使用方式的问题
  • 最终方向确认采用“双轨并存”:
    • Cloudflare 线路作为主力,隐藏源站 IP
    • Reality 线路作为备用,仅少量自用

背景与上下文

  • 服务器:你的服务器IP(已脱敏)
  • 面板入口:https://xui.douy.indevs.in/WgjJiwoKMBuMFs/
  • 订阅入口:https://sub.douy.indevs.in
  • 统一证书路径:
    • /etc/ssl/douy-indevs-in/fullchain.cer
    • /etc/ssl/douy-indevs-in/private.key
  • Tunnel / Cloudflare 相关域名:
    • xui.douy.indevs.in
    • sub.douy.indevs.in
    • vless.douy.indevs.in
    • vmess.douy.indevs.in
    • vmess20443.douy.indevs.in
    • vless9443.douy.indevs.in
    • vless11443.douy.indevs.in
  • 用户明确要求:直接执行,不只给方案;修改前先备份;不要破坏现有可用节点。

过程摘要

  1. 首先对服务器做只读检查,确认 x-ui、cloudflared、证书文件、监听端口和面板/订阅入口状态。
  2. 确认 x-ui 与 cloudflared 都在运行,证书有效,xray 监听 443/8443/9443/11443 等端口。
  3. 发现外部访问 xui.douy.indevs.in 和 sub.douy.indevs.in 一度返回 Cloudflare 侧 404,随后继续核对本地服务、Tunnel 配置与数据库设置。
  4. 读取 /etc/cloudflared/config.yml,确认各 hostname 到本地源站端口的映射,其中:
    • xui.douy.indevs.in -> https://127.0.0.1:37937
    • sub.douy.indevs.in -> https://127.0.0.1:2096
    • vless9443.douy.indevs.in -> https://127.0.0.1:9443
    • vless11443.douy.indevs.in -> https://127.0.0.1:11443
  5. 检查 x-ui 数据库与 xray 运行配置,定位到 9443、11443 两条 VLESS + WS + TLS 节点的实际配置参数均存在且监听正常。
  6. 对 vless9443.douy.indevs.in 的 WebSocket 握手进行了本机和公网双重验证,均得到 101 Switching Protocols,确认链路本身是通的。
  7. 最终定位 VLESS + WS + TLS 节点问题的根因:x-ui 后台导出的分享链接把“后端源站端口 9443/11443”直接暴露给客户端,而在 Cloudflare Tunnel 架构下,客户端实际应该连接公网 443。
  8. 随后利用 3x-ui 原生支持的 externalProxy 机制,修复 9443 与 11443 这两条入站的导出逻辑,使后台复制出来的链接能按 域名 + 443 导出。
  9. 后续又排查了 Reality 节点。用户使用的分享链接是 @xui.douy.indevs.in:443,这会把面板域名当成 Reality 服务器地址,容易导致客户端连接失败或行为异常。
  10. 对 Reality 节点进行修复:给 443 Reality 入站增加 externalProxy,将导出地址改为直连服务器公网 IP “你的服务器IP(已脱敏):443,保留原有 Reality 参数不变。
  11. 在讨论架构后,用户确认采用“双轨并存”:主力用 Cloudflare 隐藏 IP,备用保留 Reality 直连节点,但不作为公开主力。

关键结论

  1. Cloudflare Tunnel 架构下:
  • 后端端口如 9443、11443 仅是服务器源站入站端口
  • 客户端不应直接使用这些后端端口
  • 客户端应连接各自域名的公网 443
  1. VLESS + WS + TLS 节点本身并未损坏,问题主要是 x-ui 导出分享链接未适配 Tunnel 架构。

  2. 3x-ui 的 externalProxy 字段可以解决“后台监听端口”和“客户端对外端口”不一致的问题,是本次修复的关键机制。

  3. Reality 节点不能像 Cloudflare Tunnel 一样隐藏源站 IP。Reality 本质上要求客户端直接连真实入口,因此不适合作为需要隐藏 IP 的公开主力节点。

  4. 当前合理架构是:

  • 主力:VLESS + WS + TLS + Cloudflare Tunnel
  • 备用:VLESS + Reality 直连

执行动作

  1. 只读巡检新服务器当前状态。
  2. 核查 cloudflared 配置与 x-ui 数据库设置。
  3. 确认 9443、11443 两条 VLESS 入站在 xray 中存在且监听。
  4. 对 vless9443.douy.indevs.in 执行 WebSocket 升级测试,确认链路通畅。
  5. 备份关键文件:
    • /etc/x-ui/x-ui.db
    • /etc/cloudflared/config.yml
  6. 修改数据库中 9443、11443 两条入站的 stream_settings.externalProxy:
    • vless9443.douy.indevs.in:443
    • vless11443.douy.indevs.in:443
  7. 重启 x-ui 并验证 externalProxy 已成功写入数据库。
  8. 对 Reality 入站再次备份数据库。
  9. 修改 port=443 这条 Reality 入站的 externalProxy 为 “你的服务器IP(已脱敏):443。
  10. 再次重启 x-ui 并验证 Reality 的导出映射生效。

执行命令记录

  1. 检查主机和服务状态
ssh root@`你的服务器IP(已脱敏)` "hostnamectl; echo '---'; uptime; echo '---'; systemctl is-active x-ui; systemctl is-active cloudflared"
  • 目的:确认主机系统、运行时长、x-ui 和 cloudflared 是否运行。
  • 结果:两项服务均为 active。
  1. 检查关键监听端口
ssh root@`你的服务器IP(已脱敏)` "ss -tulpn | grep -E '(:80|:443|:2096|:8443|:9443|:11443|:20443|:37937)' || true"
  • 目的:确认 x-ui/xray 对外监听情况。
  • 结果:确认 443、8443、9443、11443、2096 等端口有进程监听。
  1. 检查证书文件与有效期
ssh root@`你的服务器IP(已脱敏)` "ls -l /etc/ssl/douy-indevs-in/ && echo '---' && openssl x509 -in /etc/ssl/douy-indevs-in/fullchain.cer -noout -subject -issuer -dates"
  • 目的:确认统一证书存在且有效。
  • 结果:证书 CN = *.douy.indevs.in,有效期至 2026-07-31。
  1. 读取 Tunnel 配置
ssh root@`你的服务器IP(已脱敏)` "sed -n '1,220p' /etc/cloudflared/config.yml"
  • 目的:确认域名与本地源站端口映射关系。
  • 结果:确认 xui/sub/vmess/vless9443/vless11443 等域名的 ingress 映射。
  1. 检查本机和公网的 WebSocket 升级
ssh root@`你的服务器IP(已脱敏)` "curl -sk --http1.1 -D - -o /dev/null https://127.0.0.1:9443/TIGxBWnHOkYpQWA3/ -H 'Host: vless9443.douy.indevs.in' -H 'Connection: Upgrade' -H 'Upgrade: websocket' -H 'Sec-WebSocket-Version: 13' -H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' --max-time 10"
curl --http1.1 -sk -D - -o NUL https://vless9443.douy.indevs.in/TIGxBWnHOkYpQWA3/ -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" --max-time 15
  • 目的:确认 WS+TLS+Tunnel 链路是否真正打通。
  • 结果:本机与公网都返回 101 Switching Protocols,是诊断“链路正常、导出错误”的关键证据。
  1. 读取 xray 运行配置中的入站参数
ssh root@`你的服务器IP(已脱敏)` "python3 - <<'PY'
import json
p='/usr/local/x-ui/bin/config.json'
with open(p,'r',encoding='utf-8') as f:
    data=json.load(f)
for ib in data.get('inbounds',[]):
    port=ib.get('port')
    if port in (9443,11443,8443,443):
        print('PORT',port)
        print('STREAM',json.dumps(ib.get('streamSettings',{}),ensure_ascii=False))
PY"
  • 目的:确认 9443/11443/443 的真实传输配置。
  • 结果:验证 9443 与 11443 为 VLESS + ws + tls,443 为 VLESS + reality。
  1. 备份数据库与关键配置
ssh root@`你的服务器IP(已脱敏)` 'cp /etc/x-ui/x-ui.db /etc/x-ui/x-ui.db.bak-ui-export-fix && cp /etc/cloudflared/config.yml /etc/cloudflared/config.yml.bak-ui-export-fix'
  • 目的:保证导出修复前可回滚。
  1. 本地修改数据库后回传服务器
scp root@`你的服务器IP(已脱敏)`:/etc/x-ui/x-ui.db "C:\Users\fengx\AppData\Local\Temp\opencode\x-ui.db.remote"
scp "C:\Users\fengx\AppData\Local\Temp\opencode\x-ui.db.remote" root@`你的服务器IP(已脱敏)`:/etc/x-ui/x-ui.db
  • 目的:绕开远程多层引号问题,稳定修改 SQLite 中的 JSON 字段。
  • 结果:成功将 9443/11443 的 externalProxy 写回服务器。
  1. 重启并验证 x-ui
ssh root@`你的服务器IP(已脱敏)` 'systemctl restart x-ui && sleep 3 && systemctl is-active x-ui && sqlite3 -line /etc/x-ui/x-ui.db "select port,stream_settings from inbounds where port in (9443,11443,443);"'
  • 目的:确认服务正常拉起且数据库中的 externalProxy 已生效。
  • 结果:x-ui 为 active,相关入站的 externalProxy 成功保存。
  1. 测试服务器外网出站能力
ssh root@`你的服务器IP(已脱敏)`
 
---
 
---
**相关**: [[00-索引-网络基建索引]] [[4.30 Cloudflare Tunnel 0基础手动安装教程]]