From 4447e6f4505e03f3f9b84e2b47c6621a0afd1ed5 Mon Sep 17 00:00:00 2001 From: fscarmen Date: Mon, 28 Jul 2025 07:32:24 +0000 Subject: [PATCH] Modify the API URL for counting runtime statistics. --- menu.sh | 66 +++++++++++++++------ warp-go.sh | 171 ++++++++++++++++++++++++----------------------------- 2 files changed, 123 insertions(+), 114 deletions(-) diff --git a/menu.sh b/menu.sh index 2f95a09..22dc2d8 100644 --- a/menu.sh +++ b/menu.sh @@ -9,7 +9,7 @@ export DEBIAN_FRONTEND=noninteractive # Github 反代加速代理 GH_PROXY='https://ghproxy.lvedong.eu.org/' -trap "rm -f /tmp/{wireguard-go-*,best_mtu,best_endpoint,endpoint,ip}; exit" INT +trap cleanup_resources EXIT INT TERM E[0]="\n Language:\n 1. English (default) \n 2. 简体中文" C[0]="${E[0]}" @@ -416,6 +416,11 @@ hint() { echo -e "\033[33m\033[01m$*\033[0m"; } # 黄色 reading() { read -rp "$(info "$1")" "$2"; } text() { grep -q '\$' <<< "${E[$*]}" && eval echo "\$(eval echo "\${${L}[$*]}")" || eval echo "\${${L}[$*]}"; } +# 清理函数 +cleanup_resources() { + rm -f /tmp/{endpoint,ip,endpoint_result,wireguard-go-*,best_mtu,best_endpoint,noudp} 2>/dev/null; exit 0 +} + # 检测是否需要启用 Github CDN,如能直接连通,则不使用 check_cdn() { [ -n "$GH_PROXY" ] && wget --server-response --quiet --output-document=/dev/null --no-check-certificate --tries=2 --timeout=3 https://raw.githubusercontent.com/fscarmen/warp-sh/main/README.md >/dev/null 2>&1 && unset GH_PROXY @@ -426,7 +431,7 @@ statistics_of_run-times() { local UPDATE_OR_GET=$1 local SCRIPT=$2 if grep -q 'update' <<< "$UPDATE_OR_GET"; then - { wget --no-check-certificate -qO- --timeout=3 "http://stat.cloudflare.now.cc:4000/api/updateStats?script=${SCRIPT}" > /tmp/statistics; }& + { wget --no-check-certificate -qO- --timeout=3 "https://stat.cloudflare.now.cc/api/updateStats?script=${SCRIPT}" > /tmp/statistics; }& elif grep -q 'get' <<< "$UPDATE_OR_GET"; then [ -s /tmp/statistics ] && [[ $(cat /tmp/statistics) =~ \"todayCount\":([0-9]+),\"totalCount\":([0-9]+) ]] && local TODAY="${BASH_REMATCH[1]}" && local TOTAL="${BASH_REMATCH[2]}" && rm -f /tmp/statistics info " $(text 41) " @@ -1908,27 +1913,50 @@ EOF best_mtu() { # 反复测试最佳 MTU。 Wireguard Header:IPv4=60 bytes,IPv6=80 bytes,1280 ≤ MTU ≤ 1420。 ping = 8(ICMP回显示请求和回显应答报文格式长度) + 20(IP首部) 。 # 详细说明:<[WireGuard] Header / MTU sizes for Wireguard>:https://lists.zx2c4.com/pipermail/wireguard/2017-December/002201.html - MTU=$((1500-28)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - until [[ $? = 0 || $MTU -le $((1280+80-28)) ]]; do - MTU=$((MTU-10)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - done + # MTU 初始范围(适用于 WireGuard 等封装,IPv4/IPv6 都保守选 1280-1420) + local MIN_MTU=1280 + local MAX_MTU=1500 + local TEST_IP + local PING_CMD + local BEST_MTU=1280 - if [ "$MTU" -eq $((1500-28)) ]; then - MTU=$MTU - elif [ "$MTU" -le $((1280+80-28)) ]; then - MTU=$((1280+80-28)) + if [ "$IPV4$IPV6" = "01" ]; then + TEST_IP="2606:4700:d0::a29f:c001" + PING_CMD="$PING6" else - for i in {0..8}; do - (( MTU++ )) - ( [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 ) || break - done - (( MTU-- )) + TEST_IP="162.159.192.1" + PING_CMD="ping" fi - MTU=$((MTU+28-80)) - echo "$MTU" > /tmp/best_mtu + # 二分查找能 ping 通的最大 MTU(不碎片) + while [ $((MIN_MTU <= MAX_MTU)) -eq 1 ]; do + local MID_MTU=$(( (MIN_MTU + MAX_MTU) / 2 )) + if $PING_CMD -c1 -W1 -s $MID_MTU -M do "$TEST_IP" >/dev/null 2>&1; then + BEST_MTU=$MID_MTU + MIN_MTU=$((MID_MTU + 1)) # 尝试更大值 + else + MAX_MTU=$((MID_MTU - 1)) # 减小范围 + fi + done + + # 最终微调确认 BEST_MTU 是最大可用值 + for (( i=BEST_MTU+1; i<=1420; i++ )); do + if $PING_CMD -c1 -W1 -s $i -M do "$TEST_IP" >/dev/null 2>&1; then + BEST_MTU=$i + else + break + fi + done + + # 返回最终 MTU(按需减包头)——可自定义减多少 + # WireGuard:+28 是 IP+UDP,-60 / -80 是安全包头(例如 wireguard + extra overhead) + grep -q ':' <<< "$TEST_IP" && BEST_MTU=$((BEST_MTU + 28 - 80)) || BEST_MTU=$((BEST_MTU + 28 - 60)) + + # 确保范围安全 + [ "$BEST_MTU" -lt 1280 ] && BEST_MTU=1280 + [ "$BEST_MTU" -gt 1420 ] && BEST_MTU=1420 + + echo "$BEST_MTU" > /tmp/best_mtu } # 寻找最佳 Endpoint,根据 v4 / v6 情况下载 endpoint 库 diff --git a/warp-go.sh b/warp-go.sh index 3dc8256..4e97dc9 100644 --- a/warp-go.sh +++ b/warp-go.sh @@ -10,9 +10,9 @@ TOKEN_LENGTH=800 export DEBIAN_FRONTEND=noninteractive # Github 反代加速代理 -GH_PROXY='https://ghproxy.agrayman.gay/' +GH_PROXY='https://ghproxy.lvedong.eu.org/' -trap "rm -f /tmp/warp-go*; exit" INT +trap cleanup_resources EXIT INT TERM E[0]="Language:\n 1.English (default) \n 2.简体中文" C[0]="${E[0]}" @@ -252,6 +252,11 @@ reading() { read -rp "$(info "$1")" "$2"; } text() { eval echo "\${${L}[$*]}"; } text_eval() { eval echo "\$(eval echo "\${${L}[$*]}")"; } +# 清理函数 +cleanup_resources() { + rm -f /tmp/warp-go* 2>/dev/null; exit 0 +} + # 检测是否需要启用 Github CDN,如能直接连通,则不使用 check_cdn() { [ -n "$GH_PROXY" ] && wget --server-response --quiet --output-document=/dev/null --no-check-certificate --tries=2 --timeout=3 https://raw.githubusercontent.com/fscarmen/warp-sh/main/README.md >/dev/null 2>&1 && unset GH_PROXY @@ -262,7 +267,7 @@ statistics_of_run-times() { local UPDATE_OR_GET=$1 local SCRIPT=$2 if grep -q 'update' <<< "$UPDATE_OR_GET"; then - { wget --no-check-certificate -qO- --timeout=3 "http://stat.cloudflare.now.cc:4000/api/updateStats?script=${SCRIPT}" > /tmp/statistics; }& + { wget --no-check-certificate -qO- --timeout=3 "https://stat.cloudflare.now.cc/api/updateStats?script=${SCRIPT}" > /tmp/statistics; }& elif grep -q 'get' <<< "$UPDATE_OR_GET"; then [ -s /tmp/statistics ] && [[ $(cat /tmp/statistics) =~ \"todayCount\":([0-9]+),\"totalCount\":([0-9]+) ]] && TODAY="${BASH_REMATCH[1]}" && TOTAL="${BASH_REMATCH[2]}" && rm -f /tmp/statistics fi @@ -508,52 +513,6 @@ check_install() { wget --no-check-certificate -T5 -qO- /tmp/warp-go.tar.gz https://gitlab.com/fscarmen/warp/-/raw/main/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz | tar xz -C /tmp/ warp-go chmod +x /tmp/warp-go }& - - # 后台优选最佳 MTU - { - # 反复测试最佳 MTU。 Wireguard Header:IPv4=60 bytes,IPv6=80 bytes,1280 ≤ MTU ≤ 1420。 ping = 8(ICMP回显示请求和回显应答报文格式长度) + 20(IP首部) 。 - # 详细说明:<[WireGuard] Header / MTU sizes for Wireguard>:https://lists.zx2c4.com/pipermail/wireguard/2017-December/002201.html - MTU=$((1500-28)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - until [[ $? = 0 || $MTU -le $((1280+80-28)) ]]; do - MTU=$((MTU-10)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - done - - if [ "$MTU" -eq $((1500-28)) ]; then - MTU=$MTU - elif [ "$MTU" -le $((1280+80-28)) ]; then - MTU=$((1280+80-28)) - else - for i in {0..8}; do - (( MTU++ )) - ( [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 ) || break - done - (( MTU-- )) - fi - - MTU=$((MTU+28-80)) - - echo "$MTU" > /tmp/warp-go-mtu - }& - - # 后台优选优选 WARP Endpoint - { - wget $STACK -qO /tmp/endpoint https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/warp-linux-${ARCHITECTURE//amd64*/amd64} && chmod +x /tmp/endpoint - [ "$IPV4$IPV6" = 01 ] && wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv6 || wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv4 - - if [[ -s /tmp/endpoint && -s /tmp/ip ]]; then - /tmp/endpoint -file /tmp/ip -output /tmp/endpoint_result >/dev/null 2>&1 - # 如果全部是数据包丢失,LOSS = 100%,说明 UDP 被禁止,生成标志 /tmp/noudp - [ "$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $2}')" = '100.00%' ] && touch /tmp/noudp || ENDPOINT=$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $1}') - rm -f /tmp/{endpoint,ip,endpoint_result} - fi - - # 如果失败,会有默认值 162.159.192.1:2408 或 [2606:4700:d0::a29f:c001]:2408 - [ "$IPV4$IPV6" = 01 ] && ENDPOINT=${ENDPOINT:-'[2606:4700:d0::a29f:c001]:2408'} || ENDPOINT=${ENDPOINT:-'162.159.192.1:2408'} - - echo "$ENDPOINT" > /tmp/warp-go-endpoint - }& fi } @@ -1100,52 +1059,6 @@ EOF [ "$IPV6" = 1 ] && ip6_info } -# 寻找最佳 MTU -best_mtu() { - # 反复测试最佳 MTU。 Wireguard Header:IPv4=60 bytes,IPv6=80 bytes,1280 ≤ MTU ≤ 1420。 ping = 8(ICMP回显示请求和回显应答报文格式长度) + 20(IP首部) 。 - # 详细说明:<[WireGuard] Header / MTU sizes for Wireguard>:https://lists.zx2c4.com/pipermail/wireguard/2017-December/002201.html - MTU=$((1500-28)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - until [[ $? = 0 || $MTU -le $((1280+80-28)) ]]; do - MTU=$((MTU-10)) - [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 - done - - if [ "$MTU" -eq $((1500-28)) ]; then - MTU=$MTU - elif [ "$MTU" -le $((1280+80-28)) ]; then - MTU=$((1280+80-28)) - else - for i in {0..8}; do - (( MTU++ )) - ( [ "$IPV4$IPV6" = 01 ] && $PING6 -c1 -W1 -s $MTU -Mdo 2606:4700:d0::a29f:c001 >/dev/null 2>&1 || ping -c1 -W1 -s $MTU -Mdo 162.159.192.1 >/dev/null 2>&1 ) || break - done - (( MTU-- )) - fi - - MTU=$((MTU+28-80)) - - echo "$MTU" > /tmp/warp-go-mtu -} - -# 寻找最佳 Endpoint,根据 v4 / v6 情况下载 endpoint 库 -best_endpoint() { - wget $STACK -qO /tmp/endpoint https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/warp-linux-${ARCHITECTURE//amd64*/amd64} && chmod +x /tmp/endpoint - [ "$IPV4$IPV6" = 01 ] && wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv6 || wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv4 - - if [[ -s /tmp/endpoint && -s /tmp/ip ]]; then - /tmp/endpoint -file /tmp/ip -output /tmp/endpoint_result >/dev/null 2>&1 - # 如果全部是数据包丢失,LOSS = 100%,说明 UDP 被禁止,生成标志 /tmp/noudp - [ "$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $2}')" = '100.00%' ] && touch /tmp/noudp || ENDPOINT=$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $1}') - rm -f /tmp/{endpoint,ip,endpoint_result} - fi - - # 如果失败,会有默认值 162.159.192.1:2408 或 [2606:4700:d0::a29f:c001]:2408 - [ "$IPV4$IPV6" = 01 ] && ENDPOINT=${ENDPOINT:-'[2606:4700:d0::a29f:c001]:2408'} || ENDPOINT=${ENDPOINT:-'162.159.192.1:2408'} - - echo "$ENDPOINT" > /tmp/warp-go-endpoint -} - # 输入 WARP+ 账户(如有),限制位数为空或者26位以防输入错误 input_license() { [ -z "$LICENSE" ] && reading " $(text 38) " LICENSE @@ -1311,6 +1224,74 @@ install() { # 先删除之前安装,可能导致失败的文件 rm -rf /opt/warp-go/warp-go /opt/warp-go/warp.conf + # 后台优选最佳 MTU + { + # 反复测试最佳 MTU。 Wireguard Header:IPv4=60 bytes,IPv6=80 bytes,1280 ≤ MTU ≤ 1420。 ping = 8(ICMP回显示请求和回显应答报文格式长度) + 20(IP首部) 。 + # 详细说明:<[WireGuard] Header / MTU sizes for Wireguard>:https://lists.zx2c4.com/pipermail/wireguard/2017-December/002201.html + # MTU 初始范围(适用于 WireGuard 等封装,IPv4/IPv6 都保守选 1280-1420) + local MIN_MTU=1280 + local MAX_MTU=1500 + local TEST_IP + local PING_CMD + local BEST_MTU=1280 + + if [ "$IPV4$IPV6" = "01" ]; then + TEST_IP="2606:4700:d0::a29f:c001" + PING_CMD="$PING6" + else + TEST_IP="162.159.192.1" + PING_CMD="ping" + fi + + # 二分查找能 ping 通的最大 MTU(不碎片) + while [ $((MIN_MTU <= MAX_MTU)) -eq 1 ]; do + local MID_MTU=$(( (MIN_MTU + MAX_MTU) / 2 )) + if $PING_CMD -c1 -W1 -s $MID_MTU -M do "$TEST_IP" >/dev/null 2>&1; then + BEST_MTU=$MID_MTU + MIN_MTU=$((MID_MTU + 1)) # 尝试更大值 + else + MAX_MTU=$((MID_MTU - 1)) # 减小范围 + fi + done + + # 最终微调确认 BEST_MTU 是最大可用值 + for (( i=BEST_MTU+1; i<=1420; i++ )); do + if $PING_CMD -c1 -W1 -s $i -M do "$TEST_IP" >/dev/null 2>&1; then + BEST_MTU=$i + else + break + fi + done + + # 返回最终 MTU(按需减包头)——可自定义减多少 + # WireGuard:+28 是 IP+UDP,-60 / -80 是安全包头(例如 wireguard + extra overhead) + grep -q ':' <<< "$TEST_IP" && BEST_MTU=$((BEST_MTU + 28 - 80)) || BEST_MTU=$((BEST_MTU + 28 - 60)) + + # 确保范围安全 + [ "$BEST_MTU" -lt 1280 ] && BEST_MTU=1280 + [ "$BEST_MTU" -gt 1420 ] && BEST_MTU=1420 + + echo "$BEST_MTU" > /tmp/warp-go-mtu + }& + + # 后台优选优选 WARP Endpoint + { + wget $STACK -qO /tmp/endpoint https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/warp-linux-${ARCHITECTURE//amd64*/amd64} && chmod +x /tmp/endpoint + [ "$IPV4$IPV6" = 01 ] && wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv6 || wget $STACK -qO /tmp/ip https://gitlab.com/fscarmen/warp/-/raw/main/endpoint/ipv4 + + if [[ -s /tmp/endpoint && -s /tmp/ip ]]; then + /tmp/endpoint -file /tmp/ip -output /tmp/endpoint_result >/dev/null 2>&1 + # 如果全部是数据包丢失,LOSS = 100%,说明 UDP 被禁止,生成标志 /tmp/noudp + [ "$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $2}')" = '100.00%' ] && touch /tmp/noudp || ENDPOINT=$(grep -sE '[0-9]+[ ]+ms$' /tmp/endpoint_result | awk -F, 'NR==1 {print $1}') + rm -f /tmp/{endpoint,ip,endpoint_result} + fi + + # 如果失败,会有默认值 162.159.192.1:2408 或 [2606:4700:d0::a29f:c001]:2408 + [ "$IPV4$IPV6" = 01 ] && ENDPOINT=${ENDPOINT:-'[2606:4700:d0::a29f:c001]:2408'} || ENDPOINT=${ENDPOINT:-'162.159.192.1:2408'} + + echo "$ENDPOINT" > /tmp/warp-go-endpoint + }& + # 询问是否有 WARP+ 或 Teams 账户 [ -z "$LICENSE_TYPE" ] && hint "\n $(text 54) \n" && reading " $(text 4) " LICENSE_TYPE case "$LICENSE_TYPE" in