Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sub-proxy

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: запоминает историю пингов, отслеживает последовательные ошибки

🚀 Быстрый старт

Через Docker (рекомендуется)

# 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

Локально (bare-metal)

# 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

📡 API Endpoints

GET /sub/<uuid>

Основной эндпоинт подписки. Возвращает base64-encoded список share-ссылок (vless://, tuic://, naive+https://).

  • Кэшируется: да (CACHE_TTL_MAIN)
  • Rate limit: да
curl -k https://localhost:40731/sub/your-uuid-here

GET /singbox/<uuid>

Возвращает готовый sing-box конфиг в JSON.

  • Параметры: ?port=7890 — порт для mixed-inbound (по умолчанию 7890)
  • Кэшируется: да (CACHE_TTL_SINGBOX)
curl -k https://localhost:40731/singbox/your-uuid-here?port=1080

GET /health

Статус всех источников, whitelist метаданные, метрики.

curl -k https://localhost:40731/health

GET /whitelist/debug

Детальная информация по whitelist конфигам: оператор, bypass-score, история пингов, ошибки.

curl -k https://localhost:40731/whitelist/debug

📋 Примеры конфигурации

Пример SUB_URLS (3x-ui панели)

SUB_URLS=https://panel1.example.com:2090/sub/,https://panel2.example.com:2090/sub/

Пример EXTRA_TUNNELS

{
  "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"
  ]
}

Пример EXTERNAL_SOURCES

[
  {
    "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 работает в фоне:

  1. Каждые WHITE_REFRESH секунд скачивает сырые конфиги из репозиториев
  2. Парсит VLESS ссылки
  3. Пингует все конфиги (с пропуском тех, у кого >=5 последовательных ошибок)
  4. Сортирует по bypass_score (комбинация security, transport, fingerprint, SNI и т.д.)
  5. Выбирает топ N конфигов с приоритетом высокого bypass_score и российских операторов

🧠 Bypass Score (Bypassability Rating)

Система оценки конфигов для определения лучших для обхода белых списков:

Параметр Бонус Условие
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

# Сборка
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

🔧 Советы по настройке

  1. Начните с whitelist: даже без своих SUB_URLS и EXTERNAL_SOURCES, приложение будет собирать конфиги из публичных GitHub-репозиториев
  2. Настройте SUB_URLS: укажите URL вашей 3x-ui панели, чтобы получать свои конфиги
  3. Добавьте внешние подписки: если у вас есть подписки от других провайдеров, добавьте их в EXTERNAL_SOURCES
  4. Мониторьте /health: проверяйте, какие источники живы
  5. Настройте CERT_DOMAINS: укажите ваш реальный домен, если сертификат должен быть валидным

📄 Лицензия

MIT


Made with ❤️ for unrestricted internet access.

About

Пробирается через щели в белых списках. Собирает крошки с разных подписок и склеивает в один рабочий туннель. Multi-source VPN config aggregator that bypasses whitelists.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages