Семейнограм docs

Техническая документация проекта. v2.0.0 RC

Обзор

Семейнограм — приватный мессенджер на базе MTProto 2.0 с anti-censorship транспортом gproxy-native. Трафик неотличим от обычного HTTPS видеостриминга для систем DPI.

Архитектура

Клиент (Android) Сервер (89.208.79.119) MTProto client gproxy-gateway (:8443) │ │ └── TCP 127.0.0.1:19150 ──┐ │ │ │ GproxyNativeClient (Java) │ │ │ │ │ ├── TLS 1.3 ──────────────┼──────────────┤ ├── Activation (4 steps) │ │ ├── X25519 key exchange │ │ └── AES-256-GCM frames ──┼──────────────┤ │ │ │ MTProto relay ──── teamgram (:10443) │ │ │ │ │ MySQL, Redis, Kafka │ │ etcd, MinIO

gproxy-native протокол

1. TLS 1.3 подключение

Клиент устанавливает стандартное TLS 1.3 соединение к серверу на порту 8443. Сервер предоставляет валидный SSL-сертификат (Let's Encrypt). Для DPI — это обычный HTTPS.

2. Steganographic Activation (4 шага)

Клиент отправляет 4 HTTP-запроса, в которых стеганографически спрятаны HMAC-токены:

ШагМетодПутьГде спрятан токен
0GET/Cookie: _ga=<token>
1GET/assets/style.cssIf-None-Match: "<token>"
2GET/assets/app.jsCookie: _gid=<token>
3POST/api/analyticsJSON body: {"sid":"<token>"}

Токены генерируются из PSK пользователя через HMAC-SHA256 с time-based seed (окно 120 секунд ± допуск). Для DPI — обычные аналитические запросы браузера.

3. Tunnel Stream

После активации клиент открывает HTTP POST stream (/video/stream/session.mp4) — выглядит как видеостриминг. Через этот stream идёт key exchange и затем зашифрованные данные.

4. X25519 Key Exchange

Клиент → Сервер:  [32B X25519 pubkey] [24B nonce]         = 56 байт
Сервер → Клиент:  [32B X25519 pubkey] [24B nonce] [32B proof] = 88 байт

Shared secret = X25519(client_private, server_public)
Master key    = HKDF-SHA256(shared_secret, client_nonce||server_nonce, "gproxy-session-v1")
Client key    = HKDF-SHA256(master, "", "client-write-key")
Server key    = HKDF-SHA256(master, "", "server-write-key")
Nonce prefix  = HKDF-SHA256(master, "", "nonce-prefixes")[0:8]

5. Encrypted Frames

Все данные передаются в зашифрованных фреймах:

Wire Frame = [Header (12B cleartext)] [Ciphertext (N bytes)] [Auth Tag (16B)]

Header (12 bytes, AAD):
  [2B] payload_length (BE)
  [1B] frame_type: 0x01=DATA, 0x02=KEEPALIVE
  [1B] flags
  [8B] sequence_number (BE, anti-replay)

Encryption: AES-256-GCM
  Nonce = [4B prefix] + [8B sequence BE] = 12 bytes
  AAD = frame header (12 bytes)
  Payload = MTProto message + padding (VP8-like size distribution)

6. VP8 Камуфляж

Размеры фреймов подбираются по гистограмме VP8 видеокодека (WebRTC профиль):

РазмерОписание
~150 BМалые P-frames
~350 BСредние P-frames
~600 BСтандартные P-frames
~900 BБольшие P-frames
~1200 BТипичный размер (≈MTU)
~1400 BКрупные P-frames
~3000 BI-frame фрагменты

Компоненты

Сервер: gproxy-gateway (Go)

# Путь: /data/teamgram/gproxy-gateway/
internal/
  crypto/     — X25519, HKDF, AES-256-GCM, HMAC-SHA256
  activation/ — 4-step steganographic handshake
  frame/      — wire frame encode/decode, VP8 padding
  server/     — TLS server, activation handler, tunnel, relay

Android клиент (Java)

GproxyNativeClient.java  — протокол (TLS, activation, KE, frames)
GproxyTransport.java     — lifecycle (retry, reconnect, service)
GproxyService.java       — foreground service (Android notification)

Серверная инфраструктура

КомпонентПортНазначение
gproxy-gateway8443Anti-censorship gateway (gproxy-native)
teamgram10443MTProto server (Docker)
teamgram11443WebSocket MTProto (nginx proxy)
MySQL 8.03306Основная БД
Redis 76379Кэш/сессии
etcd 3.52379Service discovery
Kafka 3.99092Очередь сообщений
MinIO19000Объектное хранилище
gproxy VPN4443VPN (отдельно от мессенджера)

Безопасность

АспектРеализация
АутентификацияPSK + HMAC-SHA256 токены (4-step activation)
Key exchangeX25519 (ephemeral, perfect forward secrecy)
ШифрованиеAES-256-GCM (AEAD, authenticated encryption)
Anti-replay64-bit sequence counter в каждом фрейме
Anti-DPITLS 1.3, VP8 camouflage, HTTP analytics pattern
Server identityHMAC proof в key exchange response

Версии

ВерсияСтатусОписание
v2.0.0-expRCgproxy-native protocol (Java клиент + Go сервер)
v1.9.0StableSOCKS5 relay через libgproxy
v1.5.0Прямое MTProto подключение (без gproxy)
v1.0.0Первый запуск

Репозитории

API / Админка