Files

101 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: passwall-quic-fix
description: 诊断/修复 Passwall 旁路由上 YouTube/Google 问题——网页 UI 刷不出来或慢、原生 YouTube app(安卓/iOS)连不上、视频能放但页面卡。核心:QUIC(UDP 443) 在不同节点类型下处理方式不同;TCP 节点必须屏蔽 QUICUDP 原生节点(Hysteria2)则放开。根治办法是改用 Hysteria2 节点。触发词:「passwall YouTube 慢/打不开」「原生youtube app 连不上」「网页UI刷不出来视频能放」「旁路由 QUIC」「udp_proxy_drop_ports」「修旁路由代理」「再改一台旁路由」「hysteria2 节点」。
---
# Passwall 旁路由 YouTube / QUIC 问题处理
## 适用症状
- YouTube 网页 UI 刷不出来/很慢,但视频能放(浏览器)。
- 原生 YouTube app(安卓/iOS)连不上。
- 手机单层 Shadowrocket/Clash 没问题。
## 核心原理(务必先判断节点类型!)
问题根源是 **QUIC(UDP 443) 与节点传输方式的匹配**
- **TCP 传输节点**VLESS+Reality、Trojan、VMess-TCP…,`transport=raw`):
QUIC 是 UDP,塞进 TCP 隧道 = UDP-over-TCP,又慢又不稳。
**正确做法:屏蔽 QUIC**`udp_proxy_drop_ports=443`),逼客户端走 TCP。
→ ⚠️ **不要放开**:放开会让原生 app(尤其 iOS,对静默 DROP 不回退)连不上。浏览器 UI 慢是**节点延迟**造成的,不是 QUIC,别靠放 QUIC 治。
- **UDP 原生节点****Hysteria2 / TUIC**,需 **sing-box 内核**):
QUIC/UDP 能真正跑通。
**正确做法:放开 QUIC**`udp_proxy_drop_ports` 清空)。安卓/iOS app + 浏览器全部正常且更快。
> 打地鼠现象(按下安卓弹起 iOS)= 你在 TCP 节点上反复调 QUIC 开关。TCP 节点上无解,必须换 UDP 原生节点。
## 诊断(只读)
`H/U/P/PORT`SSH 执行:
```
echo "drop_ports=$(uci get passwall.@global_forwarding[0].udp_proxy_drop_ports 2>/dev/null)";
TCP=$(uci get passwall.@global[0].tcp_node);
echo "节点=$TCP 协议=$(uci get passwall.$TCP.protocol) 传输=$(uci get passwall.$TCP.transport) 内核=$(uci get passwall.$TCP.type)";
nft list ruleset 2>/dev/null | grep -icE "udp dport 443.*drop"
```
- 协议 vless/trojan + transport raw → **TCP 节点**
- 协议 hysteria2/tuic → **UDP 原生节点**
## 处理 A:当前是 TCP 节点,且想立刻不卡
保持/恢复屏蔽 QUIC(这是 TCP 节点的正确配置):
```
uci set passwall.@global_forwarding[0].udp_proxy_drop_ports="443"; uci commit passwall; /etc/init.d/passwall restart >/dev/null 2>&1 &
```
浏览器 UI 慢只能靠**就近节点**或**换 Hy2**根治。原生 app 屏蔽 QUIC 后一般能连(iOS 仍可能因 DROP 慢,彻底解决见 B)。
## 处理 B:根治(推荐)——改用 Hysteria2 节点
**服务端**(VPS,一次性):官方脚本装 hysteria2,监听 UDP 443,复用域名证书,以 root 运行。
**Passwall 加节点**uci,字段已验证可用):
```
uci set passwall.hy2ww=nodes
uci set passwall.hy2ww.remarks='hysteria2'
uci set passwall.hy2ww.type='sing-box' # 必须 sing-box 内核
uci set passwall.hy2ww.protocol='hysteria2'
uci set passwall.hy2ww.address='<域名>'
uci set passwall.hy2ww.port='443'
uci set passwall.hy2ww.hysteria2_auth_password='<密码>'
uci set passwall.hy2ww.tls='1'
uci set passwall.hy2ww.tls_serverName='<域名>' # 用真实证书时填域名
uci set passwall.hy2ww.tls_allowInsecure='0'
uci set passwall.hy2ww.add_mode='1'
# 切到 Hy2 + 放开 QUICUDP 原生不用屏蔽)
uci get passwall.@global[0].tcp_node > /tmp/pw_tcp_node.bak
uci set passwall.@global[0].tcp_node='hy2ww'
uci set passwall.@global[0].udp_node='tcp'
uci set passwall.@global_forwarding[0].udp_proxy_drop_ports=''
uci commit passwall; /etc/init.d/passwall restart >/dev/null 2>&1 &
```
或直接在 Passwall「导入分享链接」粘 `hysteria2://<密码>@<域名>:443/?sni=<域名>#hy2`
## 验证(重启会挤断 SSH,等 ~8s 重连)
```
sleep 8
sshpass -p "$P" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=12 -p $PORT $U@$H '
echo "tcp_node=$(uci get passwall.@global[0].tcp_node) drop=[$(uci get passwall.@global_forwarding[0].udp_proxy_drop_ports)]";
echo "内核=$(pgrep -af "sing-box|xray"|grep passwall|grep -oE "sing-box|xray"|head -1)";
curl -x socks5h://127.0.0.1:1070 -s -o /dev/null -w "youtube=%{http_code} t=%{time_total}s\n" --max-time 20 https://www.youtube.com/'
```
然后让用户在**安卓+iOS app + 浏览器三端**实测 YouTube(CLI 测不出 QUIC,必须真机测)。
## 附:代理自愈 watchdog(解决"VPS 换机房后路由器缓存旧 IP / 节点掉线")
自建节点用域名(DDNS)时,VPS 换 IP 后路由器 dnsmasq 缓存 + 代理内核会**死守旧 IP**,需重启 passwall 才重新解析。装个 watchdog 自愈(**别用"监视外部DNS IP"——公共DNS缓存不准;改测代理通不通**):
```
sshpass -p "$P" ssh ... $U@$H 'cat > /root/passwall-watch.sh <<"EOF"
#!/bin/sh
ok(){ curl -x socks5h://127.0.0.1:1070 -s --max-time 8 -o /dev/null -w "%{http_code}" "http://www.google.com/generate_204" 2>/dev/null | grep -q 204; }
ok && exit 0; sleep 6; ok && exit 0
NOW=$(date +%s); LAST=$(cat /tmp/passwall-watch.ts 2>/dev/null || echo 0)
[ $((NOW-LAST)) -lt 900 ] && exit 0
date +%s > /tmp/passwall-watch.ts; logger -t passwall-watch "proxy down x2, restart"; /etc/init.d/passwall restart
EOF
chmod +x /root/passwall-watch.sh
( crontab -l 2>/dev/null | grep -v passwall-watch.sh; echo "*/5 * * * * /root/passwall-watch.sh" ) | crontab -'
```
逻辑:每5分钟经节点测 generate_204,连续两次不通就重启 passwall(重新解析+重连),15分钟冷却防抖。socks 端口注意确认(`tcp_node_socks_port`,常见 1070)。
## 注意
- Passwall 内核可能是 **xray 或 sing-box**,查进程两个都要查。
- Hysteria2 必须用 sing-box 内核;xray 不支持 hysteria2/tuic。
- 重启 passwall 会刷新 nft、挤断当前 SSH,属正常,重连即可。
- 回退 TCP 节点:`uci set passwall.@global[0].tcp_node="$(cat /tmp/pw_tcp_node.bak)"; uci commit passwall; /etc/init.d/passwall restart &`
- 不要把路由器/节点密码写进任何持久化文件或记忆。