Перейти к основному содержимому

Настройка STUN/TURN сервера

STUN/TURN сервера необходимы для обхода ограничений NAT, а также блокировок со стороны провайдера при прохождении медиатрафика на стороне участника видео встреч.

Так же STUN сервер необходим для нормальной работы Janus серверов.

STUN (сокр. от англ. Session Traversal Utilities for NAT) — это сетевой протокол, который позволяет клиенту, находящемуся за сервером трансляции адресов (или за несколькими такими серверами), определить свой внешний IP-адрес, способ трансляции адреса и порта во внешней сети, связанный с определённым внутренним номером порта. Эта информация используется для установления соединения UDP между двумя хостами в случае, если они оба находятся за маршрутизатором NAT.

TURN (Traversal Using Relay NAT) — это протокол, который позволяет узлу за NAT или брандмауэром получать входящие данные через TCP или UDP соединения. Такая возможность особенно актуальна для узлов позади симметричных NAT, или брандмауэров, которые собираются стать принимающей стороной в соединении с одним конкретным узлом (peer-ом).

TURN не предназначен для проброса портов сервера через NAT, он поддерживает соединения точка-точка (peer-to-peer) между узлами, расположенными за NAT (как в IP-телефонии).

В этом плане он сохраняет функции безопасности, обеспеченные симметричным NAT и брандмауэрами, но меняет таблицы трансляции так, чтобы узел на внутренней стороне мог стать принимающей стороной соединения.

Если нет требований к защите медиа трафика, то можно воспользоваться публичными STUN серверами, например:

Но для стабильной работы системы рекомендуется иметь свой приватный STUN/TURN сервер.

Установка и настройка COTURN

Установка пакета и зависимостей

apt -y update
apt -y install coturn
warning

В связи с публикацией наружу обязательно обновите все пакеты до последних версий, чтобы исключить возможные уязвимости.

Конфигурационный файл turnserver.conf

listening-port=3478
# Задайте IP для прослушивания. (0.0.0.0 для всех интерфейсов)
listening-ip={local_ip}
# Укажите внешний IP адресса сервера
external-ip={external_ip}/{local_ip}
min-port=10000
max-port=65000

# realm — домен, на котором работает сервер например example.com
realm={realm_domain}
server-name={server_name}

#### REST API auth
#use-auth-secret
#static-auth-secret={secret_key} # `pwgen -s 64 1` to generate

#stun-only # если нужен только stun
#no-stun # если нужен только turn

lt-cred-mech

fingerprint
no-tcp-relay
# <https://www.rtcsec.com/article/slack-webrtc-turn-compromise-and-bug-bounty/#how-to-fix-an-open-turn-relay-to-address-this-vulnerabilit
allowed-peer-ip={local_ip}

user-quota=12
total-quota=1200

log-file=/var/log/coturn/turnserver.log
simple-log
#syslog
verbose
подсказка

Необходимо опубликовать наружу порты 3478 и диапазон RTP, указанный в конфигурационном файле.

Полезные команды

#добавление нового пользователя в sqlite
turnadmin -a -u user -p pass -r example.com #Если не работает, то надо указать ключ -b с путем до базы
#Удаление пользователя
turnadmin -d -u user

#Просмотр добавленных пользователей
sqlite3 /var/lib/turn/turndb "select * from turnusers_lt"
turnadmin -l

#Накатить схему, если не завелось
sqlite3 /var/lib/turn/turndb < /usr/local/src/coturn/turndb/schema.sql

# Создание секретного ключа
pwgen -s 64 1

# Подключение проверка через turnutils с самого сервера, creds
turnutils_uclient {TURN_IP} -DgX -u webrtc -w superpass -e {TURN_IP} -n 1 -c -y
# Rest
turnutils_uclient -y -u 1671526053:vvs -w {secret_key} {TURN_IP}

# Тестирование с удаленной машины, creds
turnutils_uclient -e {TURN_IP} -X -g -u turn_user -w "superpass" {TURN_IP}

Полезные ссылки