diff --git a/src/core.sh b/src/core.sh index f0dcf81..8faf857 100644 --- a/src/core.sh +++ b/src/core.sh @@ -281,6 +281,17 @@ ask() { continue } if [[ $(is_test port_used $REPLY) && $is_ask_set != 'door_port' ]]; then + if [[ $REPLY == 443 && $is_caddy && $is_lower =~ "reality" ]]; then + msg "\n检测到 443 端口已被 Caddy 占用。" + msg "你可以选择启用 REALITY 回落分流功能,将非科学上网流量转发给本地 Caddy (4443 端口)。" + msg "这需要你后续手动将 Caddyfile 中的默认 https 端口修改为 4443 并重启 Caddy。" + ask string is_enable_fallback "是否启用 Caddy 回落分流?(y/n):" + if [[ $is_enable_fallback =~ ^[Yy]$ ]]; then + is_reality_fallback=1 + export $is_ask_set=$REPLY + break + fi + fi msg "$is_err 无法使用 ($REPLY) 端口." continue fi @@ -926,7 +937,16 @@ add() { err "($is_use_port) 不是一个有效的端口. $is_err_tips" } [[ $(is_test port_used $is_use_port) && ! $is_gen ]] && { - err "无法使用 ($is_use_port) 端口. $is_err_tips" + if [[ $is_use_port == 443 && $is_caddy && $is_lower =~ "reality" ]]; then + msg "\n检测到 443 端口已被 Caddy 占用。" + msg "你可以选择启用 REALITY 回落分流功能,将非科学上网流量转发给本地 Caddy (4443 端口)。" + msg "这需要你后续手动将 Caddyfile 中的默认 https 端口修改为 4443 并重启 Caddy。" + ask string is_enable_fallback "是否启用 Caddy 回落分流?(y/n):" + if [[ $is_enable_fallback =~ ^[Yy]$ ]]; then + is_reality_fallback=1 + fi + fi + [[ ! $is_reality_fallback ]] && err "无法使用 ($is_use_port) 端口. $is_err_tips" } port=$is_use_port fi @@ -1100,9 +1120,9 @@ get() { get file $2 if [[ $is_config_file ]]; then is_json_str=$(cat $is_conf_dir/"$is_config_file" | sed s#//.*##) - is_json_data=$(jq '(.inbounds[0]|.type,.listen_port,(.users[0]|.uuid,.password,.username),.method,.password,.override_port,.override_address,(.transport|.type,.path,.headers.host),(.tls|.server_name,.reality.private_key)),(.outbounds[1].tag)' <<<$is_json_str) + is_json_data=$(jq '(.inbounds[0]|.type,.listen_port,(.users[0]|.uuid,.password,.username),.method,.password,.override_port,.override_address,(.transport|.type,.path,.headers.host),(.tls|.server_name,.reality.private_key,.reality.handshake.server_port)),(.outbounds[1].tag)' <<<$is_json_str) [[ $? != 0 ]] && err "无法读取此文件: $is_config_file" - is_up_var_set=(null is_protocol port uuid password username ss_method ss_password door_port door_addr net_type path host is_servername is_private_key is_public_key) + is_up_var_set=(null is_protocol port uuid password username ss_method ss_password door_port door_addr net_type path host is_servername is_private_key is_reality_fallback_port is_public_key) [[ $is_debug ]] && msg "\n------------- debug: $is_config_file -------------" i=0 for v in $(sed 's/""/null/g;s/"//g' <<<"$is_json_data"); do @@ -1118,6 +1138,7 @@ get() { is_reality=1 net_type+=reality is_public_key=${is_public_key/public_key_/} + [[ $is_reality_fallback_port == '4443' ]] && is_reality_fallback=1 fi is_socks_user=$username is_socks_pass=$password @@ -1238,7 +1259,13 @@ get() { net=reality [[ ! $is_servername ]] && is_servername=$is_random_servername [[ ! $is_private_key ]] && get_pbk - is_json_add="tls:{enabled:true,server_name:\"$is_servername\",reality:{enabled:true,handshake:{server:\"$is_servername\",server_port:443},private_key:\"$is_private_key\",short_id:[\"\"]}}" + local handshake_server=$is_servername + local handshake_port=443 + [[ $is_reality_fallback ]] && { + handshake_server="127.0.0.1" + handshake_port=4443 + } + is_json_add="tls:{enabled:true,server_name:\"$is_servername\",reality:{enabled:true,handshake:{server:\"$handshake_server\",server_port:$handshake_port},private_key:\"$is_private_key\",short_id:[\"\"]}}" [[ $is_lower =~ "http" ]] && { is_json_add="$is_json_add,transport:{type:\"http\"}" } || { @@ -1490,6 +1517,15 @@ info() { msg "端口(port): $port" msg "路径(path): $path" fi + if [[ $is_reality_fallback ]]; then + msg "------------- REALITY Fallback NOTICE -------------" + warn "由于启用了 Caddy 回落分流,你必须手动配置 Caddy 才能使整体网络生效:" + msg "1. 请将你的 ${yellow}/etc/caddy/Caddyfile${none} 中的默认 https 端口修改为 ${green}4443${none}。" + msg " 例如,在全局配置块中添加: ${cyan}https_port 4443${none},或者将 site 域名改为 ${cyan}yourdomain.com:4443${none}" + msg "2. 修改后,请运行命令重启 Caddy ➔ ${green}systemctl restart caddy${none}" + msg "3. 如果 sing-box 启动失败,请检查 Caddy 是否已成功释放了 443 端口。" + msg "---------------------------------------------------" + fi footer_msg }