#!/bin/bash # 认真试 HTTP/2 并持续监控稳定性。 # # 背景: # QUIC(UDP) 在这条 4G 线路上一直报 # "Failed to dial a quic connection: no recent network activity" # 表现就是公网访问时好时坏(200 / 502 / 530 混着来)。 # 手动跑 --protocol http2 时能注册 3 条连接,看起来更稳。 # # 上次用 service 试 http2 失败(exit 1),怀疑是我改 unit 的方式有问题。 # 这次写一个全新的完整 unit,然后连续打 20 次看成功率。 set -u RELAY_DIR=/root/lanremote-relay TUNNEL_ID=$(grep -oE '^tunnel: .*' /root/.cloudflared/config.yml | awk '{print $2}') CRED="/root/.cloudflared/${TUNNEL_ID}.json" echo "===== 隧道 ID: $TUNNEL_ID =====" echo " 凭据: $CRED $([ -f "$CRED" ] && echo '✓存在' || echo '✗不存在')" echo echo "===== 写全新 unit(HTTP/2)=====" cat > /etc/systemd/system/lanremote-tunnel.service </dev/null || true pkill -f cloudflared 2>/dev/null || true sleep 3 echo " 剩余 cloudflared 进程: $(pgrep -c -f cloudflared || echo 0)" echo echo "===== 启动 =====" rm -f "$RELAY_DIR/tunnel.log" systemctl daemon-reload systemctl start lanremote-tunnel sleep 30 echo " 服务: $(systemctl is-active lanremote-tunnel)" echo " 日志尾部:" tail -6 "$RELAY_DIR/tunnel.log" 2>/dev/null | sed 's/^/ /' echo echo " 注册的连接:" grep -oE 'Registered tunnel connection.*protocol=[a-z0-9]+' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -4 | sed 's/^/ /' echo echo "===== 连打 20 次,看成功率 =====" OK=0 FAILED=0 for i in $(seq 1 20); do C=$(timeout 15 curl -4 -s -o /dev/null -w '%{http_code}' \ -H 'User-Agent: LanRemote/1.4.0' \ https://relay.xxmxxs.top/v1/health 2>/dev/null) if [ "$C" = "200" ]; then OK=$((OK + 1)); MARK="✓" else FAILED=$((FAILED + 1)); MARK="✗" fi printf " %2d: %s HTTP %s\n" "$i" "$MARK" "${C:-超时}" sleep 2 done echo echo " 成功 $OK / 20,失败 $FAILED / 20" if [ "$OK" -ge 18 ]; then echo " ✓ HTTP/2 很稳,就它了" elif [ "$OK" -ge 12 ]; then echo " ~ 比 QUIC 好,但还有抖动" else echo " ✗ 不比 QUIC 好" fi echo echo "===== 日志里还有没有 quic 报错 =====" echo " quic 相关: $(grep -c 'quic' "$RELAY_DIR/tunnel.log" 2>/dev/null || echo 0) 条" echo " 连接中断: $(grep -c 'Connection terminated' "$RELAY_DIR/tunnel.log" 2>/dev/null || echo 0) 条"