Pull to refresh

Asterisk + FreeSwitch + Skype. Подробное руководство

Reading time 14 min
Views 50K


Доброго времени суток, жителям Хабра!

Имея опыт в области установки voip-серверов на базе Asterisk, решил предложить своё подробное руководство по установке call-центра на базе Asterisk в связке со Skype. В виду популяризации Skype эта сеть стала использоваться для call-центров многих компаний. Использование ее официального клиента очень ограничивает нас в возможностях. Данная сборка позволяет увеличить число одновременных вызовов со Skype-сети.

1. Обновляем сервер

Устанавливаем все необходимые пакеты и обновления. В консоли вводим команды:
apt-get update
apt-get upgrade
apt-get install build-essential mc automake autoconf bison flex libtool libncurses5-dev libssl-dev dahdi-source subversion x11vnc yate-qt4 yate-mysql yum op-panel
apt-get -f install
apt-get install yate-qt4 yate-mysql yum op-panel


2. Замечания по безопасности

Почти всегда сразу после установки сервера начинается подбор паролей по стандартному порту(22) протокола ssh к вашему серверу. Если не дай Бог, Вы поставите стандартный, известный «подборщикам» пароль, ваш сервер захватят и удалят все важные данные. Самый простой способ — изменить номер порта:

nano  /etc/ssh/sshd_config

Найдите строку (почти в самом начале): Port 22. Смените число 22 на любое, которое вам нравится, до бесконечности (желательно, не более 65535). Перезапустите ssh:

/etc/init.d/ssh restart

3. Установка Asterisk

3.1. Все устанавливается из репозиториев

apt-get install asterisk asterisk-mp3 asterisk-mysql asterisk-ooh323c asterisk-h323 asterisk-sounds-main asterisk-moh-opsound-g722 asterisk-moh-opsound-gsm asterisk-moh-opsound-wav

3.2. Установка Web GUI:

mkdir -p /root/asterisk/asterisk-gui
cd /root/downloads/asterisk-gui/
svn checkout http://svn.digium.com/svn/asterisk-gui/trunk asterisk-gui
svn checkout http://svn.digium.com/svn/asterisk-gui/branches/2.0/
cd /root/downloads/asterisk-gui/2.0/
./configure
make
make install # (Устанавливается в /var/lib/asterisk/)
cp -r /etc/asterisk /etc/asterisk.backup
chown -R asterisk:asterisk /var/lib/asterisk/

3.3. Добавляем в файл manager.conf данные для входа:

nano /etc/asterisk/manager.conf

enabled = yes
webenabled = yes
port = 5038
bindaddr = 127.0.0.1

[root]
secret = toor
read = system,call,log,verbose,command,agent,user,config
write = system,call,log,verbose,command,agent,user,config

Где «root» это администратор сервера, а «toor» это пароль администратора.
Редактируем http.conf:

nano /etc/asterisk/http.conf


enabled=yes 
enablestatic=yes
bindaddr = 127.0.01
redirect = / /static/config/cfgbasic.html
[post_mappings]
backups = /var/lib/asterisk/gui_backups

3.4. Проводим необходимые действия для завершения

cd /root/downloads/asterisk-gui/2.0/
make checkconfig

Удаляем папку /usr/share/asterisk/static-http/ перед созданием символьной ссылки:

ln -s /var/lib/asterisk/static-http/ /usr/share/asterisk/
mk dir /usr/share/asterisk/static-http/config
chmod 777 /usr/share/asterisk/static-http/config
/etc/init.d/asterisk restart

Проверить:

В Ubuntu корневая директория веб сервера Asterisk'a располагается в /usr/share/asterisk/static-http/,
а GUI устанавливается в /var/lib/asterisk/static-http, поэтому необходимо удалить пустую папку:

rmdir /usr/share/asterisk/static-http/

И создать ссылку:

ln -s /var/lib/asterisk/static-http/ /usr/share/asterisk/

cd ~/asterisk-gui/
sudo make checkconfig

3.5. Запуск и остановка Asterisk

Если вы установили Asterisk, можно запустить его командой:

/usr/src/asterisk -vvvgc

Остановить Asterisk из CLI можно командой «stop now».
Командой без аргументов, Asterisk запускается как демон.

/usr/sbin/asterisk 

Подключится к командному интерфейсу (CLI) можно используя аргумент 'r'.

/usr/sbin/asterisk -r или просто asterisc -r

Перезагрузка файлов конфигураций без полной перезагрузки:

asterisk -rx reload

Если GUI зависает на «Checking write permission for gui folder», то:
Сначала нужно заменить строчку в файле /var/lib/asterisk/static-http/config/js/astman.js

timeout : '60000' 

На
timeout : '6'


Если не помогло, то сбросить все права:

chown -R asterisk:asterisk /var/lib/asterisk/
chmod -R 777 /var/lib/asterisk/
chown -R asterisk:asterisk /etc/asterisk/
chmod -R 777 /etc/asterisk/

3.6. Создание группы и пользователя Asterisk

/usr/sbin/groupadd asterisk 
/usr/sbin/useradd -d /var/lib/asterisk -g asterisk asterisk 

3.7. Изменение прав

Измените права на использование следующих файлов:

chown --recursive asterisk:asterisk /var/lib/asterisk
chown --recursive asterisk:asterisk /var/log/asterisk
chown --recursive asterisk:asterisk /var/run/asterisk
chown --recursive asterisk:asterisk /var/spool/asterisk
chown --recursive asterisk:asterisk /usr/lib/asterisk
chown --recursive asterisk:asterisk /etc/asterisk/

## Если Вы используете Zaptel:

chown --recursive asterisk:asterisk /dev/zap

## Если Вы используете DAHDI

chown --recursive asterisk:asterisk /dev/dahdi

#----------------------------------------------------

chmod --recursive u=rwX,g=rX,o= /var/lib/asterisk
chmod --recursive u=rwX,g=rX,o= /var/log/asterisk
chmod --recursive u=rwX,g=rX,o= /var/run/asterisk
chmod --recursive u=rwX,g=rX,o= /var/spool/asterisk
chmod --recursive u=rwX,g=rX,o= /usr/lib/asterisk

## Если Вы используете Zaptel

chmod --recursive u=rwX,g=rX,o= /dev/zap

## Если Вы используете DAHDI

chmod --recursive u=rwX,g=rX,o= /dev/dahdi

#----------------------------------------------------

chown --recursive asterisk:asterisk /etc/asterisk
chmod --recursive u=rwX,g=rX,o= /etc/asterisk 

3.8. Директории Asterisk

/usr/lib/asterisk/modules: Содержит бинарные файлы (модули, кодеки).
/var/lib/asterisk: Содержит переменные данные (звуки, скрипты и т.д.).
/var/spool/asterisk: Файлы создаваемые в процессе работы (голосовые сообщения, исходящие вызовы и т.д.).
/var/log/asterisk: Логи, информация о вызовах.
/etc/asterisk: Конфигурационные файлы Asterisk.

Конфигурации:
musiconhold.conf — Настройка параметров «музыки при удержании» MusicOnHold.
cdr_mysql.conf — Настройка хранения записей о звонках в MySQL.
manager.conf — Настройка интерфейса Manager.
meetme.conf — Настройка конференций (meetme).
mgcp.conf — Настройка параметров MGCP-устройств.
parking.conf — Параметры «парковки» вызовов «Call parking».
voicemail.conf — Параметры голосовой почты (VoiceMail).
agents.conf — Агенты Asterisk.
extensions.conf — Номерной план Asterisk.
iax.conf — Настройка IAX-устройств.
modem.conf — Настройка ISDN с использованием ISDN4Linux.
vpb.conf — Настройка аппаратуры Voicetronix.
alsa.conf — Настройки звукового драйвера ALSA для консольного пользователя.
festival.conf — Параметры работы с синтезатором речи festival.
modules.conf — Настройка модулей Asterisk.
zapata.conf — Настройка аналоговых устройств телефонии digium.
asterisk.conf — Определение расположения каталогов Asterisk.
indications.conf — Настройка параметров аналоговых АТС различных стран.
rpt.conf — Параметры протокола rtp.
logger.conf — Параметры журналирования Asterisk.

Панель управления Asterisk Web GUI будет доступна по адресу: host:8088, где host — адрес сервера, на котором расположен Asterisk.

3.9 Настройка Asterisk через Web GUI

Trunks. Voip trunks:
Provider Name: SIBNET
Hostname: sibnet.ru
Username: user123
Password: pass123
CallerID: user
FromDomain: sibnet.ru
FromUser: user123

Outgoing Calling Rules:
Calling Rule Name: World
Pattern: _XXXXXXXXXXX
Caller ID: Admin
Destination: 6001
Use Trunk: SIBNET

DialPlans:
DialPlan Name: user
Include Outgoing Calling Rules: World
Include Local Contexts: default parkedcalls conferences ringgroups voicemenus queues voicemailgroups directory pagegroups page_an_extension

Incoming Calling Rules:
Pattern: _XXXXXXXXXXX
Destination: 6001

4. Переходим к установке Skype

4.1. Создать файл /etc/yum.repos.d/skype.repo и внести в него:

[skype]
name=Skype Repository
baseurl=http://download.skype.com/linux/repos/fedora/updates/i586/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-skype

Установить командой:
yum --nogpgcheck install skype

Или из пакетов:

wget www.skype.com/go/getskype-linux-deb
apt-get -f install
dpkg -i skype-debian_2.0.0.72-1_i386.deb или dpkg -i getskype-linux-deb
aptitude install skype

4.2. Установка дополнительных пакетов

На rpm.pbone.net ищем, качаем и устанавливаем пакеты qt4, qt4-x11.
Также:

yum install x11vnc или apt-get install x11vnc

4.3. Настройка

Заводим пользователя, под которым будет работать Skype:

adduser --home /home/skype --ingroup audio --disabled-password skype

Создаем директорию, из которой Skype будет читать свой конфиг:

mkdir -p /home/skype/multi/interface01
chown -R skype.audio /home/skype/multi

Если skype будет выключаться, то можно попробовать такой способ:
nano или vim /usr/local/bin/skype_start со следующим содержимым:
Спойлер
#!/bin/sh
SKYPE_SYSTEM_USER=skype
SKYPE_HOME=/home/skype/multi
SKYPE_USER=username
SKYPE_PASSWORD=userpass
SKYPE_INSTANCES=N
XVFB=/usr/bin/Xvfb
 
module_reload() {
  rmmod snd-dummy
  modprobe snd-dummy
}
 
skype_start() {
  for i in $(seq 1 $SKYPE_INSTANCES); do
    i=`printf "%02d" $i`
    $XVFB :1$i -ac >> /dev/null 2>&1 &
    sleep 3
    su $SKYPE_SYSTEM_USER -c "/bin/echo '$SKYPE_USER $SKYPE_PASSWORD'| DISPLAY=:1$i  /usr/bin/skype \
    --dbpath=$SKYPE_HOME/interface$i --pipelogin >> /dev/null 2>&1 &"
    echo "Skype $i started"
  done
}
 
skype_stop() {
kill -TERM `ps -u $SKYPE_SYSTEM_USER -o pid=` >> /dev/null 2>&1
sleep 3
kill -TERM `ps -C Xvfb -o pid=` >> /dev/null 2>&1
}
case "$1" in
  start)
        module_reload
        sleep 3
        skype_start
        ;;
  stop)
        skype_stop
        ;;
  restart)
        skype_stop
        sleep 3
        skype_start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac


Делаем его исполняемым:

chmod +x /usr/local/bin/skype_start

4.4. Запуск

Запускаем VNC-сервер

aptitude install x11vnc
/usr/bin/Xvfb :101 -ac &
x11vnc -display :101

Создать файлик, где будет храниться пароль для авторизации:

mcedit /home/passwd

Создать пароль:

x11vnc -storepasswd 123456 /home/passwd

Права:

chmod 777 /home/passwd
chown rr /home/passwd

Остановка процесса:

ps ax | grep vnc
kill 22062 # (номер процесса)

Перед запуском Skype нужно запустить вот эти модули:

rmmod snd-dummy
modprobe snd-dummy
echo "snd_dummy" >> /etc/modules

Запуск Skype:

su skype -c "/bin/echo 'username userpass'| DISPLAY=:101 /usr/bin/skype --dbpath=/home/skype/multi/interface01 --pipelogin &"
kill skype # остановка Skype
ps aux # проверка

Подключившись по vnc к серверу, можно лицезреть запущенный в предыдущем шаге Skype, в настройках которого нужно убрать все лишнее (отключить события, автоматическое изменение статуса и т.д.) и выбрать dummy-драйвер в качестве всех звуковых устройств (Dummy-HW 2.0).

5. Установка FreeSwitch

5.1. Установка нужных библиотек:

apt-get -y install build-essential subversion automake autoconf wget libtool libncurses5-dev xvfb libx11-dev libasound2-dev xfs xfonts-100dpi xfonts-75dpi xfonts-scalable
apt-get install autoconf automake g++ git-core libjpeg62-dev libncurses5-dev libtool make python-dev gawk pkg-config gnutls-bin
apt-get install libcurl4-openssl-dev libexpat1-dev libgnutls-dev libtiff4-dev libx11-dev unixodbc-dev libssl-dev python2.6-dev zlib1g-dev libzrtpcpp-dev libasound2-dev libogg-dev libvorbis-dev libperl-dev libgdbm-dev libdb-dev python-dev uuid-dev bison
yum install expat-devel gnutls-devel libtiff-devel libX11-devel unixODBC-devel libssl-devel python-devel  zlib-devel libzrtpcpp-devel alsa-lib-devel libogg-devel libvorbis-devel perl-libs gdbm-devel libdb-devel uuid-devel @development-tools

5.2. Скачиваем FreeSwitch:

cd /usr/local/src
git clone git://git.freeswitch.org/freeswitch.git
cd freeswitch
./bootstrap.sh

5.3. Редактируем modules.conf:

nano /usr/local/src/freeswitch/modules.conf

Проверяем и добавляем всё недостающее:

applications/mod_limit
codecs/mod_voipcodecs
endpoints/mod_skypopen
mod_say_ru
formats/mod_file_string

5.4. Сборка и установка

cd /usr/local/src/freeswitch
./configure
make
make install all cd-sounds-install cd-moh-install uhd-sounds-install uhd-moh-install hd-sounds-install hd-moh-install sounds-install moh-install

5.5. Копируем конфигурацию mod_skypopen и init-скрипт для запуска FreeSwitch:

cp /usr/src/freeswitch/src/mod/endpoints/mod_skypopen/configs/skypopen.conf.xml /usr/local/freeswitch/conf/autoload_configs/
cp /usr/src/freeswitch/debian/freeswitch.init /etc/init.d/freeswitch
cp debian/freeswitch.default /etc/default/freeswitch
sed -i 's/opt/usr\/local/g' /etc/init.d/freeswitch
sed -i 's/false/true/g' /etc/default/freeswitch

5.6. Заводим пользователя для FreeSwitch

adduser --disabled-password --quiet --system --home /usr/local/freeswitch --gecos "FreeSwitch Voice Platform" --ingroup daemon freeswitch
adduser freeswitch audio
chown -R freeswitch.daemon /usr/local/freeswitch
chmod -R o-rwx /usr/local/freeswitch/

5.7. Запуск и другие команды FreeSwitch

load mod_skypiax # загрузка модуля 			
sk list # проверка загруженности модуля 
console loglevel 9 # поднимаем уровень логирования
shutdown # остановка работы FreeSwitch
/usr/local/freeswitch/bin/freeswitch # запуск FreeSwitch

5.8. Mod Skypopen

Теперь перейдем к самой важной настройке — Public API. Здесь нужно разрешить mod_skypopen обращаться к Skype.
Сам Skype позволяет добавлять программы в список «Allowed programs» только по факту их обращения к Skype, но только для того, чтобы произвести такую настройку, нецелесообразно запускать FreeSwitch и mod_skypopen, поэтому создатели mod_skypiax написали небольшую утилиту, имитирующую обращение mod_skypopen к Skype. Она находится в дереве исходников FreeSwitch и ее нужно скомпилировать отдельно:

cd /usr/local/src/freeswitch/src/mod/endpoints/mod_skypopen/configs/old-stuff
gcc -Wall -ggdb skypopen_auth.c -o skypopen_auth -lX11

У вас сейчас должен быть обязательно открыт VNC-экран.

Запускаем skypopen:
./skypopen_auth :101

Вернитесь в окно vnc-подключения — в появившемся диалоговом окне нужно разрешить Skype подключить к API skypopen. Можно также сделать это в файле /home/skype/multi/interface01/username/config.xml. Приведя вот такой вид:

<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<CaptureDevice>2</CaptureDevice>
<Notifications>
<Enable>
<SkypeLogin>0</SkypeLogin>
</Enable>
</Notifications>
<SoundDevice>2</SoundDevice>
</UI>


6. Настройка конфигурации

Важным моментом является то, что skype-клиенты должны запускаться до загрузки модуля mod_skypopen, т.е. перед стартом FreeSwitch. Также, остановка уже задействованных mod_skypopen копий Skype приведет к падению FreeSwitch.

6.1. Mod_skypopen

nano /usr/local/freeswitch/conf/autoload_configs/skypopen.conf.xml

Редактируем примерно так:

<configuration name="skypopen.conf" description="Skypopen Configuration">
  <global_settings>
    <param name="debug" value="8"/>
    <param name="dialplan" value="XML"/>
    <param name="skype_user" value="username"/>
    <param name="report_incoming_chatmessages" value="false"/>
    <param name="write_silence_when_idle" value="false"/>
    <param name="silent_mode" value="false"/>
    <param name="setsockopt" value="true"/>
    <param name="codec-prefs" value="gsm,ulaw"/>
    <param name="hold-music" value="$${moh_uri}"/>
  </global_settings>
  <per_interface_settings>
    <interface id="1" name="skypopen1">
    <param name="destination" value="5000"/>
    <param name="context" value="default"/>
    <param name="X11-display" value=":101"/>
    <param name="tcp_cli_port" value="15556"/>
    <param name="tcp_srv_port" value="15557"/>
    <param name="hold-music" value="$${moh_uri}"/>
    </interface>
  </per_interface_settings>
</configuration>


Здесь:
5000 — extension, на который будет маршрутизироваться входящий Skype-вызов;
:101 — дисплей X-сервера;
skype_user — имя Skype-акаунта.

6.2. Добавляем Skypopen в автозагрузку

Добавляем mod_skypopen в список модулей, загружающихся во время старта FreeSwitch.
Для этого в файле /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml нужно раскоментировать или дописать строчку:

<load module="mod_skypiax"/>

6.3. Конфигурация extension 5000

Как Вы, вероятно, помните входящие Skype-вызовы будут маршрутизироваться на extension 5000, который еще надо создать. Для этого в директории /usr/local/freeswitch/conf/dialplan/default создаем файл 02_skype.xml следующего содержания:

<include>
  <extension name="skype_incoming">
    <condition field="destination_number" expression="^7770$">
      <action application="set" data="hangup_after_bridge=true"/>
      <action application="set" data="effective_caller_id_name=6001"/>
      <action application="bridge" data="sofia/gateway/asterisk/6001"/>
      <action application="hangup"/>
    </condition>
  </extension>
</include>

Где:
asterisk — название шлюза, на который будет уходить вызов (АТС на базе Asterisk);
6001 — extension в Asterisk, на который будет поступать вызов;
<action application=«bridge»...> — здесь указан extension, который будет обрабатываться в asterisk при поступлении вызова, в данном случае 6001.

В этом же каталоге находятся примеры других extensions, которые нужно будет закоментировать, что бы нужный нам extension не обрабатывался в другом месте. Ту же операцию нужно проделать и в файле /usr/local/freeswitch/conf/dialplan/default.xml.

Создаём файл 01_skypopen.xml:

nano /usr/local/freeswitch/conf/dialplan/public/01_skypopen.xml

С содержимым:

<extension name="SKYPE#1">
<condition field="destination_number" expression="^8(\d{10})$">
<action application="set" data="continue_on_fail=true"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="skypopen/RR/+7$1"/>
</condition>
</extension>

6.4. Конфигурация sip_profiles

На сервере c FreeSwitch в директории /usr/local/freeswitch/conf/sip_profiles/external создаем файл asterisk.xml следующего содержания:

<include>
  <gateway name="asterisk">
  <param name="username" value="freeswitch"/>
  <param name="realm" value="127.0.0.1"/>
  <param name="password" value="pass123"/>
  <param name="register" value="true"/>
  <param name="ping" value="25"/>
  </gateway>
</include>

Где:
asterisk — имя шлюза (должно совпадать с указанным в предыдущем шаге);
127.0.0.1 — хост с Asterisk;
freeswitch — имя пользователя для доступа к шлюзу;
pass123 — его пароль.

6.5. Конфигурация sip.conf

На сервере с Asterisk добавляем в /etc/asterisk/sip.conf следующее:
Спойлер
[freeswitch]
type=friend
host=dynamic		
username=freeswitch
port=5080
secret=pass123

[6001]
fullname=Skype
registersip=no
callgroup=1
transfer=yes
callcounter=yes
context=default
cid_number=6001
hassip=yes
hasiax=no
nat=no
insecure=no
autoprov=yes
disallow=all
alow=ulaw,ulaw,gsm,g726,g729
dtmfmode=rfc2833
host=dynamic
username=60001
port=5080
fromdomain=1.1.1.1
secret=supersecret



Где:
6001 — extension из предыдущих шагов
1.1.1.1 — адрес сервера с FreeSwitch
pass123 — пароль от Extensions 6001

Осталось перечитать sip.conf:

rasterisk -x 'sip reload'

6.6. Конфигурация users.conf

Спойлер
[freeswitch]
type=friend
host=dynamic		
username=freeswitch
port=5080
secret=pass123

[6001]
fullname=Skype
registersip=no
callgroup=1
transfer=yes
callcounter=yes
context=default
cid_number=6001
hassip=yes
hasiax=no
nat=no
insecure=no
autoprov=yes
disallow=all
alow=ulaw,ulaw,gsm,g726,g729
dtmfmode=inband
host=dynamic
username=6001
port=5080
fromdomain=1.1.1.1
secret=pass123
hasvoicemail=yes
vmsecret=secret
call-limit=100
macaddres=6001
label=6001
linekeys=1



Где:
secret — пароль от голосовой почты.
100 — максимум линий.
nat=yes – обозначает, что клиент может находится за NAT-ом и для открытия медиаканала при звонке этого пользователя требуется трансляция заголовков.
host=dynamic – привязка к адресу хоста клиента отсутствует.
username=6001 – имя пользователя. Этот логин потом используется в настройках SIP-клиента.
dtmfmode=rfc2833 – метод передачи dtmf-тонов набора номера. Существует еще метод info (должен совпадать с настройками в SIP клиенте).
disallow=all – запрещаем все кодеки.
allow=ulaw – разрешаем кодек ulaw. Кодек должен быть такой, который поддерживается клиентом.
context=default – контекст описывает через какую секцию Dailplan будут проходить звонки клиента.

В extentions.conf допишем следующее:

[default]
exten => 6000,1,Dial(SIP/6000)
exten => 6001,1,Dial(SIP/6001)


7. Порядок запуска

После установки нужно по возможности сделать reboot системы. Asterisk будет запущен при загрузке. Софтофон должен быть уже активным до перезагрузки.
Очередность:

/usr/bin/Xvfb :101 -ac &
x11vnc -display :101
su skype -c "/bin/echo 'username userpass'| DISPLAY=:101 /usr/bin/skype --dbpath=/home/skype/multi/interface01 --pipelogin &" 
/usr/local/freeswitch/bin/freeswitch

Если не отображается лог в консоли FreeSwitch при входящем вызове из Skype-сети или не отображается клиент при коннекте с Vnc Viewer'а, необходимо вручную перезапустить Skype-клиент и заново проверить настройки клиента.

Использованные ресурсы: wiki.exp-it.ru, wiki.freeswitch.ru, asterisk-pbx.ru + книжки по asterisk.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+13
Comments 25
Comments Comments 25

Articles