Asterisk - замечательная система телефонии с просто удивительными возможностями. Впрочем, если вы решили её установить, значи описывать её возможности и преимущества нет необходимости. Итак…

Подготовка системы

Для начала отключаем Selinux, останавливаем Firewalld (который можно настроить позже) и устанавливаем нужные пакеты.

  • vi /etc/selinux/config

Выставляем setenforce 0

  • systemctl stop firewalld
  • systemctl disable firewalld
  • reboot

Установка нужных пакетов:

  • yum install -y epel-release
  • yum update -y
  • yum install -y gcc gcc-c++ lynx bison mariadb-devel mariadb-server mariadb gmime-devel psmisc php php-mysql php-pear php-mbstring
  • yum install -y tftp-server httpd make ncurses-devel libtermcap-devel sendmail sendmail-cf caching-nameserver sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel
  • yum install -y kernel-devel-$(uname -r) git subversion kernel-devel php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel libtool sqlite-devel libuuid-devel bzip2
  • yum install -y htop mc

Ставим и запускаем сервер базы данных. Она потом пригодится для статистики, поэтому поставим это сразу.

  • systemctl enable mariadb.service
  • systemctl start mariadb.service
  • mysql_secure_installation

Ставим db посвежее:

  • pear uninstall db
  • pear install db-1.7.14

Собираем asterisk и компоненты из исходников

Описывать не буду, достаточно просто копипастить и проявить немного терпения во время компиляции.

Для начала PJSIP, с ним работа через NAT будет проще. :)

А эта библиотека пригодится для конвертации wav в mp3

Выбираем всё, что нам пригодится. Звуковые файлы и нужные модули - выбираем всё, потом будет поздно. :)

  • make
  • make install
  • make samples
  • make config

  • useradd -m asterisk

  • chown asterisk.asterisk /var/run/asterisk
  • chown -R asterisk.asterisk /etc/asterisk
  • chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
  • chown -R asterisk.asterisk /usr/lib64/asterisk

Запуск и проверка

Теперь запускаем астериск и заходим в его консоль.

  • systemctl restart asterisk
  • systemctl enable asterisk
  • asterisk -rvv

Примеры настроек

Для начала sip.conf

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
[general]
allowguest=yes ;разрешаем гостевые. 
; Да, нормальная настройка и вам можно будет звонить "на почту".

; это для "введение в заблуждение вероятного противника"
alwaysauthreject=yes

; прикидываемся непонятно чем
useragent=Cisco-SIPGateway/IOS-12.x
sdpsession=SIP Call
sdpowner=CiscoSystemsSIP-GW-UserAgent

context=from-internet ; контекст по-умолчанию для входящих

language=ru

; отключаем все кодеки и разрешаем только некоторые для аудио и видео
disalow=all
allow=alaw
allow=ulaw
allow=gsm
allow=h261
allow=h263
allow=h263p

; и пара дополнительных опций
transport=udp
srvlookup=yes
qualify=800
videosupport=yes


; регистрируемся на sip-сервере провайдера
register => user:pass@wikiadmin.net/КудаОтправить

; для звонков через провайдера
[provider]
type=peer
secret=pass
username=user
host=wikiadmin.net
fromuser=user
fromdomain=wikiadmin.net
insecure=invite
nat=force_rport
context=КонтекстПользователей
dtmfmode=inband

; шаблон
[user](!)
type=friend
host=dynamic
disallow=all
allow=alaw
allow=ulaw
allow=gsm
allow=h261
allow=h263
allow=h263p
context=user_context ;этот параметр встретим в конце extensions.conf
nat=yes
qualify=600
call-limit=1
deny=0.0.0.0/0.0.0.0
permit=172.16.0.0/255.255.255.0

[100](user) ;для примера поставим номер 100
secret=pass
callerid="Фамилия Имя"

Теперь подкорректируем extensions.conf, где и направим звонки куда нам нужно.

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
[general]
static=yes
writeprotect=yes
clearglobalvars=no

[globals]
CONSOLE=Console/dsp
IAXINFO=guest
TRUNK=DAHDI/G2
TRUNKMSD=1


; входящие с интернета.

[from-internet]

exten => post, 1, Answer() ; тут post из post@example.com
 same => n, Macro(monitor) ; этот макрос позволит нам один раз написать строки для записи разговора и больше не повторятся
 same => n, Dial(SIP/100,60,mtT) ; 60 секунд под музыку будем вызывать номер 100, если кто позвонит на почту
 same => n, Hangup()

; этот вариант просто ждёт 3 секунды и отрубается. Для защиты от перебора
exten => _X., 1, Verbose(1,Internet guest call from IP ${CHANNEL(peerip)})
 same => n, Wait(3)
 same => n, Hangup()


; исходящие

[internal]

; конверенцию разместим на номере 55, например
exten => 55, 1, Answer()
 same => n, Playback(conf-enteringno)
 same => n, Set(CONFBRIDGE_JOIN_SOUND=confbridge-join)
 same => n, Set(CONFBRIDGE(user,announce_join_leave)=yes)
 same => n, Set(CONFBRIDGE_LEAVE_SOUND=confbridge-leave)
 same => n, Macro(monitor)
 same => n, ConfBridge(55,Mc)
 same => n, Hangup()

; запись голоса и проверка. Помогает при формировании IVR
exten => 2000,1,Wait(2)
 same => n,Record(/tmp/asterisk-recording:wav)
 same => n,Wait(2)
 same => n,Playback(/tmp/asterisk-recording)
 same => n,Wait(2)
 same => n,Hangup

; эхо-тест для проверки
exten => 99,1,Playback(demo-echotest)
 same => n, Macro(monitor)
 same => n, Echo
 same => n, Hangup()

; звонки на трёхзначные внутренние сип-номера (100, 101 и т.д.)
exten => _XXX, 1, Answer()
 same => n, Macro(monitor)
 same => n, Dial(SIP/${EXTEN},60,mtT)
 same => n, Hangup()


; теперь входящие звонки и сразу добавим IVR

[incoming]
exten => КудаОтправить, 1, Answer() ; строчка из register в sip.conf
 same => n, Macro(monitor)
; я не против звонков, но давайте в рабочее время, ок?
 same => n, GotoIfTime(09:00-12:59,Mon-Fri,*,*?work)
 same => n, GotoIfTime(14:00-18:00,Mon-Thu,*,*?work)
 same => n, GotoIfTime(14:00-16:29,Mon-Fri,*,*?work)
; если в рабочее время не попали, то просто прощаемся и отрубаем звонок.
; Нет, можно и voicemail поставить, всё в ваших руках :)
 same => n, Background(/home/asterisk/ivr/RestTime)
 same => n, Hangup()
 same => n(work), Goto(incoming,s,1) ;а тут ловим переход из временных рамок и отправляем куда надо

exten => s, 1, Answer()
 same => n, Background(/home/asterisk/ivr/WorkTime)
 same => n, WaitExten(1)

exten => _XXX, 1, Dial(SIP/${EXTEN},60,mtT) ;эта строчка ловит если набрали добавочный
 same => n, Goto(incoming,t,1) ;и если добавочный не отвечает или недоступен, отправляем на оператора, куда и таймаут падает


exten => 3, 1, Answer() ;если нажали 3, то
 same => n, Queue(sales|tT|||40) ;отправляем на очередь sales (об этом чуть позже) на 40 секунд
 same => n, Dial(SIP/100,20,mtT) ; и потом на секретаря на номер 100 на 20 секунд, если из очереди не взяли звонок
 same => n, Hangup()

exten => i, 1, Answer() ;если набрали неправильно (incorrect), отправляем так же на timeout
 same => n, Goto(incoming,t,1)

; и теперь уже строчки, которые ловят дождавшихся оператора
exten => t, 1, Dial(SIP/100,20,mtT)
 same => n, Hangup()


; разумеется, пользователям надо и звонить. Для этого 
[outgoing]
exten => _[7,8]9XXXXXXXXX, 1, Answer()
 same => n, Macro(monitor)
 same => n, Dial(SIP/7${EXTEN:1}@provider,120,Ttr) ; provider у нас описан в sip.conf сразу за register
 same => n, HangUp

; а теперь тот самый макрос для записи разговора
[macro-monitor]
exten => s, 1, Set(MONITOR_FILE=/var/calls/${UNIQUEID})
 same => n, MixMonitor(${MONITOR_FILE}.wav)
 same => n, Set(CDR(filename)=${UNIQUEID}.wav) ; эта строка потребовалась, чтобы в ACDR нормально появлялись файлы для прослушивания.


;
; контексты (исходящие)
;

[user_context] ;этой группе (context в шаблоне в sip.conf) разрешим:
include => incoming ; принимать входящие
include => internal ; пользоваться внутренними сервисами и звонками
include => outgoing ; и звонить наружу

Ну и, как и обещал, про очереди, добавив в конец queues.conf следующее:

1
2
3
4
5
6
[sales]
strategy = rrmemory ; это равномерно распределит звонки.
                    ; Можно указать так же ringall (всем сразу) и linear (по очереди как написано)
member = SIP/100
member = SIP/101
member = SIP/102

это кратко, очередь имеет массу настроек.

Вот кратко что можно настроить. Если есть желание что-то добавить - добро пожаловать на почту.