6.1 KiB
name, description
| name | description |
|---|---|
| passwall-quic-fix | 诊断/修复 Passwall 旁路由上 YouTube/Google 问题——网页 UI 刷不出来或慢、原生 YouTube app(安卓/iOS)连不上、视频能放但页面卡。核心:QUIC(UDP 443) 在不同节点类型下处理方式不同;TCP 节点必须屏蔽 QUIC,UDP 原生节点(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 + 放开 QUIC(UDP 原生不用屏蔽)
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 & - 不要把路由器/节点密码写进任何持久化文件或记忆。