--- name: passwall-quic-fix description: 诊断/修复 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 &` - 不要把路由器/节点密码写进任何持久化文件或记忆。