mirror of
https://github.com/fscarmen/sing-box.git
synced 2026-09-02 09:20:42 +08:00
v1.3.23 fix: force HTTP/2 transport for cloudflared tunnels
- add --protocol http2 to all cloudflared run commands (quick, token, config modes) v1.3.23 fix: cloudflared 隧道统一使用 HTTP/2 传输 - 所有 cloudflared 启动命令(临时 / token / config)加入 --protocol http2
This commit is contained in:
+51
-55
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 当前脚本版本号
|
||||
VERSION='v1.3.22 (2026.08.11)'
|
||||
VERSION='v1.3.23 (2026.08.14)'
|
||||
|
||||
# Github 反代加速代理
|
||||
GITHUB_PROXY=('https://hub.glowp.xyz/' 'https://proxy.vvvv.ee/')
|
||||
@@ -22,7 +22,7 @@ NODE_TAG=("xtls-reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "
|
||||
CONSECUTIVE_PORTS=${#PROTOCOL_LIST[@]}
|
||||
CDN_DOMAIN=("skk.moe" "ip.sb" "time.is" "cfip.xxxxxxxx.tk" "bestcf.top" "cdn.2020111.xyz" "xn--b6gac.eu.org" "cf.090227.xyz")
|
||||
SUBSCRIBE_TEMPLATE="https://raw.githubusercontent.com/fscarmen/client_template/main"
|
||||
DEFAULT_NEWEST_VERSION='1.14.0-beta.13'
|
||||
DEFAULT_NEWEST_VERSION='1.14.0-beta.14'
|
||||
FINGER_PRINT='chrome'
|
||||
STEP_NUM=0 # 当前步骤编号(安装流程中动态递增)
|
||||
TOTAL_STEPS='' # 总步骤数(协议确定后动态计算)
|
||||
@@ -40,8 +40,8 @@ mkdir -p "$TEMP_DIR"
|
||||
|
||||
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
||||
C[0]="${E[0]}"
|
||||
E[1]="1. Pre-register a fresh WARP account during install with shared-key fallback; 2. [sb -d] Change WARP account with register / manual input, hot-reload via sing-box check + SIGHUP and exit after success; 3. make Hysteria2 Realm and port hopping mutually exclusive with confirm prompts in install and [sb -d]"
|
||||
C[1]="1. 安装期后台预注册 WARP 账户,失败回退共享密钥; 2. [sb -d] 菜单新增「更换 WARP 账户」,支持重新注册 / 手动输入,sing-box check + SIGHUP 热更成功后退出; 3. 安装与 [sb -d] 修改链路中 Realm 与端口跳跃互斥,切换前均先提示确认"
|
||||
E[1]="Force HTTP/2 transport for cloudflared tunnels"
|
||||
C[1]="cloudflared 隧道统一使用 HTTP/2 传输"
|
||||
E[2]="Downloading Sing-box. Please wait a seconds ..."
|
||||
C[2]="下载 Sing-box 中,请稍等 ..."
|
||||
E[3]="Input errors up to 5 times.The script is aborted."
|
||||
@@ -1826,6 +1826,28 @@ custom_route_menu() {
|
||||
# ===================== 自定义路由规则 END =====================
|
||||
# ===================== 更换 WARP 账户 START =====================
|
||||
|
||||
# 获取 WARP 账户并解析到全局变量 WARP_ADDRESS6 / WARP_PRIVATE_KEY / WARP_RESERVED[1..3]
|
||||
# $1 为空则在线注册;非空则直接解析该 JSON(如安装期后台预注册的缓存)
|
||||
# 返回 0 成功 / 1 失败(接口无 id 或解析字段缺失),失败时调用方自行兜底
|
||||
warp_account_register() {
|
||||
local WARP_ACCOUNT="$1"
|
||||
[ -n "$WARP_ACCOUNT" ] || WARP_ACCOUNT=$(wget -qO- --tries=10 --waitretry=1 --timeout=2 "https://warp.cloudflare.nyc.mn/?run=register")
|
||||
|
||||
grep -q '"id"' <<< "$WARP_ACCOUNT" || return 1
|
||||
|
||||
WARP_ADDRESS6=$(awk -F'"' '/"v6":/ && $4 !~ /^\[/ {print $4}' <<< "$WARP_ACCOUNT")
|
||||
WARP_PRIVATE_KEY=$(awk -F'"' '/"private_key"/{print $4}' <<< "$WARP_ACCOUNT")
|
||||
WARP_RESERVED[1]=$(awk '/"reserved":/ {getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
WARP_RESERVED[2]=$(awk '/"reserved":/ {getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
WARP_RESERVED[3]=$(awk '/"reserved":/ {getline; getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
|
||||
if [ -z "$WARP_ADDRESS6" ] || [ -z "$WARP_PRIVATE_KEY" ] || [ -z "${WARP_RESERVED[1]}" ] || [ -z "${WARP_RESERVED[2]}" ] || [ -z "${WARP_RESERVED[3]}" ]; then
|
||||
unset WARP_ADDRESS6 WARP_PRIVATE_KEY WARP_RESERVED
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# 更换 WARP 账户:二级菜单(重新注册 / 手动输入)
|
||||
change_warp_account() {
|
||||
local WARP_ACCOUNT_CHOICE
|
||||
@@ -1844,27 +1866,12 @@ change_warp_account() {
|
||||
|
||||
# 方式1:重新注册免费账户
|
||||
change_warp_account_register() {
|
||||
local WARP_ACCOUNT PRIVATE_KEY ADDRESS6 R1 R2 R3
|
||||
WARP_ACCOUNT=$(wget -qO- --tries=10 --waitretry=1 --timeout=2 "https://warp.cloudflare.nyc.mn/?run=register")
|
||||
|
||||
if ! grep -q '"id"' <<< "$WARP_ACCOUNT"; then
|
||||
if ! warp_account_register; then
|
||||
warning "\n $(text 176) \n"
|
||||
return
|
||||
fi
|
||||
|
||||
PRIVATE_KEY=$(awk -F'"' '/"private_key"/{print $4}' <<< "$WARP_ACCOUNT")
|
||||
ADDRESS6=$(awk -F'"' '/"v6":/ && $4 !~ /^\[/ {print $4}' <<< "$WARP_ACCOUNT")
|
||||
R1=$(awk '/"reserved":/ {getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
R2=$(awk '/"reserved":/ {getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
R3=$(awk '/"reserved":/ {getline; getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
|
||||
# 兜底:接口返回格式异常导致提取为空时,按注册失败处理,保留原账户
|
||||
if [ -z "$PRIVATE_KEY" ] || [ -z "$ADDRESS6" ] || [ -z "$R1" ] || [ -z "$R2" ] || [ -z "$R3" ]; then
|
||||
warning "\n $(text 176) \n"
|
||||
return
|
||||
fi
|
||||
|
||||
change_warp_account_apply "$ADDRESS6" "$PRIVATE_KEY" "$R1" "$R2" "$R3"
|
||||
change_warp_account_apply "$WARP_ADDRESS6" "$WARP_PRIVATE_KEY" "${WARP_RESERVED[1]}" "${WARP_RESERVED[2]}" "${WARP_RESERVED[3]}"
|
||||
}
|
||||
|
||||
# 方式2:手动输入账户信息(IPv6 / Private Key / Reserved)
|
||||
@@ -1985,7 +1992,7 @@ input_argo_auth() {
|
||||
fi
|
||||
|
||||
if [[ ( -z "$ARGO_DOMAIN" || "$ARGO_DOMAIN" =~ trycloudflare\.com$ ) && ( "$IS_CHANGE_ARGO" = 'is_add_protocols' || "$IS_CHANGE_ARGO" = 'is_install' || "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ) ]]; then
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --no-autoupdate --url http://localhost:$PORT_NGINX"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --no-autoupdate --url http://localhost:$PORT_NGINX"
|
||||
elif [ -n "${ARGO_DOMAIN}" ]; then
|
||||
if [ -z "${ARGO_AUTH}" ]; then
|
||||
until [[ "$ARGO_AUTH" =~ TunnelSecret || "$ARGO_AUTH" =~ [A-Z0-9a-z=]{120,250}$ || "${#ARGO_AUTH}" =~ ^[3-6][0-9]$ ]]; do
|
||||
@@ -2000,26 +2007,26 @@ input_argo_auth() {
|
||||
ARGO_TYPE=is_json_argo
|
||||
ARGO_JSON=${ARGO_AUTH//[ ]/}
|
||||
[ "$IS_CHANGE_ARGO" = 'is_install' ] && export_argo_json_file $TEMP_DIR || export_argo_json_file ${WORK_DIR}
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --config ${WORK_DIR}/tunnel.yml run"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --config ${WORK_DIR}/tunnel.yml run"
|
||||
elif [[ "${ARGO_AUTH}" =~ [A-Z0-9a-z=]{120,250}$ ]]; then
|
||||
ARGO_TYPE=is_token_argo
|
||||
ARGO_TOKEN=$(awk '{print $NF}' <<< "$ARGO_AUTH")
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 run --token ${ARGO_TOKEN}"
|
||||
elif [[ "${#ARGO_AUTH}" =~ ^[3-6][0-9]$ ]]; then
|
||||
hint "\n $(text 119) \n "
|
||||
create_argo_tunnel "${ARGO_AUTH}" "${ARGO_DOMAIN}" "${PORT_NGINX}"
|
||||
if [[ "$ARGO_JSON" =~ TunnelSecret ]]; then
|
||||
ARGO_TYPE=is_json_argo
|
||||
[ "$IS_CHANGE_ARGO" = 'is_install' ] && export_argo_json_file $TEMP_DIR || export_argo_json_file ${WORK_DIR}
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --config ${WORK_DIR}/tunnel.yml run"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --config ${WORK_DIR}/tunnel.yml run"
|
||||
elif [[ "${#ARGO_TOKEN}" =~ ^[0-9]+$ && "${#ARGO_TOKEN}" -ge 120 && "${#ARGO_TOKEN}" -le 250 ]]; then
|
||||
ARGO_TYPE=is_token_argo
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 run --token ${ARGO_TOKEN}"
|
||||
else
|
||||
# 创建隧道失败,回退到使用临时隧道
|
||||
hint "\n $(text 117) \n "
|
||||
unset ARGO_DOMAIN
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --no-autoupdate --url http://localhost:$PORT_NGINX"
|
||||
ARGO_RUNS="${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --no-autoupdate --url http://localhost:$PORT_NGINX"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -2060,7 +2067,7 @@ change_argo() {
|
||||
[ -s ${WORK_DIR}/tunnel.json ] && rm -f ${WORK_DIR}/tunnel.{json,yml}
|
||||
|
||||
# 根据系统类型修改配置文件
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto --no-autoupdate --url http://localhost:$PORT_NGINX\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --no-autoupdate --url http://localhost:$PORT_NGINX@g" ${ARGO_DAEMON_FILE}
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto --protocol http2 --no-autoupdate --url http://localhost:$PORT_NGINX\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --no-autoupdate --url http://localhost:$PORT_NGINX@g" ${ARGO_DAEMON_FILE}
|
||||
;;
|
||||
2 )
|
||||
[ -s ${WORK_DIR}/tunnel.json ] && rm -f ${WORK_DIR}/tunnel.{json,yml}
|
||||
@@ -2068,9 +2075,9 @@ change_argo() {
|
||||
cmd_systemctl disable argo
|
||||
|
||||
if [ -n "$ARGO_TOKEN" ]; then
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto run --token ${ARGO_TOKEN}\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}@g" ${ARGO_DAEMON_FILE}
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto --protocol http2 run --token ${ARGO_TOKEN}\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 run --token ${ARGO_TOKEN}@g" ${ARGO_DAEMON_FILE}
|
||||
elif [ -n "$ARGO_JSON" ]; then
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto --config ${WORK_DIR}/tunnel.yml run\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --config ${WORK_DIR}/tunnel.yml run@g" ${ARGO_DAEMON_FILE}
|
||||
[ "$SYSTEM" = 'Alpine' ] && sed -i "s@^command_args=.*@command_args=\"--edge-ip-version auto --protocol http2 --config ${WORK_DIR}/tunnel.yml run\"@g" ${ARGO_DAEMON_FILE} || sed -i "s@ExecStart=.*@ExecStart=${WORK_DIR}/cloudflared tunnel --edge-ip-version auto --protocol http2 --config ${WORK_DIR}/tunnel.yml run@g" ${ARGO_DAEMON_FILE}
|
||||
fi
|
||||
|
||||
# 更新相关配置文件中的域名
|
||||
@@ -3996,26 +4003,15 @@ EOF
|
||||
}
|
||||
EOF
|
||||
|
||||
# 生成 endpoint 配置
|
||||
if [ -s $TEMP_DIR/warp_account.json ] && grep -q '"id"' $TEMP_DIR/warp_account.json; then
|
||||
local WARP_ACCOUNT=$(< "$TEMP_DIR/warp_account.json")
|
||||
# 生成 endpoint 配置:优先复用安装期后台预注册的缓存,否则在线注册;均失败回退共享账户
|
||||
if [ -s $TEMP_DIR/warp_account.json ] && warp_account_register "$(< "$TEMP_DIR/warp_account.json")"; then
|
||||
rm -f "$TEMP_DIR/warp_account.json"
|
||||
else
|
||||
local WARP_ACCOUNT=$(wget -qO- --tries=10 --waitretry=1 --timeout=2 "https://warp.cloudflare.nyc.mn/?run=register")
|
||||
fi
|
||||
|
||||
if grep -q '"id"' <<< "$WARP_ACCOUNT"; then
|
||||
local ADDRESS6=$(awk -F'"' '/"v6":/ && $4 !~ /^\[/ {print $4}' <<< "$WARP_ACCOUNT")
|
||||
local PRIVATE_KEY=$(awk -F'"' '/"private_key"/{print $4}' <<< "$WARP_ACCOUNT")
|
||||
local RESERVED[1]=$(awk '/"reserved":/ {getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
local RESERVED[2]=$(awk '/"reserved":/ {getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
local RESERVED[3]=$(awk '/"reserved":/ {getline; getline; getline; gsub(/[^0-9]/, ""); print}' <<< "$WARP_ACCOUNT")
|
||||
else
|
||||
local ADDRESS6="2606:4700:110:8a36:df92:102a:9602:fa18"
|
||||
local PRIVATE_KEY="YFYOAdbw1bKTHlNNi+aEjBM3BO7unuFC5rOkMRAz9XY="
|
||||
local RESERVED[1]=78
|
||||
local RESERVED[2]=135
|
||||
local RESERVED[3]=76
|
||||
elif ! warp_account_register; then
|
||||
WARP_ADDRESS6="2606:4700:110:8a36:df92:102a:9602:fa18"
|
||||
WARP_PRIVATE_KEY="YFYOAdbw1bKTHlNNi+aEjBM3BO7unuFC5rOkMRAz9XY="
|
||||
WARP_RESERVED[1]=78
|
||||
WARP_RESERVED[2]=135
|
||||
WARP_RESERVED[3]=76
|
||||
fi
|
||||
|
||||
cat > ${WORK_DIR}/conf/02_endpoints.json << EOF
|
||||
@@ -4027,9 +4023,9 @@ EOF
|
||||
"mtu":1400,
|
||||
"address":[
|
||||
"172.16.0.2/32",
|
||||
"${ADDRESS6}/128"
|
||||
"${WARP_ADDRESS6}/128"
|
||||
],
|
||||
"private_key":"${PRIVATE_KEY}",
|
||||
"private_key":"${WARP_PRIVATE_KEY}",
|
||||
"peers": [
|
||||
{
|
||||
"address": "engage.cloudflareclient.com",
|
||||
@@ -4040,9 +4036,9 @@ EOF
|
||||
"::/0"
|
||||
],
|
||||
"reserved":[
|
||||
${RESERVED[1]},
|
||||
${RESERVED[2]},
|
||||
${RESERVED[3]}
|
||||
${WARP_RESERVED[1]},
|
||||
${WARP_RESERVED[2]},
|
||||
${WARP_RESERVED[3]}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -6710,4 +6706,4 @@ elif [ "$IS_FAST_INSTALL" = 'is_fast_install' ]; then
|
||||
else
|
||||
menu_setting
|
||||
menu
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user