#!/bin/bash # 确认最优组合:tcp_mtu_probing=1 + MSS 夹 1360,接口 MTU 保持 1500。 # # 上一轮实测(各 12 次): # 基线 隧道 9/12 = 75% # + mtu_probing=1 隧道 10/12 = 83% # + MSS 夹 1360 隧道 11/12 = 92% <- 好 # + 接口 MTU 1400 隧道 6/12 = 50% <- 差!要回退 # # 为什么接口 MTU 1400 反而差: # 链路本身能过 1448 的包(ping 实测),把接口 MTU 压到 1400 是过度限制, # 每个包都变小反而让握手/传输多花几个来回,命中丢包窗口的概率更高。 # MSS 夹 1360 更精准:只限制 TCP 段大小,不改链路层。 set -u URL=https://relay.xxmxxs.top RELAY_DIR=/root/lanremote-relay echo "===== 1. 回退接口 MTU =====" ip link set dev wlan0 mtu 1500 2>/dev/null \ && echo " wlan0 MTU 恢复为 $(cat /sys/class/net/wlan0/mtu)" \ || echo " 改不回去(可能需要重连网络)" echo echo "===== 2. 确认 MSS 规则在 =====" iptables -t mangle -L -n 2>/dev/null | grep -i mss | sed 's/^/ /' \ || echo " 没有规则,重新加" iptables -t mangle -C OUTPUT -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --set-mss 1360 2>/dev/null \ || iptables -t mangle -A OUTPUT -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --set-mss 1360 iptables -t mangle -C POSTROUTING -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --set-mss 1360 2>/dev/null \ || iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --set-mss 1360 echo echo "===== 3. 最优组合下测 40 次 =====" ok=0; bad=0 for i in $(seq 1 40); do c=$(timeout 12 curl -4 -s -o /dev/null -w '%{http_code}' \ -H 'User-Agent: LanRemote/1.4.0' "$URL/v1/health" 2>/dev/null) c=${c:-000} if [ "$c" = "200" ]; then ok=$((ok+1)); else bad=$((bad+1)); printf " [%2d] %s\n" "$i" "$c" fi sleep 2 done pct=$((ok * 100 / 40)) echo echo " 隧道可用 $ok/40 = ${pct}%" echo echo "===== 4. 大包 ping 复测(确认路径 MTU 现状)=====" for size in 1400 1440 1452 1460 1472; do out=$(ping -c 3 -W 3 -M do -s "$size" 1.1.1.1 2>&1) loss=$(echo "$out" | grep -oE '[0-9]+% packet loss' | head -1) printf " 包大小 %-5s 丢包 %s\n" "$((size + 28))" "${loss:-?}" done echo echo "===== 5. 对比 =====" echo " 修之前(MSS 1500 / 不探测): 48% ~ 75%" echo " 现在(mtu_probing + MSS 1360): ${pct}%" if [ "$pct" -ge 90 ]; then echo " ✓ 达标(≥90%)" else echo " ~ 还没到 90%(链路本身仍在丢包)" fi