# Kaskad **Свой VPN для россиян за границей.** Российские сайты (госуслуги, банки, ВК) открываются через ваш сервер в РФ. Всё остальное — напрямую через зарубежный. Если RU-сервер падает — за минуту переключается на запасной. Управляется из браузера или Telegram. ![Каскад работает](https://img.shields.io/badge/status-в%20продакшне-success) ![License](https://img.shields.io/github/license/andrey271192/kaskad) ![Stars](https://img.shields.io/github/stars/andrey271192/kaskad?style=social) --- ## Зачем это нужно Живёте за границей и сталкивались с тем, что: - 🏦 Тинькофф не пускает с заграничного IP - 🧾 Госуслуги «вы не из России» - 📺 Кинопоиск, ivi, ВК — недоступны - 🛍 Озон, Wildberries — корзина не работает При этом обычный VPN в РФ **тормозит всё подряд**, включая Netflix, рабочие звонки и игры. **Каскад** делит трафик по умному: ``` ┌──────────────────────────────────────────┐ вы ───▶ │ зарубежный сервер (Амстердам, X-ray) │ │ │ │ если адрес РФ → 🇷🇺 RU-сервер → инет │ │ всё остальное → 🌍 напрямую │ └──────────────────────────────────────────┘ ``` Vk.com видит ваш московский IP. Netflix видит амстердамский. Скорость не страдает. --- ## Что умеет - ⚡ **Авто-failover** — если основной RU-сервер упал, за минуту переключение на запасной. Когда вернулся — автоматически обратно. - 🎛 **WebUI** — добавлять серверы, домены, IP в один клик. Никакого SSH. - 🤖 **Telegram-бот** — то же самое из телефона. - 🌐 **N RU-серверов** в каскаде с приоритетами. - 🌍 **N зарубежных нод** под одним каскадом — все автоматически переключаются вместе. - 🔔 **Уведомления в Telegram** при каждом переключении. - 📋 **Маршруты по доменам** — ввёл `vk.com`, бот сам резолвит IP и держит их в маршрутах. --- ## Установка в одну команду На зарубежном сервере (Ubuntu 20.04+) с уже работающим X-ray: ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/kaskad/main/install.sh | sudo bash ``` Скрипт спросит: 1. Telegram bot token (от [@BotFather](https://t.me/BotFather)) 2. Telegram chat ID (узнать у [@userinfobot](https://t.me/userinfobot)) 3. Хост вашего RU-сервера + пароль root (пароль нужен один раз) 4. Логин/пароль для WebUI Через 2-3 минуты получите: - 🌐 WebUI на `http://ВАШ_СЕРВЕР:8088` - 🤖 Активного Telegram-бота — `/status` покажет состояние - 🔁 Авто-failover каждую минуту через cron Готово. Никаких ручных правок конфигов. > 💡 **Если RU-сервер ещё чистый** — скрипт сам поставит на него WireGuard, ip_forward, iptables и поднимет туннель. Достаточно SSH-пароля. --- ## Удаление в одну команду ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/kaskad/main/uninstall.sh | sudo bash ``` или, если уже склонировано: ```bash sudo bash /opt/kaskad/uninstall.sh ``` Спросит подтверждение (`YES`), затем уберёт: - сервисы, скрипты, cron, WG-туннели, конфиги, `/opt/kaskad/` X-ray, ваши SSH-ключи и системные пакеты **не трогает**. Если хотите снести и WG-ключи — `KASKAD_PURGE_KEYS=1 sudo bash uninstall.sh`. --- ## WebUI После установки откройте `http://ВАШ_СЕРВЕР:8088`. | Что | Как | |---|---| | Переключиться на запасной RU | кнопка `backup` в верхней таблице | | Добавить ещё один RU-сервер | секция «RU-серверы» → «+ добавить RU-сервер», ввести IP/домен и пароль root | | Добавить ещё одну зарубежную ноду | секция «Ам. серверы» → «+ добавить ам. сервер» | | **Удалить зарубежный сервер** | красная кнопка `удалить` в строке — peer уберётся со всех RU и из конфига | | Добавить русский сайт | секция «Домены» → ввести `vk.com ozon.ru` | | Принудительный refresh DNS для доменов | кнопка `🔄 Refresh DNS` | Все действия идут с подтверждением, ошибки видны сразу. --- ## Telegram-бот | Категория | Команды | |---|---| | Туннели | `/status`, `/use `, `/primary`, `/backup` | | RU-серверы | `/server-list`, `/server-add`, `/server-remove`, `/bot-key` | | Ам. серверы | `/ams-list`, `/ams-add`, `/ams-remove` | | Маршруты | `/ips`, `/list`, `/add `, `/remove `, `/clear` | | Домены | `/list-domains`, `/add-domain `, `/remove-domain `, `/show-domain `, `/refresh-domains` | | Прочее | `/help` | Полный синтаксис — [docs/bot.md](docs/bot.md). --- ## Как это работает (короткая версия) 1. На каждом зарубежном сервере поднят WireGuard-туннель `ru` → к выбранному RU-серверу. 2. iptables `mangle` помечает трафик от X-ray меткой `100`, `ip rule` отправляет его в таблицу маршрутизации `200`, где default → через туннель. 3. Маршруты на конкретные RU-подсети/IP добавляются в `ru-base.aips` и `ru-extra.list`. 4. Cron каждую минуту запускает `ru-failover.py`: проверяет handshake + TCP-пробу на RU. Если пусто > N секунд — переключает endpoint на следующий по приоритету. Деталки — [docs/architecture.md](docs/architecture.md). --- ## Структура репозитория ``` kaskad/ ├── install.sh ← одна команда — всё ставится ├── uninstall.sh ← одна команда — всё убирается ├── bin/ ← скрипты для ам. серверов ├── bot/ ← Telegram-бот ├── webui/ ← Flask-приложение ├── examples/ ← шаблоны конфигов (если ставите вручную) └── docs/ ← подробная документация ``` --- ## Безопасность - Все конфиги (`ru-servers.json`, `notify.env`, `webui.env`) с правами `600`, **не коммитятся**. - Между серверами — только SSH-ключи. Пароли используются один раз, при добавлении нового сервера, и **сразу затираются**. - WebUI защищён HTTP basic auth. Рекомендация: поставьте за HTTPS reverse-proxy (Caddy, Nginx, Traefik). - Telegram-бот принимает команды только от заранее заданного `TG_CHAT_ID`. --- ## Требования - Ubuntu / Debian 20.04+ на ам. сервере (где будет WebUI и бот) — root доступ - Ubuntu / Debian 20.04+ на RU-сервере — root + SSH-пароль (нужен один раз) - На ам. сервере: уже настроенный X-ray (3x-ui подойдёт) с интерфейсом `amn0` - На RU-сервере: открыт UDP/1939 наружу (или проброс на роутере) --- ## FAQ **Не работает «удалить» в WebUI?** — кнопки `удалить` рядом с зарубежными серверами теперь явно красные. Если показывает «⛔ нельзя» — это сервер, на котором сам WebUI запущен; такой нельзя убрать (надо сначала перенести WebUI на другой узел). **Сервер удалён, но peer остался на RU?** — при удалении WebUI сам делает `wg set wg_ru peer ... remove` на всех RU. Если RU был недоступен — попросит подтверждение и удалит запись принудительно (`force`). **Скорость упала?** — каскад не должен влиять на не-RU трафик. Если падает — проверьте `iptables -t mangle -L PREROUTING -v` (помечается ли трафик) и `ip rule show`. **Бот молчит** — `journalctl -u ru-tg-bot -f`. Чаще всего: неверный `TG_BOT_TOKEN` или `TG_CHAT_ID`, или сервер не может выйти к `api.telegram.org`. Подробнее: [docs/troubleshooting.md](docs/troubleshooting.md). --- ## Связанные проекты - 🔧 [keenetic-unified](https://github.com/andrey271192/keenetic-unified) — мониторинг роутеров Keenetic - 🌐 [keenetic_ssh-web](https://github.com/andrey271192/keenetic_ssh-web) — веб-панель shell-команд на роутере - 🛣 [keenetic-dns-routes](https://github.com/andrey271192/keenetic-dns-routes) — DNS-маршрутизация без HydraRoute Neo --- ## Поддержать проект - ⭐ Поставьте звезду на [andrey271192/kaskad](https://github.com/andrey271192/kaskad) - 💖 [Boosty](https://boosty.to/andrey27/donate) - 💳 [Ozon Bank СБП](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798) - ✉️ Telegram: [@Iot_andrey](https://t.me/Iot_andrey) — вопросы, баги, идеи ## Лицензия MIT