Сайт FSA
15.02.2022

Настройка TURN сервера coturn

Это вольный перевод Howto https://matrix-org.github.io/synapse/latest/turn-howto.html.


Введение

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

Сервер Matrix Synapse поддерживает интеграцию с TURN-сервером с использованием его REST API. Сервер Matrix Synapse генерирует учетные данные, действительные для использования на TURN сервере, с использования секретного ключа.

Далее описывается установка сервера coturn (который реализует TURN REST API), его настройка и настройка сервера Synapse для интеграции его с coturn.

Требования

Для работы coturn требуется сервер, который имеет общедоступный (белый) IP-адрес.

При использовании хоста, который расположен за NAT, требуется обеспечить перенаправление портов c публичного IP-адреса на coturn. В некоторых случаях, работа через NAT может быть невозможна.

Установка coturn

Как установить coturn?

Сервер coturn можно установить из различных источников: пакетные менеджеры в дистрибутивах, контейнеры, установка из исходного кода.

Установка Debian/Ubuntu

В операционных системах Debian и Ubuntu сервер доступен из официальных репозиториев и может быть установлен с помощью:

apt install coturn

Команда установит и запустит с помощью systemd сервис с именем coturn.

Установка из исходного кода

  1. Для установки из исходного кода необходимо загрузить текущую версию с github, распаковать её и перейти каталог с исходным кодом.

  2. Производим настройку:

     ./configure
    

    Возможно, потребуется установить libevent2. Если это так, можно установить этот пакет средствами операционной системы. Либо можно игнорировать это предупреждение, т.к. для нашей цели этот пакет не нужен.

  3. Сборка и установка:

     make
     make install
    

Конфигурация coturn

  1. Файл конфигурации coturn - /etc/turnserver.conf. Создайте, раскомментируйте или отредактируйте следующие ключи:

     use-auth-secret
     static-auth-secret=[your secret key here]
     realm=turn.myserver.org
    

    В файле turnserver.conf содержатся пояснения к указанным параметрам. Для создания static-auth-secret можно использовать утилиту pwgen (необходима установка, например, через пакетный менеджер):

     pwgen -s 64 1
    

    Значение realm обязательно должно быть указано, но его значение может быть любым (при этом оно отправляется клиенту при аутентификации). Укажите в качестве realm доменное имя вашего сервера.

  2. Для анализа событий сервера coturn можно настроить его на ведение логов. По умолчанию это syslog:

     syslog
    

    В этом случае лог будет доступен через journalctl -u coturn подсистемы systemd. При желании, вы можете настроить coturn на запись логов в log-файлы. Информация об этих настройках можно найти в комментариях файла конфигурации.

  3. Обратите внимание на настройки безопасности. TURN позволяет пользователям запрашивать соединение, которое будет подключаться к произвольным IP-адресам и портам. В качестве начального варианта конфигурации можно использовать следующий:

     # Голосовой и видео трафик обычно идёт только по UDP, поэтому нет смысла разрешать пользователям использовать TCP для соединений через сервер.
    
     no-tcp-relay
    
     # не позволяйте осуществлять подключения к IP-адресам вашей локальной сети, если таковые имеются
    
     # если ваш TURN сервер находится за файерволом, включите также привилегированные публичные IP адреса
    
     denied-peer-ip=10.0.0.0-10.255.255.255
     denied-peer-ip=192.168.0.0-192.168.255.255
     denied-peer-ip=172.16.0.0-172.31.255.255
    
     # рекомендуется заблокировать адреса локальных узлов
    
     # <https://www.rtcsec.com/article/slack-webrtc-turn-compromise-and-bug-bounty/#how-to-fix-an-open-turn-relay-to-address-this-vulnerability>
    
     no-multicast-peers
     denied-peer-ip=0.0.0.0-0.255.255.255
     denied-peer-ip=100.64.0.0-100.127.255.255
     denied-peer-ip=127.0.0.0-127.255.255.255
     denied-peer-ip=169.254.0.0-169.254.255.255
     denied-peer-ip=192.0.0.0-192.0.0.255
     denied-peer-ip=192.0.2.0-192.0.2.255
     denied-peer-ip=192.88.99.0-192.88.99.255
     denied-peer-ip=198.18.0.0-198.19.255.255
     denied-peer-ip=198.51.100.0-198.51.100.255
     denied-peer-ip=203.0.113.0-203.0.113.255
     denied-peer-ip=240.0.0.0-255.255.255.255
    
     # в особых случаях, чтобы TURN-сервер работал со схемой "клиент->TURN->TURN->клиент"
    
     # тут должен быть указан прослушиваемый TURN-сервером адрес
    
     allowed-peer-ip=10.0.0.1
    
     # подумайте будете ли вы ограничивать квоту ретранслируемых потоков для каждого пользователя (или общую), чтобы избежать риска DoS атаки
    
     user-quota=12 # 4 потока для видеовызова, т.е. 12 потоков = 3 одновременных ретранслируемх потоков на пользователя.
     total-quota=1200
    
  4. Также можно рассмотреть возможность поддержки TLS/DTLS. Для этого необходимо добавить следующие настройки в файл конфигурации turnserver.conf:

     # Сертификаты TLS, включая промежуточные
    
     # Для сертификатов Let's Encrypt используйте `fullchain.pem`
    
     cert=/path/to/fullchain.pem
    
     # Файл закрытого ключа TLS
    
     pkey=/path/to/privkey.pem
    
     # Убедитесь, что директивы отключения TLS/DTLS закомментированы или удалены
    
     # no-tls
     # no-dtls
    

    После этого замените turn: в настройке turn_uris на turns:.

    Желательно настраивать TLS/DTLS только после того, как вы выполнили базовую настройку и всё заработало.

    Примечание: если вы используете Let’s Encrypt, возможно TLS/DTLS не будет работать (обсуждение Element для Android и WebRTC). В качестве альтернативы можно использовать ZeroSSL для TURN-сервера, который не подвержен данной проблеме.

  5. Убедитесь, что ваш брандмауэр пропускает трафик на TURN-сервер через порты, которые вы настроили для прослушивания (по умолчанию: 3478 и 5349 для трафика TURN (не забудьте разрешить как TCP, так и UDP-трафик) и порты 49152-65535 для UDP-ретранслятора).

  6. Если ваш сервер TURN находится за NAT, шлюз NAT должен иметь внешний общедоступный IP-адрес. Необходимо указать этот внешний адрес в настройках coturn:

     external-ip=EXTERNAL_NAT_IPv4_ADDRESS
    

    При желании можно ограничить TURN-сервер прослушиванием только локального адреса, который NAT сопоставляет с внешним адресом:

     listening-ip=INTERNAL_TURNSERVER_IPv4_ADDRESS
    

    Если ваш шлюз NAT доступен как по IPv4, так и по IPv6, можно настроить coturn для каждого доступного адреса:

     external-ip=EXTERNAL_NAT_IPv4_ADDRESS
     external-ip=EXTERNAL_NAT_IPv6_ADDRESS
    

    При объявлении внешнего адреса IPv6 убедитесь, что брандмауэр и сетевые настройки системы, на которой запущен ваш TURN-сервер, настроены на прием трафика IPv6, и что TURN-сервер прослушивает локальный адрес IPv6, который сопоставляется NAT с внешним адресом IPv6. .

  7. После настройки перезапустите сервер coturn:

    • При установке через репозитории операционной системы или самостоятельно настроили юнит systemd:

      systemctl restart coturn
      
    • При установке из исходного кода:

      bin/turnserver -o
      

Настройка Matrix Synapse

В файле конфигурации Matrix Synapse необходимо добавить следующие опции:

  1. turn_uris: список в формате yaml общедоступных URI для TURN-сервера, который будет выдан клиентам. Необходимо добавить отдельные записи для каждого из поддерживаемых транспортов;
  2. turn_shared_secret: ключ TURN-сервера, который был указан в turnserver.conf;
  3. turn_user_lifetime: это количество времени, в течение которого действительны учетные данные, сгенерированные сервером Matrix (в миллисекундах). Более короткое время дает меньше возможностей для злоупотреблений за счет увеличения трафика между веб-клиентами и Matrix сервером для обновления учетных данных. В спецификации TURN REST API рекомендуемое значение - один день (86400000).
  4. turn_allow_guests: разрешать ли гостевым пользователям использовать TURN-сервер. Включено по умолчанию, иначе VoIP не будет надежно работать для гостей. Однако, это создает угрозу безопасности, поскольку позволяет гостям подключаться к произвольным конечным точкам без прохождения CAPTCHA или чего-то подобного для регистрации реальной учетной записи.

В качестве примера, соответствующий раздел конфигурационного файла для matrix.org. turn_uris содержат адреса TURN-серверов, которые прослушивают порты по умолчанию, без TLS.

turn_uris: [ "turn:turn.matrix.org?transport=udp", "turn:turn.matrix.org?transport=tcp" ]
turn_shared_secret: "n0t4ctuAllymatr1Xd0TorgSshar3d5ecret4obvIousreAsons"
turn_user_lifetime: 86400000
turn_allow_guests: True

После обновления конфигурации необходимо перезапустить Synapse:

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

Возможные проблемы и их исправление

Типичным проявлением неверной настройки TURN-сервера является то, что вызовы между устройствами в разных сетях завершаются на этапе ожидания соединения. К сожалению, устранение таким проблем не всегда бывает простым.

Вот несколько вещей, которые можно попробовать:

Если TURN-сервер работает правильно, вы должны увидеть хотя бы одну запись о перенаправлении трафика в журнале.


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.