TURN/STUN сервер coturn

Установка 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 сервера должны быть доступны для подключения внешним клиентам SVA
  • relay порты TURN сервера должны быть доступны для подключения контейнерам Janus

Отдельный TURN сервер #

Наиболее распространенный вид установки:

  • устанавливается на отдельный сервер
  • имеет только публичный ip адрес

standalone

TURN сервер в контуре SVA #

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

  • в интернет транслируются только listening порты
  • relay порты доступны только из внутренней сети

dmz

Порты сервиса #

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 для аутентификации пользователей
  • из сети интернет должены быть доступны порты:
    • 19001
    • 443
    • 45192-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",
    ]
powered by Altuera