From d6ab0a626d36e275a6fbc3a6e5274c29a87ecd23 Mon Sep 17 00:00:00 2001 From: fscarmen <62703343+fscarmen@users.noreply.github.com> Date: Mon, 24 Mar 2025 00:53:26 +0000 Subject: [PATCH] v1.2.14 Added support for anytls protocol. --- README.md | 14 +++- docker_init.sh | 75 +++++++++++++++++- sing-box.sh | 205 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 232 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 6f632f5..8e170db 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ * * * ## 1.更新信息 +2025.03.23 v1.2.14 Added support for the AnyTLS protocol. Thanks to [Betterdoitnow] for providing the configuration; 新增对 AnyTLS 协议的支持,感谢 [Betterdoitnow] 提供的配置 + 2025.03.18 v1.2.13 Compatible with Sing-box 1.12.0-alpha.18+; 适配 Sing-box 1.12.0-alpha.18+ 2025.01.31 v1.2.12 In order to prevent sing-box from upgrading to a certain version which may cause errors, add a mandatory version file; 以防止sing-box某个版本升级导致运行报错,增加强制指定版本号文件 @@ -99,14 +101,14 @@ ## 2.项目特点: -* 一键部署多协议,可以单选、多选或全选 ShadowTLS v3 / XTLS Reality / Hysteria2 / Tuic V5 / ShadowSocks / Trojan / Vmess + ws / Vless + ws + tls / H2 Reality / gRPC Reality, 总有一款适合你 +* 一键部署多协议,可以单选、多选或全选 ShadowTLS v3 / XTLS Reality / Hysteria2 / Tuic V5 / ShadowSocks / Trojan / Vmess + ws / Vless + ws + tls / H2 Reality / gRPC Reality / AnyTLS, 总有一款适合你 * 所有协议均不需要域名,可选 Cloudflare Argo Tunnel 内网穿透以支持传统方式为 websocket 的协议 * 节点信息输出到 V2rayN / Clash Meta / 小火箭 / Nekobox / Sing-box (SFI, SFA, SFM),订阅自动适配客户端,一个订阅 url 走天下 * 自定义端口,适合有限开放端口的 nat 小鸡 * 内置 warp 链式代理解锁 chatGPT * 智能判断操作系统: Ubuntu 、Debian 、CentOS 、Alpine 和 Arch Linux,请务必选择 LTS 系统 * 支持硬件结构类型: AMD 和 ARM,支持 IPv4 和 IPv6 -* 无交互极速安排模式: 一个回车完成超 10 个协议的安装 +* 无交互极速安排模式: 一个回车完成 11 个协议的安装 ## 3.Sing-box for VPS 运行脚本: @@ -315,7 +317,7 @@ bash <(wget -qO- https://raw.githubusercontent.com/fscarmen/sing-box/main/sing-b | Key 大小写不敏感(Case Insensitive)| Value | | --------------- | ----------- | | --LANGUAGE | c=中文; e=英文 | -| --CHOOSE_PROTOCOLS | 可多选,如 bcdfk
a=全部
b=XTLS + reality
c=hysteria2
d=tuic
e=ShadowTLS
f=shadowsocks
g=trojan
h=vmess + ws
i=vless + ws + tls
j=H2 + reality
k=gRPC + reality | +| --CHOOSE_PROTOCOLS | 可多选,如 bcdfk
a=全部
b=XTLS + reality
c=hysteria2
d=tuic
e=ShadowTLS
f=shadowsocks
g=trojan
h=vmess + ws
i=vless + ws + tls
j=H2 + reality
k=gRPC + reality
l=AnyTLS | | --START_PORT | 100 - 65520 | | --PORT_NGINX | n=不需要订阅,或者 100 - 65520 | | --SERVER_IP | IPv4 或 IPv6 地址,不需要中括号 | @@ -377,6 +379,7 @@ docker run -dit \ -e VLESS_WS=true \ -e H2_REALITY=true \ -e GRPC_REALITY=true \ + -e ANYTLS=true \ -e UUID=20f7fca4-86e5-4ddf-9eed-24142073d197 \ -e CDN=www.csgo.com \ -e NODE_NAME=sing-box \ @@ -419,6 +422,7 @@ services: - VLESS_WS=true - H2_REALITY=true - GRPC_REALITY=true + - ANYTLS=true - UUID=20f7fca4-86e5-4ddf-9eed-24142073d197 - CDN=www.csgo.com - NODE_NAME=sing-box @@ -473,6 +477,7 @@ services: | -e VLESS_WS | 是 | true 为启用 VLess over WebSocket 协议,不需要的话删除本参数或填 false | | -e H2_REALITY | 是 | true 为启用 H2 over reality 协议,不需要的话删除本参数或填 false | | -e GRPC_REALITY | 是 | true 为启用 gRPC over reality 协议,不需要的话删除本参数或填 false | +| -e ANYTLS | 是 | true 为启用 AnyTLS 协议,不需要的话删除本参数或填 false | | -e UUID | 否 | 不指定的话 UUID 将默认随机生成 | | -e CDN | 否 | 优选域名,不指定的话将使用 www.csgo.com | | -e NODE_NAME | 否 | 节点名称,不指定的话将使用 sing-box | @@ -516,7 +521,8 @@ services: | |-- 17_vmess-ws_inbounds.json # vmess + ws 协议配置文件 | |-- 18_vless-ws-tls_inbounds.json # vless + ws + tls 协议配置文件 | |-- 19_h2-reality_inbounds.json # Reality http2 协议配置文件 -| `-- 20_grpc-reality_inbounds.json # Reality gRPC 协议配置文件 +| |-- 20_grpc-reality_inbounds.json # Reality gRPC 协议配置文件 +| `-- 21_anytls_inbounds.json # AnyTLS 协议配置文件 |-- logs | `-- box.log # sing-box 运行日志文件 |-- subscribe # sing-box server 配置文件目录 diff --git a/docker_init.sh b/docker_init.sh index 4b23789..9a87325 100644 --- a/docker_init.sh +++ b/docker_init.sh @@ -610,6 +610,31 @@ EOF } ] } +EOF + + # 生成 AnyTLS 配置 + [ "${ANYTLS}" = 'true' ] && ((PORT++)) && PORT_ANYTLS=$PORT && cat > ${WORK_DIR}/conf/21_anytls_inbounds.json << EOF +{ + "inbounds":[ + { + "type":"anytls", + "tag":"${NODE_NAME} anytls", + "listen":"::", + "listen_port":$PORT_ANYTLS, + "users":[ + { + "password":"${UUID}" + } + ], + "padding_scheme":[], + "tls":{ + "enabled":true, + "certificate_path":"${WORK_DIR}/cert/cert.pem", + "key_path":"${WORK_DIR}/cert/private.key" + } + } + ] +} EOF # 判断 argo 隧道类型 @@ -836,6 +861,11 @@ stdout_logfile=/dev/null local CLASH_SUBSCRIBE+=" $CLASH_GRPC_REALITY " + [ "${ANYTLS}" = 'true' ] && local CLASH_ANYTLS="- {name: \"${NODE_NAME} anytls\", type: anytls, server: ${SERVER_IP}, port: $PORT_ANYTLS, password: ${UUID}, client-fingerprint: chrome, udp: true, idle-session-check-interval: 30, idle-session-timeout: 30, skip-cert-verify: true }" && + local CLASH_SUBSCRIBE+=" + $CLASH_ANYTLS +" + echo -n "${CLASH_SUBSCRIBE}" | sed -E '/^[ ]*#|^--/d' | sed '/^$/d' > ${WORK_DIR}/subscribe/proxies # 生成 clash 订阅配置文件 @@ -975,6 +1005,44 @@ vless://${UUID}@${SERVER_IP_1}:${PORT_H2_REALITY}?encryption=none&security=reali ---------------------------- vless://${UUID}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?encryption=none&security=reality&sni=addons.mozilla.org&fp=chrome&pbk=${REALITY_PUBLIC}&type=grpc&serviceName=grpc&mode=gun#${NODE_NAME// /%20}%20grpc-reality" + [ "${ANYTLS}" = 'true' ] && local V2RAYN_SUBSCRIBE+=" +---------------------------- +# $(info "AnyTLS 配置文件内容,需要更新 sing_box 内核") + +{ + \"log\":{ + \"level\":\"warn\" + }, + \"inbounds\":[ + { + \"domain_strategy\":\"\", + \"listen\":\"127.0.0.1\", + \"listen_port\":${PORT_ANYTLS}, + \"sniff\":true, + \"sniff_override_destination\":false, + \"tag\": \"AnyTLS\", + \"type\":\"mixed\" + } + ], + \"outbounds\":[ + { + \"type\": \"anytls\", + \"tag\": \"${NODE_NAME} anytls\", + \"server\": \"${SERVER_IP}\", + \"server_port\": ${PORT_ANYTLS}, + \"password\": \"${UUID}\", + \"idle_session_check_interval\": \"30s\", + \"idle_session_timeout\": \"30s\", + \"min_idle_session\": 5, + \"tls\": { + \"enabled\": true, + \"insecure\": true, + \"server_name\": \"\" + } + } + ] +}" + echo -n "$V2RAYN_SUBSCRIBE" | sed -E '/^[ ]*#|^[ ]+|^--|^\{|^\}/d' | sed '/^$/d' | base64 -w0 > ${WORK_DIR}/subscribe/v2rayn # 生成 NekoBox 订阅文件 @@ -1067,6 +1135,10 @@ vless://${UUID}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?security=reality&sni=addons. local INBOUND_REPLACE+=" { \"type\": \"vless\", \"tag\": \"${NODE_NAME} grpc-reality\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_GRPC_REALITY}, \"uuid\":\"${UUID}\", \"tls\": { \"enabled\":true, \"server_name\":\"addons.mozilla.org\", \"utls\": { \"enabled\":true, \"fingerprint\":\"chrome\" }, \"reality\":{ \"enabled\":true, \"public_key\":\"${REALITY_PUBLIC}\", \"short_id\":\"\" } }, \"packet_encoding\": \"xudp\", \"transport\": { \"type\": \"grpc\", \"service_name\": \"grpc\" } }," && local NODE_REPLACE+="\"${NODE_NAME} grpc-reality\"," + [ "${ANYTLS}" = 'true' ] && + local INBOUND_REPLACE+=" { \"type\": \"anytls\", \"tag\": \"${NODE_NAME} anytls\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_ANYTLS}, \"password\": \"${UUID}\", \"idle_session_check_interval\": \"30s\", \"idle_session_timeout\": \"30s\", \"min_idle_session\": 5, \"tls\": { \"enabled\": true, \"insecure\": true, \"server_name\": \"\" } }," && + local NODE_REPLACE+="\"${NODE_NAME} anytls\"," + # 模板 local SING_BOX_JSON1=$(wget -qO- --tries=3 --timeout=2 ${SUBSCRIBE_TEMPLATE}/sing-box1) @@ -1189,8 +1261,7 @@ $(${WORK_DIR}/qrencode https://${ARGO_DOMAIN}/${UUID}/auto) # Sing-box 的最新版本 update_sing-box() { - #####local ONLINE=$(check_latest_sing-box) - local ONLINE='1.11.0-alpha.6' + local ONLINE=$(check_latest_sing-box) local LOCAL=$(${WORK_DIR}/sing-box version | awk '/version/{print $NF}') if [ -n "$ONLINE" ]; then if [[ "$ONLINE" != "$LOCAL" ]]; then diff --git a/sing-box.sh b/sing-box.sh index 9e68cd7..64ecb18 100644 --- a/sing-box.sh +++ b/sing-box.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # 当前脚本版本号 -VERSION='v1.2.13 (2025.03.18)' +VERSION='v1.2.14 (2025.03.23)' # 各变量默认值 GH_PROXY='https://ghproxy.lvedong.eu.org/' @@ -13,8 +13,8 @@ MAX_PORT=65520 MIN_HOPPING_PORT=10000 MAX_HOPPING_PORT=65535 TLS_SERVER_DEFAULT=addons.mozilla.org -PROTOCOL_LIST=("XTLS + reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess + ws" "vless + ws + tls" "H2 + reality" "gRPC + reality") -NODE_TAG=("xtls-reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess-ws" "vless-ws-tls" "h2-reality" "grpc-reality") +PROTOCOL_LIST=("XTLS + reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess + ws" "vless + ws + tls" "H2 + reality" "gRPC + reality" "AnyTLS") +NODE_TAG=("xtls-reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess-ws" "vless-ws-tls" "h2-reality" "grpc-reality" "anytls") CONSECUTIVE_PORTS=${#PROTOCOL_LIST[@]} CDN_DOMAIN=("skk.moe" "cfip.xxxxxxxx.tk" "cm.yutian.us.kg" "fan.yutian.us.kg" "xn--b6gac.eu.org" "dash.cloudflare.com" "visa.com") SUBSCRIBE_TEMPLATE="https://raw.githubusercontent.com/fscarmen/client_template/main" @@ -27,8 +27,8 @@ mkdir -p $TEMP_DIR E[0]="Language:\n 1. English (default) \n 2. 简体中文" C[0]="${E[0]}" -E[1]="Compatible with Sing-box 1.12.0-alpha.18+." -C[1]="适配 Sing-box 1.12.0-alpha.18+" +E[1]="Added support for the AnyTLS protocol. Thanks to [Betterdoitnow] for providing the configuration." +C[1]="新增对 AnyTLS 协议的支持,感谢 [Betterdoitnow] 提供的配置。" 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." @@ -227,6 +227,8 @@ E[99]="The \${SING_BOX_SCRIPT} is detected to be installed. Script exits." C[99]="检测到已安装 \${SING_BOX_SCRIPT},脚本退出!" E[100]="Can't get the official latest version. Script exits." C[100]="获取不到官方的最新版本,脚本退出!" +E[101]="The contents of the AnyTLS configuration file need to be updated for the sing_box kernel." +C[101]="AnyTLS 配置文件内容,需要更新 sing_box 内核" # 自定义字体彩色,read 函数 warning() { echo -e "\033[31m\033[01m$*\033[0m"; } # 红色 @@ -1694,7 +1696,7 @@ EOF ] } }, - "transport": { + "transport":{ "type": "http" }, "multiplex":{ @@ -1746,7 +1748,7 @@ EOF ] } }, - "transport": { + "transport":{ "type": "grpc", "service_name": "grpc" }, @@ -1762,6 +1764,37 @@ EOF } ] } +EOF + fi + + # 生成 anytls 配置 + CHECK_PROTOCOLS=$(asc "$CHECK_PROTOCOLS" ++) + if [[ "${INSTALL_PROTOCOLS[@]}" =~ "$CHECK_PROTOCOLS" ]]; then + [ -z "$PORT_ANYTLS" ] && PORT_ANYTLS=$[START_PORT+$(awk -v target=$CHECK_PROTOCOLS '{ for(i=1; i<=NF; i++) if($i == target) { print i-1; break } }' <<< "${INSTALL_PROTOCOLS[*]}")] + NODE_NAME[21]=${NODE_NAME[21]:-"$NODE_NAME_CONFIRM"} && UUID[21]=${UUID[21]:-"$UUID_CONFIRM"} + + cat > ${WORK_DIR}/conf/21_${NODE_TAG[10]}_inbounds.json << EOF +{ + "inbounds":[ + { + "type":"anytls", + "tag":"${NODE_NAME[21]} anytls", + "listen":"::", + "listen_port":$PORT_ANYTLS, + "users":[ + { + "password":"${UUID[21]}" + } + ], + "padding_scheme":[], + "tls":{ + "enabled":true, + "certificate_path":"${WORK_DIR}/cert/cert.pem", + "key_path":"${WORK_DIR}/cert/private.key" + } + } + ] +} EOF fi } @@ -1816,7 +1849,7 @@ EOF # 获取原有各协议的参数,先清空所有的 key-value fetch_nodes_value() { - unset FILE NODE_NAME PORT_XTLS_REALITY UUID TLS_SERVER REALITY_PRIVATE REALITY_PUBLIC PORT_HYSTERIA2 OBFS PORT_TUIC TUIC_PASSWORD TUIC_CONGESTION_CONTROL PORT_SHADOWTLS SHADOWTLS_PASSWORD SHADOWSOCKS_METHOD PORT_SHADOWSOCKS PORT_TROJAN TROJAN_PASSWORD PORT_VMESS_WS VMESS_WS_PATH WS_SERVER_IP WS_SERVER_IP_SHOW VMESS_HOST_DOMAIN CDN PORT_VLESS_WS VLESS_WS_PATH VLESS_HOST_DOMAIN PORT_H2_REALITY PORT_GRPC_REALITY ARGO_DOMAIN + unset FILE NODE_NAME PORT_XTLS_REALITY UUID TLS_SERVER REALITY_PRIVATE REALITY_PUBLIC PORT_HYSTERIA2 OBFS PORT_TUIC TUIC_PASSWORD TUIC_CONGESTION_CONTROL PORT_SHADOWTLS SHADOWTLS_PASSWORD SHADOWSOCKS_METHOD PORT_SHADOWSOCKS PORT_TROJAN TROJAN_PASSWORD PORT_VMESS_WS VMESS_WS_PATH WS_SERVER_IP WS_SERVER_IP_SHOW VMESS_HOST_DOMAIN CDN PORT_VLESS_WS VLESS_WS_PATH VLESS_HOST_DOMAIN PORT_H2_REALITY PORT_GRPC_REALITY ARGO_DOMAIN PORT_ANYTLS # 获取公共数据 ls ${WORK_DIR}/conf/*-ws*inbounds.json >/dev/null 2>&1 && SERVER_IP=$(awk -F '"' '/"WS_SERVER_IP_SHOW"/{print $4; exit}' ${WORK_DIR}/conf/*-ws*inbounds.json) || SERVER_IP=$(grep -A1 '"tag"' ${WORK_DIR}/list | sed -E '/-ws(-tls)*",$/{N;d}' | awk -F '"' '/"server"/{count++; if (count == 1) {print $4; exit}}') @@ -1861,6 +1894,9 @@ fetch_nodes_value() { # 获取 gRPC + Reality key-value [ -s ${WORK_DIR}/conf/*_${NODE_TAG[9]}_inbounds.json ] && local JSON=$(cat ${WORK_DIR}/conf/*_${NODE_TAG[9]}_inbounds.json) && NODE_NAME[20]=$(sed -n "s/.*\"tag\":\"\(.*\) ${NODE_TAG[9]}.*/\1/p" <<< "$JSON") && PORT_GRPC_REALITY=$(sed -n 's/.*"listen_port":\([0-9]\+\),/\1/gp' <<< "$JSON") && UUID[20]=$(awk -F '"' '/"uuid"/{print $4}' <<< "$JSON") && TLS_SERVER[20]=$(awk -F '"' '/"server"/{print $4}' <<< "$JSON") && REALITY_PRIVATE[20]=$(awk -F '"' '/"private_key"/{print $4}' <<< "$JSON") && REALITY_PUBLIC[20]=$(awk -F '"' '/"public_key"/{print $4}' <<< "$JSON") + + # 获取 anytls key-value + [ -s ${WORK_DIR}/conf/*_${NODE_TAG[10]}_inbounds.json ] && local JSON=$(cat ${WORK_DIR}/conf/*_${NODE_TAG[10]}_inbounds.json) && NODE_NAME[21]=$(sed -n "s/.*\"tag\":\"\(.*\) ${NODE_TAG[10]}.*/\1/p" <<< "$JSON") && PORT_ANYTLS=$(sed -n 's/.*"listen_port":\([0-9]\+\),/\1/gp' <<< "$JSON") && UUID[21]=$(awk -F '"' '/"password"/{print $4}' <<< "$JSON") } # 获取 Argo 临时隧道域名 @@ -2038,6 +2074,12 @@ export_list() { local CLASH_SUBSCRIBE+=" $CLASH_GRPC_REALITY " + + [ -n "$PORT_ANYTLS" ] && local CLASH_ANYTLS="- {name: \"${NODE_NAME[21]} ${NODE_TAG[10]}\", type: anytls, server: ${SERVER_IP}, port: $PORT_ANYTLS, password: ${UUID[21]}, client-fingerprint: chrome, udp: true, idle-session-check-interval: 30, idle-session-timeout: 30, skip-cert-verify: true }" && + local CLASH_SUBSCRIBE+=" + $CLASH_ANYTLS +" + echo -n "${CLASH_SUBSCRIBE}" | sed -E '/^[ ]*#|^--/d' | sed '/^$/d' > ${WORK_DIR}/subscribe/proxies # 生成 clash 订阅配置文件 @@ -2146,54 +2188,54 @@ tuic://${UUID[13]}:${TUIC_PASSWORD}@${SERVER_IP_1}:${PORT_TUIC}?alpn=h3&congesti # $(text 54) { - \"log\":{ - \"level\":\"warn\" - }, - \"inbounds\":[ - { - \"domain_strategy\":\"\", - \"listen\":\"127.0.0.1\", - \"listen_port\":${PORT_SHADOWTLS}, - \"sniff\":true, - \"sniff_override_destination\":false, - \"tag\": \"ShadowTLS\", - \"type\":\"mixed\" - } - ], - \"outbounds\":[ - { - \"detour\":\"shadowtls-out\", - \"domain_strategy\":\"\", - \"method\":\"$SHADOWTLS_METHOD\", - \"password\":\"$SHADOWTLS_PASSWORD\", - \"type\":\"shadowsocks\", - \"udp_over_tcp\": false, - \"multiplex\": { - \"enabled\": true, - \"protocol\": \"h2mux\", - \"max_connections\": 8, - \"min_streams\": 16, - \"padding\": true - } - }, - { - \"domain_strategy\":\"\", - \"password\":\"${UUID[14]}\", - \"server\":\"${SERVER_IP}\", - \"server_port\":${PORT_SHADOWTLS}, - \"tag\": \"shadowtls-out\", - \"tls\":{ - \"enabled\":true, - \"server_name\":\"${TLS_SERVER[14]}\", - \"utls\": { - \"enabled\": true, - \"fingerprint\": \"chrome\" - } - }, - \"type\":\"shadowtls\", - \"version\":3 - } - ] + \"log\":{ + \"level\":\"warn\" + }, + \"inbounds\":[ + { + \"domain_strategy\":\"\", + \"listen\":\"127.0.0.1\", + \"listen_port\":${PORT_SHADOWTLS}, + \"sniff\":true, + \"sniff_override_destination\":false, + \"tag\": \"${PROTOCOL_LIST[3]}\", + \"type\":\"mixed\" + } + ], + \"outbounds\":[ + { + \"detour\":\"shadowtls-out\", + \"domain_strategy\":\"\", + \"method\":\"$SHADOWTLS_METHOD\", + \"password\":\"$SHADOWTLS_PASSWORD\", + \"type\":\"shadowsocks\", + \"udp_over_tcp\": false, + \"multiplex\": { + \"enabled\": true, + \"protocol\": \"h2mux\", + \"max_connections\": 8, + \"min_streams\": 16, + \"padding\": true + } + }, + { + \"domain_strategy\":\"\", + \"password\":\"${UUID[14]}\", + \"server\":\"${SERVER_IP}\", + \"server_port\":${PORT_SHADOWTLS}, + \"tag\": \"shadowtls-out\", + \"tls\":{ + \"enabled\":true, + \"server_name\":\"${TLS_SERVER[14]}\", + \"utls\": { + \"enabled\": true, + \"fingerprint\": \"chrome\" + } + }, + \"type\":\"shadowtls\", + \"version\":3 + } + ] }" [ -n "$PORT_SHADOWSOCKS" ] && local V2RAYN_SUBSCRIBE+=" ---------------------------- @@ -2249,6 +2291,44 @@ vless://${UUID[19]}@${SERVER_IP_1}:${PORT_H2_REALITY}?encryption=none&security=r ---------------------------- vless://${UUID[20]}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?encryption=none&security=reality&sni=${TLS_SERVER[20]}&fp=chrome&pbk=${REALITY_PUBLIC[20]}&type=grpc&serviceName=grpc&mode=gun#${NODE_NAME[20]// /%20}%20${NODE_TAG[9]}" + [ -n "$PORT_ANYTLS" ] && local V2RAYN_SUBSCRIBE+=" +---------------------------- +# $(text 101) + +{ + \"log\":{ + \"level\":\"warn\" + }, + \"inbounds\":[ + { + \"domain_strategy\":\"\", + \"listen\":\"127.0.0.1\", + \"listen_port\":${PORT_ANYTLS}, + \"sniff\":true, + \"sniff_override_destination\":false, + \"tag\": \"${PROTOCOL_LIST[10]}\", + \"type\":\"mixed\" + } + ], + \"outbounds\":[ + { + \"type\": \"anytls\", + \"tag\": \"${NODE_NAME[21]} ${NODE_TAG[10]}\", + \"server\": \"${SERVER_IP}\", + \"server_port\": ${PORT_ANYTLS}, + \"password\": \"${UUID[21]}\", + \"idle_session_check_interval\": \"30s\", + \"idle_session_timeout\": \"30s\", + \"min_idle_session\": 5, + \"tls\": { + \"enabled\": true, + \"insecure\": true, + \"server_name\": \"\" + } + } + ] +}" + echo -n "$V2RAYN_SUBSCRIBE" | sed -E '/^[ ]*#|^[ ]+|^--|^\{|^\}/d' | sed '/^$/d' | base64 -w0 > ${WORK_DIR}/subscribe/v2rayn # 生成 NekoBox 订阅文件 @@ -2399,6 +2479,10 @@ vless://${UUID[20]}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?security=reality&sni=${T local INBOUND_REPLACE+=" { \"type\": \"vless\", \"tag\": \"${NODE_NAME[20]} ${NODE_TAG[9]}\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_GRPC_REALITY}, \"uuid\":\"${UUID[20]}\", \"tls\": { \"enabled\":true, \"server_name\":\"${TLS_SERVER[20]}\", \"utls\": { \"enabled\":true, \"fingerprint\":\"chrome\" }, \"reality\":{ \"enabled\":true, \"public_key\":\"${REALITY_PUBLIC[20]}\", \"short_id\":\"\" } }, \"packet_encoding\": \"xudp\", \"transport\": { \"type\": \"grpc\", \"service_name\": \"grpc\" } }," && local NODE_REPLACE+="\"${NODE_NAME[20]} ${NODE_TAG[9]}\"," + [ -n "$PORT_ANYTLS" ] && + local INBOUND_REPLACE+=" { \"type\": \"anytls\", \"tag\": \"${NODE_NAME[21]} ${NODE_TAG[10]}\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_ANYTLS}, \"password\": \"${UUID[21]}\", \"idle_session_check_interval\": \"30s\", \"idle_session_timeout\": \"30s\", \"min_idle_session\": 5, \"tls\": { \"enabled\": true, \"insecure\": true, \"server_name\": \"\" } }," && + local NODE_REPLACE+="\"${NODE_NAME[21]} ${NODE_TAG[10]}\"," + # 模板1 local SING_BOX_JSON1=$(wget --no-check-certificate -qO- --tries=3 --timeout=2 ${GH_PROXY}${SUBSCRIBE_TEMPLATE}/sing-box1) echo $SING_BOX_JSON1 | sed 's#, {[^}]\+"tun-in"[^}]\+}##' | sed "s#\"\",#$INBOUND_REPLACE#; s#\"\"#${NODE_REPLACE%,}#g" | ${WORK_DIR}/jq > ${WORK_DIR}/subscribe/sing-box-pc @@ -2841,6 +2925,15 @@ change_protocols() { unset PORT_GRPC_REALITY fi + # 获取 anytls 端口 + CHECK_PROTOCOLS=$(asc "$CHECK_PROTOCOLS" ++) + if [[ "${INSTALL_PROTOCOLS[@]}" =~ "$CHECK_PROTOCOLS" ]]; then + POSITION=$(awk -v target=$CHECK_PROTOCOLS '{ for(i=1; i<=NF; i++) if($i == target) { print i-1; break } }' <<< "${INSTALL_PROTOCOLS[*]}") + PORT_ANYTLS=${REINSTALL_PORTS[POSITION]} + else + unset PORT_ANYTLS + fi + # 停止 sing-box 服务 cmd_systemctl disable sing-box