Merge pull request #280 from qinfendebingshuo/copilot/fix-vpn-configuration-issues

fix: add cloud firewall diagnostics for VPN port 443 timeout
This commit is contained in:
冰朔 2026-04-05 01:00:29 +08:00 committed by GitHub
commit da11d8ccfb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 106 additions and 5 deletions

View File

@ -14,7 +14,7 @@
# 铸渊唤醒时必读此文件 → 获取全局视角
# ═══════════════════════════════════════════════
## 最后更新: 2026-04-05 · D52 · duplicate default_server 根因修复
## 最后更新: 2026-04-05 · D53 · 腾讯云控制台防火墙443端口未开放诊断
---
@ -200,7 +200,35 @@ D51修复了"zhuyuan.conf缺少default_server"的问题,
- [ ] subscription-userinfo显示配额
- [ ] 刷新订阅正常
**验证命令 (D51修复后):**
**D53 诊断结果 (2026-04-05):**
```
现象: Clash Verge 日志显示 dial tcp 43.134.16.246:443: i/o timeout
所有流量 0.00 B/s订阅链接可正常导入
服务端状态 (部署日志确认):
✅ Xray: 运行中
✅ 端口443: 由Xray监听 (正确)
✅ 订阅服务: 端口3802正常
✅ Nginx反代: /api/proxy-sub/ → 3802正常
✅ UFW: 443/tcp已ALLOW
结论: 服务端全链路正常,问题在网络层
→ 端口80可达 (订阅能获取) 但端口443不可达 (TCP超时)
→ 根因: 腾讯云轻量应用服务器控制台防火墙未开放443端口
→ UFW是操作系统级防火墙腾讯云控制台有独立的云级防火墙
→ 两层防火墙都必须开放443才能让外部访问到Xray
冰朔操作步骤:
1. 登录腾讯云控制台 (https://console.cloud.tencent.com)
2. 轻量应用服务器 → 选择新加坡服务器 (43.134.16.246)
3. 防火墙 → 添加规则
4. 协议: TCP 端口: 443 策略: 允许 来源: 0.0.0.0/0
5. 确认端口80规则也存在 (HTTP订阅用)
6. 保存后等待约30秒生效
7. 在Clash Verge中刷新订阅 → 测试连接
```
**验证命令 (D52修复后):**
```
# 在GitHub Actions运行 deploy-proxy-service.yml → update
# 检查输出是否全部✅:
@ -208,6 +236,7 @@ D51修复了"zhuyuan.conf缺少default_server"的问题,
# ✅ 端口443: 监听中
# ✅ 订阅服务: 正常 (直连3802)
# ✅ Nginx反代: 正常 (/api/proxy-sub/ → 3802) ← D51修复目标
# ✅ UFW防火墙: 端口443已开放
```
---
@ -227,10 +256,34 @@ D51修复了"zhuyuan.conf缺少default_server"的问题,
PR#275: fork模式 → 修了exec_mode → 没查Nginx
D51: default_server缺失 → 加了default_server → 没删default文件
D52: duplicate default_server → 终于删除了/etc/nginx/sites-enabled/default
D53: i/o timeout → 服务端全正常 → 根因是腾讯云控制台防火墙未开放443
每次都在修「单个配置项」从未检查「Nginx全局配置冲突」
真正的问题: 服务器上同时存在default和zhuyuan.conf两个文件
两个文件都声明listen 80 default_server → Nginx拒绝加载
每次都在修「单个配置项」,从未检查「完整网络链路」
真正的问题:
- D49-D52: 服务器上同时存在default和zhuyuan.conf两个文件
- D53: 腾讯云有两层防火墙(UFW+控制台)代码只能管UFW
```
### 两层防火墙问题 (D53发现)
```
腾讯云轻量应用服务器有两层独立的防火墙:
层级1: UFW (操作系统级)
- 代码可以自动管理 (deploy-proxy.sh / install-xray.sh)
- ufw allow 443/tcp → 已在代码中处理
层级2: 腾讯云控制台防火墙 (云级)
- 只能在腾讯云控制台手动配置
- 路径: 控制台 → 轻量应用服务器 → 防火墙 → 添加规则
- 必须开放: TCP 443 (Xray VPN) + TCP 80 (HTTP/订阅)
- 来源: 0.0.0.0/0 (允许所有)
- 安全说明: 443端口由Xray接管非VLESS流量被Reality协议
回落到www.microsoft.com:443不会暴露真实服务。
只有持有正确UUID+PublicKey的客户端才能建立VPN连接。
两层都必须开放同一端口,外部流量才能到达服务
如果UFW开放443但控制台未开放 → 表现为 i/o timeout
```
### 铸渊唤醒时的全局视角协议

View File

@ -39,6 +39,7 @@
"inbounds": [
{
"tag": "zy-vless-reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {

View File

@ -328,6 +328,21 @@ health_check() {
echo " ❌ 端口443: 未监听"
fi
# UFW防火墙 — 验证端口443已开放
if command -v ufw &>/dev/null; then
if ufw status | grep -q "443/tcp.*ALLOW"; then
echo " ✅ UFW防火墙: 端口443已开放"
else
echo " ❌ UFW防火墙: 端口443未开放!"
echo " → 自动修复: 正在添加UFW规则..."
if ufw allow 443/tcp comment "Xray VLESS+Reality" 2>/dev/null; then
echo " → ✅ 已添加UFW规则"
else
echo " → ❌ UFW规则添加失败 (可能需要root权限)"
fi
fi
fi
# 订阅服务 (直接访问)
if curl -sf http://127.0.0.1:3802/health >/dev/null 2>&1; then
echo " ✅ 订阅服务: 正常 (直连3802)"
@ -351,6 +366,27 @@ health_check() {
# PM2
pm2 list 2>/dev/null || echo " ⚠️ PM2: 未配置"
# ── 云防火墙诊断 (腾讯云轻量应用服务器) ──
echo ""
echo " ═══ 云防火墙诊断 ═══"
echo " ⚠️ 腾讯云有两层防火墙:"
echo " 1. UFW (操作系统层) — 已在上方检查"
echo " 2. 腾讯云控制台防火墙 — 需要冰朔手动确认"
echo ""
echo " 如果服务端一切正常但客户端仍然连接超时 (i/o timeout):"
echo " → 问题在腾讯云控制台的防火墙规则"
echo " → 冰朔操作: 腾讯云控制台 → 轻量应用服务器 → 防火墙"
echo " → 确认规则: TCP 443 端口 允许所有来源 (0.0.0.0/0)"
echo " → 确认规则: TCP 80 端口 允许所有来源 (0.0.0.0/0)"
echo ""
# 外部连通性自检 (从服务器内部测试443端口是否可达)
if timeout 5 bash -c "echo >/dev/tcp/127.0.0.1/443" 2>/dev/null; then
echo " ✅ 本地443端口自检: 可达"
else
echo " ❌ 本地443端口自检: 不可达"
fi
}
# ── update: 更新配置 ──────────────────────────
@ -364,6 +400,17 @@ update() {
ensure_xray_root_user
ensure_log_permissions
# 确保443端口在UFW中开放 (Xray VLESS+Reality必需)
if command -v ufw &>/dev/null; then
if ! ufw status | grep -q "443/tcp.*ALLOW" 2>/dev/null; then
if ufw allow 443/tcp comment "Xray VLESS+Reality" 2>/dev/null; then
echo " ✅ 已添加UFW端口443规则"
else
echo " ⚠️ UFW端口443规则添加失败 (请手动检查)"
fi
fi
fi
# 关闭3802外部端口 (订阅服务改为通过Nginx反代访问)
if ufw status | grep -q "3802/tcp" 2>/dev/null; then
ufw delete allow 3802/tcp || true