Пошаговая настройка TURN (coTURN) для Nextcloud Talk

Чтобы видеозвонки и экраншеринг стабильно работали за NAT/файрволами, Nextcloud Talk нуждается в TURN-сервере. Ниже — чистая, воспроизводимая установка coTURN, интеграция в Nextcloud, TLS, тестирование и харденинг nextcloud-talk.readthedocs.io Nextcloud community.


Предпосылки и общая схема

  • Что делает TURN: проксирует трафик WebRTC, когда P2P соединение через STUN невозможно (жёсткие NAT/CGNAT, корпоративные сети). Nextcloud Talk имеет встроенный STUN, но для реального интернета почти всегда нужен TURN Nextcloud community.
  • Рекомендуемая версия: используйте coTURN не ниже 4.5.0.8 из-за бага с IPv6 сокетами в старых версиях nextcloud-talk.readthedocs.io.

Если у вас крупная нагрузка или нужен MCU/многопользовательские конференции, изучите High‑Performance Backend (HPB/сигнализационный сервер) отдельно от TURN — это разные компоненты hackerspace.ru.


Установка coTURN

  1. Пакеты: sudo apt update sudo apt install coturn На Debian/Ubuntu есть официальные пакеты coturn. Для других систем смотрите pkgs.org или исходники проекта nextcloud-talk.readthedocs.io.
  2. Включение сервиса:
    • Откройте файл defaults и включите службу: sudo sed -i 's/^#\?TURNSERVER_ENABLED=.*/TURNSERVER_ENABLED=1/' /etc/default/coturn
    • Запускаем и добавляем в автозагрузку: sudo systemctl enable --now coturn
    Это стандартный путь для запуска coturn как systemd‑сервиса на Ubuntu/Debian YouTube.

Базовая конфигурация turnserver.conf

Создайте/отредактируйте /etc/turnserver.conf. Ниже минимальный, безопасный старт:

# Сетевые параметры
listening-port=3478
tls-listening-port=5349

# Укажите публичные IP/FQDN
listening-ip=YOUR_PUBLIC_IPV4
# listening-ip=YOUR_PUBLIC_IPV6     # при наличии
relay-ip=YOUR_PUBLIC_IPV4

# Домен для аутентификации и TLS SNI
realm=turn.example.com

# Аутентификация (статический ключ)
# Вариант 1: long-term credentials per user:
user=nextcloud:STRONG_SECRET_PASSWORD

# Вариант 2: shared secret для REST-авторизации (предпочтительно):
# Имя секрета совпадает с Nextcloud Talk "Shared secret"
# static-auth-secret=VERY_LONG_RANDOM_BASE64_OR_HEX

# Безопасность
fingerprint
no-sslv2
no-sslv3
no-tlsv1
no-tlsv1_1
log-file=/var/log/turn.log
simple-log

# Ограничения
total-quota=100
bps-capacity=0          # без искусственного лимита, задайте при необходимости
stale-nonce=600

# Прочее
# external-ip=PUBLIC_IP/LOCAL_IP     # если у сервера NAT; формат coTURN для NAT
  • Выберите один подход к аутентификации:
    • user=login:password — простой, подходит для старта.
    • static-auth-secret — REST‑авторизация временных учетных данных (TURN REST API), рекомендуется для продакшна; Nextcloud генерирует временные токены из shared secret nextcloud-talk.readthedocs.io.
  • Укажите realm как ваш FQDN и используйте одинаковые значения в Nextcloud Talk настройках YouTube nextcloud-talk.readthedocs.io.

Перезапустите сервис:

sudo systemctl restart coturn

В руководствах сообщества для Nextcloud Talk используются те же ключевые опции: listening-port, tls-listening-port, listening-ip/relay-ip, realm, quota и включение сервиса через /etc/default/coturn YouTube Nextcloud community.


TLS для TURN (рекомендуется)

  1. Сертификаты: Разместите валидный сертификат и ключ (например, от Let’s Encrypt): cert=/etc/letsencrypt/live/turn.example.com/fullchain.pem pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem
  2. Порт: используйте 5349/TCP для TURN over TLS (обязательно открыть в фаерволе) YouTube.
  3. Перезапуск: sudo systemctl restart coturn

TLS повышает успешность соединений за корпоративными фаерволами, где UDP 3478 могут блокировать YouTube.


Настройка Nextcloud Talk

В админке Nextcloud → Talk (Настройки приложения):

  • STUN: можно оставить дефолтный (например, stun.nextcloud.com).
  • TURN server: ваш FQDN, например: turn.example.com.
  • TURN ports:
    • 3478 (UDP/TCP) — без TLS.
    • 5349 (TCP) — с TLS.
  • Realm: тот же, что в turnserver.conf.
  • Аутентификация:
    • Если вы используете user=nextcloud:…, укажите логин/пароль.
    • Если используете static-auth-secret, впишите тот же shared secret в поле Nextcloud; он будет использовать REST‑креды, генерируя временные пароли для клиентов nextcloud-talk.readthedocs.io.

Сохраните и выполните самотест звонка (например, из Talk, создав комнату) Nextcloud community nextcloud-talk.readthedocs.io.


Сеть, тесты и харденинг

  • Фаервол:
    • Откройте порты: 3478/UDP, 3478/TCP, 5349/TCP.
    • Если включён релей RTP через TURN, coTURN динамически открывает порты. При необходимости ограничьте диапазон: # Пример: ограничение медиарелея min-port=49152 max-port=49999 И откройте этот диапазон в фаерволе.
  • Проверка доступности:
    • TCP: openssl s_client -connect turn.example.com:5349 -servername turn.example.com
    • Логи: tail -f /var/log/turn.log
  • Systemd‑надёжность: sudo systemctl edit coturn Добавьте: [Service] Restart=always RestartSec=5s LimitNOFILE=65535 Затем: sudo systemctl daemon-reload sudo systemctl restart coturn
  • IPv6 баг в старых версиях: Если по каким‑то причинам используете coTURN < 4.5.0.8, настройте периодический рестарт как временный обходной путь из‑за утечки IPv6 UDP сокетов nextcloud-talk.readthedocs.io.
  • Журналирование и защита:
    • Включите fingerprint, строгие версии TLS.
    • Следите за размером логов (logrotate).
    • Ограничьте доступ по IP, если это уместно (например, в корпоративной среде): allowed-peer-ip=/denied-peer-ip=.

Частые проблемы и быстрые проверки

  • Неверный realm или секрет: клиенты не получают валидные временные креды — исправьте совпадение realm и shared secret между coTURN и Nextcloud nextcloud-talk.readthedocs.io.
  • Блокировки фаервола/NAT: откройте 3478 UDP/TCP и 5349 TCP; при ограниченном диапазоне медиапортов — его тоже YouTube.
  • DNS/SNI: FQDN должен резолвиться в публичный IP, сертификат должен соответствовать hostname для TLS на 5349 YouTube.
  • Трафик уходит мимо TURN: проверьте, что Nextcloud Talk действительно использует ваш TURN (лог coTURN во время звонка, ICE candidates в консоли браузера).

Краткий ответ: Для работы coturn не нужны мощные ресурсы — достаточно современного VPS или физического сервера с 1–2 ядрами CPU, 1–2 ГБ RAM и стабильным сетевым каналом. Основное требование — пропускная способность сети и открытые порты, а не вычислительная мощность Remontka.com Частный компьютерный мастер.


🔧 Аппаратные требования для coturn

Минимальные характеристики

  • CPU: 1–2 ядра (x86_64 или ARM). Coturn не выполняет сложных вычислений, он лишь проксирует UDP/TCP‑трафик.
  • RAM: 1 ГБ достаточно для небольших нагрузок; 2 ГБ и выше — для стабильности при десятках одновременных звонков.
  • Диск: 10–20 ГБ (coturn хранит только логи и конфигурацию, медиаконтент не сохраняется).
  • Сеть: ключевой параметр. Нужен стабильный канал с низкой задержкой и достаточной пропускной способностью:
    • Для одного видеозвонка WebRTC требуется ~1–2 Мбит/с в каждую сторону.
    • Если сервер обслуживает десятки звонков, считайте суммарный трафик (например, 50 звонков ≈ 100 Мбит/с).

Рекомендуемые характеристики для продакшн‑сервера

КомпонентМинимумРекомендация
CPU1 ядро2–4 ядра для многопользовательских звонков
RAM1 ГБ4 ГБ для стабильности и буферизации
Диск10 ГБ20–40 ГБ (логи, резервные конфиги)
Сеть10 Мбит/с100 Мбит/с или гигабитный канал для десятков звонков

⚠️ Важные моменты

  • Сеть важнее железа. Coturn не кодирует видео/аудио, он только пересылает пакеты. Поэтому узким местом становится пропускная способность и задержка сети.
  • Порты: обязательно открыть 3478/UDP+TCP и 5349/TCP (TLS). Для медиарелея — диапазон портов (например, 49152–49999).
  • Масштабирование: если планируется сотни пользователей, лучше использовать несколько TURN‑серверов за балансировщиком.
  • Виртуализация: coturn отлично работает на VPS (KVM, OpenVZ, VMware), но избегайте сильно ограниченных контейнеров с нестабильной сетью.

🚀 Практический совет

Если Nextcloud Talk будет использоваться для небольших команд (до 20–30 пользователей), хватит VPS с 2 ядрами, 2 ГБ RAM и 100 Мбит/с каналом. Для корпоративного масштаба (>100 пользователей) лучше взять выделенный сервер с гигабитным каналом и 4–8 ГБ RAM.


От alex

Обучаемый.