Aster+mikrotik и дофига офисов

Итак задача: Есть 5 офисов один из которых мы условно назовем "Центральный". Надо организовать связь между ними. Причем так, чтобы люди могли пользоваться всякими Owncloud, IP-телефонией и прочими сетевыми плюшками.

Провайдером IP-телефонии является МТС, но последнюю милю дает другой провайдер. В терминологии специалистов МТС это называется "программное включение". Нам предоставили 30 линий с 1 номером, работаем по SIP с регистрацией. Причем МТС ждет, что подключаться мы будем с определенного IP-адреса. Т.е. имея 2 интернеет-канала от разных провайдеров мы сталкиваемся с необходимостью явно указать маршрут для нашего астериска. Для этого заходим в меню "IP" и выбираем пункт "Routes". Там жмем плюс и пишем в поле "Dst.Address" IP сервера МТС. В поле Gateway выбираем то подключение через которое будем прогонять наш SIP. Далее идем в том же меню IP в раздел "Firewall", выбираем наверху "NAT" и создаем правило: Chain (цепочка) "Dst-nat", протокол UDP, порт список, портов, через, запятую, которые, нам, прислал, провайдер, In-interface: выбираем подключение которое будет использоваться для IP-телефонии, Action: Dstnat и в поле To Address указываем IP нашей машинки с Asterisk.

Далее переходим в Filter Rules и создаем правило для цепочки "Forward", где указываем список UDP-портов, адрес назначения - наша машинка с Asterisk, и действие "Принять".

Заходим в раздел "Mangle" все того-же файрвола и созададим правило: цепочка Prerouting, Src.Address - IP машины с Asterisk, действие "Mark Routing", внизу строчка "New Routing Mark" - имя которым мы хотим промаркировать траффик от нашего астера.

Возвращаемся в IP-->Routes и создаем правило где назначение "0.0.0.0/0", шлюз - наше подключение для телефонии, и Routing mark выбираем из списка то имя, которое задали в предыдущем шаге.

Вот и все. Мы готовы подключаться к МТС и получать от них телефонию.

Странное дело, но почему-то я не смог найти правильных конфигов для подключения к МТС ни у них на сайте ни где-либо еще. Чтож. С помощью лома и такой-то матери подключиться удалось. Выложу ка я тут кусок конфига, который работает у меня.

Итак SIP.CONF

[General]

compactheaders = yes

register=>374****:PasSwOrD@83.242.244.56:PORT/374****

bindaddr=0.0.0.0

alwaysauthreject = yes (а вдруг забудем где-то явно указать в настройках пользователей!)

localnet=192.168.0.0/255.255.255.0 ; сети в которых будет работать телефония

localnet=192.168.3.0/255.255.255.0

jbenable = yes

jbforce = yes

jbmaxsize = 50

jbresyncthreshold = 1000

jbimpl = fixed

Тут следует отметить, что последние 5 строк - параметры джиттер-буфера. Если у Вас интернет-провайдер весельчак и гоняет трафик от Вас в тот-же город где вы находитесь через например Москву (мой случай), то у вас звук будет заикаться и пропадать. Соответственно есть 3 решения. Первое - договориться с провайдером о настройке нормальных маршрутов в пределах города. Второе - сменить провайдера на более адекватного. Третье - те 5 строк которые написаны выше :-)

ВАЖНО!!! Значение "jbmaxsize" подбирается индивидуально и экспериментально!

Далее транки для МТС

[mts1]

callerid=374****

fromuser=374****

secret=PasSWoRd

host=IP-адрес сервера МТС

fromdomain=IP-адрес сервера МТС

port=Порт который Вам сообщили в техподдержке при подключении

context=out

canreinvite=no

nat=yes

type=friend

qualify=no

insecure=invite

disallow=all

allow=alaw

dtmfmode=auto

call-limit=30 ;Число линий

[mts1_in]

defaultuser=374****

username=374****

secret=PasSWoRd

host=IP-адрес сервера МТС

nat=yes

port=Порт который Вам сообщили в техподдержке при подключении

disallow=all

allow=alaw

context=out

dtmfmode=inband

call-limit=30;Число линий

Далее пользователи:

[100]

escription=Office Manager

type=friend

username=100

secret=PasSWoRd

callerid= OfficeManager<100>

host=dynamic

disallow=all

allow=alaw:5

port=5060

context=out

call-limit=2

qualify=yes

nat=no

directmedia=no

canreinvite=no

deny=0.0.0.0/0.0.0.0

permit=192.168.0.0/255.255.255.0

alwaysauthreject = yes

Все, транк создан, пользователи заведены, с потерями UDP-пакетов разобрались. Переходим к настройке

1. Входящих

1.1. Клиент звонит и его приветствуют, сообщая какие кнопки ему можно нажать, чтобы попасть туда куда он хотел

1.2. Если ничего не нажал, то отправляем в Call-центр

1.3. Если ввел внутренний, то пробуем соединить

1.4. Если специалиста нет на месте, то отправляем звонок на сотовый

1.5. Все разговоры пишем

1.6. Если звонок был переадресован на сотовый, то отправляем СМС с номером клиента в дагонку, чтобы наш специалист знал как перезвонить при необходимости.

1.7. Если звонок переадресован, то у принимающего НЕ спрашиваем хочет ли он разговаривать. Просто соединяем. (отмена подтверждения)

1.8. Когда в Call-центре поднимают трубку у специалиста Call-центра должно всплыть окошко в 1С с частично заполненной инфой о звонящем.

1.9. Расписание работы офиса

2. Исходящих

2.1. Все звонки пишем

_____________________________________-

[general]

#include company.tree ;Подключаем дерево для обработки звонков

[out] ; Контекст

exten => 374****,1,GotoIfTime(9:00-18:00|mon-fri|*|*?company,s,1) ; Если клиент звонит с понедельника по пятницу с 9 утра до 6 вечера, то просто поприветствуем и предложим на выбор несколько вариантов развития событий (звонок отправляется на обработку в тот самый Company.tree в extension "S" с приоритетом 1)

exten => 374****,2,GotoIfTime(18:00-22:00|mon-fri|*|*?company,hol,1) ; Если клиент звонит в раабочий день, но с 6 до 10 вечера, то он отправляется в то-же дерево, но на extension "hol" с приоритетом 1

exten => 374****,3,GotoIfTime(22:00-9:00|mon-fri|*|*?company,nwt,1) ; Ночных звонарей можно уведомить о том, когда следует звонить. (nwt - not working time)

exten => 374****,4,GotoIfTime(9:00-22:00|sat-sun|*|*?company,hol,1); суббота и воскресенье с 9 до 22.

Отметим, что в нашем случае в нерабочее время есть 1 дежурный специалист который с радостью примет звонок либо находясь в офисе либо на сотовый. Он то и есть тот самый extension hol

С расписанием все. Переходим к файлу company.tree где и происходит основная обработка входящих звонков

[company]

exten => s,1,Answer() ; Подняли трубку

exten => s,2,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}_X_${CALLERID(dnid)}_${CALLERID(name)})

exten => s,3,Set(MONITOR_FILENAME=/home/user/records/${fname})

;Задали параметры записи разговора

exten => s,4,Background(/var/lib/asterisk/sounds/ru/vizit2); Играем приветствие

exten => s,5,WaitExten(7) ;если после приветствия в течение 7 секунд небыло выбрано ничего, то отправляем клиента в очередь под названием "queue-support"

exten => s,6,Queue(queue-support)

exten => 1,1,Goto(otdel1,s,1) ; Если нажали 1

exten => 2,1,Goto(otdel2,s,1) ; Если нажали 2

exten => 3,1,Goto(otdel3,s,1) ; Если нажали 3

exten => _XXX,1,MixMonitor(/home/user/records/${fname}.wav) ; Если набрали внутренний номер, то начинаем запись

exten => _XXX,2,Goto(out,${EXTEN},1) ; и возвращаем звонок на обработку в extensions.conf в соответствующий extension в контексте out с приоритетом 1

Далее в company.tree есть такой фрагмент для обработки звонков которые должны отправиться к дежурному специалисту

exten => hol,1,Answer()

exten => hol,2,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}_X_${CALLERID(dnid)}_${CALLERID(name)})

exten => hol,3,Set(MONITOR_FILENAME=/home/user/records/${fname})

exten => hol,4,Background(/var/lib/asterisk/sounds/ru/vizit2_hollydays)

exten => hol,5,WaitExten(7)

exten => hol,6,MixMonitor(/home/user/records/${fname}.wav)

exten => _XXX,2,Goto(out,142,1)

Как Вы можете заметить, разница только в том, что мы не предлагаем варианты типа "отдел 1, отдел 2, отдел 3". Либо набери внутренний номер либо переключаем на дежурного (внутренний номер 142)

[otdel1]

exten => s,1,Queue(queue-support)

exten => 0,1,Goto(company_tree,s,1)

[otdel2]

exten => s,1,Queue(queue-support)

exten => 0,1,Goto(company_tree,s,1)

[otdel3]

exten => s,1,Dial(SIP/116&SIP/117&SIP/137)

exten => 0,1,Goto(company_tree,s,1)

Отделы 1 и 2 пока не готовы сказать, кто будет принимать звонки. Поэтому как видите мы их заворачиваем все на тот-же call-центр в очередь. Но можно выйти из очереди нажав 0. В отделе 3 аж 3 сотрудника готовы ответить. Поэтому в 3 отделе звонят одновременно 3 аппарата. Кто первый трубку возьмет, тот и будет говорить.

Выше я грозился в случае необходимости передать звонок на сотовый сотруднику, отправить СМС с номером звонящего и не спрашивать подтверждения после того, как сотрудник поднял трубку.

Вернемся к extensions.conf и запилим все вышеперечисленное

Допустим у нас есть некий звонок который должен прийти к специалисту у которого внутренний номер 102

exten => 102,1,Dial(SIP/102,30) ;Звоним на номер 102 в течение 30 секунд

exten => 102,n,System(echo '${CALLERID(name)}' | gnokii --sendsms +71234567890) ;Если не дозвонились, то отправляем СМС-сообщение с номером звонящего при помощи программы "gnokii" с использованием обычного 3G-модема

exten => 102,n,Wait(3) ;Ждем 3 секунды, чтобы СМС была доставлена

exten => 102,n,Dial(SIP/81234567890@mts1,30) ;Звоним на сотовый сотруднику

ВАЖНО!!! Если не сделать Wait(3) перед звонком, то во многих случаях звонок не пройдет и клиент услышит фразу "Абонент временно недоступен". Уж не знаю в чем тут дело. Толи сотовые трубки в момент приема СМС не могут принять звонок, толи у некоторых операторов проблемы с настройками...

Теперь глянем файл queues.conf в котором заданы параметры нашей очереди

[queue-support] ;название очереди

music=default ;музыка которую будем играть во время ожидания ответа

strategy=ringall ; стратегия работы (курить мануал по очередям до просветления:-))

timeout=60

retry=5

maxlen=0

joinempty=yes

ringinuse=no

announce-frequency = 30 ;частота анонсов

announce-holdtime = no ;не объявлять приблизительное время ожидания

announce-position-limit = 6 ;информация о позиции выдаваться не будет, что бы не пугать клиента

;queue-youarenext = /var/lib/asterisk/sounds/ru/queue-youarenext ;Вы первый в очереди

;queue-thereare = /var/lib//asterisk/sounds/ru/queue-thereare

;queue-callswaiting = /var/lib/asterisk/sounds/ru/queue-callswaiting

;queue-thankyou = /var/lib/asterisk/sounds/ru/queue-thankyou

monitor-format=wav ;формат файла куда пишется разговор с оператором

monitor-type=MixMonitor ;писать голоса И клиента И оператора

member=>SIP/100 ;Очередь обслуживает внутренний номер 100

ВСЕ! Входящие обрабатываются, переадресуются, пишутся и т.д.

Переходим к исходящим

Все тот-же extensions.conf

exten => _X.,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}_X_${CALLERID(dnid)}_${CALLERID(num)})

exten => _X.,n,Set(MONITOR_FILENAME=/home/user/records/${fname})

exten => _X.,n,MixMonitor(/home/user/records/${fname}.wav)

exten => _X.,n,Dial(SIP/mts1/${EXTEN}) ; Тут мы просто звоним по тому номеру который набрал пользователь

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _8XXXXXXXXXX.,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}_X_${CALLERID(dnid)}_${CALLERID(num)})

exten => _8XXXXXXXXXX.,n,Set(MONITOR_FILENAME=/home/user/records/${fname})

exten => _8XXXXXXXXXX.,n,MixMonitor(/home/user/records/${fname}.wav)

exten => _8XXXXXXXXXX.,n,Dial(SIP/mts1/${EXTEN})

exten => _+7XXXXXXXXXX,1,GoTo(out,8${EXTEN:2},1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Фрагмент из последних 5 строк нужен, чтобы обрабатывать номера набираемые через "+7"

Примечание:

Некоторые посмотрев на обработку входящих и на реализацию переадресации скажут "Чува-а-а-ак! Ну есть же FollowMe!!!". Ну да, есть. Только нигде не найти ответа на вопрос "Как застравить астер просто передавать звонок на сотовый и не спрашивать подтверждения?" Поэтому сделал через диалплан. Если кто-то знает более правильное решение - пишите пожалуйста. Попробуем и опубликуем с привеликим удовольствием!

Ну и последние 3 штриха

1. CDR пишем в MySQL - Тут респект автору статьи за разжеванный материал. Описанное прекрасно подошло для моего Asterisk 1.6, хотя с установкой аддонов пришлось немного повозиться.... Вобщем берите ПРЕДпоследнюю версию аддонов. Последняя у меня лично не сработала.

2. Интеграция с 1С - Респект конторе "Симплет". Если у Вас есть 1С-разработчик (или Вы сами в курсе как писать под 1С), то с использованием их панели телефонии можно очень многое из астериска передать в 1С. Там же найдете необходимые библиотеки и инструкции как все грамотно подключить. Ну а если чего не найдете, то я готов все прислать по запросу в почту.

Адрес: Alexandr[Собака]Мой_домен

3. Настройка Mikrotik'ов чтобы VPN между офисами была.

Помогла статья? Поддержи автора!