diff --git a/DOCS.md b/DOCS.md new file mode 100644 index 0000000..e1a966e --- /dev/null +++ b/DOCS.md @@ -0,0 +1,310 @@ +# Kaskad PRO — документация (v2.2) + +## Что такое Kaskad PRO + +Kaskad PRO — bash-скрипт для Linux, который создаёт **каскадный “мост”** (DNAT + MASQUERADE) между клиентом и вашим зарубежным VPN/Proxy сервером. + +Схема: + +- **Клиент** → **RU VPS (Kaskad PRO)** → **Foreign VPN/Proxy** → Интернет + +Скрипт: + +- Добавляет правила `iptables` (NAT + FORWARD) +- Включает `net.ipv4.ip_forward=1` +- Включает BBR (fq + bbr) +- Сохраняет правила (netfilter-persistent/iptables-persistent где доступно) + +--- + +## Требования + +- **VPS с Linux** (Ubuntu/Debian/CentOS/Fedora) +- Доступ **root** +- Исходящий доступ в интернет (для установки пакетов и GeoIP) +- Пакеты (скрипт установит автоматически): `iptables`, `curl`, `jq`, `qrencode` (+ persistent для Debian/Ubuntu) + +--- + +## Установка + +### Вариант A: репозиторий публичный + +```bash +curl -sL https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh +``` + +### Вариант B: репозиторий приватный (GitHub PAT) + +```bash +curl -sL -H "Authorization: token YOUR_GITHUB_PAT" https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh +``` + +### Повторный запуск меню + +```bash +gokaskad +``` + +--- + +## Где взять ключи/токены + +### 1) Telegram Bot Token (где взять токен бота) + +Нужен для запуска Telegram-бота. + +1. В Telegram откройте **`@BotFather`** +2. Отправьте команду: `/newbot` +3. Введите имя бота (любое) +4. Введите username бота (должен оканчиваться на `bot`) +5. Скопируйте **token**, который выдаст BotFather (формат `123456789:AA...`) + +### 2) Telegram Chat ID (как привязать доступ) + +В Kaskad PRO управление ограничено **по Chat ID**. + +Вариант авто: + +- В меню: `8) Telegram Bot → 2) Chat ID (авто)` +- Перед этим отправьте своему боту любое сообщение (например `/start`) + +Вариант вручную: + +- В меню: `8) Telegram Bot → 3) Chat ID (вручную)` +- Вставьте chat id (число) + +### 3) GitHub PAT (для приватного репозитория) + +Нужен только если репозиторий **private**, чтобы скачивать `install.sh` по `raw.githubusercontent.com`. + +Рекомендуемый вариант: **fine-grained PAT** с доступом только к репозиторию. + +1. GitHub → Settings → Developer settings → **Personal access tokens** → **Fine-grained tokens** +2. Create token +3. Repository access: **Only select repositories** → выберите `kaskad-pro` +4. Permissions: **Contents = Read-only** +5. Сгенерируйте и сохраните токен + +Использование: в команде установки или обновления через `curl -H "Authorization: token ..."` + +--- + +## Основные функции (терминальное меню) + +Ниже — что делает каждый пункт меню и когда использовать. + +### 1) AmneziaWG / WireGuard (UDP) + +Создаёт каскад для UDP-сервисов (AWG/WireGuard/OpenVPN-UDP). + +- Вы вводите `IP` и `порт` +- Создаётся правило: `udp :порт (RU VPS) → IP:порт (Foreign)` + +На клиенте (AWG/WireGuard) меняете endpoint на IP вашего RU VPS. + +### 2) VLESS / XRay (TCP) + +Каскад для TCP-прокси (VLESS/VMess/Trojan/Reality и т.д.). + +Логика та же: + +- `tcp :порт (RU VPS) → IP:порт (Foreign)` + +### 3) TProxy / MTProto (TCP) + +Каскад для MTProto/TProxy (обычно для Telegram). + +### 4) Custom Rule (TCP/UDP, разные порты) + +Позволяет пробрасывать: + +- разные вход/выход порты +- любой TCP/UDP сервис + +Пример: клиент подключается к `RU_VPS:2222`, а трафик уходит на `FOREIGN:22` (SSH). + +### 5) Правила + +Показывает активные DNAT правила (включая IP каскада) и информацию о целевом сервере: + +- имя +- примечание +- GeoIP (страна/ISP), если определено + +### 6) Ping (live) + +Live ping выбранного целевого IP: + +- обновление каждые 1 сек +- ASCII-бар + цветовая шкала +- статистика min/max/avg и потери + +### 7) Мониторинг (авто) + +Мониторинг целевых серверов: + +- Интервал проверок: **10 сек / 1 мин / 5 мин** +- Порог задержки: в ms +- Частота уведомлений (не чаще): **10 сек / 60 сек / 5 мин / 15 мин** +- Если задержка выше порога или timeout — отправляет alert в Telegram + +Служба `kaskad-monitor`: + +- запускается автоматически, если есть хотя бы один монитор +- останавливается автоматически, если мониторов нет + +### 8) Telegram Bot + +Настройка токена/Chat ID и управление службой `kaskad-bot`. + +### 9) Удалить правило + +Удаляет 1 DNAT правило и связанные INPUT/FORWARD правила. + +### 10) Сбросить всё + +Удаляет **только** правила, созданные Kaskad (по маркеру `kaskad`). + +### 11) Обновить скрипт + +Скачивает свежий `install.sh` из репозитория и заменяет `/usr/local/bin/gokaskad`. + +Если репозиторий приватный — обновление нужно выполнять с PAT (или настроить отдельный update-token внутри скрипта/бота). + +### 12) PROMO + +Партнёрские хостинги и промокоды (плюс QR). + +### 13) Инструкция + +Встроенная краткая инструкция (страницы). + +### 14) Имена серверов + +Редактор имён и примечаний для целевых IP. + +Данные хранятся в `/etc/kaskad/aliases`. + +--- + +## Telegram Bot (как пользоваться) + +### Запуск + +1. Создайте токен через `@BotFather` +2. На сервере: + +```bash +gokaskad +``` + +Меню: + +- `8) Telegram Bot → 1) Токен бота` — вставьте token +- `8) Telegram Bot → 2) Chat ID (авто)` — отправьте боту `/start`, затем Enter в терминале +- `8) Telegram Bot → 4) Запустить` + +В Telegram: + +- Отправьте боту `/start` + +### Режимы меню + +- **Inline** — кнопки под сообщением (по умолчанию) +- **Reply keyboard** — большие кнопки внизу экрана + +Переключение: + +- В inline: кнопка `⌨️ Reply-клавиатура` +- В reply: команда `/inline` + +### Добавление сервера через бота + +Поток: + +1. Нажимаете протокол (AWG/VLESS/MTProto/Custom) +2. Вводите IP +3. Бот делает: + - GeoIP (страна/ISP) + - ping 3 раза (1 сек) +4. Просит имя +5. Просит примечание +6. Просит порт(ы) +7. Создаёт правило + +### Ping в боте + +- 1 раз — мгновенно +- 10 раз — показывает список и среднее +- 60 сек — обновляет прогресс каждые 10 секунд, затем итог + +### Мониторинг в боте + +1. `📊 Монитор` → `➕ Добавить` → выбрать сервер +2. Выбрать интервал (10с/1мин/5мин) +3. Ввести порог (мс) +4. Выбрать частоту уведомлений (10с/60с/5мин/15мин) + +--- + +## Где хранятся данные + +| Путь | Назначение | +|---|---| +| `/usr/local/bin/gokaskad` | основной скрипт/команда | +| `/etc/kaskad/config` | BOT_TOKEN, BOT_CHAT_ID, MENU_STYLE | +| `/etc/kaskad/aliases` | IP → имя/примечание/GeoIP | +| `/etc/kaskad/monitors/*.conf` | мониторы IP | +| `/var/log/kaskad.log` | лог действий | + +--- + +## Службы systemd + +```bash +systemctl status kaskad-bot +journalctl -u kaskad-bot -f + +systemctl status kaskad-monitor +journalctl -u kaskad-monitor -f +``` + +--- + +## Troubleshooting + +### Бот не отвечает + +- Проверьте, что задан `BOT_TOKEN` и `BOT_CHAT_ID` +- Проверьте службу: + +```bash +systemctl status kaskad-bot +journalctl -u kaskad-bot -f +``` + +### Raw GitHub не скачивается + +Если репозиторий приватный — нужен PAT: + +```bash +curl -sL -H "Authorization: token YOUR_GITHUB_PAT" https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh +``` + +### Мониторинг не запускается + +Мониторинг запускается автоматически, если есть конфиги в `/etc/kaskad/monitors/`. +Проверьте: + +```bash +ls -la /etc/kaskad/monitors/ +systemctl status kaskad-monitor +``` + +--- + +## Лицензия + +Для частного использования. Распространение запрещено. + diff --git a/README.md b/README.md index 2753658..f8bf1d2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# Kaskad PRO v2.0 +# Kaskad PRO v2.2 -**Каскадный менеджер VPN / Proxy с Telegram-ботом, мониторингом и пингом.** +**Каскадный менеджер VPN / Proxy с Telegram-ботом, мониторингом, GeoIP и live ping.** > Канал: [YouTube @antenkaru](https://www.youtube.com/@antenkaru) +**Не разбираетесь в серверах и терминале?** → [ИНСТРУКЦИЯ_ДЛЯ_ПОЛЬЗОВАТЕЛЯ.md](ИНСТРУКЦИЯ_ДЛЯ_ПОЛЬЗОВАТЕЛЯ.md) — пошагово простыми словами. + --- ## Возможности @@ -14,10 +16,12 @@ | **Каскад TCP** | VLESS, XRay, VMess, Reality, Trojan | | **Каскад MTProto** | Telegram-прокси | | **Custom Rule** | Разные порты входа/выхода, SSH, RDP и т.д. | -| **Live Ping** | Пинг целевого сервера в терминале (обновление 1 сек) | -| **Telegram Bot** | Полное управление через кнопки прямо из Telegram | +| **GeoIP + Ping-test** | При добавлении IP: GeoIP (страна/ISP) + 3 пинга | +| **Live Ping** | Пинг с ASCII-графикой (обновление 1 сек) | +| **Telegram Bot** | Полное управление через кнопки (Inline и Reply-клавиатура) | | **Ping в боте** | 1 раз / 10 раз (среднее) / 60 секунд (непрерывно) | -| **Мониторинг** | Автопинг каждые 10с / 1мин / 5мин с алертами в Telegram | +| **Мониторинг** | Автопинг с порогом и частотой уведомлений (10с/60с/5м/15м) | +| **Имена/примечания** | Имена IP серверов + примечания, отображаются везде | | **BBR Turbo** | Автоматическое включение Google BBR | | **Безопасность** | Валидация IP/портов, маркировка правил, изоляция iptables | @@ -25,13 +29,21 @@ ## Установка -Подключитесь к VPS (Ubuntu/Debian/CentOS) под `root`: +Подключитесь к VPS (Ubuntu/Debian/CentOS/Fedora) под `root`. + +### Вариант A: репозиторий публичный ```bash -wget -O install.sh "URL_СКРИПТА" && chmod +x install.sh && ./install.sh +curl -sL https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh ``` -Повторный запуск: +### Вариант B: репозиторий приватный (с GitHub PAT) + +```bash +curl -sL -H "Authorization: token YOUR_GITHUB_PAT" https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh +``` + +Далее скрипт установит зависимости, включит IP forwarding/BBR и создаст глобальную команду `gokaskad`. ```bash gokaskad @@ -39,6 +51,12 @@ gokaskad --- +## Документация + +Полная документация: **`DOCS.md`** + +--- + ## Быстрый старт ### 1. Создать каскад (пример WireGuard) @@ -89,6 +107,7 @@ IP: 45.10.20.30 11) Обновить скрипт 12) PROMO 13) Инструкция (7 страниц) +14) Имена серверов 0) Выход ``` @@ -106,6 +125,7 @@ IP: 45.10.20.30 📊 Мониторинг — добавить/удалить/список мониторов ❌ Удалить правило — удалить конкретный каскад 🗑 Сбросить всё — полная очистка (с подтверждением) +⌨️ Reply-клавиатура — переключение типа меню ``` --- @@ -117,6 +137,7 @@ IP: 45.10.20.30 | `/usr/local/bin/gokaskad` | Глобальная команда запуска | | `/etc/kaskad/config` | Токен бота и Chat ID | | `/etc/kaskad/monitors/` | Конфигурации мониторов | +| `/etc/kaskad/aliases` | Имена/примечания/GeoIP для IP | | `/var/log/kaskad.log` | Лог всех действий | --- diff --git a/install.sh b/install.sh index 18d34e3..a7374b3 100644 --- a/install.sh +++ b/install.sh @@ -2,12 +2,12 @@ set -o pipefail # ══════════════════════════════════════════════════════════════ -# KASKAD PRO v2.2 — Cascading VPN / Proxy Manager +# KASKAD PRO v2.3 — Cascading VPN / Proxy Manager # Telegram Bot · Live Ping · Monitoring · Alerts · GeoIP · System Stats # Channel: https://www.youtube.com/@antenkaru # ══════════════════════════════════════════════════════════════ -KASKAD_VERSION="2.2" +KASKAD_VERSION="2.3" KASKAD_DIR="/etc/kaskad" KASKAD_CONF="$KASKAD_DIR/config" KASKAD_LOG="/var/log/kaskad.log" @@ -547,6 +547,79 @@ flush_rules() { read -p "Нажмите Enter..." } +full_uninstall() { + clear + echo -e "\n${RED}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${RED}║ ⚠ ПОЛНОЕ УДАЛЕНИЕ KASKAD PRO ⚠ ║${NC}" + echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${WHITE}Будут удалены:${NC}" + echo -e " ${RED}•${NC} Все правила каскада (iptables)" + echo -e " ${RED}•${NC} Telegram-бот и мониторинг" + echo -e " ${RED}•${NC} Конфигурация ${WHITE}/etc/kaskad/${NC}" + echo -e " ${RED}•${NC} Команда ${WHITE}gokaskad${NC}" + echo -e " ${RED}•${NC} Логи ${WHITE}/var/log/kaskad.log${NC}" + echo "" + echo -e "${GREEN}НЕ будет затронуто:${NC}" + echo -e " ${GREEN}•${NC} Системные пакеты (iptables, jq, curl, qrencode)" + echo -e " ${GREEN}•${NC} Ваши VPN / прокси (WireGuard, XRay и т.д.)" + echo -e " ${GREEN}•${NC} Настройки sysctl (ip_forward, bbr)" + echo "" + read -p "$(echo -e "${RED}Удалить Kaskad PRO полностью? (y/n): ${NC}")" confirm1 + [[ "$confirm1" != "y" ]] && { echo -e "\n${CYAN}Отменено.${NC}"; read -p "Нажмите Enter..."; return; } + local words=("УДАЛИТЬ" "СТЕРЕТЬ" "СНЕСТИ" "УНИЧТОЖИТЬ" "ПРОЩАЙ") + local word="${words[$((RANDOM % ${#words[@]}))]}" + echo "" + echo -e "${RED}Последний шанс! Введите слово ${WHITE}${word}${RED} для подтверждения:${NC}" + read -p "> " confirm2 + if [[ "$confirm2" != "$word" ]]; then + echo -e "\n${CYAN}Неверное слово. Удаление отменено.${NC}" + read -p "Нажмите Enter..." + return + fi + echo "" + echo -e "${YELLOW}Удаление Kaskad PRO...${NC}\n" + if systemctl is-active kaskad-bot &>/dev/null; then + systemctl stop kaskad-bot 2>/dev/null; systemctl disable kaskad-bot 2>/dev/null + fi + [ -f "$BOT_PID_FILE" ] && { kill "$(cat "$BOT_PID_FILE")" 2>/dev/null; rm -f "$BOT_PID_FILE"; } + rm -f /etc/systemd/system/kaskad-bot.service + echo -e " ${GREEN}✓${NC} Telegram-бот остановлен" + if systemctl is-active kaskad-monitor &>/dev/null; then + systemctl stop kaskad-monitor 2>/dev/null; systemctl disable kaskad-monitor 2>/dev/null + fi + [ -f "$MONITOR_PID_FILE" ] && { kill "$(cat "$MONITOR_PID_FILE")" 2>/dev/null; rm -f "$MONITOR_PID_FILE"; } + rm -f /etc/systemd/system/kaskad-monitor.service + systemctl daemon-reload 2>/dev/null + echo -e " ${GREEN}✓${NC} Мониторинг остановлен" + while iptables -t nat -S PREROUTING 2>/dev/null | grep -q "DNAT"; do + local rule; rule=$(iptables -t nat -S PREROUTING | grep "DNAT" | head -1) + eval "iptables -t nat -D ${rule#-A }" 2>/dev/null + done + for chain in INPUT FORWARD; do + while iptables -S "$chain" 2>/dev/null | grep -q "kaskad"; do + local rule; rule=$(iptables -S "$chain" | grep "kaskad" | head -1) + eval "iptables -D ${rule#-A }" 2>/dev/null + done + done + save_iptables + echo -e " ${GREEN}✓${NC} Правила iptables удалены" + rm -rf "$KASKAD_DIR" + echo -e " ${GREEN}✓${NC} Конфигурация удалена" + rm -f "$KASKAD_LOG" + echo -e " ${GREEN}✓${NC} Логи удалены" + rm -f /usr/local/bin/gokaskad + echo -e " ${GREEN}✓${NC} Команда gokaskad удалена" + echo "" + echo -e "${GREEN}══════════════════════════════════════════${NC}" + echo -e "${GREEN} Kaskad PRO полностью удалён.${NC}" + echo -e "${WHITE} Спасибо, что пользовались!${NC}" + echo -e "${GREEN}══════════════════════════════════════════${NC}" + echo "" + read -p "Нажмите Enter..." + exit 0 +} + manage_aliases_menu() { while true; do clear @@ -1428,6 +1501,7 @@ show_menu() { echo -e "12) ${YELLOW}PROMO${NC}" echo -e "13) ${MAGENTA}📚 Инструкция${NC}" echo -e "14) ${WHITE}Имена серверов${NC}" + echo -e "15) ${RED}⚠ Удалить Kaskad PRO${NC}" echo -e " 0) Выход" echo -e "------------------------------------------------------" read -p "Выбор: " ch @@ -1436,10 +1510,102 @@ show_menu() { 3) configure_rule "tcp" "MTProto/TProxy";; 4) configure_custom_rule;; 5) list_active_rules;; 6) ping_menu;; 7) monitoring_menu;; 8) bot_menu;; 9) delete_single_rule;; 10) flush_rules;; 11) self_update;; 12) show_promo;; - 13) show_instructions;; 14) manage_aliases_menu;; 0) exit 0;; esac + 13) show_instructions;; 14) manage_aliases_menu;; 15) full_uninstall;; 0) exit 0;; esac done } +# ═══════════════════════════════════════════════════════════════ +# STARTUP WITH PROGRESS +# ═══════════════════════════════════════════════════════════════ + +run_startup() { + local total=7 s=0 + + clear; echo "" + echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ KASKAD PRO v${KASKAD_VERSION} — Загрузка ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Проверка прав root..." "$s" "$total" + check_root + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Права root подтверждены \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Загрузка конфигурации..." "$s" "$total" + init_config + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Конфигурация загружена \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Установка gokaskad..." "$s" "$total" + if [ "$(readlink -f "$0" 2>/dev/null)" != "/usr/local/bin/gokaskad" ]; then + cp -f "$0" "/usr/local/bin/gokaskad"; chmod +x "/usr/local/bin/gokaskad" + fi + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Команда gokaskad \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} IP Forwarding + BBR..." "$s" "$total" + if grep -qE '^[[:space:]]*#?[[:space:]]*net\.ipv4\.ip_forward' /etc/sysctl.conf; then + sed -i 's/^#*\s*net\.ipv4\.ip_forward.*/net.ipv4.ip_forward=1/' /etc/sysctl.conf + else + echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf + fi + grep -q "^net.core.default_qdisc=fq" /etc/sysctl.conf || echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + grep -q "^net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf || echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf + sysctl -p > /dev/null 2>&1 + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} IP Forwarding + BBR Turbo \n" "$s" "$total" + + export DEBIAN_FRONTEND=noninteractive + local need_install=0 + for cmd in iptables jq curl qrencode; do command -v "$cmd" &>/dev/null || need_install=1; done + dpkg -s iptables-persistent &>/dev/null 2>&1 || need_install=1 + ((s++)) + if [ "$need_install" -eq 1 ]; then + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Установка пакетов" "$s" "$total" + ( while true; do printf "."; sleep 1; done ) & + local dpid=$! + if command -v apt-get &>/dev/null; then + apt-get update -y > /dev/null 2>&1 + apt-get install -y iptables-persistent netfilter-persistent qrencode jq curl procps > /dev/null 2>&1 + elif command -v dnf &>/dev/null; then + dnf install -y iptables-services jq qrencode curl procps-ng > /dev/null 2>&1 + elif command -v yum &>/dev/null; then + yum install -y iptables-services jq qrencode curl procps-ng > /dev/null 2>&1 + else + kill $dpid 2>/dev/null; wait $dpid 2>/dev/null + printf "\r ${CYAN}[%d/%d]${NC} ${RED}✗${NC} Пакетный менеджер не найден! \n" "$s" "$total" + exit 1 + fi + kill $dpid 2>/dev/null; wait $dpid 2>/dev/null + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Пакеты установлены \n" "$s" "$total" + else + printf " ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Все зависимости на месте \n" "$s" "$total" + fi + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Сетевой интерфейс..." "$s" "$total" + detect_interface + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Интерфейс: %-20s \n" "$s" "$total" "$IFACE" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Внешний IP..." "$s" "$total" + get_my_ip + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} IP: %-25s \n" "$s" "$total" "$MY_IP" + + echo "" + local w=40 bar="" + for ((i=0; i