diff --git a/autoXRAY1.sh b/autoXRAY1.sh index 9e05e47..dd1593a 100644 --- a/autoXRAY1.sh +++ b/autoXRAY1.sh @@ -1,8 +1,5 @@ #!/bin/bash -# указываем фингерпринт -fpBro=firefox - # Цвета для вывода GRN='\033[1;32m' RED='\033[1;31m' @@ -19,7 +16,7 @@ if [ -z "$DOMAIN" ]; then fi echo -e "${YEL}Обновление и установка необходимых пакетов...${NC}" -apt-get update && apt-get install curl jq dnsutils openssl nginx certbot -y +apt-get update && apt-get install curl jq dnsutils openssl nginx certbot wget tar -y systemctl enable --now nginx LOCAL_IP=$(hostname -I | awk '{print $1}') @@ -38,6 +35,43 @@ if [ "$LOCAL_IP" != "$DNS_IP" ]; then echo -e "${YEL}Продолжение выполнения скрипта...${NC}" fi +# === ВОПРОСЫ ПОЛЬЗОВАТЕЛЮ === +read -p "$(echo -e "\n${YEL}Устанавливать WARP для обхода блокировок некоторых сайтов? (y/n, по умолчанию y): ${NC}")" choice_warp +choice_warp=${choice_warp:-y} +if [[ "$choice_warp" =~ ^[Yy]$ ]]; then + TAG_WARP="warp" + INSTALL_WARP=true +else + TAG_WARP="direct" + INSTALL_WARP=false +fi + +read -p "$(echo -e "\n${YEL}Устанавливать MTProxy для Telegram? (y/n, по умолчанию y): ${NC}")" choice_mtp +choice_mtp=${choice_mtp:-y} +if [[ "$choice_mtp" =~ ^[Yy]$ ]]; then + TARGET_MTP="127.0.0.1:500" + INSTALL_MTP=true +else + TARGET_MTP="/dev/shm/nginx.sock" + INSTALL_MTP=false +fi + +echo -e "\n${YEL}Выберите TLS fingerprint для маскировки трафика:${NC}" +echo "1) chrome 3) safari 5) android 7) 360" +echo "2) firefox 4) ios 6) edge 8) qq" +read -p "Введите номер [1-8] (по умолчанию 2 - firefox): " fp_choice + +case $fp_choice in + 1) fpBro="chrome" ;; + 2) fpBro="firefox" ;; + 3) fpBro="safari" ;; + 4) fpBro="ios" ;; + 5) fpBro="android" ;; + 7) fpBro="360" ;; + 8) fpBro="qq" ;; + *) fpBro="firefox" ;; +esac +# ============================ # Включаем BBR bbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control) @@ -52,10 +86,10 @@ fi cat < /etc/security/limits.d/99-autoXRAY.conf -* soft nofile 65535 -* hard nofile 65535 -root soft nofile 65535 -root hard nofile 65535 +* soft nofile 1048576 +* hard nofile 1048576 +root soft nofile 1048576 +root hard nofile 1048576 EOF ulimit -n 65535 echo -e "${GRN}Лимиты применены. Текущий ulimit -n: $(ulimit -n) ${NC}" @@ -179,7 +213,7 @@ server { add_header routing-enable 0; } - + location /${path_xhttp} { proxy_pass http://127.0.0.1:8400; proxy_http_version 1.1; @@ -245,16 +279,19 @@ socksPasw=$(openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 16) # Установка WARP-cli -# Посмотреть порт(2408): grep -r "Endpoint" /etc/wireguard/ -if ss -tuln | grep -q ":40000 "; then - echo -e "${GRN}WARP-cli (Socks5 на порту 40000) уже работает. Пропускаем.${NC}" +if [ "$INSTALL_WARP" = true ]; then + if ss -tuln | grep -q ":40000 "; then + echo -e "${GRN}WARP-cli (Socks5 на порту 40000) уже работает. Пропускаем.${NC}" + else + echo -e "${GRN}Установка WARP-cli (автоматически)...${NC}" + echo -e "1\n1\n40000" | bash <(curl -fsSL https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh) w + fi else - echo -e "${GRN}Установка WARP-cli (автоматически)...${NC}" - echo -e "1\n1\n40000" | bash <(curl -fsSL https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh) w + echo -e "${YEL}Установка WARP пропущена по выбору пользователя.${NC}" fi # Экспортируем переменные для envsubst -export xray_uuid_vrv xray_privateKey_vrv xray_publicKey_vrv xray_shortIds_vrv xray_sspasw_vrv DOMAIN path_subpage path_xhttp WEB_PATH socksUser socksPasw fpBro +export xray_uuid_vrv xray_privateKey_vrv xray_publicKey_vrv xray_shortIds_vrv xray_sspasw_vrv DOMAIN path_subpage path_xhttp WEB_PATH socksUser socksPasw TARGET_MTP TAG_WARP fpBro # Создаем JSON конфигурацию сервера cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" @@ -306,10 +343,13 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "streamSettings": { "network": "raw", "security": "reality", + "sockopt": { + "acceptProxyProtocol": false + }, "realitySettings": { "show": false, "xver": 2, - "target": "/dev/shm/nginx.sock", + "target": "${TARGET_MTP}", "spiderX": "/", "shortIds": [ "${xray_shortIds_vrv}" @@ -317,17 +357,7 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "privateKey": "${xray_privateKey_vrv}", "serverNames": [ "$DOMAIN" - ], - "limitFallbackUpload": { - "afterBytes": 0, - "bytesPerSec": 65536, - "burstBytesPerSec": 0 - }, - "limitFallbackDownload": { - "afterBytes": 5242880, - "bytesPerSec": 262144, - "burstBytesPerSec": 2097152 - } + ] } } }, @@ -517,10 +547,10 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" { "tag": "socks5", "port": 10443, - "listen": "0.0.0.0", + "listen": "127.0.0.1", "protocol": "mixed", "settings": { - "ip": "0.0.0.0", + "ip": "127.0.0.1", "udp": true, "auth": "password", "accounts": [ @@ -531,7 +561,49 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" } ] } - } + }, + { + "tag": "Hysteria2", + "listen": "0.0.0.0", + "port": 8080, + "protocol": "hysteria", + "settings": { + "version": 2, + "clients": [ + { + "auth": "${xray_shortIds_vrv}" + } + ] + }, + "streamSettings": { + "network": "hysteria", + "security": "tls", + "tlsSettings": { + "serverName": "$DOMAIN", + "alpn": [ + "h3" + ], + "certificates": [ + { + "usage": "encipherment", + "certificateFile": "/var/lib/xray/cert/fullchain.pem", + "keyFile": "/var/lib/xray/cert/privkey.pem" + } + ] + }, + "hysteriaSettings": { + "version": 2, + "auth": "${xray_shortIds_vrv}" + }, + "finalmask": { + "quicParams": { + "congestion": "brutal", + "brutalUp": "100 mbps", + "brutalDown": "100 mbps" + } + } + } + } ], "outbounds": [ { @@ -585,8 +657,8 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "outboundTag": "block" }, { - "outboundTag": "warp", - "domain": ["ifconfig.me","checkip.amazonaws.com","pify.org","2ip.io","habr.com","geosite:category-ip-geo-detect","geosite:google-gemini","geosite:canva","geosite:openai","geosite:whatsapp","geosite:category-ru"] + "outboundTag": "${TAG_WARP}", + "domain": ["ifconfig.me","checkip.amazonaws.com","pify.org","2ip.io","habr.com","geosite:category-ip-geo-detect","geosite:google-gemini","geosite:canva","geosite:openai","geosite:whatsapp"] } ], "domainStrategy": "IPIfNonMatch" @@ -897,6 +969,38 @@ OUT_WS='{ } }' +# --- Config 7 +HYSTERIA2='{ +"tag": "proxy", +"protocol": "hysteria", +"settings": { + "address": "$DOMAIN", + "port": 8080, + "version": 2 +}, +"streamSettings": { + "network": "hysteria", + "security": "tls", + "tlsSettings": { + "serverName": "$DOMAIN", + "alpn": [ + "h3" + ] + }, + "fingerprint": "$fpBro", + "hysteriaSettings": { + "version": 2, + "auth": "${xray_shortIds_vrv}" + }, + "finalmask": { + "quicParams": { + "congestion": "brutal", + "brutalUp": "100 mbps", + "brutalDown": "100 mbps" + } + } +} +}' ( @@ -905,6 +1009,8 @@ OUT_WS='{ echo "," print_config "$OUT_REALITY_VISION" "🇪🇺 VLESS RAW REALITY VISION" echo "," + print_config "$HYSTERIA2" "🇪🇺 HYSTERIA2" + echo "," print_config "$OUT_VISION" "🇪🇺 VLESS RAW TLS VISION" echo "," print_config "$OUT_XHTTP" "🇪🇺 VLESS XHTTP TLS EXTRA" @@ -922,6 +1028,9 @@ echo -e "Перезапуск XRAY" subPageLink="https://$DOMAIN/$path_subpage.json" # Формирование ссылок + +hy2="hy2://${xray_shortIds_vrv}@$DOMAIN:8080/?sni=$DOMAIN&alpn=h3" + linkRTY1="vless://${xray_uuid_vrv}@$DOMAIN:443?security=reality&type=tcp&headerType=&path=&host=&flow=xtls-rprx-vision&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlessRAWrealityVISION-autoXRAY" linkRTY2="vless://${xray_uuid_vrv}@$DOMAIN:443?security=reality&type=xhttp&headerType=&path=%2F$path_xhttp&host=&mode=stream-one&extra=%7B%22xmux%22%3A%7B%22cMaxReuseTimes%22%3A%221000-3000%22%2C%22maxConcurrency%22%3A%223-5%22%2C%22maxConnections%22%3A0%2C%22hKeepAlivePeriod%22%3A0%2C%22hMaxRequestTimes%22%3A%22400-700%22%2C%22hMaxReusableSecs%22%3A%221200-1800%22%7D%2C%22headers%22%3A%7B%7D%2C%22noGRPCHeader%22%3Afalse%2C%22xPaddingBytes%22%3A%22400-800%22%2C%22scMaxEachPostBytes%22%3A1500000%2C%22scMinPostsIntervalMs%22%3A20%2C%22scStreamUpServerSecs%22%3A%2260-240%22%7D&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlessXHTTPrealityEXTRA-autoXRAY" @@ -940,6 +1049,7 @@ configListLink="https://$DOMAIN/$path_subpage.html" CONFIGS_ARRAY=( "VLESS XHTTP REALITY EXTRA (для моста)|$linkRTY2" "VLESS RAW REALITY VISION|$linkRTY1" + "HYSTERIA2|$hy2" "VLESS RAW TLS VISION|$linkTLS1" "VLESS XHTTP TLS EXTRA|$linkTLS2" "VLESS WS TLS|$linkTLS3" @@ -947,6 +1057,14 @@ CONFIGS_ARRAY=( ) ALL_LINKS_TEXT="" +if [ "$INSTALL_MTP" = true ]; then + echo -e "\n\n${GRN}Устанавливаем MTProto FakeTLS ${NC}" + source <(curl -sL https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/telemt-test.sh) +else + echo -e "\n\n${YEL}Установка MTProto FakeTLS пропущена.${NC}" + MTProto="" +fi + # --- ЗАПИСЬ HEAD (СТАТИКА, МИНИФИЦИРОВАННЫЕ СТИЛИ И JS) --- cat > "$WEB_PATH/$path_subpage.html" <<'EOF' @@ -1006,15 +1124,22 @@ EOF ((idx++)) done -# Дописываем Socks5, All links и подвал +SOCKS5_url="tg://socks?server=$DOMAIN&port=10443&user=${socksUser}&pass=${socksPasw}" + +# Добавляем MTProxy блок только если он установлен +if [ "$INSTALL_MTP" = true ]; then cat >> "$WEB_PATH/$path_subpage.html" < -
Socks5 (TG)
-
server=$DOMAIN port=10443 user=${socksUser} pass=${socksPasw}
- - ✈️ Add to TG +
MTProtoFakeTLS (TG)
+
${MTProto}
+ + ✈️ Add to TG +EOF +fi +# Дописываем конец страницы +cat >> "$WEB_PATH/$path_subpage.html" <💠 Все конфиги вместе
$ALL_LINKS_TEXT
@@ -1032,14 +1157,22 @@ EOF echo -e "\n${YEL}=== Финальная проверка статусов ===${NC}" # Проверка WARP-cli (Socks5 порт 40000) -if ss -nlt | grep -q ":40000\b"; then - echo -e "WARP-cli: ${GRN}LISTENING${NC}" -else - echo -e "WARP-cli: ${RED}NOT LISTENING${NC}" - echo "Возникла ошибка! Возможные пути решения проблемы смотрите здесь:" - echo "https://github.com/xVRVx/autoXRAY/blob/main/test/warp-readme.md" +if [ "$INSTALL_WARP" = true ]; then + if ss -nlt | grep -q ":40000\b"; then + echo -e "WARP-cli: ${GRN}LISTENING${NC}" + else + echo -e "WARP-cli: ${RED}NOT LISTENING${NC}" + echo "Возникла ошибка! Возможные пути решения проблемы смотрите здесь:" + echo "https://github.com/xVRVx/autoXRAY/blob/main/test/warp-readme.md" + fi fi +# Проверка Telemt +if [ "$INSTALL_MTP" = true ]; then + if systemctl is-active --quiet telemt; then echo -e "Telemt: ${GRN}RUNNING${NC}"; else echo -e "Telemt: ${RED}STOPPED/ERROR${NC}"; fi +fi + + # Проверка Nginx if systemctl is-active --quiet nginx; then echo -e "Nginx: ${GRN}RUNNING${NC}" @@ -1055,9 +1188,13 @@ else fi -echo -e " +echo -e "\n" -${YEL}VLESS XHTTP REALITY EXTRA (для моста) ${NC} +if [ "$INSTALL_MTP" = true ]; then + echo -e "${YEL}MTProto FakeTLS для ТГ${NC}\n$MTProto\n" +fi + +echo -e "${YEL}VLESS XHTTP REALITY EXTRA (для моста) ${NC} $linkRTY2 ${YEL}VLESS RAW REALITY VISION ${NC} @@ -1081,5 +1218,4 @@ ${GRN}$configListLink ${NC} Открыт локальный socks5 на порту 10808, 2080 и http на 10809. ${GRN}Поддержать автора: https://github.com/xVRVx/autoXRAY ${NC} - -" +" \ No newline at end of file diff --git a/autoXRAYselfRUbrEUxhttp.sh b/autoXRAYselfRUbrEUxhttp.sh index 8eb55ba..c77ee15 100644 --- a/autoXRAYselfRUbrEUxhttp.sh +++ b/autoXRAYselfRUbrEUxhttp.sh @@ -1,8 +1,5 @@ #!/bin/bash -# указываем фингерпринт -fpBro=firefox - # Цвета для вывода GRN='\033[1;32m' RED='\033[1;31m' @@ -12,89 +9,98 @@ NC='\033[0m' # No Color [[ $EUID -eq 0 ]] || { echo -e "${RED}❌ скрипту нужны root права ${NC}"; exit 1; } DOMAIN=$1 - -vless_url=$2 +shift +VLESS_URLS=("$@") if [ -z "$DOMAIN" ]; then echo -e "${RED}❌ Ошибка: домен не задан.${NC}" exit 1 fi -if [ -z "$vless_url" ]; then - echo "${RED}❌ Ошибка: конфиг vless не задан.${NC}" +if [ ${#VLESS_URLS[@]} -eq 0 ]; then + echo -e "${RED}❌ Ошибка: конфиги vless не заданы. Укажите хотя бы одну vless:// ссылку.${NC}" exit 1 fi -if [[ "$vless_url" != vless://* ]]; then - echo "${RED}❌ Ошибка: Неверный формат vless-ссылки.${NC}" - exit 1 -fi - - # Функция URL-декодинга urldecode() { printf '%b' "${1//%/\\x}" } -url_body="${vless_url#vless://}" -node_name_enc="${url_body##*#}" -node_nameVL="$(urldecode "$node_name_enc")" +COUNT=${#VLESS_URLS[@]} +echo -e "${GRN}Обнаружено $COUNT vless ссылок для моста!${NC}" -url_body="${url_body%%#*}" +# Массивы для хранения параметров каждой ноды +declare -a NODE_UUID NODE_ADDR NODE_PORT NODE_NAME NODE_TYPE NODE_SEC NODE_FP NODE_SNI NODE_PBK NODE_SID NODE_SPX NODE_MODE NODE_PATH NODE_EXTRA +# Уникальные UUID для сервера-моста (RU) +declare -a BRIDGE_UUID -uuidVL="${url_body%@*}" -host_port_query="${url_body#*@}" +# Генерируем базовый UUID сервера для всех подключений (будет один клиент в конфиге сервера) +SERVER_UUID=$(openssl rand -hex 16 | sed 's/\(........\)\(....\)\(....\)\(....\)\(............\)/\1-\2-\3-\4-\5/') +# Разбиваем UUID на группы для удобной подмены 3-й группы (7 и 8 байты) +g1="${SERVER_UUID:0:8}" +g2="${SERVER_UUID:9:4}" +g3="${SERVER_UUID:14:4}" +g4="${SERVER_UUID:19:4}" +g5="${SERVER_UUID:24:12}" -addressVL="${host_port_query%%:*}" -restVL="${host_port_query#*:}" -portVL="${restVL%%\?*}" +for (( i=0; i/dev/null) +if [ "$bbr" = "bbr" ]; then echo -e "${GRN}BBR уже запущен${NC}" else echo "net.core.default_qdisc=fq" > /etc/sysctl.d/999-autoXRAY.conf @@ -122,18 +155,15 @@ else fi cat < /etc/security/limits.d/99-autoXRAY.conf -* soft nofile 65535 -* hard nofile 65535 -root soft nofile 65535 -root hard nofile 65535 +* soft nofile 1048576 +* hard nofile 1048576 +root soft nofile 1048576 +root hard nofile 1048576 EOF ulimit -n 65535 echo -e "${GRN}Лимиты применены. Текущий ulimit -n: $(ulimit -n) ${NC}" - - # Блок CERTBOT - START - # Определяем путь к конфигу nginx if [ -f /etc/nginx/sites-available/default ]; then CONFIG_PATH="/etc/nginx/sites-available/default" @@ -191,11 +221,10 @@ else fi # Блок CERTBOT - END - path_subpage=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20) # конфиг nginx -bash -c "cat > $CONFIG_PATH" < "$CONFIG_PATH" server { server_name $DOMAIN; listen unix:/dev/shm/nginx.sock ssl http2 proxy_protocol; @@ -244,56 +273,91 @@ EOF systemctl restart nginx -echo -e "${GRN}✅ Конфигурация nginx обновлена.${NC} - -" - - - - # Создание директории WEB_PATH="/var/www/$DOMAIN" mkdir -p "$WEB_PATH" # Генерируем сайт маскировку -bash -c "$(curl -L https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page2.sh)" -- $WEB_PATH +bash -c "$(curl -sL https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page2.sh)" -- "$WEB_PATH" # Установка Xray -bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +bash -c "$(curl -sL https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install - -# Определяем директорию скрипта -#SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) SCRIPT_DIR=/usr/local/etc/xray -# Генерируем переменные -xray_uuid_vrv=$(xray uuid) - +# Генерируем глобальные ключи для сервера-моста key_output=$(xray x25519) xray_privateKey_vrv=$(echo "$key_output" | awk -F': ' '/PrivateKey/ {print $2}') xray_publicKey_vrv=$(echo "$key_output" | awk -F': ' '/Password/ {print $2}') - -key_mldsa65=$(xray mldsa65) -seed_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Seed/ {print $2}') -verify_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Verify/ {print $2}') - xray_shortIds_vrv=$(openssl rand -hex 8) -xray_sspasw_vrv=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20) - path_xhttp=$(openssl rand -base64 15 | tr -dc 'a-z0-9' | head -c 6) -# ipserv=$(hostname -I | awk '{print $1}') - socksUser=$(openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | head -c 6) socksPasw=$(openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 16) +# ====СОЗДАНИЕ КОНФИГА СЕРВЕРА В ЦИКЛЕ ==== + +ROUTING_RULES="" +OUTBOUNDS="" + +for (( i=0; i "$SCRIPT_DIR/config.json" +cat << EOF > "$SCRIPT_DIR/config.json" { "log": { "dnsLog": false, @@ -301,6 +365,18 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "error": "/var/log/xray/error.log", "loglevel": "none" }, + "burstObservatory": { + "pingConfig": { + "timeout": "3s", + "interval": "40s", + "sampling": 1, + "destination": "https://www.gstatic.com/generate_204", + "connectivity": "" + }, + "subjectSelector": [ + "proxy" + ] + }, "dns": { "servers": [ "https+local://8.8.4.4/dns-query", @@ -311,16 +387,16 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "queryStrategy": "UseIPv4" }, "inbounds": [ - { + { "tag": "RUbrEUraw", - "port": ${portVL}, + "port": 443, "listen": "0.0.0.0", "protocol": "vless", "settings": { "clients": [ { "flow": "xtls-rprx-vision", - "id": "${xray_uuid_vrv}" + "id": "$SERVER_UUID" } ], "decryption": "none", @@ -342,28 +418,21 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "streamSettings": { "network": "raw", "security": "reality", + "sockopt": { + "acceptProxyProtocol": false + }, "realitySettings": { "show": false, "xver": 2, - "target": "/dev/shm/nginx.sock", + "target": "${TARGET_MTP}", "spiderX": "/", "shortIds": [ - "${xray_shortIds_vrv}" + "$xray_shortIds_vrv" ], - "privateKey": "${xray_privateKey_vrv}", + "privateKey": "$xray_privateKey_vrv", "serverNames": [ "$DOMAIN" - ], - "limitFallbackUpload": { - "afterBytes": 0, - "bytesPerSec": 65536, - "burstBytesPerSec": 0 - }, - "limitFallbackDownload": { - "afterBytes": 5242880, - "bytesPerSec": 262144, - "burstBytesPerSec": 2097152 - } + ] } } }, @@ -375,7 +444,7 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "settings": { "clients": [ { - "id": "${xray_uuid_vrv}" + "id": "$SERVER_UUID" } ], "decryption": "none" @@ -391,8 +460,8 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" "streamSettings": { "network": "xhttp", "xhttpSettings": { - "mode": "${mode}", - "path": "/${path_xhttp}", + "mode": "stream-one", + "path": "/$path_xhttp", "acceptProxyProtocol": false }, "security": "none", @@ -401,66 +470,26 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" } } }, - { + { "tag": "RUsocks5", "port": 10443, - "listen": "0.0.0.0", + "listen": "127.0.0.1", "protocol": "mixed", "settings": { - "ip": "0.0.0.0", + "ip": "127.0.0.1", "udp": true, "auth": "password", "accounts": [ { - "user": "${socksUser}", - "pass": "${socksPasw}" - + "user": "$socksUser", + "pass": "$socksPasw" } ] } } ], "outbounds": [ - { - "mux": { - "concurrency": -1, - "enabled": false - }, - "tag": "proxy", - "protocol": "vless", - "settings": { - "vnext": [ - { - "port": ${portVL}, - "users": [ - { - "id": "$uuidVL", - "encryption": "none" - } - ], - "address": "$addressVL" - } - ] - }, - "streamSettings": { - "network": "$TYPE", - "xhttpSettings": { - "extra": ${extra}, - "mode": "${mode}", - "path": "${path_url}" - }, - "security": "$SECURITY", - "realitySettings": { - "show": false, - "fingerprint": "$FP", - "serverName": "$SNI", - "password": "$PBK", - "shortId": "$SID", - "mldsa65Verify": "", - "spiderX": "$SPX" - } - } - }, +$OUTBOUNDS { "tag": "direct", "protocol": "freedom", @@ -474,6 +503,28 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" } ], "routing": { + "domainMatcher": "hybrid", + "domainStrategy": "IPIfNonMatch", + "balancers": [ + { + "tag": "Super_Balancer", + "selector": [ + "proxy" + ], + "strategy": { + "type": "leastLoad", + "settings": { + "maxRTT": "1s", + "expected": $COUNT, + "baselines": [ + "1s" + ], + "tolerance": 0.01 + } + }, + "fallbackTag": "direct" + } + ], "rules": [ { "ip": [ @@ -481,7 +532,7 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" ], "outboundTag": "block" }, - { + { "port": "25", "outboundTag": "block" }, @@ -502,13 +553,13 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" { "domain": [ "habr.com", - "apkmirror.com", + "apkmirror.com", "ifconfig.me", "checkip.amazonaws.com", "pify.org", "geosite:category-ip-geo-detect" ], - "outboundTag": "proxy" + "balancerTag": "Super_Balancer" }, { "domain": [ @@ -532,56 +583,59 @@ cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json" }, { "inboundTag": [ - "RUbrEUraw","RUbrEUxhttp","RUsocks5" + "RUsocks5" ], - "outboundTag": "proxy" - } - ], - "domainStrategy": "IPIfNonMatch" + "balancerTag": "Super_Balancer" + }, +$ROUTING_RULES + ] } } - EOF # Создаем JSON конфигурацию клиента -cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" -[ +print_config() { + local PROXY_OUTBOUND="$1" + local REMARK="$2" + + cat << TPL { "log": { "loglevel": "warning" }, "dns": { - "servers": [ - "https://8.8.4.4/dns-query", - "https://8.8.8.8/dns-query", - "https://1.1.1.1/dns-query" + "servers":[ + "https://8.8.4.4/dns-query", + "https://8.8.8.8/dns-query", + "https://1.1.1.1/dns-query" ], "queryStrategy": "UseIPv4" }, "routing": { + "domainMatcher": "hybrid", "domainStrategy": "IPIfNonMatch", - "rules": [ + "rules":[ { - "domain": [ + "domain":[ "geosite:category-ads", "geosite:win-spy" ], "outboundTag": "block" }, { - "protocol": [ + "protocol":[ "bittorrent" ], "outboundTag": "direct" }, { - "domain": [ + "domain":[ "habr.com", "apkmirror.com" ], "outboundTag": "proxy" }, { - "domain": [ + "domain":[ "geosite:private", "ifconfig.me", "checkip.amazonaws.com", @@ -605,14 +659,14 @@ cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" "outboundTag": "direct" }, { - "ip": [ + "ip":[ "geoip:private" ], "outboundTag": "direct" } ] }, - "inbounds": [ + "inbounds":[ { "tag": "socks-in", "protocol": "socks", @@ -623,11 +677,7 @@ cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" }, "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls", - "quic" - ] + "destOverride":[ "http", "tls", "quic" ] } }, { @@ -640,11 +690,7 @@ cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" }, "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls", - "quic" - ] + "destOverride":[ "http", "tls", "quic" ] } }, { @@ -654,55 +700,12 @@ cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" "port": 10809, "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls", - "quic" - ] + "destOverride":[ "http", "tls", "quic" ] } } ], - "outbounds": [ - { - "mux": { - "concurrency": -1, - "enabled": false - }, - "tag": "proxy", - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "$DOMAIN", - "port": ${portVL}, - "users": [ - { - "id": "${xray_uuid_vrv}", - "encryption": "none" - } - ] - } - ] - }, - "streamSettings": { - "network": "$TYPE", - "xhttpSettings": { - "extra": ${extra}, - "mode": "${mode}", - "path": "/${path_xhttp}" - }, - "security": "reality", - "realitySettings": { - "show": false, - "fingerprint": "$fpBro", - "serverName": "$DOMAIN", - "password": "${xray_publicKey_vrv}", - "shortId": "${xray_shortIds_vrv}", - "mldsa65Verify": "", - "spiderX": "/" - } - } - }, + "outbounds":[ +$PROXY_OUTBOUND, { "tag": "direct", "protocol": "freedom" @@ -712,341 +715,166 @@ cat << 'EOF' | envsubst > "$WEB_PATH/$path_subpage.json" "protocol": "blackhole" } ], - "remarks": "🇷🇺 Bridge RU-EU vlsXHTTPrty" -}, -{ - "log": { - "loglevel": "warning" - }, - "dns": { - "servers": [ - "https://8.8.4.4/dns-query", - "https://8.8.8.8/dns-query", - "https://1.1.1.1/dns-query" - ], - "queryStrategy": "UseIPv4" - }, - "routing": { - "domainStrategy": "IPIfNonMatch", - "rules": [ - { - "domain": [ - "geosite:category-ads", - "geosite:win-spy" - ], - "outboundTag": "block" - }, - { - "protocol": [ - "bittorrent" - ], - "outboundTag": "direct" - }, - { - "domain": [ - "habr.com", "apkmirror.com" - ], - "outboundTag": "proxy" - }, - { - "domain": [ - "geosite:private", - "ifconfig.me", - "checkip.amazonaws.com", - "pify.org", - "geosite:category-ip-geo-detect", - "geosite:apple", - "geosite:apple-pki", - "geosite:huawei", - "geosite:xiaomi", - "geosite:category-android-app-download", - "geosite:f-droid", - "geosite:yandex", - "geosite:vk", - "geosite:microsoft", - "geosite:win-update", - "geosite:win-extra", - "geosite:google-play", - "geosite:steam", - "geosite:category-ru" - ], - "outboundTag": "direct" - }, - { - "ip": [ - "geoip:private" - ], - "outboundTag": "direct" - } - ] - }, - "inbounds": [ + "remarks": "$REMARK" +} +TPL +} + +CLIENT_CONFIGS="" +declare -a CONFIGS_ARRAY +ALL_LINKS_TEXT="" + +# Цикл генерации клиентов по каждой ссылке +for (( i=0; iEU xhttp | $REMARK_BASE")" + CLIENT_CONFIGS+="," + CLIENT_CONFIGS+="$(print_config "$OUT_REALITY_VISION" "🇷🇺 RU>EU raw | $REMARK_BASE")" + CLIENT_CONFIGS+="," + CLIENT_CONFIGS+="$(print_config "$OUT_DIRECT_EU" "🇪🇺 EU dir | $REMARK_BASE")" + + if [ $i -lt $((COUNT-1)) ]; then + CLIENT_CONFIGS+="," + fi + + # --- Генерируем ссылки vless:// для HTML странички (с портом моста) --- + link_xhttp="vless://${BRIDGE_UUID[$i]}@$DOMAIN:$SERVER_PORT?security=reality&type=xhttp&headerType=&path=%2F$path_xhttp&host=&mode=stream-one&extra=%7B%22xmux%22%3A%7B%22cMaxReuseTimes%22%3A%221000-3000%22%2C%22maxConcurrency%22%3A%223-5%22%2C%22maxConnections%22%3A0%2C%22hKeepAlivePeriod%22%3A0%2C%22hMaxRequestTimes%22%3A%22400-700%22%2C%22hMaxReusableSecs%22%3A%221200-1800%22%7D%2C%22headers%22%3A%7B%7D%2C%22noGRPCHeader%22%3Afalse%2C%22xPaddingBytes%22%3A%22400-800%22%2C%22scMaxEachPostBytes%22%3A1500000%2C%22scMinPostsIntervalMs%22%3A20%2C%22scStreamUpServerSecs%22%3A%2260-240%22%7D&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#RU%3EEU_xhttp_$REMARK_BASE" + + link_raw="vless://${BRIDGE_UUID[$i]}@$DOMAIN:$SERVER_PORT?security=reality&type=tcp&headerType=&path=&host=&flow=xtls-rprx-vision&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#RU%3EEU_raw_$REMARK_BASE" + + CONFIGS_ARRAY+=( "XHTTP (RU>EU $REMARK_BASE)|$link_xhttp" ) + CONFIGS_ARRAY+=( "RAW VISION (RU>EU $REMARK_BASE)|$link_raw" ) + CONFIGS_ARRAY+=( "Direct EU ($REMARK_BASE)|${VLESS_URLS[$i]}" ) +done + +# Записываем массив в файл подписки +echo "[$CLIENT_CONFIGS]" > "$WEB_PATH/$path_subpage.json" systemctl restart xray echo -e "Перезапуск XRAY" -# Формирование ссылок subPageLink="https://$DOMAIN/$path_subpage.json" - -# Формирование ссылок -link1="vless://${xray_uuid_vrv}@$DOMAIN:${portVL}?security=reality&type=xhttp&headerType=&path=%2F$path_xhttp&host=&mode=${mode}&extra=%7B%22xmux%22%3A%7B%22cMaxReuseTimes%22%3A%221000-3000%22%2C%22maxConcurrency%22%3A%223-5%22%2C%22maxConnections%22%3A0%2C%22hKeepAlivePeriod%22%3A0%2C%22hMaxRequestTimes%22%3A%22400-700%22%2C%22hMaxReusableSecs%22%3A%221200-1800%22%7D%2C%22headers%22%3A%7B%7D%2C%22noGRPCHeader%22%3Afalse%2C%22xPaddingBytes%22%3A%22400-800%22%2C%22scMaxEachPostBytes%22%3A1500000%2C%22scMinPostsIntervalMs%22%3A20%2C%22scStreamUpServerSecs%22%3A%2260-240%22%7D&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlsXHTTPrtyRUbrEU" - -link2="vless://${xray_uuid_vrv}@$DOMAIN:${portVL}?security=reality&type=tcp&headerType=&path=&host=&flow=xtls-rprx-vision&sni=$DOMAIN&fp=$fpBro&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlsRAWrtyXTLSRUbrEU" - - configListLink="https://$DOMAIN/$path_subpage.html" -CONFIGS_ARRAY=( - "VLESS XHTTP REALITY RUbrEU|$link1" - "VLESS RAW REALITY XTLS RUbrEU|$link2" - "Напрямую через EU|$vless_url" -) -ALL_LINKS_TEXT="" +if [ "$INSTALL_MTP" = true ]; then + echo -e "\n\n${GRN}Устанавливаем MTProto FakeTLS ${NC}" + source <(curl -sL https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/telemt-test.sh) +else + echo -e "\n\n${YEL}Установка MTProto FakeTLS пропущена.${NC}" + MTProto="" +fi -# --- ЗАПИСЬ HEAD (СТАТИКА, МИНИФИЦИРОВАННЫЕ СТИЛИ И JS) --- +echo -e "\n\n${GRN}Создаем страницу подписки ${NC}" cat > "$WEB_PATH/$path_subpage.html" <<'EOF' @@ -1062,7 +890,6 @@ function copyText(e,t){navigator.clipboard.writeText(document.getElementById(e). EOF -# --- ЗАПИСЬ BODY (ДИНАМИЧЕСКИЕ ДАННЫЕ) --- cat >> "$WEB_PATH/$path_subpage.html" <📂 Ссылка на подписку (готовый конфиг клиента с роутингом) @@ -1073,20 +900,17 @@ cat >> "$WEB_PATH/$path_subpage.html" <QR
-

📱 Приложение HAPP (Windows/Android/iOS/MAC/Linux)

-

Маршрутизацию нужно выключить, она тут встроенная. По умолчанию она выключена - включается, если вы пользовались сторонними сервисами.

- -

➡️ Конфиги

+

➡️ Конфиги ($COUNT VPS x 3 протокола)

EOF -# Цикл генерации строк конфигов +# Вывод строк конфигов idx=1 for item in "${CONFIGS_ARRAY[@]}"; do title="${item%%|*}" @@ -1105,15 +929,22 @@ EOF ((idx++)) done -# Дописываем Socks5, All links и подвал +SOCKS5_url="tg://socks?server=$DOMAIN&port=10443&user=${socksUser}&pass=${socksPasw}" + +# Добавляем MTProxy блок только если он установлен +if [ "$INSTALL_MTP" = true ]; then cat >> "$WEB_PATH/$path_subpage.html" < -
Мост Socks5 (TG)
-
server=$DOMAIN port=10443 user=${socksUser} pass=${socksPasw}
- - ✈️ Add to TG +
MTProtoFakeTLS (TG)
+
${MTProto}
+ + ✈️ Add to TG +EOF +fi +# Дописываем конец страницы +cat >> "$WEB_PATH/$path_subpage.html" <💠 Все конфиги вместе
$ALL_LINKS_TEXT
@@ -1130,32 +961,25 @@ EOF # --- ФИНАЛЬНАЯ ПРОВЕРКА --- echo -e "\n${YEL}=== Финальная проверка статусов ===${NC}" -# Проверка Nginx -if systemctl is-active --quiet nginx; then - echo -e "Nginx: ${GRN}RUNNING${NC}" -else - echo -e "Nginx: ${RED}STOPPED/ERROR${NC}" +if [ "$INSTALL_MTP" = true ]; then + if systemctl is-active --quiet telemt; then echo -e "Telemt: ${GRN}RUNNING${NC}"; else echo -e "Telemt: ${RED}STOPPED/ERROR${NC}"; fi fi +if systemctl is-active --quiet nginx; then echo -e "Nginx: ${GRN}RUNNING${NC}"; else echo -e "Nginx: ${RED}STOPPED/ERROR${NC}"; fi +if systemctl is-active --quiet xray; then echo -e "XRAY: ${GRN}RUNNING${NC}"; else echo -e "XRAY: ${RED}STOPPED/ERROR${NC}"; fi -# Проверка XRAY -if systemctl is-active --quiet xray; then - echo -e "XRAY: ${GRN}RUNNING${NC}" -else - echo -e "XRAY: ${RED}STOPPED/ERROR${NC}" + +echo -e "\n" +if [ "$INSTALL_MTP" = true ]; then + echo -e "${YEL}MTProto FakeTLS для ТГ${NC}\n$MTProto\n" fi - echo -e " -${YEL}VLESS XHTTP REALITY EXTRA (мост RU->EU) ${NC} -$link1 - -${YEL}VLESS RAW REALITY XTLS (мост RU->EU) ${NC} -$link2 +${YEL}✅ Сгенерировано мостов: ${GRN}$COUNT${NC} ${YEL}Ваша json страничка подписки ${NC} -$subPageLink +${GRN}$subPageLink${NC} -${YEL}Ссылка на сохраненные конфиги ${NC} +${YEL}Ссылка на сохраненные конфиги (Web UI) ${NC} ${GRN}$configListLink ${NC} Скопируйте подписку в специализированное приложение: @@ -1164,8 +988,9 @@ ${GRN}$configListLink ${NC} - Windows: конфиги Happ или winLoadXRAY или v2rayN для vless v2RayTun или Throne -Открыт локальный socks5 на порту 10808, 2080 и http на 10809. +Открыт локальный socks5 на порту 10443. +Внутри клиента: socks5 на 10808, 2080 и http на 10809. ${GRN}Поддержать автора: https://github.com/xVRVx/autoXRAY ${NC} -" +" \ No newline at end of file