Telemt (Rust) — установка и настройка

Репо: https://github.com/telemt/telemt Язык: Rust + Tokio | Версия: 3.4.15 | Лицензия: GPL-3.0

Лучший выбор для Telegram-бота: REST API для управления пользователями, per-user лимиты, TCP Splice маскировка.

Диагностика блокировок

С 3.4.x telemt логирует TLS-фингерпринт (JA4/JA3) клиентов. Как по логам поймать активный детект ТСПУ (expected_64_got_0) — в 10-telemt-logs-dpi.

Продакшн-развёртывание под нагрузкой

Несколько инстансов, systemd, анти-DPI закалка (client_mss="tspu" + UFW rate-limit per-port) и фикс iOS-залипания — в 11-telemt-server-setup.

Быстрая установка (Docker)

1. Генерация секрета

openssl rand -hex 16
# Пример: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

2. Создание конфига telemt.toml

[general]
use_middle_proxy = true
log_level = "normal"
 
[general.modes]
classic = false
secure = false
tls = true
 
[server]
port = 443
 
[server.api]
enabled = true
listen = "127.0.0.1:9091"
whitelist = ["127.0.0.0/8"]
# auth_header = "my-secret-token"  # опционально
 
# [server.metrics]
# metrics_port = 9090  # Prometheus, выключено по умолчанию
 
[[server.listeners]]
ip = "0.0.0.0"
 
[censorship]
tls_domain = "petrovich.ru"    # Домен для маскировки (см. 08-best-practices.md)
mask = true
tls_emulation = true
 
[access.users]
user1 = "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

3. Docker Compose (docker-compose.yml)

services:
  telemt:
    image: whn0thacked/telemt-docker:latest
    container_name: telemt
    restart: unless-stopped
    network_mode: host
    environment:
      RUST_LOG: "info"
    volumes:
      - ./telemt.toml:/etc/telemt.toml:ro
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /tmp:rw,nosuid,nodev,noexec,size=16m
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 256M
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

4. Запуск

docker compose up -d
docker compose logs -f

Установка без Docker (бинарник)

# Скачать бинарник
TELEMT_VERSION=3.4.25
wget -qO- "https://github.com/telemt/telemt/releases/download/${TELEMT_VERSION}/telemt-x86_64-linux-gnu.tar.gz" | tar xz
sudo mv telemt /bin/telemt
sudo chmod +x /bin/telemt
 
# Создать пользователя
sudo useradd -d /opt/telemt -m -r -U telemt
 
# Systemd сервис
sudo tee /etc/systemd/system/telemt.service << 'EOF'
[Unit]
Description=Telemt MTProxy
After=network.target
 
[Service]
Type=simple
User=telemt
ExecStart=/bin/telemt /etc/telemt/telemt.toml
LimitNOFILE=65536
Restart=on-failure
AmbientCapabilities=CAP_NET_BIND_SERVICE
 
[Install]
WantedBy=multi-user.target
EOF
 
sudo systemctl daemon-reload
sudo systemctl enable --now telemt

REST API

Порт 9091, JSON, префикс /v1.

Управление пользователями

# Создать пользователя (секрет генерируется автоматически)
curl -X POST http://127.0.0.1:9091/v1/users \
  -H "Content-Type: application/json" \
  -d '{"username":"user_123456"}'
 
# Создать с expiration и лимитами
curl -X POST http://127.0.0.1:9091/v1/users \
  -H "Content-Type: application/json" \
  -d '{
    "username": "user_123456",
    "expiration_rfc3339": "2026-04-14T00:00:00Z",
    "max_tcp_conns": 10,
    "max_unique_ips": 3,
    "data_quota_bytes": 10737418240
  }'
 
# Список пользователей (включает готовые tg://proxy ссылки!)
curl http://127.0.0.1:9091/v1/users | jq
 
# Информация о конкретном пользователе
curl http://127.0.0.1:9091/v1/users/user_123456
 
# Изменить лимиты
curl -X PATCH http://127.0.0.1:9091/v1/users/user_123456 \
  -H "Content-Type: application/json" \
  -d '{"expiration_rfc3339": "2026-05-01T00:00:00Z"}'
 
# Удалить пользователя
curl -X DELETE http://127.0.0.1:9091/v1/users/user_123456

Поля при создании/обновлении

ПолеТипОбязательноеОписание
usernamestringДа[A-Za-z0-9_.-], 1-64 символа
secretstringНет32 hex. Автогенерация если не указан
expiration_rfc3339stringНетСрок действия (ISO 8601)
data_quota_bytesu64НетКвота трафика в байтах
max_tcp_connsusizeНетМакс. одновременных TCP
max_unique_ipsusizeНетМакс. уникальных IP
user_ad_tagstringНет32 hex, рекламный тег

Ответ содержит готовые ссылки

{
  "links": {
    "tls": ["tg://proxy?server=1.2.3.4&port=443&secret=ee..."],
    "secure": ["tg://proxy?server=1.2.3.4&port=443&secret=dd..."],
    "classic": ["tg://proxy?server=1.2.3.4&port=443&secret=..."]
  }
}

Другие эндпоинты

МетодПутьОписание
GET/v1/healthЗдоровье сервиса
GET/v1/system/infoИнформация о системе
GET/v1/stats/summaryСтатистика
GET/v1/stats/usersСтатистика по пользователям

Аутентификация

  1. IP whitelistwhitelist в [server.api], CIDR формат. По умолчанию 127.0.0.1/32
  2. Auth headerauth_header в [server.api], exact string match

Ограничения

  • DELETE последнего пользователя → 409 last_user_forbidden
  • POST /v1/users/{name}/rotate-secret404 (баг, не реализован в текущей версии)
  • Утечка памяти в draining writers (issue #390, не исправлено в 3.3.17) — мониторьте RSS, рестартуйте при необходимости

TCP Splice — маскировка

Когда к серверу подключается НЕ клиент Telegram (DPI-зонд, браузер):

  1. Telemt определяет что это не MTProxy handshake
  2. Устанавливает TCP-соединение с реальным сервером tls_domain
  3. Прозрачно сплайсит TCP-потоки
  4. Клиент получает настоящий сертификат и контент реального сайта

Нет MITM, нет поддельных сертификатов. DPI не может отличить от реального HTTPS.