#!/bin/bash # 撤掉边缘 IP 固定。 # # 教训(一天内自己推翻自己两次): # 第一次:以为优选 IP 能降延迟 -> 错。落点还是 lax,改不了路径。 # 第二次:以为优选 IP 能避开超时 -> 半小时内对,但对不久。 # 当时实测 138ms 的两个 IP,30 分钟后再测全都不通了。 # # 根因:Cloudflare anycast 的可达性受运营商路由影响, # 会随时间变化。**固定 IP 等于钉死到一个可能失效的地址上**, # 比让 GeoDNS 动态解析更糟 —— 后者至少每次重连会重新挑。 # # 结论:不固定。靠 cloudflared 自己的重试 + --ha-connections 2 冗余。 set -u echo "===== 1. 清掉 hosts 固定 =====" before=$(grep -c argotunnel /etc/hosts 2>/dev/null || echo 0) sed -i '/argotunnel.com/d' /etc/hosts after=$(grep -c argotunnel /etc/hosts 2>/dev/null || echo 0) echo " argotunnel 条目: $before -> $after" echo echo "===== 2. 确认解析回到 GeoDNS =====" python3 - <<'PY' import socket for host in ("region1.v2.argotunnel.com", "region2.v2.argotunnel.com"): try: infos = socket.getaddrinfo(host, 7844, socket.AF_INET) ips = sorted({i[4][0] for i in infos}) print(" %s -> %d 个地址" % (host, len(ips))) print(" %s" % " ".join(ips[:5])) except OSError as e: print(" %s 解析失败 %s" % (host, e)) PY echo echo "===== 3. 重启隧道,观察 90 秒连接稳定性 =====" systemctl restart lanremote-tunnel stable=1 for i in $(seq 1 9); do sleep 10 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" [ "$i" -ge 6 ] && [ "$conn" != "2" ] && stable=0 done [ "$stable" = "1" ] && echo " ✓ 后段稳定在 2 条连接" || echo " · 还在收敛" echo echo "===== 4. 这段时间的超时告警数 =====" since=$(date -u -d '100 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 次" fi echo echo "===== 5. 当前落点(应为 2 条)=====" grep -E 'Registered tunnel connection' /root/lanremote-relay/tunnel.log 2>/dev/null | tail -2 \ | grep -oE 'ip=[0-9.]+ location=[a-z0-9]+ protocol=[a-z0-9]+' | sed 's/^/ /' echo echo "===== 6. 公网延迟(15 次,设备侧最坏情况)=====" ok=0; total=0 for i in $(seq 1 15); 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); printf " %2d: %s 秒\n" "$i" "$t"; } \ || printf " %2d: 失败\n" "$i" sleep 1 done avg=$(echo "scale=2; $total / $ok" | bc 2>/dev/null || echo "?") echo " 可用 $ok/15 平均 ${avg} 秒"