Files
kaskad/README.md
2026-05-30 18:26:32 +03:00

202 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kaskad
Живёшь за границей, а Госуслуги, банк и ВК снова открываются «как дома» — через твой сервер в РФ. Netflix и рабочие звонки идут напрямую, без тормозов. RU-узел упал — за минуту подхватит запасной. Управление — в браузере (`:8088`) или в 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` — откроется страница входа. После входа сессия хранится в 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: [@PCAdministration](https://t.me/PCAdministration) — вопросы, баги, идеи
## Лицензия
MIT