#!/bin/bash # 试几种 cloudflared 参数组合,看哪种能稳定拿到匿名隧道地址。 # # 背景:这条 4G 线路的 IPv6 有地址但不通,已经加了 --edge-ip-version 4。 # 但匿名隧道还是时不时报 context deadline exceeded。 # 分别试 QUIC / HTTP2 两种传输协议。 set -u LOG=/root/tunnel_probe.log RESULT=/root/tunnel_probe_result.txt : > "$RESULT" try_one() { local label="$1"; shift local extra="$*" echo "===== 试:$label =====" echo " 参数: $extra" pkill -f 'cloudflared tunnel --no-autoupdate' 2>/dev/null || true sleep 2 : > "$LOG" # shellcheck disable=SC2086 nohup cloudflared tunnel --no-autoupdate $extra \ --url http://127.0.0.1:8080 > "$LOG" 2>&1 & local pid=$! local url="" for i in $(seq 1 30); do sleep 2 url=$(grep -oE 'https://[a-z0-9]+(-[a-z0-9]+)+\.trycloudflare\.com' "$LOG" 2>/dev/null | tail -1) [ -n "$url" ] && break done if [ -n "$url" ]; then echo " ✓ $((i*2)) 秒拿到: $url" echo "$label | OK | ${i}0% | $url" >> "$RESULT" kill "$pid" 2>/dev/null || true sleep 1 return 0 else local err err=$(tail -3 "$LOG" | tr '\n' ' ' | cut -c1-160) echo " ✗ 60 秒没拿到" echo " 最后几行: $err" echo "$label | FAIL | - | $err" >> "$RESULT" kill "$pid" 2>/dev/null || true sleep 1 return 1 fi } echo "设备网络确认:" timeout 6 curl -4 -s -o /dev/null -w ' IPv4 -> %{http_code}\n' https://www.cloudflare.com || echo " IPv4 不通" timeout 6 curl -6 -s -o /dev/null -w ' IPv6 -> %{http_code}\n' https://www.cloudflare.com || echo " IPv6 不通(已知)" echo try_one "IPv4+纯默认" "--edge-ip-version 4" echo try_one "IPv4+HTTP2" "--edge-ip-version 4 --protocol http2" echo try_one "只强制IPv4不加别的" "--edge-ip-version 4 --retries 5" echo echo "============================================================" echo " 汇总" echo "============================================================" cat "$RESULT" | while IFS='|' read -r label status pct detail; do printf " %-22s %-6s %s\n" "$label" "$status" "$detail" done echo echo "把能用的那个写回正式服务…" BEST=$(grep '| OK |' "$RESULT" | head -1 | cut -d'|' -f1) if [ -n "$BEST" ]; then echo " 可用组合: $BEST" case "$BEST" in *HTTP2*) OTP="--protocol http2" ;; *retries*) OTP="--retries 5" ;; *) OTP="" ;; esac echo " EXTRA_OPTS=$OTP" > /root/lanremote-relay/tunnel_opts.conf echo " 已记下:$OTP" else echo " 没有可用的组合 —— 匿名隧道当前被 Cloudflare 限流。" echo " 这正是必须用具名隧道的原因。" fi