mirror of
https://github.com/andrey271192/kaskad.git
synced 2026-09-21 13:51:57 +00:00
202 lines
11 KiB
Markdown
202 lines
11 KiB
Markdown
# Kaskad
|
||
|
||
Живёшь за границей, а Госуслуги, банк и ВК снова открываются «как дома» — через твой сервер в РФ. Netflix и рабочие звонки идут напрямую, без тормозов. RU-узел упал — за минуту подхватит запасной. Управление — в браузере (`:8088`) или в Telegram.
|
||
|
||
  
|
||
|
||
---
|
||
|
||
## Зачем это нужно
|
||
|
||
Живёте за границей и сталкивались с тем, что:
|
||
|
||
- 🏦 Тинькофф не пускает с заграничного 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` — откроется страница входа. После входа сессия хранится в cookie; кнопка **Выход** надёжно завершает сессию.
|
||
|
||
| Что | Как |
|
||
|---|---|
|
||
| Переключиться на запасной RU | кнопка `backup` в верхней таблице |
|
||
| Добавить ещё один RU-сервер | секция «RU-серверы» → «+ добавить RU-сервер», ввести IP/домен и пароль root |
|
||
| Добавить ещё одну зарубежную ноду | секция «Ам. серверы» → «+ добавить ам. сервер» |
|
||
| **Удалить зарубежный сервер** | красная кнопка `удалить` в строке — peer уберётся со всех RU и из конфига |
|
||
| Добавить русский сайт | секция «Домены» → ввести `vk.com ozon.ru` |
|
||
| Принудительный refresh DNS для доменов | кнопка `🔄 Refresh DNS` |
|
||
|
||
Все действия идут с подтверждением, ошибки видны сразу.
|
||
|
||
---
|
||
|
||
## Telegram-бот
|
||
|
||
| Категория | Команды |
|
||
|---|---|
|
||
| Туннели | `/status`, `/use <id>`, `/primary`, `/backup` |
|
||
| RU-серверы | `/server-list`, `/server-add`, `/server-remove`, `/bot-key` |
|
||
| Ам. серверы | `/ams-list`, `/ams-add`, `/ams-remove` |
|
||
| Маршруты | `/ips`, `/list`, `/add <IP>`, `/remove <IP>`, `/clear` |
|
||
| Домены | `/list-domains`, `/add-domain <d>`, `/remove-domain <d>`, `/show-domain <d>`, `/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: вход по логину/паролю на странице `/login`, сессия в cookie; за 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
|