11#! /usr/bin/env bash
22
33# 当前脚本版本号
4- VERSION=' v1.2.17 (2025.07.12 )'
4+ VERSION=' v1.2.17 (2025.07.16 )'
55
66# 各变量默认值
77GH_PROXY=' gh-proxy.com/'
@@ -988,13 +988,6 @@ sing-box_variables() {
988988 SERVER_IP=${SERVER_IP:- " $SERVER_IP_DEFAULT " } && WS_SERVER_IP_SHOW=$SERVER_IP
989989 [ -z " $SERVER_IP " ] && error " $( text 47) "
990990
991- # 根据服务 IP,使用不同的 warp 配置
992- if [[ " $SERVER_IP " =~ : ]]; then
993- STRATEGY=prefer_ipv6
994- else
995- STRATEGY=ipv4_only
996- fi
997-
998991 # 检测是否解锁 chatGPT
999992 CHATGPT_OUT=warp-ep;
1000993 [ " $( check_chatgpt $( grep -oE ' [46]' <<< " $STRATEGY" ) ) " = ' unlock' ] && CHATGPT_OUT=direct
@@ -1075,8 +1068,9 @@ check_dependencies() {
10751068 fi
10761069
10771070 # 检测 Linux 系统的依赖,升级库并重新安装依赖
1078- local DEPS_CHECK=(" wget" " tar" " ip" " bash" " openssl" )
1079- local DEPS_INSTALL=(" wget" " tar" " iproute2" " bash" " openssl" )
1071+ local DEPS_INSTALL=(" wget" " tar" " iproute2" " iproute2" " bash" " openssl" " ping" )
1072+ local DEPS_CHECK=(" wget" " tar" " ss" " ip" " bash" " openssl" " iputils-ping" )
1073+
10801074 [ " $SYSTEM " != ' Alpine' ] && DEPS_CHECK+=(" systemctl" ) && DEPS_INSTALL+=(" systemctl" )
10811075 for g in " ${! DEPS_CHECK[@]} " ; do
10821076 [ ! -x " $( type -p ${DEPS_CHECK[g]} ) " ] && DEPS+=(${DEPS_INSTALL[g]} )
@@ -1092,7 +1086,8 @@ check_dependencies() {
10921086 [ ! -x " $( type -p ip6tables) " ] && DEPS+=(ip6tables)
10931087 fi
10941088
1095- # 如需要安装的依赖大于0,就更新库并安装
1089+ # 先 DEPS 去重,如需要安装的依赖大于0,就更新库并安装
1090+ DEPS=($( echo " ${DEPS[@]} " | tr ' ' ' \n' | awk ' !a[$0]++' ) )
10961091 if [[ " ${# DEPS[@]} " > 0 ]]; then
10971092 [[ ! " $SYSTEM " =~ Alpine| CentOS ]] && ${PACKAGE_UPDATE[int]} > /dev/null 2>&1
10981093 ${PACKAGE_INSTALL[int]} ${DEPS[@]} > /dev/null 2>&1
@@ -1323,8 +1318,38 @@ sing-box_json() {
13231318 else
13241319 DIR=$TEMP_DIR
13251320
1326- # 生成 log 配置
1327- cat > ${WORK_DIR} /conf/00_log.json << EOF
1321+ # 根据 IPv4 和 IPv6 的网络状态,使不同的 DNS 策略
1322+ [ -x " $( type -p ping) " ] && for i in {1..3}; do
1323+ ping -c 1 -W 1 " 151.101.1.91" & > /dev/null && local IS_IPV4=is_ipv4 && break
1324+ done
1325+
1326+ if [ -x " $( type -p ping6) " ]; then
1327+ for i in {1..3}; do
1328+ ping6 -c 1 -W 1 " 2a04:4e42:200::347" & > /dev/null && local IS_IPV6=is_ipv6 && break
1329+ done
1330+ elif [ -x " $( type -p ping) " ]; then
1331+ for i in {1..3}; do
1332+ ping -c 1 -W 1 " 2a04:4e42:200::347" & > /dev/null && local IS_IPV6=is_ipv6 && break
1333+ done
1334+ fi
1335+
1336+ case " ${IS_IPV4} @${IS_IPV6} " in
1337+ is_ipv4@is_ipv6)
1338+ local STRATEGY=prefer_ipv4
1339+ ;;
1340+ is_ipv4@)
1341+ local STRATEGY=ipv4_only
1342+ ;;
1343+ @is_ipv6)
1344+ local STRATEGY=ipv6_only
1345+ ;;
1346+ * )
1347+ local STRATEGY=prefer_ipv4
1348+ ;;
1349+ esac
1350+
1351+ # 生成 log 配置
1352+ cat > ${WORK_DIR} /conf/00_log.json << EOF
13281353{
13291354 "log":{
13301355 "disabled":false,
@@ -1335,8 +1360,8 @@ sing-box_json() {
13351360}
13361361EOF
13371362
1338- # 生成 outbound 配置
1339- cat > ${WORK_DIR} /conf/01_outbounds.json << EOF
1363+ # 生成 outbound 配置
1364+ cat > ${WORK_DIR} /conf/01_outbounds.json << EOF
13401365{
13411366 "outbounds":[
13421367 {
@@ -1347,8 +1372,8 @@ EOF
13471372}
13481373EOF
13491374
1350- # 生成 endpoint 配置
1351- cat > ${WORK_DIR} /conf/02_endpoints.json << EOF
1375+ # 生成 endpoint 配置
1376+ cat > ${WORK_DIR} /conf/02_endpoints.json << EOF
13521377{
13531378 "endpoints":[
13541379 {
@@ -1381,8 +1406,8 @@ EOF
13811406}
13821407EOF
13831408
1384- # 生成 route 配置
1385- cat > ${WORK_DIR} /conf/03_route.json << EOF
1409+ # 生成 route 配置
1410+ cat > ${WORK_DIR} /conf/03_route.json << EOF
13861411{
13871412 "route":{
13881413 "rule_set":[
@@ -1425,8 +1450,8 @@ EOF
14251450}
14261451EOF
14271452
1428- # 生成缓存文件
1429- cat > ${WORK_DIR} /conf/04_experimental.json << EOF
1453+ # 生成缓存文件
1454+ cat > ${WORK_DIR} /conf/04_experimental.json << EOF
14301455{
14311456 "experimental": {
14321457 "cache_file": {
@@ -1437,8 +1462,8 @@ EOF
14371462}
14381463EOF
14391464
1440- # 生成 dns 配置文件
1441- cat > ${WORK_DIR} /conf/05_dns.json << EOF
1465+ # 生成 dns 配置文件
1466+ cat > ${WORK_DIR} /conf/05_dns.json << EOF
14421467{
14431468 "dns":{
14441469 "servers":[
@@ -1451,8 +1476,8 @@ EOF
14511476}
14521477EOF
14531478
1454- # 内建的 NTP 客户端服务配置文件,这对于无法进行时间同步的环境很有用
1455- cat > ${WORK_DIR} /conf/06_ntp.json << EOF
1479+ # 内建的 NTP 客户端服务配置文件,这对于无法进行时间同步的环境很有用
1480+ cat > ${WORK_DIR} /conf/06_ntp.json << EOF
14561481{
14571482 "ntp": {
14581483 "enabled": true,
@@ -2665,7 +2690,7 @@ anytls://${UUID[21]}@${SERVER_IP_1}:${PORT_ANYTLS}/?insecure=1#${NODE_NAME[21]}%
26652690
26662691 # 生成 Sing-box 订阅文件
26672692 [ -n " $PORT_XTLS_REALITY " ] &&
2668- local INBOUND_REPLACE+=" { \" type\" : \" vless\" , \" tag\" : \" ${NODE_NAME[11]} ${NODE_TAG[0]} \" , \" server\" :\" ${SERVER_IP} \" , \" server_port\" :${PORT_XTLS_REALITY} , \" uuid\" :\" ${UUID[11]} \" , \" flow\" :\"\" , \" packet_encoding\" :\" xudp \" , \" tls\" :{ \" enabled\" :true, \" server_name\" :\" ${TLS_SERVER[11]} \" , \" utls\" :{ \" enabled\" :true, \" fingerprint\" :\" chrome\" }, \" reality\" :{ \" enabled\" :true, \" public_key\" :\" ${REALITY_PUBLIC[11]} \" , \" short_id\" :\"\" } }, \" multiplex\" : { \" enabled\" : true, \" protocol\" : \" h2mux\" , \" max_connections\" : 8, \" min_streams\" : 16, \" padding\" : true, \" brutal\" :{ \" enabled\" :${IS_BRUTAL} , \" up_mbps\" :1000, \" down_mbps\" :1000 } } }," &&
2693+ local INBOUND_REPLACE+=" { \" type\" : \" vless\" , \" tag\" : \" ${NODE_NAME[11]} ${NODE_TAG[0]} \" , \" server\" :\" ${SERVER_IP} \" , \" server_port\" :${PORT_XTLS_REALITY} , \" uuid\" :\" ${UUID[11]} \" , \" flow\" :\"\" , \" packet_encoding\" : \" none \" , \" tls\" :{ \" enabled\" :true, \" server_name\" :\" ${TLS_SERVER[11]} \" , \" utls\" :{ \" enabled\" :true, \" fingerprint\" :\" chrome\" }, \" reality\" :{ \" enabled\" :true, \" public_key\" :\" ${REALITY_PUBLIC[11]} \" , \" short_id\" :\"\" } }, \" multiplex\" : { \" enabled\" : true, \" protocol\" : \" h2mux\" , \" max_connections\" : 8, \" min_streams\" : 16, \" padding\" : true, \" brutal\" :{ \" enabled\" :${IS_BRUTAL} , \" up_mbps\" :1000, \" down_mbps\" :1000 } } }," &&
26692694 local NODE_REPLACE+=" \" ${NODE_NAME[11]} ${NODE_TAG[0]} \" ,"
26702695
26712696 if [ -n " $PORT_HYSTERIA2 " ]; then
@@ -2726,13 +2751,13 @@ anytls://${UUID[21]}@${SERVER_IP_1}:${PORT_ANYTLS}/?insecure=1#${NODE_NAME[21]}%
27262751 fi
27272752
27282753 [ -n " $PORT_H2_REALITY " ] &&
2729- local REALITY_H2_INBOUND=" { \" type\" : \" vless\" , \" tag\" : \" ${NODE_NAME[19]} ${NODE_TAG[8]} \" , \" server\" : \" ${SERVER_IP} \" , \" server_port\" : ${PORT_H2_REALITY} , \" uuid\" :\" ${UUID[19]} \" , \" tls\" : { \" enabled\" :true, \" server_name\" :\" ${TLS_SERVER[19]} \" , \" utls\" : { \" enabled\" :true, \" fingerprint\" :\" chrome\" }, \" reality\" :{ \" enabled\" :true, \" public_key\" :\" ${REALITY_PUBLIC[19]} \" , \" short_id\" :\"\" } }, \" packet_encoding\" : \" xudp \" , \" transport\" : { \" type\" : \" http\" } }," &&
2754+ local REALITY_H2_INBOUND=" { \" type\" : \" vless\" , \" tag\" : \" ${NODE_NAME[19]} ${NODE_TAG[8]} \" , \" server\" : \" ${SERVER_IP} \" , \" server_port\" : ${PORT_H2_REALITY} , \" uuid\" :\" ${UUID[19]} \" , \" tls\" : { \" enabled\" :true, \" server_name\" :\" ${TLS_SERVER[19]} \" , \" utls\" : { \" enabled\" :true, \" fingerprint\" :\" chrome\" }, \" reality\" :{ \" enabled\" :true, \" public_key\" :\" ${REALITY_PUBLIC[19]} \" , \" short_id\" :\"\" } }, \" packet_encoding\" : \" none \" , \" transport\" : { \" type\" : \" http\" } }," &&
27302755 local REALITY_H2_NODE=" \" ${NODE_NAME[19]} ${NODE_TAG[8]} \" " &&
27312756 local NODE_REPLACE+=" ${REALITY_H2_NODE} ," &&
27322757 local INBOUND_REPLACE+=" ${REALITY_H2_INBOUND} "
27332758
27342759 [ -n " $PORT_GRPC_REALITY " ] &&
2735- 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\" } }," &&
2760+ 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\" : \" none \" , \" transport\" : { \" type\" : \" grpc\" , \" service_name\" : \" grpc\" } }," &&
27362761 local NODE_REPLACE+=" \" ${NODE_NAME[20]} ${NODE_TAG[9]} \" ,"
27372762
27382763 [ -n " $PORT_ANYTLS " ] &&
0 commit comments