Это вольный перевод 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.
Установка из исходного кода
-
Для установки из исходного кода необходимо загрузить текущую версию с github, распаковать её и перейти каталог с исходным кодом.
-
Производим настройку:
./configureВозможно, потребуется установить libevent2. Если это так, можно установить этот пакет средствами операционной системы. Либо можно игнорировать это предупреждение, т.к. для нашей цели этот пакет не нужен.
-
Сборка и установка:
make make install
Конфигурация coturn
-
Файл конфигурации 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 доменное имя вашего сервера.
-
Для анализа событий сервера coturn можно настроить его на ведение логов. По умолчанию это syslog:
syslogВ этом случае лог будет доступен через journalctl -u coturn подсистемы systemd. При желании, вы можете настроить coturn на запись логов в log-файлы. Информация об этих настройках можно найти в комментариях файла конфигурации.
-
Обратите внимание на настройки безопасности. 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 -
Также можно рассмотреть возможность поддержки 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-сервера, который не подвержен данной проблеме.
-
Убедитесь, что ваш брандмауэр пропускает трафик на TURN-сервер через порты, которые вы настроили для прослушивания (по умолчанию: 3478 и 5349 для трафика TURN (не забудьте разрешить как TCP, так и UDP-трафик) и порты 49152-65535 для UDP-ретранслятора).
-
Если ваш сервер 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. .
-
После настройки перезапустите сервер coturn:
-
При установке через репозитории операционной системы или самостоятельно настроили юнит systemd:
systemctl restart coturn -
При установке из исходного кода:
bin/turnserver -o
-
Настройка Matrix Synapse
В файле конфигурации Matrix Synapse необходимо добавить следующие опции:
turn_uris: список в формате yaml общедоступных URI для TURN-сервера, который будет выдан клиентам. Необходимо добавить отдельные записи для каждого из поддерживаемых транспортов;turn_shared_secret: ключ TURN-сервера, который был указан вturnserver.conf;turn_user_lifetime: это количество времени, в течение которого действительны учетные данные, сгенерированные сервером Matrix (в миллисекундах). Более короткое время дает меньше возможностей для злоупотреблений за счет увеличения трафика между веб-клиентами и Matrix сервером для обновления учетных данных. В спецификации TURN REST API рекомендуемое значение - один день (86400000).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:
-
если вы используете
synctl:cd /where/you/run/synapse ./synctl restart -
если вы используете
systemd:systemctl restart matrix-synapse.service
После этого необходимо перезагрузить все клиенты или подождать час, пока они обновят свои настройки.
Возможные проблемы и их исправление
Типичным проявлением неверной настройки TURN-сервера является то, что вызовы между устройствами в разных сетях завершаются на этапе ожидания соединения. К сожалению, устранение таким проблем не всегда бывает простым.
Вот несколько вещей, которые можно попробовать:
-
Убедитесь, что вы открыли порты на брандмауэре, чтобы разрешить трафик TCP и UDP на порты TURN (обычно 3478 и 5349).
-
Убедитесь, что вы открыли порты на брандмауэре, чтобы разрешить трафик UDP на порты ретрансляции UDP (по умолчанию 49152-65535).
-
Попробуйте отключить TLS/DTLS порты и включить только незашифрованные TCP/UDP. При этом незашифрованным будет только сигнальный трафик. Голосовой и видео трафик WebRTC всегда передаётся зашифрованным.
-
Некоторые реализации WebRTC (в частности, Google Chrome), по-видимому, путаются в TURN-серверами, доступными по IPv6. Возможно, это является неожиданным побочным эффектом обработки нескольких IP-адресов, как определено в draft-ietf-rtcweb-ip-handling.
Попробуйте удалить все записи AAAA для вашего TURN-сервера, чтобы он был доступен только через IPv4. -
Если ваш сервер TURN находится за NAT:
- дважды проверьте, что ваш шлюз NAT правильно перенаправляет все порты TURN (обычно 3478 и 5349 для трафика TCP и UDP TURN и 49152-65535 для ретрансляции UDP) на внутренний адрес NAT вашего TURN-сервера. Если внешние адреса IPv4 и IPv6 объявляются с помощью опции
external-ip, убедитесь, что NAT перенаправляет трафик IPv4 и IPv6 на внутренние адреса IPv4 и IPv6 вашего TURN-сервера. Если есть сомнения, удалите записи AAAA для своего TURN-сервера и укажите только IPv4-адрес в качествеexternal-ip. - убедитесь, что ваш TURN-сервер использует шлюз NAT в качестве маршрута по умолчанию.
- дважды проверьте, что ваш шлюз NAT правильно перенаправляет все порты TURN (обычно 3478 и 5349 для трафика TCP и UDP TURN и 49152-65535 для ретрансляции UDP) на внутренний адрес NAT вашего TURN-сервера. Если внешние адреса IPv4 и IPv6 объявляются с помощью опции
-
Включите более подробное ведение журнала в coturn с помощью ключа
verbose:verboseПосле этого проверьте записи, которые будут созданы в журнале.
-
Если вы используете клиент на основе браузера в Chrome, воспользуйтесь chrome://webrtc-internals/. В Firefox проверьте «Журнал подключений» через about:webrtc.
-
Протестировать настройку TURN-сервера для сервера Matrix можно с помощью https://test.voip.librepush.net/. Обратите внимание, что этот тест еще не полностью надежен, поэтому не расстраивайтесь, если тест не пройден. Ознакомиться с репозиторием исходного кода тестера можно на github, там же можно сообщать о найденных ошибках.
-
Инструмент для тестирования WebRTC доступен по ссылке. Чтобы использовать его, вам понадобится имя пользователя/пароль для вашего TURN-сервера. Их можно найти:
-
найдите запрос GET /_matrix/client/r0/voip/к вашему TURN-серверу, который выполнил клиент Matrix, в сетевом инспекторе браузера. В ответе сервера вы должны увидеть username и password.
Или:
-
Используйте следующий скрипт:
secret=staticAuthSecretHere u=$((`date +%s` + 3600)):test p=$(echo -n $u | openssl dgst -hmac $secret -sha1 -binary | base64) echo -e "username: $u\npassword: $p"Или:
-
Временно настройте coturn для доступа с помощью имени пользователя и пароля. Для этого закомментируйте
use-auth-secretиstatic-auth-secretи, добавьте следующие параметры:lt-cred-mech user=username:passwordПримечание. Эти настройки не вступят в силу, если
use-auth-secretи неstatic-auth-secretбудут отключены.Перезапустите coturn после внесения изменений в файл конфигурации.
Не забудьте восстановить исходные настройки,чтобы вернуться к тестированию с клиентами Matrix!
-
Если TURN-сервер работает правильно, вы должны увидеть хотя бы одну запись о перенаправлении трафика в журнале.