Multi-source VPN config aggregator — собирает конфигурации VLESS/TUIC/Naive из нескольких источников, проверяет их работоспособность (ping), сортирует по способности обходить белые списки РФ, и отдаёт готовую подписку в формате base64 или sing-box JSON.
- Агрегация из N источников: 3x-ui панели, внешние подписки, whitelist-repos (GitHub), собственные туннели
- Умная дедупликация: один конфиг не попадёт в подписку дважды, даже если его отдают разные источники
- TCP/TLS Ping: проверка живучести каждого конфига перед добавлением
- Bypass Score (Bypassability Rating): оценка конфига по параметрам (security, transport, flow, fingerprint, SNI) для сортировки лучших для обхода блокировок
- Operator Classification: авто-определение оператора (Yandex, VK, Beeline, MTS и др.) по SNI/IP
- White-List Bypass: сбор конфигов из публичных репозиториев, нацеленных на обход белых списков РФ
- Sing-box Output: конвертация всех конфигов в нативный sing-box JSON
- Health Checks: мониторинг источников с exponential backoff
- Rate Limiting: защита от злоупотреблений
- Auto-refresh: фоновое обновление whitelist и внешних подписок
- HTTPS: авто-генерация self-signed сертификата
- Graceful Shutdown: корректное сохранение состояния
- State Persistence: запоминает историю пингов, отслеживает последовательные ошибки
# 1. Клонируйте репозиторий
git clone https://github.com/Vit9borzenko/SubRat.git
cd SubRat
# 2. Настройте переменные окружения
# Скопируйте .env.example в docker-compose.yml и заполните свои SUB_URLS / EXTERNAL_SOURCES
# 3. Запустите
docker compose up -d
# 4. Проверьте здоровье
curl -k https://localhost:40731/health# 1. Установите Python 3.11+ и pip
sudo apt update && sudo apt install -y python3 python3-pip python3-venv curl
# 2. Клонируйте и перейдите в директорию
git clone https://github.com/Vit9borzenko/SubRat.git
cd SubRat
# 3. Создайте виртуальное окружение и установите зависимости
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
pip install -r requirements.txt
# 4. Настройте переменные окружения
export SUB_URLS="https://your-panel.example.com:2090/sub/"
export EXTERNAL_SOURCES='[{"name":"mysub","url":"https://example.com/sub/link","suffix":"MYSUB","verify":true,"ping_timeout":4.0}]'
# ... остальные переменные (см. .env.example)
# 5. Запустите
python app.py| Переменная | По умолчанию | Описание |
|---|---|---|
| Server | ||
APP_PORT |
40731 |
Порт сервера |
APP_HOST |
0.0.0.0 |
Хост |
RATE_MAX |
30 |
Макс. запросов в окно |
RATE_WINDOW |
60 |
Окно rate limiting (сек) |
| SSL | ||
CERT_DIR |
/data |
Директория для сертификатов |
CERT_CN |
sub-proxy.local |
Common Name |
CERT_ORG |
sub-proxy |
Организация |
CERT_COUNTRY |
RU |
Страна |
CERT_DOMAINS |
— | DNS-имена для SAN (через запятую) |
| Caching | ||
CACHE_TYPE |
SimpleCache |
Тип кэша (SimpleCache, RedisCache...) |
CACHE_TTL_MAIN |
90 |
TTL для /sub/ (сек) |
CACHE_TTL_SINGBOX |
90 |
TTL для /singbox/ (сек) |
| Refresh | ||
WHITE_REFRESH |
1800 |
Интервал обновления whitelist и внешних подписок (сек) |
HEALTH_INTERVAL |
60 |
Интервал health check (сек) |
| Ping | ||
PING_TIMEOUT |
4.0 |
Таймаут пинга (сек) |
PING_WORKERS |
20 |
Количество воркеров пула |
| Sources | ||
SUB_URLS |
— | Базовые URL 3x-ui панелей (через запятую) |
EXTRA_TUNNELS |
{} |
JSON-объект UUID → массив share-ссылок |
EXTERNAL_SOURCES |
[] |
JSON-массив внешних источников подписок |
WHITE_SOURCES_JSON |
— | JSON-массив whitelist источников (опционально, по умолчанию публичные GitHub) |
WHITE_LIST_LIMIT |
10 |
Лимит whitelist конфигов в выдаче |
| Files | ||
STATE_FILE |
/data/state.json |
Файл состояния |
LOG_FILE |
/data/sub-proxy.log |
Файл лога |
PINNED_CERTS_FILE |
/data/pinned_certs.json |
Файл привязанных сертификатов |
LOG_MAX_BYTES |
5242880 |
Макс. размер лога до ротации |
LOG_BACKUP_COUNT |
3 |
Количество бэкапов лога |
CLASH_SECRET |
— | Secret для Clash API |
Основной эндпоинт подписки. Возвращает base64-encoded список share-ссылок (vless://, tuic://, naive+https://).
- Кэшируется: да (CACHE_TTL_MAIN)
- Rate limit: да
curl -k https://localhost:40731/sub/your-uuid-hereВозвращает готовый sing-box конфиг в JSON.
- Параметры:
?port=7890— порт для mixed-inbound (по умолчанию 7890) - Кэшируется: да (CACHE_TTL_SINGBOX)
curl -k https://localhost:40731/singbox/your-uuid-here?port=1080Статус всех источников, whitelist метаданные, метрики.
curl -k https://localhost:40731/healthДетальная информация по whitelist конфигам: оператор, bypass-score, история пингов, ошибки.
curl -k https://localhost:40731/whitelist/debugSUB_URLS=https://panel1.example.com:2090/sub/,https://panel2.example.com:2090/sub/
{
"uuid-1234": [
"naive+https://user:pass@server.com:443#Мой Naive",
"tuic://uuid:password@server.com:2053?sni=server.com&alpn=h3&congestion_control=bbr#Мой TUIC"
]
}[
{
"name": "mysub",
"url": "https://example.com/sub/link",
"suffix": "MYSUB",
"verify": true,
"ping_timeout": 4.0,
"keep_all_on_ping_fail": false
}
]Пользовательский UUID
│
▼
┌──────────┐
│ /sub/<id>│
│/singbox/ │
└────┬─────┘
│
▼
aggregate_links(uuid)
│
├── 3x-ui SUB_URLS ──────────────► fetch_sub()
├── EXTRA_TUNNELS ───────────────► предопределённые ссылки
├── ExternalSubManager ─────────► fetch → decode → ping
└── WhiteListManager ───────────► fetch → ping → score → select
│
▼
dedup (extract_link_uuid)
│
▼
┌───────────────────┐
│ /sub/ → base64 │
│ /singbox/ → JSON │
└───────────────────┘
WhiteListManager работает в фоне:
- Каждые
WHITE_REFRESHсекунд скачивает сырые конфиги из репозиториев - Парсит VLESS ссылки
- Пингует все конфиги (с пропуском тех, у кого >=5 последовательных ошибок)
- Сортирует по
bypass_score(комбинация security, transport, fingerprint, SNI и т.д.) - Выбирает топ N конфигов с приоритетом высокого bypass_score и российских операторов
Система оценки конфигов для определения лучших для обхода белых списков:
| Параметр | Бонус | Условие |
|---|---|---|
| security=reality | +0.35 | REALITY протокол |
| security=tls/xtls | +0.15 | Обычный TLS |
| security=none | -0.10 | Нет шифрования |
| type=grpc | +0.25 | gRPC транспорт |
| type=tcp/http | +0.10 | TCP/HTTP |
| type=ws | +0.08 | WebSocket |
| flow содержит "vision" | +0.15 | VLESS Vision |
| fingerprint=chrome/firefox/... | +0.15 | Реальный fingerprint |
| Российский SNI (yandex, vk и т.д.) | +0.10 | Обход DPI |
| Есть public key (pbk) | +0.08 | REALITY |
| Port 443 | +0.05 | Стандартный порт |
Tier: GODLIKE (≥0.70) → GREAT (≥0.50) → GOOD (≥0.30) → OK (≥0.15) → MEH (<0.15)
- Нет хардкода: все credentials, URL, UUID — через переменные окружения
- Self-signed cert: генерируется автоматически при первом запуске
- Rate limiting: защита от DDoS
- Graceful shutdown: корректное завершение с сохранением состояния
- Non-root user: в Docker-образе приложение запускается от subproxy (uid 1000)
- TOFU pinning: Trust On First Use для сертификатов
# Сборка
docker build -t sub-proxy .
# Запуск с конфигом
docker run -d \
--name sub-proxy \
--network host \
-v $(pwd)/data:/data \
-e SUB_URLS="https://your-panel:2090/sub/" \
-e EXTERNAL_SOURCES='[{"name":"my","url":"...","suffix":"MY","verify":true}]' \
sub-proxy
# Или через compose (команда без дефиса, файл остается docker-compose.yml)
docker compose up -d- Начните с whitelist: даже без своих SUB_URLS и EXTERNAL_SOURCES, приложение будет собирать конфиги из публичных GitHub-репозиториев
- Настройте SUB_URLS: укажите URL вашей 3x-ui панели, чтобы получать свои конфиги
- Добавьте внешние подписки: если у вас есть подписки от других провайдеров, добавьте их в EXTERNAL_SOURCES
- Мониторьте /health: проверяйте, какие источники живы
- Настройте CERT_DOMAINS: укажите ваш реальный домен, если сертификат должен быть валидным
MIT
Made with ❤️ for unrestricted internet access.