Техническая документация проекта. v2.0.0 RC
Семейнограм — приватный мессенджер на базе MTProto 2.0 с anti-censorship транспортом gproxy-native. Трафик неотличим от обычного HTTPS видеостриминга для систем DPI.
Клиент устанавливает стандартное TLS 1.3 соединение к серверу на порту 8443. Сервер предоставляет валидный SSL-сертификат (Let's Encrypt). Для DPI — это обычный HTTPS.
Клиент отправляет 4 HTTP-запроса, в которых стеганографически спрятаны HMAC-токены:
| Шаг | Метод | Путь | Где спрятан токен |
|---|---|---|---|
| 0 | GET | / | Cookie: _ga=<token> |
| 1 | GET | /assets/style.css | If-None-Match: "<token>" |
| 2 | GET | /assets/app.js | Cookie: _gid=<token> |
| 3 | POST | /api/analytics | JSON body: {"sid":"<token>"} |
Токены генерируются из PSK пользователя через HMAC-SHA256 с time-based seed (окно 120 секунд ± допуск). Для DPI — обычные аналитические запросы браузера.
После активации клиент открывает HTTP POST stream (/video/stream/session.mp4) — выглядит как видеостриминг. Через этот stream идёт 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]
Все данные передаются в зашифрованных фреймах:
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)
Размеры фреймов подбираются по гистограмме 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 B | I-frame фрагменты |
gproxy-gateway.service# Путь: /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
127.0.0.1:19150 (локальный relay)GproxyNativeClient.java — протокол (TLS, activation, KE, frames)
GproxyTransport.java — lifecycle (retry, reconnect, service)
GproxyService.java — foreground service (Android notification)
| Компонент | Порт | Назначение |
|---|---|---|
| gproxy-gateway | 8443 | Anti-censorship gateway (gproxy-native) |
| teamgram | 10443 | MTProto server (Docker) |
| teamgram | 11443 | WebSocket MTProto (nginx proxy) |
| MySQL 8.0 | 3306 | Основная БД |
| Redis 7 | 6379 | Кэш/сессии |
| etcd 3.5 | 2379 | Service discovery |
| Kafka 3.9 | 9092 | Очередь сообщений |
| MinIO | 19000 | Объектное хранилище |
| gproxy VPN | 4443 | VPN (отдельно от мессенджера) |
| Аспект | Реализация |
|---|---|
| Аутентификация | PSK + HMAC-SHA256 токены (4-step activation) |
| Key exchange | X25519 (ephemeral, perfect forward secrecy) |
| Шифрование | AES-256-GCM (AEAD, authenticated encryption) |
| Anti-replay | 64-bit sequence counter в каждом фрейме |
| Anti-DPI | TLS 1.3, VP8 camouflage, HTTP analytics pattern |
| Server identity | HMAC proof в key exchange response |
| Версия | Статус | Описание |
|---|---|---|
| v2.0.0-exp | RC | gproxy-native protocol (Java клиент + Go сервер) |
| v1.9.0 | Stable | SOCKS5 relay через libgproxy |
| v1.5.0 | Прямое MTProto подключение (без gproxy) | |
| v1.0.0 | Первый запуск |
greevex/tg-server — серверная часть (teamgram + gproxy-gateway)greevex/tg-android — Android клиентgreevex/tg-desktop — Desktop клиентgproxy-native-protocol/api/stats, /api/users, /api/sessions, /api/health и др.