unix 2012-03-04 12-45-40
Корпоративный VoIP сервер на базе Asterisk в Ubuntu Server 8.04.2
Задача: поднять корпоративный сервер IP телефонии с несколькими потоками
E1 от разных провайдеров и несколькими SIP провайдерами, завернуть логи
в базу и настроить подбивку статистики, настроить электронные факсы.
В течении двух недель экспериментировал с Asterisk на различных
платформах и сборках - FreeBSD, CentOS, Trixbox, AsteriskNOW, Elastix,
Akozia... везде что-то не нравилось и не сросталось, и в итоге я
остановился на Ubuntu Server 8.04.2.
ASTERISK
Итак, ставим Ubuntu, во время установки отмечаем LAMP (Linux Apache
MySQL PHP) и OpenSSH.
Обновляемся и устанавливаем необходимые пакеты:
aptitude update
aptitude upgrade
aptitude install make gcc cpp g++ linux-headers-2.6.24.23-server \
bison ncurses-dev mysql-client libmysqlclient-dev libnewt-dev php-gd
Основную часть будем ставить из исходников, скачанных с сервера Digium:
wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.6.0.5.tar.gz
wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.6.0.1.tar.gz
wget http://downloads.digium.com/pub/telephony/dahdi-linux/dahdi-linux-2.1.0.4.tar.gz
wget http://downloads.digium.com/pub/telephony/dahdi-tools/dahdi-tools-2.1.0.2.tar.gz
wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.9.tar.gz
Распаковываем все это дело в /usr/src и начинаем по-порядку устанавливать.
Libpri:
make
make install
Dahdi:
make
make install
Dahdi-tools:
./configure
make menuselect
make
make install
Asterisk:
./configure
make menuselect
make
make install
Asterisk addons:
./configure
make menuselect
make
make install
reboot
Make menuselect делаем для проверки необходимых компонентов. Особенно
нас интересует mysql.
После того как все установлено необходимо поправить несколько основных файлов.
У меня установлены две платы Openvox D110P, которые являются полным
аналогом (китайская подделка =)) плат от Digium TE110P. Провайдеры
телефонии - Peterstar & Golden Telecom.
# cat /etc/dahdi/system.conf
span=1,1,0,ccs,hdb3,crc4
bchan=1-15
echocanceller=mg2,1-15
dchan=16
bchan=17-21
echocanceller=mg2,17-21
loadzone = us
defaultzone=us
span=2,0,0,ccs,hdb3
bchan=32-46
dchan=47
echocanceller=mg2,32-46
# cat /etc/asterisk/chan_dahdi.conf
[channels]
switchtype=euroisdn
pridialplan=unknown
prilocaldialplan=national
resetinterval = 100000000
facilityenable = yes
signalling=pri_cpe
rxwink=300
usecallerid=yes
cidsignalling=bell
cidstart=ring
hidecallerid=no
callwaiting=yes
usecallingpres=yes
sendcalleridafter=1
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
echotraining=800
relaxdtmf=yes
rxgain=0.0
txgain=0.0
group=1
context=from_peterstar
immediate=no
channel=>1-15,17-21
mohsuggest=default
group=2
context=from_golden
immediate=no
channel=>32-46
mohsuggest=default
Теперь можно уйти в ребут.
После перезагрузки смотрим подгрузились ли необходимые модули:
lsmod | sort
dahdi 197768 87 dahdi_echocan_mg2,xpp,dahdi_transcode,wcb4xxp,wctdm,wcfxo,wctdm24xxp,wcte11xp,wct1xxp,wcte12xp,wct4xxp
dahdi_echocan_mg2 6920 0
dahdi_transcode 9352 1 wctc4xxp
.....
wcb4xxp 83492 0
wcfxo 13984 0
wct1xxp 16544 0
wct4xxp 353920 0
wctc4xxp 49180 0
wctdm24xxp 135008 0
wctdm 40652 0
wcte11xp 27424 37
wcte12xp 71392 0
.....
Дальше проверяем как dahdi переварил наши платы:
# dahdi_cfg -vvvvvvvv
DAHDI Tools Version - 2.1.0.2
DAHDI Version: 2.1.0.4
Echo Canceller(s): MG2
Configuration
SPAN 1: CCS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
SPAN 2: CCS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
Channel map:
Channel 01: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 01)
...
Channel 15: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 15)
Channel 16: D-channel (Default) (Slaves: 16)
Channel 17: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 17)
...
Channel 46: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 46)
Channel 47: D-channel (Default) (Slaves: 47)
37 channels to configure.
Setting echocan for channel 1 to mg2
...
Setting echocan for channel 46 to mg2
Еще одна утилита:
dahdi_scan
[1]
active=yes
alarms=OK
description=Digium Wildcard TE110P T1/E1 Card 0
name=WCT1/0
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 04 Slot 01
basechan=1
totchans=31
irq=23
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS
[2]
active=yes
alarms=OK
description=Digium Wildcard TE110P T1/E1 Card 1
name=WCT1/1
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 04 Slot 02
basechan=32
totchans=31
irq=21
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS
Настраиваем Asterisk. Приведу только основные блоки своей конфигурации
т.к. всё достаточно индивидуально.
# cat /etc/asterisk/extensions.conf
[general]
static = yes
writeprotect = yes
clearglobalvars = yes
[globals]
CONSOLE = Console/dsp ; Console interface for demo
TRUNKMSD = 1 ; MSD digits to strip (usually 1 or 0)
FEATURES =
DIALOPTIONS =
RINGTIME = 20
FOLLOWMEOPTIONS =
PAGING_HEADER = Intercom
PAGING_TIMEOUT = 60
[default]
[from_peterstar]
exten => 1111111,1,Ringing
exten => 1111111,n,Wait(1)
exten => 1111111,n,Answer
exten => 1111111,n,Dial(SIP/100,90,tr)
exten => 1111111,n,Queue(office)
exten => 1111111,n,Hangup()
[from_golden]
exten => 2222222,1,Ringing
exten => 2222222,n,Wait(1)
exten => 2222222,n,Answer
exten => 2222222,n,Dial(SIP/200,90,tr)
exten => 2222222,n,Queue(sklad)
exten => 2222222,n,Hangup()
[to_peterstar]
exten => _[1-9]XXXXXX,1,Set(CALLERID(all)=1111111)
exten => _[1-9]XXXXXX,2,Dial(dahdi/g1/${EXTEN},90,t)
exten => _7XXXXXX,1,Set(CALLERID(all)=1111111)
exten => _7XXXXXX,2,Dial(dahdi/g1/${EXTEN},90,t)
exten => t,1,Busy
[to_golden]
exten => _[1234569]XXXXXX,1,Set(CALLERID(all)=2222222)
exten => _[1234569]XXXXXX,2,Dial(dahdi/g2/${EXTEN},90,t)
exten => _7XXXXXX,1,Set(CALLERID(all)=2222222)
exten => _7XXXXXX,2,Dial(dahdi/g2/${EXTEN},90,t)
exten => t,1,Busy
[to_sipnet]
exten => _7921XXXXXXX,1,Dial(SIP/sipnet_et/${EXTEN},90,t)
exten => _7921XXXXXXX,2,Hangup()
.....
# cat /etc/asterisk/queue.conf
[general]
[default]
[office]
music=default
strategy=ringall
timeout=60
retry=30
wrapuptime=15
;periodic-announce-frequency=30
;periodic-announce = queue-periodic-announce
monitor-format = wav49
monitor-type = MixMonitor
context = office
member => SIP/100
[sklad]
music=default
strategy=ringall
timeout=60
retry=30
wrapuptime=15
;periodic-announce-frequency=30
;periodic-announce = queue-periodic-announce
monitor-format = wav49
monitor-type = MixMonitor
context = sklad
member => SIP/200
Вобщем в город звоним через Peterstar & Golden, а на мобильные и
межгород прописываем sipnet и его аналоги.
Дальше я решил запустить астериск стандартным для убунты образом:
/etc/init.d/asterisk start
Но оказолось что при компиляции никакие стартовые скрипты не создались.
Хотя в других версиях такого бага небыло.
Мое решение - вписываем в конец скрипта /etc/init.d/rc.local строчку:
/usr/sbin/asterisk -f -vvvg -c
Для проверки можно перезагрузиться и посмотреть сработало ли:
ps -aux | grep asterisk | grep -v grep
root 6184 0.1 1.1 28612 12108 ? Sl Feb19 4:05 /usr/sbin/asterisk -f -vvvg -c
Залезаем на консоль Астериска, начинаем звонить и смотреть не лезут ли ошибки:
asterisk -r
....
ФАКС
Вобщем все красиво, все работает, дальше будем прикручивать электронный факс.
Лирическое отступление: сначала я решил поставить факс из репозиториев
убунты - asterisk-app-fax, это чудо потянуло за собой астериск 1.4.22 и
все мои труды накрылись медным тазом =). Поэтому будем ставить связку
iaxmodem + hylafax, хоть из репозитория, но без вышеуказанных проблем.
aptitude install hylafax-serveк hylafax-client iaxmodem
Создаем несколько виртуальных модемов:
# cat /etc/iaxmodem/ttyIAX0
device /dev/ttyIAX0
owner uucp:uucp
mode 660
port 4570
refresh 50
server 127.0.0.1
peername iaxmodem
secret password
codec alaw
cidname Company
cidnumber +7(812)1111111
Выполняем для каждого модема:
cd /etc/iaxmodem
cp ttyIAX0 ttyIAX1
....
Не забываем менять название девайса в первой строчке файла настроек.
Запусаем iaxmodem:
/etc/init.d/iaxmodem start
Проверяем появились ли виртуальные модемы:
ls /dev | grep ttyIAX
ttyIAX0
ttyIAX1
....
Дальше нужно настроить взаимодействие этих модемов с hylafax.
Начальная настройка hylafax:
faxsetup
И для чего для каждого модема проделываем:
faxaddmodem
Прописывам модемы в астериске:
# cat /etc/asterisk/iax.conf
[general]
bindport = 4569
bindaddr = 0.0.0.0
disallow=all
allow=ulaw
allow=alaw
[iaxmodem]
type=friend
secret=password
port=4570
host=dynamic
context=office
disallow=all
allow=alaw
[iaxmodem1]
type=friend
secret=password
port=4580
host=dynamic
context=sklad
disallow=all
allow=alaw
.....
# cat /etc/asterisk/sip.conf
...
[111]
type=friend
context=office
secret=111
callerid="FAX-Office"<111>
nat=yes
host=dynamic
qualify=yes
[222]
type=friend
context=sklad
secret=222
callerid="FAX-Sklad"<222>
nat=yes
host=dynamic
qualify=yes
....
# cat /etc/asterisk/extensions.conf
exten => 111,1,Dial(IAX2/iaxmodem)
exten => 222,1,Dial(IAX2/iaxmodem1)
....
Для того, чтобы факсы отправлялись по e-mail необходимо настроить
почтовую систему на релей к вашему почтовому серверу и прописать
следующее:
# cat /etc/hylafax/FaxDispatch
case "$DEVICE" in
ttyIAX0) SENDTO=office@comp.spb.ru; FILETYPE=tif;;
ttyIAX1) SENDTO=sklad@comp.spb.ru; FILETYPE=tif;;
esac
При такой схеме факсы, приходящие на номер 111, будут идти на один
адрес, а приходящие на 222 - на другой, и т.д...
reboot
Отправлять факсы из винды можно после установки какой-нибудь клиентской
проги. Я использую Winprint Hylafax.
СТАТИСТИКА
Если аддон астериска собран с поддержкой MySQL:
# cat /etc/asterisk/cdr_mysql.conf
[global]
hostname=localhost
dbname=asterisk
table=cdr
password=password
user=root
port=3306
sock=/var/run/mysqld/mysqld.sock
userfield=1
Создаем базу:
mysql -p
> CREATE DATABASE asterisk;
GRANT INSERT
ON asterisk.*
TO asterisk@localhost
IDENTIFIED BY 'yourpassword';
USE asterisk;
CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`userfield` varchar(255) NOT NULL default ''
);
ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default '';
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );
reboot
Проверяем:
asterisk -r
pbx*CLI> cdr show status
CDR logging: enabled
CDR mode: simple
CDR output unanswered calls: no
CDR registered backend: mysql
CDR registered backend: csv
CDR registered backend: cdr-custom
Сие означает, что логи у нас пошли в базу.
Теперь прикручиваем модуль статистики:
wget http://areski.net/asterisk-stat-v2/asterisk-stat-v2_0_1.tar.gz
Распаковываем сожержимое в /var/www и настраиваем соответствующим
образом файлы ./lib/defaults.php и ./lib/DB-modules/phplib_mysql.php
apache2ctl restart
Заходим через браузер на адрес http://your-pbx-ip/cdr.php (можно сделать
и по-красивее) и радуемся тому, что все работает! =)
PS: При написании использовались следующие материалы:
* http://bbs.chinaunix.net/archiver/tid-1290435.html
* http://www.the-asterisk-book.com/unstable/faxserver-mit-iaxmodem-und-hylafax.html
* http://www.voip-info.org/wiki-Asterisk+cdr+mysql
PPS: http://alchemist-unix.blogspot.com/2009/02/ip-e1-sip.html - мой блог ;)