Первый опыт с Asterisk

Начнем помаленьку... Вобщем долго я не мог решиться на освоение Астера (Asterisk) ибо как построить обычную локалку я знаю, а вот чтобы по ней еще и телефония работала да еще и с выходом в город... Короче темный лес. И вот зимой 2013-2014 я таки решился прочитать первый ман мо этому делу не "по диагонали" а вдумчиво и возможно с тестовой машиной.

Тут надо сказать, что хоть я и говорю всем, что самый продвинутый по функционалу и удобству интерфейс - это командный, но иногда все-же малодушничаю и пишу в гугле вместе с сутью вопроса три буковки "GUI". Так получилось и в этот раз. Я боялся, что не смогу разобраться в языке программирования Астера (именно так на некоторых страницах в этих ваших интернетах и было написано.) и набрал в запросе "asterisk gui". Наткнулся на эту статью и подумал "О! Круть! Ща я быстро запилю на виртуалку всю эту шляпу и не надо будет мне в тонкости конфигурирования вникать. Натыкал мышью чего надо и порядок!". Вобщем я ошибся... Статья прекрасна, но вот понять что к чему в веб-интерфейсе оказалось намного сложнее (для меня), чем просто открыть файлики sip.conf и extensiions.conf и все самому написать как мне надо. Помучавшись с вебом и поняв, что если и были какие-то дефолтные конфиги в общем случае правильные из коробки, то сейчас я их уже точно похерил я снес все под корень и воспользовавшись упомянутой выше статьей поставил только астериск не прикручивая к нему веб-управлялку. Ну а дальше на примерах.

Моя ситуация.

В офис заведена телефонная линия по оптике (SIP) от Билайн (Спасибо чуваки! Все работает, одна авария за 3 года разрулили за 4 часа зимой!), дальше стоят Билайновские-же аудиокодесы и превращают кошернейший SIP в убогий аналог который подключался к Panasonic TDA-30. Потом ТДА-шку заменили на KX-NCP1000. Переход этот позволил подключить вместо 16 пользователей ~40 и обошелся компании в over 100000 вечно-деревянных рублей + вызов специалиста для настройки, но это уже мелочи.

Время шло, штат разростался, компания выкупила вторую половину здания в котором мы распологались и стало понятно, что NCP нам уже мало в той конфигурации, которая есть, а расширение имеет свой предел и стоит денег. Плюс тянуть аналоговые линии до каждого рабочего места - геморрой еще тот. Так и решили мы воспользоваться астером ибо с SIP он работает прекрасно, денег за него не просят и вообще будущее за цифрой.

Вобщем я считаю, что статью ссылка на которую была выше Вы осилили и сам Астер у Вас установлен.

Добавляем SIP-транк (то, через что Астер общается с внешним миром) в файл /etc/asterisk/sip.conf

[beeline1]

description=Транк Билайн1

defaultuser = 8846*******

fromuser = 8846*******

callerid = 8846*******

host= ТУТ_БУДЕТ_IP_SIP_ШЛЮЗА_ПРОВАЙДЕРА

fromdomain = ТУТ_БУДЕТ_IP_SIP_ШЛЮЗА_ПРОВАЙДЕРА

dtmfmode = rfc2833

type=friend

canreinvite=no

insecure=invite,port

context=beeline-trunk ;тут пишется название контекста в котором будут обрабатываться звонки проходящие через транк

qualify=yes

disallow=all ;запретили ВСЕ кодеки

allow=alaw ;разрешили кодек G711

allow=ulaw :разрешили еще какой-то кодек из рекомендованных провайдером (точно название не помню, но тоже G7-какой-то)

nat = yes ; Да, мы работаем за натом

deny=0.0.0.0/0.0.0.0 ;запретили работать с ЛЮБЫМ АДРЕСОМ ЛЮБОЙ СЕТИ

permit=195.239.42.214/255.255.255.255 ; Разрешили работать с IP адресом SIP_ШЛЮЗА_ПРОВАЙДЕРА и ТОЛЬКО С НИМ!!!

alwaysauthreject=yes ; Если что-то не так при регистрации, то посылать всех нахрен без объяснения причин.

Обратите внимание на последние 3 строчки. Это очень важно с точки зрения безопасности! Дело в том, что у Астера есть свой встроенный файрволл. Так вот первая из 3 строк отсечет злоумышленников из всех сетей. Вторая разрешит работать только с тем, кому мы доверяем, а третья не позволит злоумышленнику прикинувшись провайдером узнать, как надо авторизоваться на нашем сервере.

Так... Выход в город по SIP есть.

Теперь подключим резервные аналоговые линии (просто потому, что они у нас есть в количестве 3 штук). Для этого поставим шлюз (в моем случае GrandStream GXW-4104), обновим прошивку (ацкий танец с бубном!), настроим его (еще ацкий танец с бубном!) и создадим еще один транк:

[Городской 7-значный номер]

description=Trunk

defaultuser = Городской 7-значный номер

fromuser = Городской 7-значный номер

callerid = Городской 7-значный номер

username = Городской 7-значный номер

secret = Страшно-длинный-пароль-указанный-в-настройках-шлюза-для-этого-канала

host=dynamic

fromdomain = 192.168.2.161 ;Ip-адрес шлюза

dtmfmode = rfc2833

type=friend

canreinvite=no

insecure=invite,port

context=out

qualify=yes

disallow=all

allow=alaw

allow=ulaw

nat = no

deny=0.0.0.0/0.0.0.0

permit=192.168.2.0/255.255.255.0 ; тут я париться не стал и разрешил всю подсеть "192.168.2.0" ибо вся эта подсеть состоит из шлюза и отдельной сетевки в моей Астерисковой машине. Т.е. безопасность обеспечена на физическом уровне. Можно было-бы воткнуть шлюз в общую сеть и не ставить дополнительную сетевку в комп с астериском, но мне так больше нравится.

alwaysauthreject=yes ;ВСЕГДА(!) добавляйте эту строчку!!!

У меня еще есть линии которые предоставлены Телфином (единственный найденный мною оператор который предоставил прмые московские номера нам в Самаре за адекватные деньги и с использованием VPN). Вообще лично я считаю, что когда речь идет об IP-телефонии у Вас должна оживать Ваша внутренняя паранойя. Если у Вас не прямой канал до провайдера, то пользуйте VPN, шлюзы всегда в отдельную подсеть и с паролями ну и т.д.

Вобщем на каждый телфиновский номер у нас будет 2 транка (входящий и исходящий). Не спрашивайте, почему так ибо я не знаю. Таковы у них требования.

[in_номер_линии]

context = out

type = peer

username = номер_линии (пришлют при подключении, начинается с 000)

secret = Ваш_пароль

host = IP-шлюза_провайдера

port = 5060

disallow=all

allow=alaw

deny=0.0.0.0/0.0.0.0

permit=Подсеть_провайдера/255.255.255.0

permit=VPN_подсеть_с_провайдером/255.255.255.0

alwaysauthreject=yes

[telphin2]

;description=7495*******;Ваш_номер

defaultuser = номер_линии (пришлют при подключении, начинается с 000)

context = out

type = peer

fromuser = номер_линии

username = номер_линии

secret = Ваш_пароль

host = IP-шлюза_провайдера

port = 5060

insecure=invite

promiscredir = yes

;qualify=yes

disallow=all

allow=alaw

deny=0.0.0.0/0.0.0.0

permit=Подсеть_провайдера/255.255.255.0

permit=VPN_подсеть_с_провайдером/255.255.255.0

alwaysauthreject=yes

Да! И еще не забыть для Телфина в начале sip.conf вставить

"register => номер_линии:пароль@IP-шлюза-провайдера:5060/номер_линии"

Ну вот. Линии заведены, можно и пользователей добавить! Там же в sip.conf для удобства разделив транки и пользователей строчкой ;;;;;;;;;;;;;;;;;;;;;;;;; (коментарии) делаем так

[101]

description=Имя_пользователя_которое_можно_писать_на_русском. Это мы пишем для себя, чтобы не забыть кто есть кто.

type=friend

username=101 ;Это логин

secret= Очень_сложный_пароль

callerid=Secretar <101> ; Тут пишем ТРАНСЛИТОМ то, что будет высвечиваться у остальных пользователей на экранах телефона, когда ЭТОТ пользователь им звонит.

host=dynamic ;Пользователь получает IP-адрес устройства по DHCP, поэтому хрен его знает с какого IP он будет подключаться

disallow=all

allow=gsm

allow=alaw

allow=h261 ;ТУТ

allow=h263 ; РАЗРЕШАЮТСЯ

allow=h263p ; КОДЕКИ

allow=h264 ; ДЛЯ

allow = mpeg4 ; ВИДЕО

;allow=g729 ;

;allw=gsm

context=out

call-limit=1

qualify=yes

nat=yes

canreinvite=no

deny=0.0.0.0/0.0.0.0

permit=192.168.0.0/255.255.255.0 ;Разрешили всю нашу внутреннюю сеть.

permit=192.168.3.0/255.255.255.0 ;Разрешили нашу VPN-сеть (если предполагается, что ЭТОТ пользователь будет подключаться по VPN и пользовать телефонию. Полезно когда пользователь например в другом городе или стране где можно найти не дорогой интернет и у пользователя хватает мозгов на то, чтобы настроить VPN в своем устройстве).

alwaysauthreject=yes

Все. Пользователь с внутренним номером "101" добавлен

Сейчас будет рекламная вставка

Представьте себе, что у Вас не один пользователь, который может оказаться в командировке и ему нужна дешевая связь с офисом, а удаленный офис с кучей сотрудников. Тогда было-бы круто НЕ платить за межгород с ними. Для этого берем офигенное оборудование Microtik (у меня вот такие красавцы трудятся) и настраиваем на них VPN-соединение. Пользуем фишки типа вач-догов, чтобы роутеры сами следили за состоянием соединения и в случае необходимости сами предпринимали необходимые действия типа использования резервных каналов (прекрасно работают с Yota, Мегафон-4G и прочими провайдерами USB-свистков) или балансировки нагрузки на подключенные каналы. О! Кстати! А ведь НА ЭТИ РОУТЕРЫ МОЖНО ПОСТАВИТЬ ASTERISK!!! Или SQUID!!! Или... ИЛИ ВООБЩЕ ВСЕ ЧТО УГОДНО! Там линух на борту. Но это все как-нибудь потом...

Так вот! При таком подходе у Вас все офисы оказываются в одной единой телефонной сети и платите Вы только за интернет, который как правило безлимитный.

Конец рекламы моих любимых микротиков.

Выход в город есть, пользователй создали. Теперь надо отредактировать /etc/asterisk/extensions.conf чтобы наш астер знал куда и какие звонки отправлять

Есть пара моментов. Первое: у нас не используется внутренний номер "1001" и в sip.conf он не описан. Этот номер я использовал для того, чтобы отправить звонок на автоинформатор, который просит набрать внутренний номер абонента или дождаться ответа.

Второе: Как вы можете заметить, Телфиновские линии нужны не всем, а только 2 сотрудникам. Причем входящие на определенную линию отправляются не на автоинформатор а на конкретного сотрудника. Позвонить же с московского номера можно набрав на телефоне "*8" для одной линии или "*9" для другой

[out]

exten => 100,1,Dial(SIP/100) ;Если кто-то звонит на внутренний "100", то надо по SIP позвонить на номер "100"

exten => 101,1,Dial(SIP/101) ;Если кто-то звонит на внутренний "101", то надо по SIP позвонить на номер "101"

exten => номер_линии_Телфин,1,Dial(SIP/105) ;Если кто-то звонит на первую линию Телфин, то надо по SIP позвонить на номер "105"

exten => 1001,1,Goto(company,s,1) ;Если кто-то звонит на 1001, то отправить в "company"

exten => _*8X.,1,Dial(SIP/telphin/${EXTEN:2}) ; вот он! Звонок через Телфин. ":2" тут нужно, чтобы Астер отправлял в линию набранный номер НЕ учитывая первые 2символв. Т.е. увидев начало *8 Астер понял, что звонить надо через Телфин и эти самые *8 отрезал

exten => _*9X.,1,Dial(SIP/telphin2/${EXTEN:2}) ;Аналогично звоним через другую Телфиновскую линию

exten => _X.,1,Dial(SIP/beeline2/6256029#${EXTEN}) :Транк для первого билайна у нас закреплен за парой человек, которые должны звонить всегда с одного и того-же номера.

exten => _X.,n,Dial(SIP/beeline3/${EXTEN}); Вобщем

exten => _X.,n,Dial(SIP/beeline4/${EXTEN});Тут

exten => _X.,n,Dial(SIP/beeline5/${EXTEN});Мы

exten => _X.,n,Dial(SIP/2699525/${EXTEN});Перебираем

exten => _X.,n,Dial(SIP/2699558/${EXTEN}); Подряд

exten => _X.,n,Dial(SIP/2699587/${EXTEN}) ; Все доступные линии, пока не наткнемся на свободную

exten => _X.,n,Hangup()

[beeline-trunk] В контекст "Beeline-trunk" я загнал все транки, кроме телфиновских. При входящем звонке на любой из них (кроме первых двух) звонок отправляется на автоинформатор

exten => 2699525,1,Dial(SIP/118) ;если кто-то звонит на 2699525, отправить звонок на внутренний "118"

exten => _XXXX2738426,1,Dial(SIP/136&SIP/137&SIP/138) ; если звонят на 2738426, то будут одновременно звонить внутренние номера 136, 137 и 138

exten => _XXXX2738427,1,Goto(company,s,1) ;Собственно автоинформатор

exten => _XXXX2793394,1,Goto(company,s,1) ;Собственно автоинформатор

exten => _XXXX2793395,1,Goto(company,s,1) ;Собственно автоинформатор

exten => _XXXX2793396,1,Goto(company,s,1) ;Собственно автоинформатор

exten => 2699558,1,Goto(company,s,1) ;Собственно автоинформатор

Чтобы автоинформатор работал, надо в начале extensions.conf в раздел "[general]" добавить строчку #include company.tree

и в каталоге /etc/asterisk/ создать файл company.tree и в нем написать:

[company]

exten => s,1,Answer() ;Астер поднял трубку

exten => s,2,Background(/var/lib/asterisk/sounds/ru/hello) ;Выдал на линию приветствие (пока играет приветствие звонящий уже может набирать внутренний номер. Если вместо Background Вы напишите "Playback", то звонящий будет вынужден дослушать сообщение до конца)

exten => s,3,WaitExten(7) ;Даем 7 секунд подумать и таки набрать внутренний номер

exten => _XXX,1,Dial(SIP/${EXTEN}) ;Если номер набран, то переводим звонок на него

exten => t,1,Dial(SIP/101) ;Если пока играло приветствие и шли 7 секунд ожидания звонящий так и не набрал внутренний номер, то отправить звонок секретарю на номер 101.

ВСЕ!

Теперь у нас есть Астер, который работает с 3 очень разными провайдерами телефонии от аналога до SIP без регистрации + приветствие + поддержка видео звонков (работает в программном клиенте LinPhone под Android, который глючит безбожно!) + работа с удаленными пользователями через VPN.

Если очень интересно узнать кто куда и как долго звонил, то можно взять файлик /var/log/asterisk/cdr-csv/Master.csv и импортнуть его в OpenOffice Calc например.

Надеюсь кому-то приведенные примеры помогут быстро справиться с поставленными задачами.

В следующий раз расскажу про организацию мини-колцентра из пентиума 4, 2 телефонов и 4 3G-модемов в качестве линий связи.:-)