Slyber TURN Server - высокопроизводительный WebRTC TURN/STUN сервер в одном бинарнике

Slyber TURN Server - высокопроизводительный WebRTC TURN/STUN сервер в одном бинарнике

Slyber TURN Server - автономный сервер ретрансляции медиатрафика (STUN/TURN) для WebRTC приложений, построенный на базе pion/turn/v4. Поставляется в виде единого статически скомпилированного бинарного файла для linux/amd64 и linux/arm64 без внешних системных зависимостей.

  • Автоматичесая конфигурация: Автоматическое определение внешнего IPv4 через STUN при старте.
  • Встроенный HTTP API: Готовый эндпоинт /api/turn-credentials с CORS и Rate Limiting, плюс локальная генерация HMAC-SHA1 токенов за 0 мс.
  • Масштабирование по ядрам: Масштабирование UDP слушателей по ядрам CPU через SO_REUSEPORT и автотюнинг буферов сокетов до 8 МБ.
  • Безопасность из коробки: Встроенный SSRF фильтр (блокировка Cloud Metadata 169.254.169.254, loopback и приватных подсетей) с поддержкой TURN Hairpinning.
  • Встроенная диагностика и нагрузочное тестирование: Инструменты slyber_turn doctor и slyber_turn bench встроены прямо в бинарный файл для проверки сетевой связности, задержек (RTT), потерь пакетов и джиттера по RFC 3550.

Установка в одну команду

Установочный скрипт автоматически определяет архитектуру процессора (amd64 / arm64), сверяет контрольную сумму SHA256SUMS, настраивает сетевые буферы ядра Linux (sysctl), открывает порты в ufw или firewalld, генерирует конфигурацию в /opt/slyber_turn/.env, регистрирует systemd-сервис и запускает самодиагностику.

1. Стандартная установка с автоматической настройкой сервера

Bash
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/install.sh | sudo bash

2. Кастомная установка с пользовательскими параметрами

Вы можете передать нужный REALM, собственный TURN_SECRET, порты или лимит полосы пропускания на сессию прямо в команду установки:

Bash
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/install.sh | \
  sudo REALM="turn.example.com" \
       PUBLIC_IP="auto" \
       HTTP_PORT=":8080" \
       MAX_KBPS_PER_SESSION="2000" \
       bash

По завершении скрипт выведет статус сервиса, сгенерированный TURN_SECRET и результат проверки slyber_turn doctor

Code
[INFO] Detected platform: linux/amd64
[INFO] Downloading slyber_turn-linux-amd64...
[INFO] Verifying SHA256 checksum...
[OK] Checksum verified
[OK] Installed binary to /opt/slyber_turn/slyber_turn (symlinked to /usr/local/bin/slyber_turn)
[OK] Created initial configuration in /opt/slyber_turn/.env
[INFO] Applying UFW firewall rules...
[INFO] Running self-diagnostics...
--------------------------------------------------
[OK] Configuration valid (realm: turn.example.com, relay port pool: 49152-65535, capacity: 16384 sessions)
[OK] HTTP API protection active (origins: 1, require_secret: false)
[OK] STUN check passed in 12ms: PUBLIC_IP (203.0.113.50) matches external IP
[INFO] UDP port 3478 is already in use - switching to running server verification (Live Probe)...
[OK] HTTP API (:8080/healthz) responded normally (200 OK)
[OK] TURN Allocate succeeded in 390µs (allocated relay address: 203.0.113.50:50124)
--------------------------------------------------
[OK] Slyber Turn Server is installed and running.
  Service     : systemctl status slyber_turn
  Config file : /opt/slyber_turn/.env
  TURN Secret : 8f9d2a7b4c1e6f3a9b0c8d7e6f5a4b3c
  Diagnostics : sudo slyber_turn doctor
  Benchmark   : sudo slyber_turn bench -clients 20 -duration 5s

Управление сервисом и удаление

После установки управление сервером осуществляется стандартными командами systemd и CLI утилитой

Bash
# Проверка статуса и логов
sudo systemctl status slyber_turn
sudo journalctl -u slyber_turn -f

# Запуск диагностики или нагрузочного теста
sudo slyber_turn doctor
sudo slyber_turn bench -clients 20 -duration 5s

Удаление с сохранением конфигурации и телеметрии

По умолчанию скрипт деинсталляции останавливает сервис, удаляет systemd юнит и бинарные файлы, но сохраняет директорию /opt/slyber_turn (файл .env, историю статистики stats.json и журнал событий events.jsonl):

Bash
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/uninstall.sh | sudo bash

Полное удаление (включая конфигурацию и данные)

Если необходимо полностью очистить сервер вместе с директорией /opt/slyber_turn, передайте переменную PURGE_DATA=true

Bash
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/uninstall.sh | sudo PURGE_DATA=true bash

Ключевые технические характеристики

КомпонентРеализация в Slyber TURN Server
Сетевой стек (Linux)Множественные UDP сокеты с SO_REUSEPORT (TURN_THREADS=NumCPU), автонастройка net.core.rmem_max / wmem_max до 8 МБ для исключения потерь пакетов на пиках.
Выдача WebRTC кредовВстроенный HTTP API (/api/turn-credentials) с проверкой Origin (включая поддомены), IP/CIDR allowlist, Rate Limiter и строгим режимом REQUIRE_SECRET=true.
Работа с TLSгенерация Self-Signed ECDSA P-256 в памяти.
Защита от SSRFБлокировка обращений к Cloud Metadata (169.254.0.0/16, fd00:ec2::254/128), loopback и приватным сетям с поддержкой TURN Hairpinning и фильтрацией браузерного LAN шума.
Трекинг сессий и мобильных сетейГруппировка сессий по user_id с автоматическим скрытием старых сокетов через 5 секунд при переключении клиента между Wi-Fi и 4G/LTE.
Шейпинг трафикаНеблокирующий Token Bucket лимитер на атомиках (MAX_KBPS_PER_SESSION) для ограничения полосы пропускания отдельной сессии.
Мониторинг и телеметрияЭндпоинт /metrics в формате Prometheus, /api/node-stats (24-часовая история, пул портов, Top Offenders) и персистентный журнал /events (events.jsonl).

Подключение к WebRTC приложению

1. Получение учетных данных (кредов) из браузера

JavaScript
const res = await fetch("http://YOUR_SERVER_IP:8080/api/turn-credentials?user_id=user_42");
const turn = await res.json();

const pc = new RTCPeerConnection({
  iceServers: [{
    urls: turn.uris,
    username: turn.username,
    credential: turn.password
  }]
});