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. Пример программ, которые позволяют реализовать серверную часть:
- STUN Client and Server
- 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