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-сервер.

Требования

  • Небольшой виртуальный сервер, например Облачный сервер CX23 с 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

Get €20/$20 free credit!

Valid until: 31 December 2026 Valid for: 3 months and only for new customers
Configure now
Want to contribute?

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

Find out more