#!/bin/bash # 阶段1:真正的网络加速 # # 排查结论: # ① 隧道在跑 QUIC(ExecStart 缺 --protocol http2)—— # 实测 QUIC 48% vs HTTP/2 80%,这是重大性能回退,必须修回。 # ② 优选 IP 对这条线路**没用**:hosts 覆盖确实生效了 # (日志里 ip=198.41.200.238 就是我指定的),但落点仍是 lax01/lax13。 # 说明运营商把**所有** Cloudflare anycast 流量都路由到美西,换 IP 改不了路径。 # 所以那段 hosts 覆盖属于无效配置,清掉更干净。 # ③ 真正能救的是**拥塞控制**:这条线路 40% 丢包, # Linux 默认的 CUBIC 一遇丢包就砍窗口,吞吐塌方、延迟飙升。 # BBR 基于带宽+延迟建模,丢包不当事 —— 在丢包链路上提升是数量级的。 set -u RELAY_DIR=/root/lanremote-relay echo "════════ 1. 恢复 HTTP/2 ════════" cat > /etc/systemd/system/lanremote-tunnel.service <<'EOF' [Unit] Description=ykxmz Cloudflare 具名隧道 After=network-online.target lanremote-relay.service lanremote-nettune.service Wants=network-online.target lanremote-relay.service [Service] Type=simple # 协议 HTTP/2(走 TCP 7844) # 实测:这条线路丢 UDP 包,QUIC 可用率只有 48%; # HTTP/2 稳定在 80% 以上。**别去掉这个参数** —— # 去掉就会退回 QUIC,可用率直接腰斩。 # 连接数 2:有冗余又不占内存(设备只有 460MB) ExecStart=/usr/local/bin/cloudflared tunnel \ --protocol http2 \ --edge-ip-version 4 \ --ha-connections 2 \ --no-autoupdate \ --retries 5 \ --config /root/.cloudflared/config.yml run lanremote Restart=always RestartSec=5 MemoryMax=160M StandardOutput=append:/root/lanremote-relay/tunnel.log StandardError=append:/root/lanremote-relay/tunnel.log [Install] WantedBy=multi-user.target EOF systemctl daemon-reload echo " 已写回 --protocol http2" echo echo "════════ 2. 清掉无效的 hosts 覆盖 ════════" sed -i '/argotunnel.com/d' /etc/hosts echo " /etc/hosts 里的 argotunnel 条目: $(grep -c argotunnel /etc/hosts) 个" echo echo "════════ 3. 启用 BBR 拥塞控制 ════════" modprobe tcp_bbr 2>/dev/null || true cat > /etc/sysctl.d/98-ykxmz-net.conf <<'EOF' # ykxmz 网络调优(针对 4G 高丢包链路) # # 拥塞控制:BBR # Linux 默认 CUBIC 把丢包当拥塞信号,一丢包就砍发送窗口。 # 这条线路丢包 40%,CUBIC 会一直在"砍窗口-慢慢恢复"的循环里, # 表现就是延迟从 200ms 飙到 2 秒。 # BBR 用带宽和延迟建模,丢包不直接等于拥塞,高丢包链路上好得多。 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # TCP 缓冲:长途高延迟链路需要更大的窗口才能跑满 net.core.rmem_max = 4194304 net.core.wmem_max = 4194304 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 65536 4194304 # 快速打开连接(省一个 RTT) net.ipv4.tcp_fastopen = 3 # 更早重传,别干等 net.ipv4.tcp_retries2 = 8 # 复用 TIME_WAIT 的连接,长轮询场景能省不少握手 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 EOF sysctl -p /etc/sysctl.d/98-ykxmz-net.conf 2>&1 | sed 's/^/ /' echo echo " 当前拥塞控制: $(sysctl -n net.ipv4.tcp_congestion_control)" echo " 队列算法: $(sysctl -n net.core.default_qdisc)" echo " 可用算法: $(sysctl -n net.ipv4.tcp_available_congestion_control)" echo echo "════════ 4. 重启隧道 ════════" systemctl restart lanremote-tunnel sleep 40 echo " 连接数: $(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')" echo " 协议与落点:" grep -E 'Registered tunnel connection' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -3 \ | grep -oE 'ip=[0-9.]+ location=[a-z0-9]+ protocol=[a-z0-9]+' | sed 's/^/ /' grep -oE 'Initial protocol [a-z0-9]+' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -2 | sed 's/^/ /' echo echo "════════ 5. 延迟实测(20 次,看平均)════════" total=0; ok=0; max=0 for i in $(seq 1 20); do r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 20 \ -H 'User-Agent: LanRemote/1.4.0' https://relay.xxmxxs.top/v1/health 2>/dev/null) code=$(echo "$r" | cut -d' ' -f1) t=$(echo "$r" | cut -d' ' -f2) if [ "$code" = "200" ]; then ok=$((ok+1)) total=$(echo "$total + $t" | bc) bigger=$(echo "$t > $max" | bc) [ "$bigger" = "1" ] && max=$t fi sleep 1 done avg=$(echo "scale=3; $total / $ok" | bc 2>/dev/null || echo "?") echo " 可用 $ok/20" echo " 平均 ${avg} 秒 最慢 ${max} 秒"