artem
05.02.2018
22705

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

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

WebRTC в Asterisk 13

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   «[email protected]»|;
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, выполнены верно, звук должен проходить в обе стороны без какой-либо заметной задержки в начале разговора.

Книга 101 функция Asterisk
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Скачать книгу
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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


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

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.