Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Установка TURN/STUN-сервера coturn на Debian/Ubuntu

profile picture
Author
Noah Seefried
Published
2019-03-08
Time to read
4 minutes reading time

Введение

Мы установим TURN/STUN-сервер coturn. TURN-сервер позволяет установить прямое соединение (например для IP-телефонии) преодолев NAT. От также может использоваться в качестве TURN-сервера и шлюза для сетевого трафика общего назначения.

Основная концепция TURN

Sequence diagram

Пример проектов, использующих TURN/STUN:

Если вы самостоятельно размещаете одно из этих приложений, то вы можете использовать для них свой собственный TURN/STUN-сервер.

Требования

  • Небольшой виртуальный сервер, например Облачный сервер CX11 с root-доступом
  • Базовые знания о Linux

Предположения

  • Домен: example.com
  • IPv4-адрес сервера: 10.0.0.1
  • IPv6-адрес сервера: 2001:db8:1234::1
  • Публичный IPv4-адрес клиента: 78.47.166.55
  • Частный IPv4-адрес клиента: 192.168.0.10

Шаг 1 — Настройка записей в DNS

Общие DNS-записи:

turn.example.com. 14400 IN A    10.0.0.1
turn.example.com. 14400 IN AAAA 2001:db8:1234::1
stun.example.com. 14400 IN A    10.0.0.1
stun.example.com. 14400 IN AAAA 2001:db8:1234::1

@ IN NAPTR 10 0 "s" "RELAY:turn.udp" "" _turn._udp.example.com.

Следующие DNS-записи должны использоваться, если вы устанавливаете только один TURN/STUN-сервер:

_stun._udp.example.com.  14400 IN SRV  5 0 3478 turn.example.com.
_stun._tcp.example.com.  14400 IN SRV  5 0 3478 turn.example.com.
_stuns._tcp.example.com. 14400 IN SRV  5 0 5349 turn.example.com.

_turn._udp.example.com.   14400 IN SRV  5 0 3478 turn.example.com.
_turn._tcp.example.com.   14400 IN SRV  5 0 3478 turn.example.com.
_turns._tcp.example.com.  14400 IN SRV  5 0 5349 turn.example.com.

Для лучшей производительности и отказоустойчивости вы должны иметь по крайней мере два TURN/STUN-сервера. Для двух нужно немного изменить DNS-записи:

_stun._udp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_stun._udp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_stun._tcp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_stun._tcp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_stuns._tcp.example.com.  14400 IN SRV  5  50 5349 turn1.example.com.
_stuns._tcp.example.com.  14400 IN SRV  10 50 5349 turn2.example.com.
_turn._udp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_turn._udp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_turn._tcp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_turn._tcp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_turns._tcp.example.com.  14400 IN SRV  5  50 5349 turn1.example.com.
_turns._tcp.example.com.  14400 IN SRV  10 50 5349 turn2.example.com.

Не забудьте настроить DNS-записи (A и AAAA) для turn1.example.com и turn2.example.com как упоминалось выше.

Теоретически, можно добавить вторую запись A и AAAA для turn.example.com и stun.example.com, но это не рекомендуемый способ.

Шаг 2 — Установка

Сначала нужно установить coturn на сервере.

apt-get install coturn

Временно остановим coturn

systemctl stop coturn

Шаг 3 — Настройка

Для того чтобы включить TURN-сервер, откройте файл /etc/default/coturn и уберите # перед TURNSERVER_ENABLED=1.

Настройки хранятся в файле /etc/turnserver.conf. В начале переместим исходную версию этого файла с помощью команды:

mv /etc/turnserver.conf /etc/turnserver.conf.orig

Затем мы откроем(создадим) файл /etc/turnserver.conf со следующим содержимым:

listening-port=3478
tls-listening-port=5349

fingerprint
lt-cred-mech

use-auth-secret
static-auth-secret=replace-this-secret

realm=turn.example.com

total-quota=100
stale-nonce=600

cert=/etc/letsencrypt/live/turn.example.com/cert.pem
pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem
cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"

no-sslv3
no-tlsv1
no-tlsv1_1
#no-tlsv1_2

dh2066

no-stdout-log
log-file=/var/tmp/turn.log
#log-file=/dev/null

no-loopback-peers
no-multicast-peers

proc-user=turnserver
proc-group=turnserver

Создайте секрет с помощью команды

sed -i "s/replace-this-secret/$(openssl rand -hex 32)/" /etc/turnserver.conf

Шаг 4 — Регистрация Let's Encrypt сертификатов

Для Let's Encrypt сертификатов будем использовать certbot от EFF.

apt-get install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d turn.example.com

За 30 (и 7) дней до истечения срока действия сертификатов вы получите электронное письмо на holu@example.com.

Шаг 5 — Запуск и испытание TURN/STUN-сервера

Запустите coturn, выполнив systemctl start coturn. Проверить, работает ли cotrun можно при помощи команды systemctl status coturn.

Мы пока не знаем, все ли верно работает, но, к нашему счастью, есть тестер: WebRTC samples Trickle ICE

Удалите сервер по умолчанию из списка. Поле «STUN or TURN URI» должно выглядеть следующим образом:

stun:stun.example.com

но можно использовать и IP-адрес:

stun:10.0.0.1:3478

Для проверки шифрования SSL/TLS используйте порт 5349. Тестер не поддерживает проверку работы TURN.

Затем нажмите на Add Server, а затем на Gather candidates.

Вывод должен выглядеть примерно так:

Time    Component       Type    Foundation     Protocol Address         Port        Priority
0.019   1               host             0          UDP 192.168.0.10    41904   126 | 32512 | 255
0.024   1               host             2          TCP 192.168.0.10    9       125 | 32704 | 255
0.027   2               host             0          UDP 192.168.0.10    53438   126 | 32512 | 254
0.030   2               host             2          TCP 192.168.0.10    9       125 | 32704 | 254
0.134   1               srflx            1          UDP 78.47.166.55    41904   100 | 32543 | 255
0.152   2               srflx            1          UDP 78.47.166.55    53438   100 | 32543 | 254
0.153   Done

Если вы получаете тайм-аут Not reachable?, вероятно, соединение заблокировано межсетевым экраном. Проверьте еще раз, открыты ли порты 3478 и 5349 для TURN-сервера. Также проверьте, можете ли вы связаться с ним с Вашего компьютера или другого сервера через telnet или nmap.

Если все работает должным образом, в файле с настройками замените log-file=/var/log/turn.log на log-file=/dev/null. Это отключит ведение журнала IP-адресов и обеспечивает максимальную конфиденциальность.

Вывод

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

Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue

Discover our

Dedicated Servers

Configure your dream server. Top performance with an excellent connection at an unbeatable price!

Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more