Установка TURN сервера coturn для контура SVA #
Возможно использование собственного TURN сервера.
TURN сервер требуется для “пробивания” NAT, а именно для возможности установки соединения от сервера Janus к браузеру клиентов. Наличие правильно настроенного TURN сервера существенно увеличивает возможности подключения клиентских устройств к медиа-шлюзу Janus. Поэтому, использование TURN сервера настоятельно рекомендовано.
На платформе SVA рекомендуется использование TURN сервера
coturn. Для этого можно использовать образом cr.repo.altuera.ru/sva/prod/coturn:4.6.2. Это реплика официального публичного образа с предустановленными тестовыми сертификатами.
Требования для запуска в docker #
Поскольку docker очень тяжело справляется с публикацией большого количества портов контейнера, настоятельно рекомендуется запускать с network_mode: host
Конфигурирование параметров запуска в аргументах командной строки. Подробнее обо всех параметрах и их значениях можно ознакомиться в официальной документации
Сетевое размещение #
TURN сервер - самостоятельный сервис, не связанный напрямую с контуром SVA. При его настройке следует учесть 2 требования:
listeningпорты TURN сервера должны быть доступны для подключения внешним клиентам SVArelayпорты TURN сервера должны быть доступны для подключения контейнерам Janus
Отдельный TURN сервер #
Наиболее распространенный вид установки:
- устанавливается на отдельный сервер
- имеет только публичный ip адрес

TURN сервер в контуре SVA #
Если используется только в контуре SVA, то TURN сервер может располагаться в DMZ и на тех же хостах, где запущены Janus:
- в интернет транслируются только
listeningпорты relayпорты доступны только из внутренней сети

Порты сервиса #
listening ports #
Порты, на которые поступают входящие соединения от клиентов.
command: [
...
"--listening-port=19001"
...
]
Рекомендуется не использовать порты по-умолчанию (могут блокироваться некоторыми интернет-провайдерами).
relay ports #
Порты, к которым подключается Janus. Должны (RFC 5766) быть из диапазона 49152-65535
Диапазон портов #
command: [
...
"--min-port=49152",
"--max-port=65535",
...
]
Внешний ip адрес #
Если сервис находится за NAT, то ему требуется указать какой публичный ip адрес использовать для замены приватного.
"--external-ip=1.10.20.30"
Или определить автоматически
environment:
DETECT_EXTERNAL_IP: yes
command: [
...
"--external-ip=$(detect-external-ip)",
...
]
Если внешний ip адрес не задан, то TURN сервер будет возвращать ip адрес наиболее подходящего интерфейса.
relay-ip #
Флагом relay-ip= можно указать, какой именно интерфейс использовать для relay портов. Возможно, понадобится на хостах с множественными ip адресами.
environment:
DETECT_EXTERNAL_IP: yes
command: [
...
"--relay-ip=192.168.100.200,
...
]
TLS #
Использование TLS для подключения клиентов к TURN серверу имеет свои плюсы и минусы.
Плюсы:
- Зашифрованная передача данных аутентификации
- используя порт 443, можно обойти строгие сетевые ограничения (WAF, firewall, transparent proxy) на стороне Клиента, увеличив тем самым вероятность успешного подключения
Минусы:
- повышенная нагрузка на устройство клиента: внутри установленного TLS подключения SRTP трафик все равно передается в зашифрованном виде (DTLS). Для слабых недорогих устройств это может стать причинами “тормозов”, нагрева устройства и быстрого расхода заряда аккумуляторов
Несмотря на различие в названиях директив coturn listening-port и tls-listening-port оба объявленных порта могут принимать как plain, так и tls подключения.
Для настройки TLS необходимо указать пути к сертификату (цепочка, включая intermediate CA) и его ключу (оба файла в формате PEM):
command: [
...
"--cert=/cert/cert_fullchain.pem",
"--pkey=/cert/cert.key",
"--no-tlsv1", "--no-tlsv1_1",
...
]
флаги --no-tlsv1 и --no-tlsv1_1 исключают возможность использования устаревших версий tls
Аутентификация #
Протокол TURN требует обязательно аутентификации пользователей.
Платформа SVA поддерживает 2 типа аутентификации:
- Постоянные логин и пароль
- автоматически генерируемые логин и пароль с ограниченным временем жизни в соответствии с “ A REST API For Access To TURN Services”
Постоянные логин и пароль #
Задаются (в любом количестве) параметрами запуска:
command: [
...
"--realm=your.domain.com",
"--lt-cred-mech",
"--user=user1:password1",
...
]
SVA может использовать только одну пару логин/пароль для безопасного подключения всех клиентов к TURN серверу. При такой авторизации настоятельно рекомендуется подключение к turn серверу только с использованием TLS.
Realm может быть любым, но его наличие обязательно.
Использование TURN secret #
command: [
...
"--realm=your.domain.com",
"--use-auth-secret",
"--static-auth-secret=someSecretSting",
...
]
Realm может быть любым, но его наличие обязательно.
Тестирование TURN сервера #
Для тестирования TURN сервера с целью убедиться, что возвращаются ожидаемые relay кандидаты, можно воспользоваться тестовой страницей.
Примеры compose файлов #
Установка совместно с контейнерами Janus #
- может описываться в том же compose файле, что прочие компоненты хоста
- использует порт
19001для обоих типов подключений (tls и plain) - использует turn secret для аутентификации пользователей
- из сети интернет должен быть доступны только один порт
19001 - для объявления в настройках SVA используются адреса
turn:public.hostname.com:19001- поскольку используются временные пароли, попробовать подключиться без TLS
turns:public.hostname.com:19001- подключение с tls
Развернуть
services:
coturn:
image: cr.repo.altuera.ru/sva/prod/coturn:4.6.2
restart: always
network_mode: host
volumes:
/srv/coturn/cert:/cert
command: [
"-n",
"--listening-port=19001",
"--min-port=49152",
"--max-port=65535",
"--use-auth-secret",
"--static-auth-secret=secret",
"--realm=videochat.altuera.com",
"--cert=/cert/cert_fullchain.pem",
"--pkey=/cert/cert.key",
"--no-tlsv1", "--no-tlsv1_1",
"--fingerprint",
"--mobility",
"--no-multicast-peers",
"--no-cli",
"--log-file=stdout",
"--verbose",
]
Установка отдельного TURN сервера #
- устанавливается на отдельный хост имеющий публичный ip или 1-to-1 NAT
- автоматическое определение публичного ip
- использует порт
19001для plain подключений - использует TLS на порту
443для самых сложных случаев NAT - использует turn secret для аутентификации пользователей
- из сети интернет должены быть доступны порты:
1900144345192-65535
- для объявления в настройках SVA используются адреса
turn:public.hostname.com:19001- поскольку используются временные пароли, попробовать подключиться без TLS
turns:public.hostname.com:443- подключение с tls на порт 443
Развернуть
services:
coturn:
image: cr.repo.altuera.ru/sva/prod/coturn:4.6.2
restart: always
network_mode: host
environment:
DETECT_EXTERNAL_IP: yes
volumes:
/srv/coturn/cert:/cert
command: [
"-n",
"--listening-port=19001",
"--tls-listening-port=443",
"--external-ip=$(detect-external-ip)",
"--min-port=49152",
"--max-port=65535",
"--use-auth-secret",
"--static-auth-secret=secret",
"--realm=videochat.altuera.com",
"--cert=/cert/cert_fullchain.pem",
"--pkey=/cert/cert.key",
"--no-tlsv1", "--no-tlsv1_1",
"--fingerprint",
"--mobility",
"--no-multicast-peers",
"--no-cli",
"--log-file=stdout",
"--verbose",
]