diff --git a/install.sh b/install.sh index ba83b93..c27f58e 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,7 @@ #!/bin/bash -# šŸš€ SwiftGram MTProxy v1.0.3 — Š¤ŠøŠ½Š°Š»ŃŒŠ½Ń‹Š¹ фикс звонков (UDP) -# Режим: Network Host + IPv4 Explicit Binding (100% Calls Compatibility) +# šŸš€ SwiftGram MTProxy — Smart Modular Manager +# v1.0.5 — Final Working Version (TCP + UDP Calls) +# ŠŸŠ¾Š»Š½Ń‹Š¹ Ń„ŃƒŠ½ŠŗŃ†ŠøŠ¾Š½Š°Š», без рекламы, исправлена логика портов. # ── ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠø Ń€ŠµŠæŠ¾Š·ŠøŃ‚Š¾Ń€ŠøŃ ──────────────────────────────────────────────────── REPO_RAW_URL="https://git.bargcraft.top/kobalt/swiftgram/raw/branch/main" @@ -90,6 +91,8 @@ optimize_system() { { echo "net.core.default_qdisc=fq" echo "net.ipv4.tcp_congestion_control=bbr" + echo "net.ipv4.ip_local_port_range=1024 65535" + echo "net.core.somaxconn=65535" } >> /etc/sysctl.conf sysctl -p >/dev/null 2>&1 spinner_stop @@ -108,7 +111,7 @@ fix_firewall() { firewall-cmd --permanent --add-port="$port"/udp >/dev/null 2>&1 firewall-cmd --reload >/dev/null 2>&1 fi - echo -e " ${GREEN}āœ“${NC} Firewall настроен (TCP/UDP $port)" + echo -e " ${GREEN}āœ“${NC} Firewall: порты $port (TCP/UDP) открыты" } # ── Установка зависимостей ─────────────────────────────────────────────────── @@ -159,6 +162,22 @@ find_smart_port() { echo "$port" } +# ── Š˜Š½Ń‚ŠµŠ»Š»ŠµŠŗŃ‚ŃƒŠ°Š»ŃŒŠ½Ń‹Š¹ анализ Гомена ─────────────────────────────────────────── +analyze_best_domain() { + spinner_start "Анализ Гоменов Š“Š»Ń Fake TLS..." + local test_domains=("google.com" "wikipedia.org" "github.com" "habr.com" "microsoft.com") + local best="google.com" + local min=999 + for d in "${test_domains[@]}"; do + local t=$(ping -c 1 -W 1 "$d" 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}') + if [ -n "$t" ] && (( $(echo "$t < $min" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min%.*} ]) )); then + min=$t; best=$d + fi + done + spinner_stop + echo "$best" +} + # ── ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ Ганные ŠæŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŃ ────────────────────────────────────────────── show_config() { if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then @@ -174,9 +193,9 @@ show_config() { echo -e "\n${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" echo -e "${CYAN}ā•‘ Š”ŠŠŠŠ«Š• ŠŸŠžŠ”ŠšŠ›Š®Š§Š•ŠŠ˜ŠÆ ā•‘${NC}" echo -e "${CYAN}ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•${NC}" - echo -e " IP: ${WHITE}$IP4${NC}" + echo -e " IPv4: ${WHITE}$IP4${NC}" [ -n "$IP6" ] && echo -e " IPv6: ${WHITE}$IP6${NC}" - echo -e " ŠŸŠ¾Ń€Ń‚: ${WHITE}$PORT${NC} (Direct UDP Calls Ready)" + echo -e " ŠŸŠ¾Ń€Ń‚: ${WHITE}$PORT${NC} (TCP + UDP)" echo -e " Secret: ${WHITE}$SECRET${NC}" echo -e "\n Дсылка: ${BLUE}$LINK${NC}" echo "" @@ -187,19 +206,35 @@ show_config() { menu_install() { clear echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${CYAN}ā•‘ Š£Š”Š¢ŠŠŠžŠ’ŠšŠ SWIFTGRAM MTPROXY ā•‘${NC}" + echo -e "${CYAN}ā•‘ Выберите Гомен Š“Š»Ń маскировки (Fake TLS) ā•‘${NC}" echo -e "${CYAN}ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•${NC}" - local domains=("google.com" "wikipedia.org" "github.com" "habr.com" "microsoft.com" "stackoverflow.com" "lenta.ru" "rbc.ru") - echo -e "\nВыберите Гомен Š“Š»Ń маскировки (Fake TLS):" + local domains=( + "google.com" "wikipedia.org" "habr.com" "github.com" + "coursera.org" "udemy.com" "medium.com" "stackoverflow.com" + "bbc.com" "cnn.com" "reuters.com" "nytimes.com" + "lenta.ru" "rbc.ru" "ria.ru" "kommersant.ru" + "stepik.org" "duolingo.com" "khanacademy.org" "ted.com" + ) + + local best_suggest=$(analyze_best_domain) + echo -e " ${GREEN}→ Š ŠµŠŗŠ¾Š¼ŠµŠ½Š“ŃƒŠµŠ¼Ń‹Š¹ Гомен (Š»ŃƒŃ‡ŃˆŠøŠ¹ пинг): $best_suggest${NC}\n" + for i in "${!domains[@]}"; do - printf " ${YELLOW}%2d)${NC} %-20s" "$((i+1))" "${domains[$i]}" + printf " ${YELLOW}%2d)${NC} %-22s" "$((i+1))" "${domains[$i]}" [[ $(( (i+1) % 2 )) -eq 0 ]] && echo "" done - echo -e "\n ${CYAN}9)${NC} Ввести свой Гомен" - read -p "Выбор: " d_idx - if [ "$d_idx" = "9" ]; then read -p "ВвеГите Гомен: " DOMAIN; else DOMAIN=${domains[$((d_idx-1))]}; fi - DOMAIN=${DOMAIN:-google.com} + echo -e "\n ${CYAN}21)${NC} Ввести свой Гомен" + + local d_idx DOMAIN + read -p "Š’Š°Ńˆ выбор [1-21]: " d_idx + if [ "$d_idx" = "21" ]; then + read -p " ВвеГите Гомен: " DOMAIN + DOMAIN=$(echo "$DOMAIN" | tr -d '[:space:]') + else + DOMAIN=${domains[$((d_idx-1))]} + fi + DOMAIN=${DOMAIN:-$best_suggest} local PORT=$(find_smart_port) echo -e " ${GREEN}āœ“${NC} Š˜Ń‚Š¾Š³Š¾Š²Ń‹Š¹ порт: ${WHITE}$PORT${NC}" @@ -207,19 +242,19 @@ menu_install() { optimize_system fix_firewall "$PORT" - spinner_start "Š—Š°ŠæŃƒŃŠŗ контейнера (UDP Calls Optimized)..." + spinner_start "Š—Š°ŠæŃƒŃŠŗ контейнера (команГа оригинала)..." docker pull nineseconds/mtg:2 >/dev/null 2>&1 local SECRET=$(docker run --rm nineseconds/mtg:2 generate-secret --hex "$DOMAIN" 2>/dev/null) docker stop "$CONTAINER_NAME" &>/dev/null docker rm "$CONTAINER_NAME" &>/dev/null - # Š Š•ŠØŠ•ŠŠ˜Š•: --network host + ŠæŃ€ŠøŠ²ŃŠ·ŠŗŠ° Šŗ IPv4 (0.0.0.0). - # Это ŃƒŠ±ŠøŃ€Š°ŠµŃ‚ NAT Гокера, который ломает звонки, но Š¾ŃŃ‚Š°Š²Š»ŃŠµŃ‚ Š“Š¾ŃŃ‚ŃƒŠæŠ½Š¾ŃŃ‚ŃŒ. + # Š˜Š”ŠŸŠžŠ›Š¬Š—Š£Š•Šœ Š¢ŠžŠ§ŠŠ£Š® ŠšŠžŠœŠŠŠ”Š£, ŠšŠžŠ¢ŠžŠ ŠŠÆ Š ŠŠ‘ŠžŠ¢ŠŠ›Š Š’ ŠžŠ Š˜Š“Š˜ŠŠŠ›Š• docker run -d --name "$CONTAINER_NAME" --restart always \ - --network host \ + -p "$PORT":"$PORT"/tcp \ + -p "$PORT":"$PORT"/udp \ nineseconds/mtg:2 simple-run \ - -n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \ + -n 1.1.1.1 -i prefer-ipv4 \ 0.0.0.0:"$PORT" "$SECRET" > /dev/null 2>&1 sleep 2 @@ -246,10 +281,12 @@ menu_setup_bot() { if ! command -v python3 &>/dev/null; then run_with_progress "Установка Python3" install_pkg python3 python3-pip python3-venv; fi mkdir -p "$BOT_DIR" cd "$BOT_DIR" - spinner_start "Š—Š°Š³Ń€ŃƒŠ·ŠŗŠ° моГулей..." + + spinner_start "Š—Š°Š³Ń€ŃƒŠ·ŠŗŠ° моГулей бота..." curl -sL "$REPO_RAW_URL/requirements.txt" -o "requirements.txt" curl -sL "$REPO_RAW_URL/bot.py" -o "bot.py" spinner_stop + [ ! -d "venv" ] && python3 -m venv venv >/dev/null 2>&1 ./venv/bin/pip install --upgrade pip -q ./venv/bin/pip install -r requirements.txt -q @@ -258,12 +295,18 @@ menu_setup_bot() { read -r TOKEN echo -e "${YELLOW}Š’Š°Ńˆ Telegram ID:${NC}" read -r ADMIN_ID - { echo "BOT_TOKEN=$TOKEN"; echo "ALLOWED_IDS=$ADMIN_ID"; echo "CONTAINER_NAME=$CONTAINER_NAME"; echo "CONFIG_PATH=$BOT_DIR/proxy.json"; } > .env + + { + echo "BOT_TOKEN=$TOKEN" + echo "ALLOWED_IDS=$ADMIN_ID" + echo "CONTAINER_NAME=$CONTAINER_NAME" + echo "CONFIG_PATH=$BOT_DIR/proxy.json" + } > .env chmod 600 .env cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF [Unit] -Description=SwiftGram Bot +Description=SwiftGram Bot Service After=network.target docker.service [Service] Type=simple @@ -284,14 +327,22 @@ EOF # ── 7) УГаление ────────────────────────────────────────────────────────────── menu_remove() { clear - read -p "Š£Š“Š°Š»ŠøŃ‚ŃŒ SwiftGram ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ? (y/N): " yn + echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${RED}ā•‘ Š£Š”ŠŠ›Š•ŠŠ˜Š• SWIFTGRAM ā•‘${NC}" + echo -e "${RED}ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•${NC}" + read -p " Š£Š“Š°Š»ŠøŃ‚ŃŒ ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ? (y/N): " yn [[ "$yn" != "y" ]] && return - spinner_start "УГаление..." + local words=("Š£Š”ŠŠ›Š˜Š¢Š¬" "SWIFTGRAM" "ŠžŠ§Š˜Š”Š¢ŠšŠ") + local confirm_word="${words[$((RANDOM % ${#words[@]}))]}" + echo -e " ВвеГите слово: ${WHITE}$confirm_word${NC}" + read -p " >>> " input_word + [[ "$input_word" != "$confirm_word" ]] && return + spinner_start "ŠžŃ‡ŠøŃŃ‚ŠŗŠ°..." docker stop "$CONTAINER_NAME" &>/dev/null; docker rm "$CONTAINER_NAME" &>/dev/null systemctl stop "$SERVICE_NAME" 2>/dev/null; systemctl disable "$SERVICE_NAME" 2>/dev/null rm -f "/etc/systemd/system/${SERVICE_NAME}.service"; rm -rf "$BOT_DIR"; rm -f /usr/local/bin/swiftgram spinner_stop - echo -e "${GREEN}āœ“ УГалено.${NC}"; read -p "Enter..." + echo -e "${GREEN}āœ“ Дистема очищена.${NC}"; read -p "Enter..." } # ── Главный цикл ───────────────────────────────────────────────────────────── @@ -302,14 +353,16 @@ SELF="$(realpath "$0")" while true; do clear echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${MAGENTA}ā•‘ SWIFTGRAM MANAGER (v1.0.3) ā•‘${NC}" + echo -e "${MAGENTA}ā•‘ SWIFTGRAM MANAGER (Professional) ā•‘${NC}" echo -e "${MAGENTA}ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•${NC}" docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$" && echo -e " ŠŸŃ€Š¾ŠŗŃŠø: ${GREEN}Š ŠŠ‘ŠžŠ¢ŠŠ•Š¢${NC}" || echo -e " ŠŸŃ€Š¾ŠŗŃŠø: ${RED}Š’Š«ŠšŠ›Š®Š§Š•Š${NC}" systemctl is-active --quiet "$SERVICE_NAME" && echo -e " Бот: ${GREEN}Š ŠŠ‘ŠžŠ¢ŠŠ•Š¢${NC}" || echo -e " Бот: ${YELLOW}ŠŠ• ŠŠŠ”Š¢Š ŠžŠ•Š${NC}" - echo -e "\n ${GREEN}1)${NC} Š£ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ / ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ прокси\n ${GREEN}2)${NC} ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ Ганные (QR)\n ${CYAN}3)${NC} ŠŠ°ŃŃ‚Ń€Š¾ŠøŃ‚ŃŒ Telegram-бота\n ${GREEN}4)${NC} ŠŸŠµŃ€ŠµŠ·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ прокси\n ${RED}5)${NC} Š£Š“Š°Š»ŠøŃ‚ŃŒ SwiftGram\n ${WHITE}0)${NC} ВыхоГ" + echo -e "\n ${GREEN}1)${NC} Š£ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ / ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ прокси\n ${GREEN}2)${NC} ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ Ганные (QR)\n ${CYAN}3)${NC} ŠŠ°ŃŃ‚Ń€Š¾ŠøŃ‚ŃŒ Telegram-бота\n ${GREEN}4)${NC} ŠŸŠµŃ€ŠµŠ·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ прокси\n ${GREEN}5)${NC} Логи прокси\n ${RED}6)${NC} Š£Š“Š°Š»ŠøŃ‚ŃŒ SwiftGram\n ${WHITE}0)${NC} ВыхоГ" read -p "ŠŸŃƒŠ½ŠŗŃ‚: " m_idx case $m_idx in 1) menu_install ;; 2) clear; show_config; read -p "ŠŠ°Š¶Š¼ŠøŃ‚Šµ Enter..." ;; 3) menu_setup_bot ;; - 4) docker restart "$CONTAINER_NAME"; sleep 1 ;; 5) menu_remove ;; 0) exit 0 ;; + 4) docker restart "$CONTAINER_NAME"; echo "Готово"; sleep 1 ;; + 5) docker logs --tail 50 "$CONTAINER_NAME"; read -p "Enter..." ;; + 6) menu_remove ;; 0) exit 0 ;; esac done \ No newline at end of file