mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 13:40:45 +00:00
阶段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,已同步到设备下载区
104 lines
3.7 KiB
Bash
104 lines
3.7 KiB
Bash
#!/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} 秒"
|