Первый опыт с 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-модемов в качестве линий связи.:-)