#!/bin/bash # 用实测最快的边缘 IP 固定隧道出口。 # # 之前我判断"优选 IP 没用"是**错的** —— 结论下得太急。 # 真正的价值不是降低延迟(落点仍是 lax,改不了), # 而是**避开会握手超时的 IP**: # # 日志里大量 dial tcp 198.41.192.167:7844: i/o timeout # Retrying connection in up to 32s # GeoDNS 随机给的 IP 里有一部分连不上, # cloudflared 就连上-掉线-重连反复折腾, # 表现就是延迟在 0.69s ~ 4.4s 之间乱跳。 # # 实测(probe_cf_edge2.py)最快且稳定的: # 198.41.200.238 138ms # 198.41.192.214 143ms set -u echo "===== 1. 备份 =====" cp -f /etc/hosts "/root/hosts.bak.$(date +%s)" echo " 已备份 /etc/hosts" echo echo "===== 2. 先复测这两个 IP 还通不通 =====" python3 - <<'PY' import socket, time for ip in ("198.41.200.238", "198.41.192.214", "198.41.200.13", "198.41.192.37"): s = socket.socket(); s.settimeout(3) t = time.perf_counter() try: s.connect((ip, 7844)) print(" %-16s %.0f ms" % (ip, (time.perf_counter() - t) * 1000)) except OSError as e: print(" %-16s 不通 (%s)" % (ip, e.__class__.__name__)) finally: s.close() PY echo echo "===== 3. 写 /etc/hosts(固定两个最快的)=====" sed -i '/argotunnel.com/d' /etc/hosts { echo "" echo "# ykxmz:固定 Cloudflare 隧道边缘 IP" echo "# 目的不是降低延迟(落点仍是 lax),而是避开会握手超时的 IP。" echo "# GeoDNS 随机发的 IP 里有些连不上,会导致隧道反复重连、延迟乱跳。" echo "198.41.200.238 region1.v2.argotunnel.com" echo "198.41.192.214 region2.v2.argotunnel.com" } >> /etc/hosts grep argotunnel /etc/hosts | sed 's/^/ /' echo echo "===== 4. 确认解析走的是我们指定的 =====" python3 - <<'PY' import socket for host in ("region1.v2.argotunnel.com", "region2.v2.argotunnel.com"): infos = socket.getaddrinfo(host, 7844, socket.AF_INET) ips = sorted({i[4][0] for i in infos}) print(" %s -> %s" % (host, ips)) PY echo echo "===== 5. 重启隧道并观察 60 秒 =====" systemctl restart lanremote-tunnel : > /root/reconnect_watch.txt for i in $(seq 1 12); do sleep 5 conn=$(curl -s --max-time 3 http://127.0.0.1:20241/metrics 2>/dev/null \ | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') errs=$(curl -s --max-time 3 http://127.0.0.1:20241/metrics 2>/dev/null \ | grep '^cloudflared_tunnel_request_errors' | awk '{print $2}') echo " ${i}0s: 连接 $conn 错误 $errs" done echo echo "===== 6. 这 60 秒里有几次超时告警 =====" since=$(date -u -d '70 seconds ago' '+%Y-%m-%dT%H:%M:%S' 2>/dev/null || echo "") if [ -n "$since" ]; then n=$(awk -v s="$since" '$0 >= s' /root/lanremote-relay/tunnel.log 2>/dev/null \ | grep -c 'i/o timeout') echo " 超时告警 $n 次(改之前每分钟都有好几次)" else echo " (算不出时间窗,跳过)" fi echo echo "===== 7. 当前落点 =====" grep -E 'Registered tunnel connection' /root/lanremote-relay/tunnel.log 2>/dev/null | tail -3 \ | grep -oE 'ip=[0-9.]+ location=[a-z0-9]+ protocol=[a-z0-9]+' | sed 's/^/ /' echo echo "===== 8. 公网延迟(10 次)=====" ok=0; total=0 for i in $(seq 1 10); do r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 25 \ -H 'User-Agent: LanRemote/1.4.0' https://relay.xxmxxs.top/v1/health 2>/dev/null) c=$(echo "$r" | cut -d' ' -f1) t=$(echo "$r" | cut -d' ' -f2) [ "$c" = "200" ] && { ok=$((ok+1)); total=$(echo "$total + $t" | bc); } sleep 1 done avg=$(echo "scale=2; $total / $ok" | bc 2>/dev/null || echo "?") echo " 可用 $ok/10 平均 ${avg} 秒"