Files
ykxmz/_build/revert_edge_pin.sh
xmz7891 7b7830d8c5 阶段3+4+5:管理页白色化 + 局域网诊断 + 全量验收
阶段3 管理页
- 清掉全部深色主题残留(地址框 #0b1220、按钮悬停 #262c36、
  删除按钮 #2d1214 等 11 处),现在 0 处深色
- 接口全部正常:health / downloads / netcheck

阶段4 局域网诊断
- 查清楚"电脑不在同一网络"是怎么回事:被控端是**对的**
  (lan_ips() 报 ['192.168.2.64', '169.254.83.107'],真实地址排第一),
  是手表当时真不在 192.168.2.x —— 可能连了 5G 频段的另一个路由器,或开着移动数据
- 所以改了手表的提示:不再只说"不在同一网络",
  而是把**双方地址都打出来**,用户一眼能看出是网段不同还是连错 WiFi
- 端到端验证局域网路径:认证 1 ms,功能列表 207 项

阶段1 结论修正(一天内推翻自己两次,如实记录)
- 第一次判断"优选 IP 无用":错。半小时内确实能避开超时 IP
- 第二次固定优选 IP:也错。那些实测 138ms 的 IP 半小时后全不通了
  —— Cloudflare anycast 可达性随运营商路由变化,固定 IP 等于钉死到会失效的地址
- 最终:不固定,靠 GeoDNS + cloudflared 重试 + ha-connections 2 冗余
- 撤销后立即变好:连接稳定 2 条、超时告警 0 次、设备侧延迟 4.40s -> 1.66s
- **真正的瓶颈**:分段实测发现本机到 Cloudflare 的**裸 RTT 就 1439 ms**,
  比经隧道的请求(1215 ms)还慢。说明瓶颈是这条网络的 4G 上行本身,
  不是设备的隧道。公网侧已无优化空间。
- 局域网 118 ms vs 公网 1215 ms,快 10 倍 —— 这才是该走的路

阶段5 验收
- 全量回归 29 项全通过
- 设备侧验收 38 项全通过
- 成品:setup exe 14.37 MB / server zip / watch apk,已同步到设备下载区
2026-10-07 00:13:10 +08:00

78 lines
3.2 KiB
Bash

#!/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} 秒"