Установка и настройка сервера coturn (STUN/TURN)

Thank you for reading this post, don't forget to subscribe!

STUN

сете­вой про­то­кол, кото­рый поз­во­ля­ет сете­вым устрой­ствам, нахо­дя­щим­ся за NAT узна­вать свои внеш­ние IP-адре­са. По умол­ча­нию рабо­та­ет на пор­ту 3478 (no SSL) или 5349 (TLS).

Чаще все­го, необ­хо­ди­мость сер­ве­ра, кото­рый предо­став­ля­ет дан­ную воз­мож­ность, воз­ни­ка­ет при нали­чии служб пере­да­чи меди­а­кон­тен­та. Напри­мер, осо­бен­ность неко­то­рых из них (VOIP или WebRTC) заклю­ча­ет­ся в попыт­ке уста­но­вить соеди­не­ние точ­ка-точ­ка, что про­ти­во­ре­чит идеи исполь­зо­ва­ния NAT. Конеч­но же, дан­ное соеди­не­ние не будет выпол­не­но, так как два раз­лич­ных узла с IP-адре­са­ми из диа­па­зо­на локаль­ных сетей не смо­гут «най­ти» друг дру­га. STUN-сер­вер поз­во­ля­ет дан­ным узлам исполь­зо­вать для режи­ма точ­ка-точ­ка не внут­рен­ние адре­са, а внеш­ние, делая воз­мож­ным их соединение.

Для реа­ли­за­ции воз­мож­но­стей про­то­ко­ла мож­но исполь­зо­вать один из бес­плат­ных сер­ве­ров, например:

  • stun.sipnet.ru
  • stun.ipshka.com
  • stun.sipgate.net
  • stun.ekiga.net
  • stun.l.google.com:19305

… или раз­вер­нуть свой соб­ствен­ный сер­вер под Linux или Windows. При­мер про­грамм, кото­рые поз­во­ля­ют реа­ли­зо­вать сер­вер­ную часть:

  1. STUN Client and Server
  2. coturn

Для про­вер­ки рабо­ты сер­ве­ра мож­но вос­поль­зо­вать­ся онлайн инстру­мен­том на стра­ни­це https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/.

Аль­тер­на­ти­ва STUN — TURN. Послед­ний может созда­вать допол­ни­тель­ную нагруз­ку на сеть, но более гаран­ти­ро­ва­но обес­пе­чи­ва­ет соеди­не­ние меж­ду узла­ми. Одна­ко, в свя­зи с боль­шой нагруз­кой, кото­рую он может создать на сеть, сто­ит отдать пред­по­чте­ние про­то­ко­лу STUN.

Дан­ный сер­вер нам может пона­до­бить­ся для кор­рект­ной пере­да­чи меди­а­кон­тен­та, напри­мер, VOIP или посред­ством WebRTC

Подготовка системы

Для кор­рект­ной рабо­ты сер­ве­ра мы долж­ны открыть пор­ты в бранд­мау­э­ре и отклю­чить SELinux.

1. Настройка firewalld

Доба­вим порт 3478 для нешиф­ро­ван­ных соединений:

firewall-cmd --add-port=3478/{udp,tcp} --permanent

Доба­вим порт 5349 для TLS:

firewall-cmd --add-port=5349/{udp,tcp} --permanent

Пере­за­пус­ка­ем кон­фи­гу­ра­цию для при­ме­не­ния правил:

firewall-cmd --reload

2. Отключение SELinux

Для отклю­че­ния SELinux вво­дим 2 команды:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Про­ве­ря­ем, что настрой­ки применились:

getenforce

Если видим:

Permissive

… пере­за­гру­жа­ем сервер.

Установка и запуск

Уста­нов­ка паке­та coturn выпол­ня­ет­ся из репо­зи­то­рия EPEL. Сна­ча­ла ста­вим его командой:

yum install epel-release

После мож­но уста­нав­ли­вать сер­вер STUN/TURN:

yum install coturn

Раз­ре­ша­ем авто­за­пуск сер­ви­са и стар­ту­ем его:

systemctl enable coturn --now

Сер­вер готов при­ни­мать запросы.

Проверка работы

Для про­вер­ки сер­ве­ра нам нуж­но уста­но­вить кли­ен­та stun. Это мож­но сде­лать либо на тот же сер­вер, либо на дру­гой компьютер.

а) Под Ubuntu доста­точ­но выпол­нить одну команду:

apt-get install stun-client

б) В CentOS нуж­но уста­но­вить ста­рый репо­зи­то­рий, после саму программу:

yum install https://download-ib01.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install stun

После уста­нов­ки про­грам­мы мож­но попро­бо­вать отпра­вить запрос на сер­вер. В зави­си­мо­сти от вари­ан­та Linux коман­ды будут разные.

а) в CentOS:

stun-client <IP-адрес сер­ве­ра STUN/TURN>

б) в Ubuntu:

stun <IP-адрес сер­ве­ра STUN/TURN>

* в при­ме­рах ниже мы будем исполь­зо­вать вари­ант для CentOS.

И так, при­мер для выпол­не­ния тесто­во­го запроса:

stun-client 192.168.0.15

* где 192.168.0.15 — IP-адрес во внут­рен­ней сети наше­го сер­ве­ра STUN/TURN.

Мы долж­ны полу­чить ответ:

STUN client version 0.96
Primary: Open
Return value is 0x000001

Если сер­вер не рабо­та­ет, мы полу­чим что-то на подобие:

STUN client version 0.96
Primary: Blocked or could not reach STUN server
Return value is 0x00001c

Если наш сер­вер досту­пен из сети Интер­нет, мы можем выпол­нить онлайн тест на пор­та­ле Trickle ICE.

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

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

1. Пароль для подключения

Что­бы огра­ни­чить под­клю­че­ния к наше­му сер­ве­ру, мы можем задать пароль­ную фра­зу. Для это­го откры­ва­ем файл с настрой­ка­ми сервера:

vi /etc/coturn/turnserver.conf

И сни­ма­ем ком­мен­та­рии со строк:

use-auth-secret

static-auth-secret=north

… а так­же меня­ем north на любой пароль:

static-auth-secret=Str0ngPa$$word

Пере­за­пус­ка­ем сервис:

systemctl restart coturn

2. Сервер за NAT (external-ip)

Если наш сер­вер сам нахо­дит­ся за NAT, необ­хо­ди­мо настро­ить зна­че­ние для опции external-ip, кото­рое ука­жет, какой адрес нуж­но исполь­зо­вать в каче­стве ретранслятора.

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл:

vi /etc/coturn/turnserver.conf

а) если исполь­зу­ет­ся един­ствен­ный внеш­ний адрес, ука­зы­ва­ем его:

external-ip=60.70.80.91

б) если у нас мно­же­ство адре­сов, запись может быть такой:

external-ip=60.70.80.91/172.17.19.101
external-ip=60.70.80.92/172.17.19.102

* где 60.70.80.91 и 60.70.80.92 — пуб­лич­ные адре­са; 172.17.19.101 и 172.17.19.102 — приватные.

Пере­за­пус­ка­ем сервис:

systemctl restart coturn

3. Настройка SSL

Пере­да­ча дан­ных воз­мож­на с при­ме­не­ни­ем шиф­ро­ва­ния. Для это­го, во-пер­вых, нам нуж­но полу­чить сер­ти­фи­кат; во-вто­рых — настро­ить сер­вер STUN.

Сер­ти­фи­кат мож­но купить или полу­чить бес­плат­но в Let's Encrypt. В дан­ной инструк­ции будет исполь­зо­вать­ся куп­лен­ный сер­ти­фи­кат. Пред­по­ло­жим, что его мы сохра­ни­ли в фай­лах /etc/pki/coturn/public/cert.pem и /etc/pki/coturn/private/cert.key.

Теперь откры­ва­ем кон­фи­гу­ра­ци­он­ный файл сервера:

vi /etc/coturn/turnserver.conf

Сни­ма­ем ком­мен­та­рии и пра­вим зна­че­ния для опций:

cert=/etc/pki/coturn/public/cert.pem

pkey=/etc/pki/coturn/private/cert.key

Пере­за­пус­ка­ем сервис:

systemctl restart coturn

4. Только STUN или TURN

По умол­ча­нию, coturn запус­ка­ет­ся и рабо­та­ет в режи­ме STUN/TURN. Если нуж­но, что­бы рабо­тал толь­ко один из них, откры­ва­ем настройки:

vi /etc/coturn/turnserver.conf

а) если нужен толь­ко STUN:

stun-only

б) если нужен толь­ко TURN:

no-stun

Пере­за­пус­ка­ем сервис:

systemctl restart coturn

Использование бесплатных серверов STUN/TURN

Мы рас­смот­ре­ли про­цесс уста­нов­ки и настрой­ки сво­е­го сер­ве­ра. Одна­ко, как вре­мен­ное реше­ние, мы можем исполь­зо­вать пуб­лич­ные бес­плат­ные. Спис­ки дан­ных сер­ве­ров мож­но лег­ко най­ти в сети. При­ве­дем несколь­ко примеров.

Серверы в России

stun.chathelp.ru:3478

stun.comtube.ru:3478

stun.comtube.ru:3478

Серверы Google

stun.l.google.com:19302

stun1.l.google.com:19302

stun2.l.google.com:19302

stun3.l.google.com:19302

stun4.l.google.com:19302