artem
05.02.2018
4807

Настройка WebRTC в Asterisk 13

В данной статье речь пойдёт о настройке Asterisk 13 для подключения клиентов по WebRTC. Каждый компонент, требуемый для работы WebRTC, будет описан в отдельном разделе.
(Приведённые настройки рассчитаны на CentOS 6, FreePBX 13 и Asterisk 13, приведена настройка для канала chan_sip).

DNS-имя

Первое, что нужно для нормальной работы WebRTC – DNS-имя для вашего сервера Asterisk. В принципе, WebRTC будет работать и с IP-адресом, но такое решение годится только для тестирования. В описываемом примере DNS-имя сервера Asterisk будет fubar-pbx.local. Указывать DNS-имя где-либо в настройках самого сервера телефонии не обязательно, поэтому переходим к следующему пункту.

 

SSL-сертификат

SSL-сертификат для работы WebRTC нужен обязательно. Соединение по websocket может быть нешифрованным, но голос может передаваться только по SRTP с использованием DTLS, наличие сертификата для этого обязательно. Для нормальной работы WebRTC, сертификат должен быть доверенным для всех браузеров, в которых будет запускаться WebRTC-клиент, поэтому сертификат придётся купить или воспользоваться корпоративным центром сертификации.
Для тестирования сгодится и сертификат, сгенерированный с помощью EasyRSA, открытый ключ полученного центра сертификации даже можно будет сделать доверенным для клиентов и использовать полученный сертификат в продашн. Естественно, в поле сертификата CN должно быть указано DNS-имя (или IP-адрес, если Вы всё-таки решили использовать IP-адрес). Ниже приведены команды, с помощью которых можно создать сертификат, используя актуальную версию EasyRSA (скачивание, распаковка и переход в директорию с EasyRSA – упражнение для читателя).

yes | cp ./vars.example ./vars
# Заполняем параметры EasyRSA приемлимыми значениями
sed -ri ‘s|^#set_var EASYRSA_REQ_COUNTRY[[:space:]]+.*|set_var EASYRSA_REQ_COUNTRY      “RU”|;
s|^#set_var EASYRSA_REQ_PROVINCE[[:space:]]+.*|set_var EASYRSA_REQ_PROVINCE     “Province”|;
s|^#set_var EASYRSA_REQ_CITY[[:space:]]+.*|set_var EASYRSA_REQ_CITY     “City”|;
s|^#set_var EASYRSA_REQ_ORG[[:space:]]+.*|set_var EASYRSA_REQ_ORG       “Organization”|;
s|^#set_var EASYRSA_REQ_EMAIL[[:space:]]+.*|set_var EASYRSA_REQ_EMAIL   “root@fubar-pbx.local”|;
s|^#set_var EASYRSA_REQ_OU[[:space:]]+.*|set_var EASYRSA_REQ_OU         “Unit”|’ ./vars
 
sed -ri ‘s|^#set_var EASYRSA_KEY_SIZE[[:space:]]+.*|set_var EASYRSA_KEY_SIZE    2048|;
s|^#set_var EASYRSA_ALGO[[:space:]]+.*|set_var EASYRSA_ALGO             rsa|;
s|^#set_var EASYRSA_CA_EXPIRE[[:space:]]+.*|set_var EASYRSA_CA_EXPIRE   3650|;
s|^#set_var EASYRSA_CERT_EXPIRE[[:space:]]+.*|set_var EASYRSA_CERT_EXPIRE       3650|;
s|^#set_var EASYRSA_DIGEST[[:space:]]+.*|set_var EASYRSA_DIGEST         “sha256″|’  ./vars
 
# Создаём ключ и сертификат центра сертификации
./easyrsa –batch init-pki
./easyrsa –batch –req-cn=”$(uuid)” build-ca nopass
 
# Создаём и подписываем сертификат для сервера
./easyrsa –batch –req-cn=fubar-pbx.local gen-req FubarPBX nopass
./easyrsa –batch sign server FubarPBX
 
# Конвертируем полученный сертификат в формат PEM
openssl x509 -in pki/issued/FubarPBX.crt -out pki/issued/FubarPBX.pem -outform PEM
 

Нужные нам файлы:
./pki/ca.crt – сертификат центра сертификации
./pki/issued/FubarPBX.pem – сертификат сервера
./pki/private/FubarPBX.key – закрытый ключ сервера

 

Все эти файлы нужно загрузить через модуль FreePBX «Certificate Management» (выберите пункт «New Certificate» → «Upload Certificate» при добавлении сертификата)

В поле Private Key вставьте закрытый ключ, в поле Certificate – сертификат, в поле Trusted Chain – сертификат центра сертификации, затем нажмите «Generate Certificate» (FreePBX сохранит данные сертификата в файлы в директории /etc/asterisk/keys).

 

STUN-сервер

Даже если между клиентом и сервером не будет NAT, для нормальной работы WebRTC требуется наличие механизма ICE, как минимум, для того, чтобы клиент и сервер могли определить, какой из своих IP-адресов указывать в SDP. Совсем без ICE, WebRTC работать не будет, т.к. в заголовки c= в SDP будут вписываться либо все IP-адреса хоста, либо ни одного. Для реализации ICE мы поднимем простой STUN-сервер, он не поможет нам обойти большую часть современных NAT, но от него это и не требуется. NAT будем обходить с помощью привычного механизма SIP Comedia, а STUN здесь нужен для того, чтобы клиент и сервер WebRTC могли определить правильный IP-адрес для подстановки в SDP.

STUN-сервер желательно установить на другом хосте (не на сервере Asterisk), на CentOS 6 можно поставить из EPEL пакет stun-server. Для работы STUN-сервера необходимо наличие двух IP-адресов, в нашем случае это будут адреса 192.168.100.55/24 и 192.168.100.56/24, оба настроены на сетевом интерфейсе eth0.

Также нам понадобится init-скрипт для STUN-сервера (в пакет stun-server он почему-то не входит), приведённый init-скрипт был позаимствован здесь 

#!/bin/sh
#
#   Startup/shutdown script for the STUN-Server
#
#   Linux chkconfig stuff:
#
#   chkconfig: 35 90 10
#   description: Startup/shutdown script for the STUN-Server
#
 
# Source function library.
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
else
        exit 0
fi
 
DAEMON=/usr/sbin/stun-server
IP1=192.168.100.55
IP2=192.168.100.56
 
prog=stun-server
 
start () {
        echo -n $”Starting $prog: “
 
        # start daemon
        daemon $DAEMON -b -h $IP1 -a $IP2 2>/dev/null
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/stun-server
        return $RETVAL
}
 
stop () {
        # stop daemon
        echo -n $”Stopping $prog: “
        killproc $DAEMON
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/stun-server
}
 
restart() {
        stop
        start
}
 
case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                restart
        ;;
        condrestart)
                [ -f /var/lock/subsys/stun-server ] && restart || :
        ;;     
        status)
                status $DAEMON
        ;;
        *)
 
        echo $”Usage: $prog {start|stop|restart|condrestart|status}”
        exit 1
esac
 
exit $RETVAL
Скрипт нужно сохранить в файл /etc/init.d/stun-server

Что делать дальше, должно быть очевидно

chkconfig –add stun-server
service stun-server start

Если stun-server не работает можете запустить его вручную и посмотреть, на что он ругается

stun-server -v -h 192.168.100.55 -a 192.168.100.56
 

Важное замечание насчёт STUN – STUN-сервер должен вернуть WebRTC-серверу IP-адрес, на который WebRTC-клиент сможет отправить RTP-трафик, и RTP-трафик дойдёт до WebRTC-сервера. Т.е. STUN-сервер, описанный здесь, подойдёт для подключения клиентов из локальной сети и из удалённых подразделений по VPN. Если в данном сценарии использовать, к примеру, публичный STUN-сервер, WebRTC-сервер подставит в SDP внешний IP-адрес и WebRTC-клиент будет пытаться отправлять RTP-трафик на внешний IP-адрес со всеми вытекающими последствиями.

Это ещё не всё, Asterisk тоже должен использовать настроенный STUN-сервер. Для этого добавьте в раздел [general] файла /etc/asterisk/rtp.conf следующие параметры:

icesupport=yes
stunaddr=192.168.100.55:3478
Если используете FreePBX, дополнительные параметры нужно указать в файле rtp_custom.conf следующим образом
[general](+)
icesupport=yes
stunaddr=192.168.100.55:3478 

Встроенный HTTP-сервер Asterisk

Встроенный HTTP-сервер Asterisk будет принимать websocket-соединения от WebRTC-клиентов, но для начала его нужно включить, для этого зайдите в раздел FreePBX «Settings» → «Advanced Settings»

Включите параметр «Enable TLS for the mini-HTTP Server» (параметр «Enable the mini-HTTP Server» не нужно включать, если не планируете использовать подключения к websocket без шифрования) и укажите путь к загруженному ранее сертификату и ключу.
Настройки в файле /etc/asterisk/http.conf (если не используете FreePBX):

[general]
enabled=no
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/asterisk/keys/FubarPBX.pem
tlsprivatekey=/etc/asterisk/keys/FubarPBX.key

Учётная запись SIP для подключения webrtc-клиента

Создайте обычную учётную запись для канала chan_sip и укажите дополнительно следующие параметры:

NAT Mode: Yes – (force_rport,comedia)
Transport: WSS Only
Enable AVPF: Yes
Force AVP: Yes
Enable ICE Support: Yes
Enable rtcp Mux: Yes
Enable Encryption: Yes (SRTP only)
Enable DTLS: Yes
Use Certificate: FubarPBX (выберите из списка загруженный ранее сертификат)
DTLS Verify: Fingerprint
DTLS Setup: Act/Pass

 

Те же дополнительные параметры для указания в файле sip.conf в том же порядке:

nat=force_rport,comedia
transport=wss
avpf=yes
force_avp=yes
icesupport=yes
rtcp_mux=yes
encryption=yes
dtlsenable=yes
dtlscertfile=/etc/asterisk/keys/FubarPBX.crt
dtlsprivatekey=/etc/asterisk/keys/FubarPBX.key
dtlsverify=fingerprint
dtlssetup=actpass

Для примера был создан номер 100 со случайным паролем.

 

Подключение демо-клиента sipML5

Настройка WebRTC завершена, протестируем работу с помощью демо-клиента sipML5. sipML5 выбран из-за того, что только у него в демо-клиенте доступны все необходимые расширенные настройки.
Демо-клиент доступен по ссылке https://www.doubango.org/sipml5/call.htm?svn=250
Для начала зайдите в «Expert Settings»

Включите опцию «Disable Video», укажите URL для подключения к websocket (значение текстом wss://fubar-pbx.local:8089/ws) и укажите свой STUN-сервер (значение текстом – [{ url: ‘stun:192.168.100.55:3478’ }])
Сохраните расширенные настройки и вернитесь на основную страничку демо-клиента

Внесите базовые параметры для подключения и нажмите «Login», если все настройки внесены верно, сверху должна появиться надпись Connected (также команда «sip show peers» в CLI Asterisk должна отобразить подключение клиента с учётной записью 100). Также, если настройки, связанные со STUN, выполнены верно, звук должен проходить в обе стороны без какой-либо заметной задержки в начале разговора.

 

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices