Thank you for reading this post, don't forget to subscribe!
FreeSWITCH — открытая телефонная платформа, распространяемая в исходных кодах, созданная для удовлетворения потребности в управляемых голосом или текстом системах, масштабируемых от софтфонa до софтсвичa. FreeSWITCH может быть использован в качестве коммутатора, АТС, медиа шлюза или медиа сервера для приложений IVR, использующих простые или XML скрипты для управления алгоритмом обработки звонка. FreeSWITCH поддерживает разные протоколы, такие как SIP, H.323, IAX2 и Google Talk, что позволяет взаимодействовать c sipX, OpenPBX, Bayonne, Yate, или Asterisk.
1 Способ автоматическая установка:
Для установки Freeswitch в CentOS 7 подключим epel репозитарий от freeswitch. Подключение репозитария идет через RPM пакет с серверов разработчика. Для этого выполним в консоли следующую команду.
1 |
#yum install -y http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm epel-release |
Далее установим сам freeswitch.
1 |
#yum install -y freeswitch-config-vanilla freeswitch-lang-* freeswitch-sounds-* |
По окончании установки добавляем в автозагрузку командой.
1 |
#chkconfig freeswitch on |
и можем запускать
1 |
service freeswitch start |
Проверяем корректность запуска входом в консоль. выполняем команду fs_cli.
На этом установка freeswitch на CentOS закончена.
2 Способ сборка из исходников
Перед установкой необходимо подготовить сервер, установив необходимые утилиты и зависимости.
Сначала рекомендуется отключить Selinux, для этого необходимо поменять в файле /etc/selinux/config поменять значение параметра SELINUX с enforsing на disabled
Следующим шагом необходимо выполнить обновление системы, запускается командой yum update
Также рекомендуется установить базовые серверные утилиты, командой yum groupinstall Base
После выполнения данных шагов необходимо перезагрузить сервер командой reboot
После загрузки проверить статус Selinux, командой sestatus, результат должен выдать disabled
Далее нужно установить веб-сервре и mysql. В качестве веб-сервера используется Apache, в качестве mysql — Mariadb.
Установка Apache производится командой
yum install httpd
После установки необходимо запустить Apache b добавить его в автозапуск, командами
systemctl start httpd и
systemctl enable httpd .
Далее необходимо установить Mariadb, командой
yum install mariadb-server mariadb
Также рекомендуется выполнить первоначальную настройку Mariadb с помощью команды mysql_secure_installation
Также необходимо установить дополнительные зависимости:
yum install php php-pdo php-mysql sqlite-devel pcre-devel speex-devel libedit-devel bison patch ncurses-devel unixODBC-devel openssl-devel gnutls-devel libogg-devel autoconf automake gcc-c++ git-core libjpeg-devel libtool libjpeg-devel kernel-devel git xz-devel mesa-dri-drivers libXv libXScrnSaver xorg-x11-fonts* libXScrnSaver curl-devel libtiff-devel libjpeg-devel subversion fontconfig libICE libSM libX11 libXau libxcb libXcursor libXext libXfixes libXi libXinerama libXrandr libXrender libXScrnSaver libXv portaudio portaudio-devel
Также рекомендуется установить и настроить ODBC коннектор, если он отсутствует в системе:
yum install unixODBC-devel mysql-connector-odbc
Далее необходимо настроить ODBC с помощью файла /etc/odbcinst.ini в большинстве случаев нет необходимости вносить правки. Ниже приведен примерный вид данного файла — секция [MySQL]
Далее необходимо заполнить файл /etc/odbc.ini при его отсутствии — необходимо создать и внести в него следующие данные:
1 2 3 4 5 6 7 8 |
[MySQL-fusionpbx] Description=MySQL connection to 'fusionpbx' database Driver = MySQL Server = localhost Port = 3306 Database = fusionpbx Option = 3 Socket = /var/lib/mysql/mysql.sock |
Далее необходимо скачать через git исходный код FreeSwitch.
Для этого необходимо перейти в директорию /usr/src и выполнить команду:
git clone -b v1.8 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch
Далее перейти в директорию с кодом: cd /usr/src/freeswitch
И запустить конфигурацию командой ./bootstrap.sh -j
Далее перед продолжением установки рекомендуется раскомментировать дополнительные модули в файле modules.conf
Примерный вид приведен ниже на скриншоте:
Далее необходимо запустить продолжение конфигурации командой
./configure –enable-portable-binary –prefix=/usr –localstatedir=/var –sysconfdir=/etc –with-gnu-ld –with-openssl –enable-core-odbc-support –enable-zrtp –enable-static-v8 –disable-parallel-build-v8
при удачном конфигурировании будет выдан список директорий, с которыми работает FreeSwitch
Далее вызываем команду make
Для полной установки вызывается команда
make install
После установки, отобразится оповещение об успешном разворачивании FreeSwitch, а также будут предложены дальнейшие шаги: установка звуковых файлов, апгрейд версии FreeSwitch, установка конфигурационных файлов по-умолчанию.
Далее рекомендуется установить стандартные аудиофайлы различного качества в англоязычном и русскоязычном форматах, а также файлы музыки в ожидании.
1 2 3 |
make sounds-install make moh-install make sounds-ru-install |
Например:
1 2 3 |
make hd-moh-install make hd-sounds-install make hd-sounds-ru-install |
Следующим шагом необходимо создать пользователя FreeSwitch и установить права на файлы и директории FreeSwitch, а также создать директорию для PID-файла:
1 2 3 4 5 6 7 |
useradd freeswitch chown -R freeswitch:freeswitch /usr/bin/freeswitch chmod -R 770 /usr/bin/freeswitch chmod -R 750 /usr/freeswitch/bin/* mkdir /run/freeswitch chown -R freeswitch:freeswitch /run/freeswitch |
А также необходимо скопировать файл юнита для запуска FreeSwitch
1 |
cp/usr/src/freeswitch/build/freeswitch.service /etc/systemd/system/multi-user.target.wants/ |
Рекомендуется привести его к следующему виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
[Unit] Description=freeswitch After=syslog.target network.target local-fs.target [Service] ; service Type=forking RuntimeDirectory=freeswitch PIDFile=/run/freeswitch/freeswitch.pid PermissionsStartOnly=true ExecStart=/usr/bin/freeswitch -ncwait -nonat -run /run/freeswitch TimeoutSec=45s Restart=always ; exec WorkingDirectory=/run/freeswitch User=freeswitch Group=daemon LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=60000 ;LimitSTACK=240 LimitRTPRIO=infinity LimitRTTIME=7000000 IOSchedulingClass=realtime IOSchedulingPriority=2 CPUSchedulingPolicy=rr CPUSchedulingPriority=89 UMask=0007 [Install] WantedBy=multi-user.target |
Далее необходимо создать конфигурационный файл, в котором будут описаны разрешения freeswitch по-умолчанию:
1 |
vim /usr/lib/tmpfiles.d/freeswitch.conf |
И прописать в него следующие параметры:
1 |
d /run/freeswitch 770 freeswitch freeswitch |
Далее — производится перезапуск службы daemon и запускается служба FreeSwitch:
1 2 3 |
systemctl daemon-reload systemctl start freeswitch.service |
Командой systemctl status freeswitch.service можно проверить статус службы
Вход в консоль FreeSwitch производится командой
fs_cli
Для выхода из консоли используется сочетание клавиш Ctrl+d
======================================================================
Настройка
Freeswitch в системе можно представить схематически следующим образом:
Здесь 10.200.16.215 – это IP адрес сетевого интерфейса ens32 сервера Linux.
По умолчанию в Freeswitch уже созданы номера 1000 – 1019. У всех номеров задан стандартный пароль регистрации 1234. И если Iptables пропускает SIP и RTP трафик, то на сервере можно сразу зарегистрироваться, используя порт 5060 по умолчанию.
После регистрации на freeswitch с номером 1000 с паролем по умолчанию можно позвонить на номер 5000 и услышать приветствие freeswitch. Здесь так же можно протестировать некоторые возможности freeswitch. При тестировании нужно убедиться, что firewall пропускает трафик! (на время теста firewall можно вообще отключить)
Вход в консоль freeswitch
# fs_cli
Выход из консоли
freeswitch@internal> control-D
Файлы конфигурации
Конфигурация freeswitch лежит здесь
/usr/local/freeswitch/conf/
Структура каталога основных конфигурационных файлов:
autoload_configs – каталог загружаемых при старте системы модулей
dialplan – каталог планов набора. Здесь для каждого плана набора создается xml файл с общим описанием и каталог с детальным описанием планов наборов различных направлений. Планы набора направлений подгружаются по очереди по алфавиту, поэтому лучше планы набора начинать называть цифрами, что бы обеспечить правильную последовательность загрузки.
default
00_in.xml
01_in_supp.xml
default.xml
directory – каталог с описанием абонентских номеров, которые будут подключаться и работать через Freeswitch. Здесь есть файл с общим описанием пользователей и их групп и одноименная папка, содержащая множество файлов. Каждый файл соответствует одному абоненту.
default
1000.xml – описание абонента с номером 1000
1001.xml – описание абонента с номером 1001
….
1019.xml
default.xml
default.xml
sip_profiles – каталог содержащий профили сервера Freeswitch. Главные параметры профиля – это то, IP адрес и порт, на котором работает это SIP профиль. В простейшем случае имеется один профиль, работающий на всех IP адресах сервера и порту 5060. В конфигурации по умолчанию создано два профиля. Первый профиль Internal, работающий на порту 5060, второй профиль external, работающий на порту 5080. Директория, имеющая тоже название, что и имя профиля содержит описание внешних каналов сервера Freeswitch – сущностей gateway.
external
example.xml
external.xml
internal.xml
vars.xml – файл, определяющий ряд глобальных переменных, которые можно использовать при построении конфигурационных файлов.
Допустим необходимо реализовать следующую
схему, как показано на рисунке:
И абоненты и внешний стык работают на порту 5060 – поэтому необходим только один профиль SIP. Остальные профили в могут быть удалены в папке sip_profiles (а лучше переименованы для будущего подсматривания), что бы в при загрузке Freeswitch их «не видел». Файлы можно переименовать таким образом, что бы они не имели расширение xml, а имели расширение например такое: xml.removed.
Необходимая структура файлов будет иметь вид:
Исключение ненужных профилей из конфигурации Freeswitch:
# cd /usr/local/freeswitch/conf/sip_profiles
# mv internal-ipv6.xml internal-ipv6.xml.removed
# mv external-ipv6.xml external-ipv6.xml.removed
# mv internal.xml internal.xml.removed
# mv external.xml external.xml.removed
# mv external/example.xml external/example.xml.removed
# mv external-ipv6/example.xml external-ipv6/example.xml.removed
# mv ../directory/default/example.com.xml ../directory/default/example.com.xml.removed
# systemctl restart freeswitch
Убеждаемся, что ни один профиль не загружен:
fs_cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> sofia status Name Type Data State ================================================================================== ================================================================================== 0 profiles 0 aliases Убеждаемся, что не загружен ни один канал - gateway: > sofia status gateway Profile::Gateway-Name Data State Ping Time IB Calls(F/T) OB alls(F/T) ================================================================================== ================================================================================== 0 gateways: Inbound(Failed/Total): 0/0,Outbound(Failed/Total):0/0 <b>Исключение прослушивания ненужных портов</b> <b> </b>Freeswitch по умолчанию прослушивает следующие порты: <b>Исключение прослушивания ненужных портов</b> <b> </b>Freeswitch по умолчанию прослушивает следующие порты: |
После исключения из конфигурации профилей по умолчанию, порты 5060, 5061, 5080, 5081 более не прослушиваются.
Отключаем модуль VERTO, который разрешает работать Freeswitch с телефонами-браузерами по портам 8081, 8082, 1337 с использованием стандарта WEBRTC:
# nano /usr/local/freeswitch/conf /autoload_configs/modules.conf.xml
Комментируем строку:
<load module="mod_verto"/>
Должно получиться:
<!--<load module="mod_verto"/> -->
Настраиваем Freeswitch на работу с системой mod_event_socket на порту 8021. Это необходимо для управления Freeswitch через API. Разрешаем принимать запросы на порту 8021.
# nano /usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml
Меняем строку
<param name="listen-ip" value="::"/>
на:
<param name="listen-ip" value="0.0.0.0"/>
Открываем порты RTP в диапазоне 8000 – 32768
# nano autoload_configs/switch.conf.xml
Приводим блок RTP port range к виду
<!-- RTP port range -->
<param name="rtp-start-port" value="8000"/>
<param name="rtp-end-port" value="32768"/>
Перезагружаем сервис:
# systemctl restart freeswitch.service
Проверяем порты, которые слушает Freeswitch:
# netstat -ltupn | grep freesw
tcp 0 0 0.0.0.0:8021 0.0.0.0:* LISTEN 16208/freeswitch
Для того, что бы Freeswitch мог работать по сети вносим минимальные правки в iptables. Например, так:
# nano /etc/sysconfig/iptables
-A INPUT -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -p udp -m udp --dport 8000:32768 -j ACCEPT
# systemctl restart iptables.service
Здесь мы открываем всем порт 5060 для приема SIP сообщений и порты 8000 – 32768 для приема RTP трафика.
Начало конфигурирования
Теперь можно приступить к конфигурированию собственного профиля, каналов и настройке системы Freeswitch
При конфигурировании системы после добавления новых файлов конфигурации необходимо выполнять:
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# fs_cli
> reloadxml
или просто
# fs_cli -x "reloadxml"
При глобальный изменения (не просто добавлении нового абонента), нужно рестартовать весь Freeswitch командой:
# systemctl restart freeswitch
Смена пароля клиентам по умолчанию для всех клиентов freeswitch выполняется так:
# cd /usr/local/freeswitch/conf
# nano vars.xml
Меняем пароль 1234 в строке
<X-PRE-PROCESS cmd="set" data="default_password=1234"/>
Например на что-то более суровое:
<X-PRE-PROCESS cmd="set" data="default_password=12345678"/>
Затем применяем изменения в консоли fs выполняем
> reloadxml
> sofia profile restart all
Запись событий (логов) freeswitch в файл:
Подготавливаем лог-файл:
# touch /var/log/freeswitch.log
# chown freeswitch:freeswitch /var/log/freeswitch.log
Правим конфигурацию freeswitch:
# nano /usr/local/freeswitch/conf/autoload_configs/logfile.conf.xml
Ищем строку
<!--<param name="logfile" value="/var/log/freeswitch.log"/>-->
Для записи лог в файл строку нужно раскомментировать, а для этого убрать xml комментарии <!-- и -->. Должно получиться:
<param name="logfile" value="/var/log/freeswitch.log"/>
Раскомментировать и изменить строку с параметром maximum-rotate
<param name="maximum-rotate" value="5"/>
И потом вот эту строчку, определяющую максимальный размер файла::
<param name="rollover" value="10485760"/>
Перезапускаем freeswitch:
# systemctl restart freeswitch.service
Иногда лог-файлы freeswitch переполняются и Freeswitch не может нормально работать. При этом в консоли fs_cli постоянно сыпятся логи:
2016-05-21 19:00:25.931136 [NOTICE] mod_logfile.c:213 New log started.
2016-05-21 19:00:25.931136 [NOTICE] mod_logfile.c:213 New log started.
В этом случае необходимо остановить freeswitch
# systemctl stop freeswitch.service
Затем удалить файл логов и вновь создать его
# rm -f /var/log/freeswitch.log
# touch /var/log/freeswitch.log
# chown freeswitch:freeswitch /var/log/freeswitch.log
Затем запустить Freeswitch заново:
# systemctl restart freeswitch.service
Установка русских звуков в freeswitch
# cd /usr/local/freeswitch/conf
# nano vars.xml
Вставляем строку
<X-PRE-PROCESS cmd="set" data="default_language=ru"/>
В консоли fs выполняем
> reloadxml
Создание нового профиля:
# /usr/local/freeswitch/conf
# touch sip_profiles/supportsvttk.xml
# nano sip_profiles/supportsvttk.xml
Содержимое файла
[codesyntax lang="xml" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<aliases> </aliases> <gateways> <X-PRE-PROCESS cmd="include" data="supportsvttk/*.xml"/> </gateways> <domains> <!-- Псевдонимы не создаются, все домены сканируются на предмет подключения gateway --> <domain name="all" alias="false" parse="true"/> </domains> <settings> <param name="user-agent-string" value="FreeSWITCH TTK"/> <!-- Название SIP-агента--> <param name="caller-id-type" value="rpid"/> <!-- Remote-Party-ID header --> <!--Диагностика --> <param name="debug" value="0"/> <!-- Дебаг отключен --> <param name="sip-trace" value="no"/> <!-- Трассировка отключена --> <param name="sip-capture" value="no"/> <!-- Захват SIP трафика отключен --> <param name="log-auth-failures" value="true"/> <!-- Включаем логи неуспешных попыток авторизации--> <!-- Параметры DTMF --> <param name="rfc2833-pt" value="101"/> <!-- Идентификатор DTMF 2833 в трафике RTP--> <param name="dtmf-duration" value="2000"/> <param name="dtmf-type" value="rfc2833"/> <param name=”liberal-dtmf” value=”true”/> <!-- всегда предлагать rfc2833, а принимать и rfc2833, и info dtmf --> <!-- Параметры WatchDOG (перезапуск сервера, если он вдруг перестал отвечать) - выключен --> <param name="watchdog-enabled" value="false"/> <!-- Главные параметры! На каком порту и на каком Ip адресе будет работать профиль--> <param name="sip-port" value="5060"/> <param name="sip-ip" value="$${local_ip_v4}"/> <param name="rtp-ip" value="$${local_ip_v4}"/> <param name="nonce-ttl" value="60"/> <!-- Параметр TTL--> <param name="ext-rtp-ip" value="auto-nat"/> <param name="ext-sip-ip" value="auto-nat"/> <!-- ACL: Access List --> <!--<param name="apply-nat-acl" value="nat.auto"/>--> <!--<param name="local-network-acl" value="localnet.auto"/>--> <param name="apply-inbound-acl" value="alcgw"/> <!-- С подсетей указанных в aclgw в файле autoload_configs/acl.conf.xml разрешено совершать звонки без аутентификации --> <!--<param name="apply-register-acl" value="acluserreg"/>--> <!--Глобальный ACL для регистрации. Лист нужно создать в autoload_configs/acl.conf.xml--> <!-- --> <param name="dialplan" value="XML"/> <param name="context" value="supportsvttk"/> <!-- Какой dialplan будет включаться при приходе вызова --> <param name="max-proceeding" value="2000"/><!-- Максимальное количество обрабатываемых диалогов --> <param name="hold-music" value="$${hold_music}"/><!-- MOH --> <param name="all-reg-options-ping" value="true"/> <!-- Отправлять периодически параметры OPTION в сторону клиента --> <param name="nat-options-ping" value="true"/> <!-- Отправлять периодически параметры OPTION в сторону клиента за NAT --> <param name="unregister-on-options-fail" value="true"/> <!-- Убивать регистрацию, если пакеты OPTION не имеют ответа --> <param name="sip-options-respond-503-on-busy" value="true"/><!-- Отвечать на SIP OPTION ошибкой 503, если у FS проблема --> <param name="auth-calls" value="true"/><!--авторизация включена глобально--> <param name="inbound-reg-force-matching-username" value="true"/> <!-- User и authuser должны совпадать--> <!-- Кодеки и RTP --> <param name="inbound-codec-prefs" value="PCMA, PCMU"/> <param name="outbound-codec-prefs" value="PCMA, PCMU"/> <param name="disable-transcoding" value="true"/><!-- Отключить перекодироку. FS будет предлагаеть удаленной стороне только кодеки вызывающей стороры--> <param name=”inbound-codec-negotiation” value="generous"/> <!-- Кто главный в выборе кодека generous - удаленная сторона --> <param name="inbound-late-negotiation" value="true"/> <!-- Сначала читаем dialplan, потом выбираем кодек --> <param name="rtp-timer-name" value="soft"/> <param name="auto-jitterbuffer-msec" value="60"/><!-- Буфер для сглаживания rtp jitterа --> <param name="rtp-timeout-sec" value="300"/> <!-- Период неактивности RTP, после которого соединение разрывается --> <param name="rtp-hold-timeout-sec" value="1800"/> <!-- Период неактивности RTP, после которого соединение разрывается --> <!-- Прочие параметры SIP --> <param name="enable-timer" value="false"/> <!-- Включить таймеры RFC 4028 SIP Session Timers Этот механизм определяет и исправляет SIP каналы которые не были закрыты нормальным способом--> <param name="auth-all-packets" value="false"/> <!-- Не используется аутентификация при получении всех пакетов (только register и invite)--> <param name="enable-100rel" value="true"/> <param name="challenge-realm" value="auto_from"/> <!-- Установка realm, используется поле from в качестве значения SIP realm--> <param name="manage-presence" value="true"/> <!--Для того что бы юзеры могли подписываться на извещение состояния сервера сообщением SUBSCIBE --> <param name="accept-blind-auth" value="false"/><!-- если установлен в true, то любая аутентификация принимается без проверки --> <param name="accept-blind-reg" value="false"/><!-- если установлен в true, то любая регистрация принимается без проверки--> </settings> </profile> |
[/codesyntax]
Создание папки для файлов с описанием каналов – шлюзов – gateway-ев
# mkdir sip_profiles/supportsvttk
Добавляем права на созданные файлы и папки и перезагружаемся:
# systemctl restart freeswitch
Проверяем в консоли Freeswitch и убеждаемся, что наш профиль загрузился:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
> sofia status Name Type Data State =================================================================================== supportsvttk profile sip:mod_sofia@10.200.16.215:5060 RUNNING (0) =================================================================================== 1 profile 0 aliases и > sofia status profile supportsvttk ================================================================================== Name supportsvttk Domain Name N/A Auto-NAT false DBName sofia_reg_supportsvttk Pres Hosts Dialplan XML Context supportsvttk Challenge Realm auto_from RTP-IP 10.200.16.215 SIP-IP 10.200.16.215 URL sip:mod_sofia@10.200.16.215:5060 BIND-URL sip:mod_sofia@10.200.16.215:5060;transport=udp,tcp HOLD-MUSIC local_stream://moh OUTBOUND-PROXY N/A CODECS IN PCMA, PCMU CODECS OUT PCMA, PCMU TEL-EVENT 101 DTMF-MODE rfc2833 CNG 13 SESSION-TO 0 MAX-DIALOG 2000 NOMEDIA false LATE-NEG true PROXY-MEDIA false ZRTP-PASSTHRU false AGGRESSIVENAT false CALLS-IN 0 FAILED-CALLS-IN 0 CALLS-OUT 0 FAILED-CALLS-OUT 0 REGISTRATIONS 0 |
[/codesyntax]
Проверяем порты, слушающие Freeswitch:
1 2 3 4 |
# netstat -ltupn | grep freeswi tcp 0 0 0.0.0.0:8021 0.0.0.0:* LISTEN 16146/freeswitch tcp 0 0 10.200.16.215:5060 0.0.0.0:* LISTEN 16146/freeswitch udp 0 0 10.200.16.215:5060 0.0.0.0:* 16146/freeswitch |
После изменения параметров профиля, его перезагрузку можно выполнить так:
# fs_cli -x "sofia profile supportsvttk killgw samara-ast1" && sleep 30 && fs_cli -x "sofia profile supportsvttk rescan"
Создание описания абонентов
Создадим трех абонентов – 11, 12, 50
# cd /usr/local/freeswitch/conf/directory
Создаем общий файл описания абонентов
# touch supportsvttk.xml
Содержимое файла:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<include> <domain name="sip.svttk.ru"> <params> <param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/> </params> <variables> <variable name="record_stereo" value="true"/> </variables> <groups> <group name=" sip.svttk.ru "> <users> <X-PRE-PROCESS cmd="include" data="supportsvttk/*.xml"/> </users> </group> </groups> </domain> </include> |
[/codesyntax]
Домен sip.svttk.ru должен быть прописан в DNS. В нашем случае на Ip 10.200.16.215
Далее создаем папку, где для каждого абонента будет создаваться отдельный файл с его описанием:
# mkdir supportsvttk
Наконец файлы абонентов создаем по шаблону:
# touch supportsvttk/11.xml
# nano supportsvttk/11.xml
Содержимое файла:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<include> <user id="12"> <!-- Номер и логин --> <params> <!-- Пароль для регистрации. Если его не будет - авторизация будет идти по IP адресу--> <param name="password" value="12345xyz"/> <!-- IP адрес с которого можно авторизовываться. Если его не будет, то авторизовываться можно с любого ip --> <param name="auth-acl" value="10.10.0.0/16,192.168.1.0/24"/> </params> <variables> <variable name="dtmf-type" value="rfc2833"/> <!-- режим DTMF --> <variable name="user_context" value="supportsvttk"/> <!-- контекст номера --> <!--Можно задать имя и номер, которое будут подставляться при всех исх вызовах с номера--> <!--<variable name="effective_caller_id_name" value="2057553"/>--> <!--<variable name="effective_caller_id_number" value="2057553"/>--> <variable name="sip-force-expires" value="3600"/> <!-- период перерегистрации --> </variables> </user> </include> |
[/codesyntax]
Аналогично создаются и другие файлы 12.xml и 50.xml
Пробуем зарегистрироваться на сервере 10.200.16.215 на порту 5060 с логином 11, 12 или 50 и паролем 12345xyz.
Настройки ZoyPer:
Регистрация прошла успешно.
ри регистрации в консоли будет писаться:
2016-05-15 18:27:39.192559 [WARNING] sofia_reg.c:1775 SIP auth challenge (REGISTER) on sofia profile 'supportsvttk' for [11@sip.svttk.ru] from ip 10.10.69.141
2016-05-15 18:27:39.212547 [DEBUG] sofia_reg.c:3002 IP [10.10.69.141] passed ACL check [10.10.69.0/24,192.168.1.0/24]
Проверка статуса регистрации абонентов
Для всех абонентов:
> sofia status profile supportsvttk reg
Для конкретного абонента
> sofia status profile supportsvttk reg 11
Или для конкретного абонента можно посмотреть и так
> sofia status profile supportsvttk reg 11@10.10.69.141
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Registrations: ================================================================================== Call-ID: Mzk2ZDQyNThiMDhmNmU1MjAxZmVlMDJhODcyMTZiYzc. User: 11@sip.svttk.ru Contact: "11" <sip:11@10.10.69.141:5060;rinstance=e4f819a88eee6403;transport=UDP> Agent: Zoiper for Windows 2.38 rev.16635 Status: Registered(UDP)(unknown) EXP(2016-05-15 19:28:39) EXPSECS(3170) Ping-Status: Reachable Ping-Time: 9.57 Host: kvs.svttk.ru IP: 10.10.69.141 Port: 5060 Auth-User: 11 Auth-Realm: sip.svttk.ru MWI-Account: 11@sip.svttk.ru Total items returned: 1 ================================================================================== |
Обновить регистрацию конкретного абонента
> sofia profile supportsvttk flush_inbound_reg 11@10.10.69.141 reboot
Если не написать, кого сбрасываем, то обнуляться все регистрации.
> sofia profile supportsvttk flush_inbound_reg reboot
Диалог SUBSCRIBE и NOTIFY.
В описанной настройке не используется диалог SUBSCRIBE и NOTIFY. Этот диалог разрешает пользователю подписаться на события сервера и получать периодически уведомления о его состоянии. Включение этого диалога выполняется на
- SIP клиенте. В ZoyPer «Subscribe for MWI»=«both»
- На сервере freeswitch в sip профиле параметр <param name="manage-presence" value="true"/>
Диалог SUBSCRIBE и NOTIFY выглядит так, как показано ниже. При этом проверка состояния клиента запросами OPTION не производиться.
Другие варианты диалога, при выключенной возможности на Freeswitch и при выключенной возможности на стороне клиента:
В последнем случае Freeswitch в текущей конфигурации будет проверять состояние клиента запросами OPTION.
Создание внутреннего плана набора
Создадим базовую конфигурацию dialplan и дадим возможность абонентам звонить друг другу.
# cd /usr/local/freeswitch/conf
# touch dialplan/supportsvttk.xml
# nano dialplan/supportsvttk.xml
Содержимое файла:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 |
<include> <context name="supportsvttk"> <!-- Модуль защиты от закольцовывания звонков--> <extension name="unloop"> <condition field="${unroll_loops}" expression="^true$"/> <condition field="${sip_looped_call}" expression="^true$"> <action application="deflect" data="${destination_number}"/> </condition> </extension> <X-PRE-PROCESS cmd="include" data="supportsvttk/*.xml"/> </context> </include> |
[/codesyntax]
Этот файл описывает правила обработки и предотвращения петель.
Далее создаем папку, где будут храниться правила набора:
# mkdir dialplan/supportsvttk
# touch dialplan/supportsvttk/01_internal.xml
# nano dialplan/supportsvttk/01_internal.xml
Содержимое файла:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 |
<include> <extension name="call_internal"> <condition field="destination_number" expression="^(1[12])$|^(50)$"> <!-- Звоним --> <action application="bridge" data="user/$1@sip.svttk.ru"/> <!-- Кладем трубку --> <action application="hangup"/> </condition> </extension> </include> |
[/codesyntax]
Меняем права на созданные файлы и рестартуемся.
Теперь абоненты 11,12 и 50 могут позвонить друг другу по коротким номерам. Вызываемый абонент увидит в АОН короткий номер вызывающего абонента.
Исходящая и входящая связь. Asterisk.
Связь с внешним миром (с ТфОП) будет обеспечиваться через сервер Asterisk и станцию Si3000 ISKRATEL.
Соединение с Asterisk происходит с помощью номера 2057553
Входящие вызовы на 2057553 направляются на внутренний номер 12.
Конфигурация Asterisk:
Файл /etc/asterisk/extensions.conf:
[test-2057553]
exten => _XXXXXXX,1,Dial(${OUTTRUNKSI}/${EXTEN},120,t)
exten => _XXXXXXX,n,Hangup()
exten => _8XXXXXXXXXX,1,Dial(${OUTTRUNKSI}/${EXTEN},120,t)
exten => _8XXXXXXXXXX,n,Hangup()
;Во входящем контексте со стороны Si3000:
exten => 2057553,1,Dial(SIP/2057553gw/${EXTEN},120,t)
exten => 2057553,n,Hangup()
Файл /etc/asterisk/extensions.conf:
[2057553gw] ; тест Freeswitch
type=peer
host=10.200.16.215
port=5060
context=test-2057553
dtmfmode=rfc2833
deny=0.0.0.0/0.0.0.0
permit=10.200.16.215/255.255.255.255
insecure=port,invite
qualify=yes
disallow=all
allow=ulaw
allow=alaw
Создаем файл конфигурации шлюза на Freeswitch на номер 2057553.
# touch sip_profiles/supportsvttk/gw2057553.xml
# nano sip_profiles/supportsvttk/gw2057553.xml
Содержимое файла описание каналов - gateways:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<gateway name="samara-ast1"> <param name="username" value="xxx"/><!--Можно указать любое имя, главное, что бы оно было--> <param name="password" value="yyy"/><!--Можно указать любой пароль, главное, что бы он был--> <param name="register" value="false"/> <param name="realm" value="10.200.104.12"/> <param name="from-domain" value="sip.svttk.ru"/> <!-- дополнительные параметры, если на удаленном сервере нужно регистрироваться --> <!-- При это нужно выставить name="register" value="true" --> <!--<param name="proxy" value="10.200.104.12"/>--> <!--<param name="register-proxy" value="10.200.104.12"/>--> <!--<param name="expire-seconds" value="3600"/>--> <!--Период регистрации--> <!--<param name="retry-seconds" value="30"/>--> <!--Количество сек ожидания перед повторной регистрацией, если регистрация вдруг была неудачной--> <!--<param name="ping" value="25"/>--> <!--ОТправлять ping каждые 25 сек. При неответе считает шлюз аварийным и регистрацию прерываем --> <param name="context" value="supportsvttk"/><!-- Контекст для входящих вызовов--> <param name="caller-id-in-from" value="true"/> <!-- Использовать АОН входящего вызова в поле from исх вызовов через этот шлюз--> <!--<param name="contact-params" value="tport=tcp"/>--> <!--extra sip params to send in the contact--> </gateway> |
[/codesyntax]
Для того что бы Freeswitch установил соединение с IP удаленного сервера, как видно достаточно указать этот IP адрес в переменной realm. Это возможно потому, что часть переменных, при их отсутствии заменяется вышестоящими. На рисунке показана зависимость значений некоторых параметров друг от друга в описании gateway:
Параметр gateway name – самый главный, его обязательно нужно указывать. Параметр realm, если не указано другое, принимает значение gateway name. Параметр from-domain, если не указано другое, принимает значение realm и т.д.
Для того что бы разрешить Asterisk-у устанавливать соединения с Freeswitch без регистрации необходимо на Freeswitch создать список доступа – ACL, имя которого будет указано в переменной apply-inbound-acl файла sip-профиля sip_profiles/supportsvttk.xml. В созданном ранее sip-профиле имя этого списка доступа alcgw.
<param name="apply-inbound-acl" value="alcgw"/>
Список доступа alcgw создается в файле autoload_configs/acl.conf.xml
# nano autoload_configs/acl.conf.xml
Добавляем между тегами <network-lists> и </network-lists> блок:
<list name="alcgw" default="deny">
<node type="allow" cidr="10.200.104.12/32"/>
</list>
При попадании входящего вызова в ACL авторизация запрашиваться не будет. Это справедливо и для файлов из sip_profiles и для файлов из directory.
Применяем к созданным файлам права пользователя freeswitch и рестартуем сервис Freeswitch.
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# systemctl restart freeswitch.service
Проверяем состояние созданного канала:
Статус на Asterisk:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# asterisk -rx "sip show peer 2057553gw" * Name : 2057553gw Context : test-korolev-2057553 Transfer mode: open CallingPres : Presentation Allowed, Not Screened Expire : -1 Insecure : port,invite DTMFmode : rfc2833 ToHost : 10.200.16.215 Addr->IP : 10.200.16.215:5060 Defaddr->IP : (null) Codecs : (ulaw|alaw) Status : OK (1 ms) Статус на Freeswitch: freeswitch@kvs.svttk.ru> sofia status gateway samara-ast1 =================================================================== Name samara-ast1 Profile supportsvttk Scheme Digest Realm 10.200.104.12 Username xxx Password yes From <sip:xxx@sip.svttk.ru> Contact <sip:gw+samara-ast1@10.200.16.215:5060;tport=tcp;transport=udp;gw=samara-ast1> Exten xxx To sip:xxx@10.200.104.12 Proxy sip:10.200.104.12 Context supportsvttk Expires 3600 Freq 3600 Ping 0 PingFreq 0 PingTime 0.00 PingState 0/0/0 State NOREG Status UP Uptime 1335s CallsIN 0 CallsOUT 1 FailedCallsIN 0 FailedCallsOUT 0 =================================================================== |
[/codesyntax]
После изменения параметров описания шлюза (файла gw2057553.xml), его рестарт можно выполнить так:
# fs_cli -x "sofia profile supptechttk stop" && sleep 30 && fs_cli -x "sofia profile supptechttk start"
Создаем файлы описания диалпланов входящей и исходящей связи:
# touch dialplan/supportsvttk/10_in.xml
# touch dialplan/supportsvttk/20_out.xml
# nano dialplan/supportsvttk/10_in.xml
Содержимое файла:
<include>
<extension name="call_in">
<condition field="destination_number" expression="^(2057553)$">
<!-- Звоним -->
<action application="bridge" data="user/12@sip.svttk.ru"/>
<!-- Кладем трубку -->
<action application="hangup"/>
</condition>
</extension>
</include>
# nano dialplan/supportsvttk/20_out.xml
Содержимое файла, разрешающего звонить на 7ми значные номера:
<include>
<extension name="call_out">
<condition field="destination_number" expression="^([2-9][0-9]{6})$">
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>
<!--Выставляем номер и имя у вызывающего абонента через данный шлюз-->
<action application="set" data="effective_caller_id_number=2057553"/>
<action application="set" data="effective_caller_id_name=2057553"/>
<action application="bridge" data="sofia/gateway/samara-ast1/$1"/>
<action application="hangup"/>
</condition>
</extension>
</include>
Теперь можно звонить в город по ТфОП и принимать входящие вызовы на номер 2057553 абонентом 12. При выходе в город в качестве АОН будет подставляться номер 2057553.
При установлении вызова от абонента, каждый раз будет проходить процедура авторизации абонента. При этом на Freeswitch для клиента будут иницироваться переменные из профиля пользователя, которым можно в последствии манипулировать. Нормальная процедура авторизации при установлении вызова:
Для трассировки вызовов во Freeswitch существуют команды, включающие трассировки на профиле:
Включение / выключение трассировки в консоли Freeswitch:
> sofia profile supportsvttk siptrace on
> sofia profile supportsvttk siptrace off
При включенной трассировки в консоль будут ввалиться SIP сообщения вместе с основными событиями:
Изменить степень детализации логов консоли можно так:
> console loglevel 7 (режим DEBUG)
> console loglevel 6 (по умолчанию INFO)
> console loglevel – покажет текущий режим консоли
Уровни логирования могут быть такие:
0 "CONSOLE",
1 "ALERT",
2 "CRIT",
3 "ERR",
4 "WARNING",
5 "NOTICE",
6 "INFO",
7 "DEBUG"
Исходящая и входящая связь. Si3000.
# touch sip_profiles/supportsvttk/gw9938103.xml
# nano sip_profiles/supportsvttk/gw9938103.xml
Содержимое файла:
<gateway name="samara-si3000">
<param name="username" value="xxx"/><!--Можно указать любое имя, главное, что бы оно было-->
<param name="password" value="yyy"/><!--Можно указать любой пароль, главное, что бы он был-->
<param name="register" value="false"/>
<param name="realm" value="10.200.101.11"/>
<param name="from-domain" value="sip.svttk.ru"/>
<!-- дополнительные параметры, если на удаленном сервере нужно регистрироваться -->
<!-- При это нужно выставить name="register" value="true" -->
<!--<param name="proxy" value="10.200.101.11"/>-->
<!--<param name="register-proxy" value="10.200.101.11"/>-->
<!--<param name="expire-seconds" value="3600"/>--> <!--Период регистрации-->
<!--<param name="retry-seconds" value="30"/>--> <!--Количество сек ожидания перед повторной регистрацией, если регистрация вдруг была неудачной-->
<!--<param name="ping" value="25"/>--> <!--ОТправлять ping каждые 25 сек. При неответе считает шлюз аварийным и регистрацию прерываем -->
<param name="context" value="supportsvttk"/><!-- Контекст для входящих вызовов-->
<param name="caller-id-in-from" value="true"/> <!-- Использовать АОН входящего вызова в поле from исх вызовов через этот шлюз-->
<!--<param name="contact-params" value="tport=tcp"/>--> <!--extra sip params to send in the contact-->
</gateway>
Добавляем маршрут для входящей связи:
# nano dialplan/supportsvttk/10_in.xml
Приводим файл к виду:
<include>
<extension name="call_in">
<condition field="destination_number" expression="^(2057553)$">
<!-- Звоним -->
<action application="bridge" data="user/12@sip.svttk.ru"/>
<!-- Кладем трубку -->
<action application="hangup"/>
</condition>
</extension>
<extension name="call_in_si3000">
<condition field="destination_number" expression="^(9938103)$">
<!-- Звоним -->
<action application="bridge" data="user/11@sip.svttk.ru"/>
<!-- Кладем трубку -->
<action application="hangup"/>
</condition>
</extension>
</include>
Разрешаем Si3000 соединяться с Freeswitch без регистрации:
# nano autoload_configs/acl.conf.xml
Меняем ACL – alcgw. Добавляем туда IP 10.200.101.11.
<list name="alcgw" default="deny">
<node type="allow" cidr="10.200.104.12/32"/>
<node type="allow" cidr="10.200.101.11/32"/>
</list>
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# systemctl restart freeswitch.service
При работе со станцией Si3000 нужно иметь ввиду, что станция SI3000 для обмена сигнальными сообщениями используется один ip адрес (в нашем случае – 10.200.101.11), а для обмена RTP сообщениями – другие IP адреса (в нашем случае – 10.200.101.13). IP адрес 10.200.101.13 не нужно добавлять в ACL alcgw.
В описанной конфигурации RTP сообщения будут проходить через Freeswitch. Используя опцию bypass_media можно разрешить обмен сообщениями RTP между конечными точками напрямую.
Диаграмма работы Freswitch с Si3000 при входящем вызове будет следующей: