Asterisk‎ > ‎

IP-телефония на базе Asterisk


Оригинал статьи

Настройка Asterisk, Dahdi и Hylafax.
Эта статья очень помогла после проблем с сервером Asterisk. Оригинал статьи смотрите на сайте lipovetskiy.wordpress.com. Спасибо автору за помощь.

Задача

Поднять корпоративный сервер IP телефонии с несколькими потоками E1 от разных провайдеров и несколькими SIP провайдерами, завернуть логи в базу и настроить подбивку статистики, настроить электронные факсы. Сервер на Ubuntu 9.04 Server.

ASTERISK

Итак, ставим Ubuntu, во время установки отмечаем LAMP (Linux Apache MySQL PHP) и OpenSSH.
Обновляемся и устанавливаем необходимые пакеты:
# aptitude update
# aptitude upgrade
# aptitude install make gcc cpp g++ linux-headers-`uname -r` bison ncurses-dev mysql-client libmysqlclient-dev libnewt-dev php5-gd libxml2 libopenh323-dev mc


Основную часть будем ставить из исходников, скачанных с сервера Digium:
# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.6.1.tar.gz
# wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.6.1.tar.gz
# wget http://downloads.digium.com/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
# wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.10.tar.gz

Распаковываем все это дело в /usr/src и начинаем по-порядку устанавливать.
Сначала устанавливаем поддержку работы наших PRI карт.
Libpri:
# make
# make install

Dahdi:
# make
# make install
# make config

Дальше ставим сам Астериск:
Asterisk:
# ./configure
# make menuselect
# make
# make install
# make config
# make samples

Make menuselect делаем для выбора необходимых компонентов. Не пугаемся отсутствия поддержки MySQL — ее мы будем ставить из аддонов.
Asterisk addons:
# ./configure
# make menuselect
# make
# make instal
# reboot

Настраиваем Asterisk для работы с нашими платами:
У меня установлены две платы Openvox D110P, которые являются полным аналогом (китайская подделка =)) плат от Digium TE110P. Провайдеры телефонии — Peterstar & Golden Telecom. Для их корректной работы с потоками E1 необходимо сгенерировать основные файлы dahdi (платы физически должны быть установлены):
# dahdi_genconf

Смотрим:
# cat /etc/dahdi/system.conf
span=1,1,0,ccs,hdb3,crc4
# PETERSTAR
bchan=1-15,17-31
dchan=16
echocanceller=mg2,1-15,17-31
span=2,2,0,ccs,hdb3
# Golden Telecom
bchan=32-46,48-62
dchan=47
echocanceller=mg2,32-46,48-62
loadzone = us
defaultzone = us

Обратите внимание на значение CRC4: Golden Telecom не поддерживает его, но по-умолчанию dahdi_genconf его выставляет. Уточняйте у провайдера.
# cat /etc/asterisk/dahdi-channels.conf

; Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER) HDB3/CCS/CRC4
group=0,11
context=from-pstn
switchtype = euroisdn
signalling = pri_cpe
channel => 1-15,17-31
context = default
group = 63
; Span 2: WCT1/1 "Digium Wildcard TE110P T1/E1 Card 1" HDB3/CCS
group=0,12
context=from-pstn
switchtype = euroisdn
signalling = pri_cpe
channel => 32-46,48-62
context = default
group = 63

Запускаем Dahdi:
# /etc/init.d/dahdi start

После этого должна подгрузиться куча новых модулей:
# 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_cfg -vvvvvvvv
# dahdi_scan

Правим
# 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

Дальше настраиваем маршрутизацию.
Приведу только основные блоки своей конфигурации т.к. всё достаточно индивидуально.
# 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 и его аналоги.
После внесения изменений в конфигурационные файлы перезапускаем астериск:
# asterisk -rvvvgc
> reload

Иногда может потребоваться полная перезагрузка:
# /etc/init.d/asterisk restart

ФАКС

В-общем все красиво, все работает, дальше будем прикручивать электронный факс.
Лирическое отступление: сначала я решил поставить факс из репозиториев убунты — asterisk-app-fax, это чудо потянуло за собой астериск 1.4.22 и все мои труды накрылись медным тазом =). Поэтому будем ставить связку iaxmodem + hylafax, хоть из репозитория, но без вышеуказанных проблем.
# aptitude install hylafax-server 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 mysql status
Connected to asterisk@localhost, port 3306 using table cdr for 9 hours, 27 minutes, 4 seconds.
Wrote 321 records since last restart.

Сие означает, что логи у нас пошли в базу.
Теперь прикручиваем модуль статистики:
# wget http://areski.net/asterisk-stat-v2/asterisk-stat-v2_0_1.tar.gz

Распаковываем сожержимое в /var/www и настраиваем соответствующим образом файлы ./lib/defines.php и ./lib/DB-modules/phplib_mysql.php
В apache2.conf вписываем строчку:
DirectoryIndex index.htm index.html index.php cdr.php

# apache2ctl restart

Заходим через браузер на адрес http://your-pbx-ip и радуемся тому, что все заработало.

UPDATE

В случае, если астериск стоит в локальной сети и в resolv.conf стоит IP адресс рутера, который резольвит имена через свой wan-порт (adsl, или что угодно), то при падении wan соединения и отсутствия на рутере какой-либо статической таблицы хостов, рутер будет бесконечно долго (либо пока истечет его таймаут) думать что же ответить линуксу (libresolv) на его запрос. Пока линукс ждет ответ - астериск тормозит по полной програме - отваливаются внутрение extensions, не работает voicemail, не правильно загораются BLF. Тут надо заметить, что в файле resolv.conf также можно установить свой timeout, например 1 секунду.

(с) alphil http://asterisk-support.ru/question/14387/ne-rabotaet-telefoniia-bez-dostupa-servera-k/?answer=19830#post-id-19830

В resolv.conf добавляем строку
options attempts:1 timeout:1

Comments