VPN Platform WireGuard · VLESS+REALITY DPI Bypass · Multi-server

VPN-платформа: мультисерверная инфраструктура с защитой от DPI-блокировок

Коммерческая VPN с подпиской, гибридными протоколами и selective bypass для Telegram. WireGuard + VLESS+REALITY — два протокола для разных рынков в одной платформе.

2 proto
WireGuard + VLESS+REALITY под разные рынки
table 200
отдельная таблица маршрутизации для bypass
3 phase
многофазные напоминания: 3d / 1d / 0d
live
relay-узлы в нескольких странах, работает
Контекст
Коммерческая VPN-платформа coeur VPN с подпиской, ботом (@coeurvpn_bot), Cryptomus + Robokassa-оплатой. Мультисерверная архитектура: Backend API, RU VPN серверы, Relay NL, World VPN. Стек: FastAPI + aiogram + WireGuard + VLESS.
FastAPI backend aiogram bot Cryptomus
Проблема
WireGuard блокируется DPI по характеристикам трафика на ряде рынков. После настройки маршрутизации — Telegram голос/видео переставал работать: UDP-пакеты уходили в туннель, но серверы Telegram не отвечали через VPN-IP.
DPI blocks WireGuard Telegram calls broken UDP routing conflict
Мультисерверная архитектура
Гибридный стек: два протокола, relay-узлы, selective bypass
Клиент → Bot/API → выбор протокола по региону → туннель → интернет. Telegram UDP идёт напрямую через bypass.
Client
iOS · Android
macOS · Windows
Telegram Bot
HTTPS
Backend API
FastAPI · ARQ
89.169.55.86
PostgreSQL · Redis
config
RU VPN #1/2
WireGuard
стандартные рынки
WireGuard
UDP 51820
Internet
+selective
bypass
Relay NL
VLESS+REALITY
185.93.104.56
VLESS+REALITY
TLS 443
World VPN
DPI-рынки
RU / CN / IR
DPI bypass
WireGuard — стандарт
VLESS+REALITY — DPI-рынки
Backend + Redis + PostgreSQL
Relay NL — промежуточный узел
Fix 1 — Telegram UDP bypass
ipset + fwmark + policy routing table 200
Telegram UDP-трафик выводится напрямую через основной интерфейс, не затрагивая защиту остального трафика
root cause
UDP routing
До — весь UDP в туннель
# /etc/wireguard/wg0.conf [Interface] Address = 10.8.0.1/24 PostUp = iptables -A FORWARD \ -i wg0 -j ACCEPT PostUp = iptables -t nat -A \ POSTROUTING -o eth0 -j MASQUERADE # ❌ весь трафик клиента → wg0 # Telegram UDP серверы не отвечают # через VPN IP → звонки рвутся
После — Telegram идёт напрямую
# Создаём ipset с IP Telegram серверов ipset create telegram_ips hash:net ipset add telegram_ips 149.154.160.0/20 ipset add telegram_ips 91.108.4.0/22 ipset add telegram_ips 91.108.56.0/22 # fwmark для Telegram UDP → таблица 200 iptables -t mangle -A PREROUTING \ -m set --match-set telegram_ips dst \ -p udp -j MARK --set-mark 0x200 # Таблица 200: маршрут в обход туннеля ip rule add fwmark 0x200 table 200 ip route add default via $GW table 200
Полная схема: PostUp в wg0.conf
[Interface] PostUp = bash /etc/wireguard/bypass.sh up PostDown = bash /etc/wireguard/bypass.sh down # /etc/wireguard/bypass.sh GW=$(ip route | grep default | awk '{print $3}') # 1. ipset с CIDR блоками Telegram ipset create tg hash:net 2>/dev/null || true # ... add all Telegram CIDR blocks # 2. mangle: помечаем UDP к Telegram iptables -t mangle -A PREROUTING \ -m set --match-set tg dst -p udp \ -j MARK --set-mark 0x200 # 3. policy routing: fwmark → table 200 ip rule add fwmark 0x200 table 200 prio 100 ip route add default via $GW dev eth0 table 200 # ✓ Telegram UDP → eth0 напрямую # ✓ остальной трафик → wg0 туннель
Fix 2 — DPI bypass
VLESS+REALITY вместо WireGuard для DPI-рынков
WireGuard имеет узнаваемые признаки трафика — REALITY маскирует соединение под легитимный TLS-сайт
protocol
DPI / WG
WireGuard — блокируется DPI
# Характеристики WG-трафика: # UDP фиксированный порт 51820 # - размер пакетов инициации 148 b # - фиксированный header паттерн # - UDP без вариации порта # ❌ легко детектируется и блокируется [Interface] ListenPort = 51820 # известный порт
VLESS+REALITY — неотличим от TLS
# config.json (xray-core) { "protocol": "vless", "streamSettings": { "security": "reality", "realitySettings": { "dest": "google.com:443", "serverNames": ["google.com"], // ✓ трафик = TLS к google.com // ✓ DPI не отличает от легит. }}}
Renewal notifications
Многофазные напоминания с Redis-дедупликацией
3 фазы: за 3 дня / за 1 день / в день истечения — каждое уходит ровно один раз
feature
Redis dedup
renewal_notifier.py — ARQ worker
# Фазы напоминания PHASES = {"3d": 3, "1d": 1, "0d": 0} async def notify_expiring(ctx): redis: Redis = ctx["redis"] for phase, days in PHASES.items(): subs = await get_expiring(days) for sub in subs: # Дедупликация через Redis key key = f"notif:{sub.user_id}:{phase}" if await redis.exists(key): continue # уже отправлено await bot.send_message( sub.user_id, TEXTS[phase][sub.lang] ) # Флаг на 4 дня → нет дублей await redis.setex(key, 86400*4, "1")
Реализованные решения: ✓ Telegram UDP bypass ✓ VLESS+REALITY ✓ policy routing 200 ✓ Redis dedup
Live ✓
Результат
Платформа работает на мультисерверной инфраструктуре с relay-узлами в нескольких странах. Telegram-звонки работают корректно при активном VPN. Уровень продления подписок вырос после внедрения системы уведомлений. VLESS+REALITY обеспечивает работу на рынках с активным DPI.
WireGuard
VLESS+REALITY · xray-core
ipset + fwmark
policy routing · table 200
FastAPI · ARQ
aiogram · Telegram bot
Redis · dedup
Cryptomus

Есть задача? Давайте разберём её

Расскажите что происходит — мы скажем можем ли помочь и как это выглядит по деньгам и срокам. Без обязательств.