Идея этого материала пришла мне в прошлом году, когда сделав большой круг по нашей необъятной, я в конце месяца получил счета за роуминг. Несмотря на уверения сотовых компаний о свободном роуминге внутри страны, смс или Интернет-трафик может тарифицироваться отдельно. А включенные в тариф минуты действуют только в «домашнем регионе». Ну а поскольку в этом году планы предусматривают путешествия не только по родной стране, то я начал реализовывать свою задумку — собственная стационарная АТС дома, которая сможет связаться со мной в любой точке земного шара.
Попутно я решил проблему телефонной связи между квартирами и домами родственников, поскольку время внутренних переговоров исчислялось не просто часами, а десятками часов.
Небольшой спойлер: в результате удалось установить Asterisk на NAS и роутер
Так я пришел к тому, что нужна собственная телефония. Можно было бы выбрать какой-либо из сервисов SIP-телефонии, которые в большом количестве присутствуют на рынке. Но у меня был сформирован список требований, которым не удовлетворял ни один из операторов:
- Самостоятельный выбор внутренних номеров
- Выход на внешние линии связи с возможностью звонков на городские и сотовые номера
- Возможность выбора оператора, предоставляющего IP-телефонию
- Возможность задействовать SIM-карту выбранного оператора с обычным «телефонным» тарифом
- Наличие голосового меню для переадресации входящего звонка нужному абоненту
- Минимальная или нулевая стоимость обслуживанияподдержания внутренней связи
Многие операторы предоставляют виртуальную АТС и даже голосовое меню. Но эта услуга уже является платной. Некоторые операторы позволяют звонить внутри своей сети бесплатно, но возникает проблема набора длинных номеров. И уж точно никто не позволяет использовать SIM-карту выбранного оператора с минимальной стоимостью звонков или предоплаченными минутами. Так я решил сам стать собственным оператором связи.
Шаг первый. Выбор платформы: виртуализация
Так как я уже имел дело с IP-телефонией, то решено было поднимать свою АТС на базе Asterisk — это бесплатно, есть масса форумов, мануалов и… почему бы нет? Я обзавелся несколькими радиотрубками с поддержкой SIP и начал думать над платформой для работы Астериска. Выносить в облака или на виртуальный сервер- это означало бы, что рано или поздно придется платить, но тогда рушится идея сделать телефонию бесплатно. Поэтому я решил задействовать функцию виртуализации на своём NAS QNAP-451. Об этой фишке сетевого накопителя я уже писал, так что можно почитать подробнее. Производительности системы с головой хватало не только для работы самого Астериска, но и для работы web-интерфейса, поэтому я решил использовать дистрибутив Elastix. Надо сказать, что последний доступный на официальном сайте Elastix.org дистрибутив под номером 5 уже является условно бесплатным, поэтому рекомендую на торрентах поискать дистрибутив версии 4 — он был бесплатен и распространялся свободно, но теперь на сайте не доступен.
Создание пользователей в Elastix описано многократно, а вот остальное освещено в сети не так подробно. Поэтому я опишу подключение SIP-провайдера «Мультифон» от Мегафона и создание голосового меню с переадресацией.
Создаем транк с параметрами своей учетной записи в Мультифон. К любому номеру оператора Мегафон можно подключить эту опцию. Списание средств никак не зависит от выбранного тарифного плана и производится за каждую минуту исходящего звонка. Входящие бесплатны. Поддерживается сразу две линии разговора. Кроме того, можно настроить, чтобы входящие звонки шли только на телефон, телефон+мультифон, только на мультифон.
Настройки текстом для тех, кто хочет добавить себе транк Мультифон:
username=номер_телефона
type=peer
secret=пароль
port=5060
nat=yes
insecure=port,invite
host=sbc.megafon.ru
fromuser=номер_телефона
fromdomain=multifon.ru
dtmfmode=inband
context=from-trunk
Register String:
номер_телефона: пароль@multifon.ru/номер_телефона
Итак, мы подключились к SIP-провайдеру и теперь можем переадресовать входящий звонок на любой из внутренних номеров. Но что делать, если хочется, чтобы позвонивший сам выбирал, на какой внутренний номер ему набрать? Можно создать голосовое меню с выбором адресата. Сделаю пошаговое описание.
Создаем голосовое меню в Elastix
Переходим в пункт System Recordings. Здесь уже написаны параметры голосовой записи, которую необходимо сделать: PCM, 16 bit, 8000 Hz. Это можно сделать как в стандартной звукозаписывающей утилите, так и в сторонних программах вроде SoundForge.
После того, как создано голосовое приветствие и загружено на сервер, переходим в пункт меню IVR. Создаем новое голосовое меню и выбираем файл приветствия, а также реакцию на нажатие кнопок. В моем случае я выбрал, что по нажатию цифры «3» будет вызываться номер «101» и так далее. Если же выбирается ошибочная кнопка или звонящий не нажимает ни одну кнопку, то переадресация идет на внутренний номер 304.
Теперь надо сделать, чтобы входящий звонок попадал на наше голосовое меню. Заходим в пункт Inbound Routes и создаем новое правило. В последнем пункте «Set Destination» выбираем IVR и ранее созданную очередь, которую я назвал «dozvon».
Сохраняем и пользуемся. Все это проработало около месяца без сбоев, но этого мне показалось мало. Ведь не у каждого дома стоит NAS с виртуалкой или сервер, на котором можно поднять Астериск, но почти у каждого дома есть роутер!
Возможные проблемы и их решение с виртуальным сервером
В процессе создания сервера и переадресации портов, выяснилось, что работа двух виртуалок и одного физического сервера на одном сетевом порту не очень эффективна. Самым простым решением было воспользоваться возможностями системы виртуализации и отдельный сетевой интерфейс выделить под виртуальную машину. Сделать это оказалось очень просто встроенными средствами QNAP. После этого, на первом сетевом интерфейса остался работать сам NAS+1-я виртуальная машина, а на втором сетевом интерфейсе — вторая виртуалка.
Шаг второй: поднимаем Asterisk на роутере
Так получилось, что я пользуюсь провайдером Yota, но не пользуюсь их оригинальными роутерами. Уже давно у меня поселился отличный роутер от Zyxel — Keenetic LTE. Пару лет назад я его уже испытывал в самых суровых условиях глубинки и остался полностью доволен — об этом есть отдельный материал на Хабре.
В последних прошивках NDMS, а если быть точнее, то начиная с прошивки 2.08.B, для семейства роутеров Zyxel Keenetic включена поддержка пакетов OPKG. Это значит, что можно ставить самый разнообразный софт. (Есть масса софта, адаптированного под роутеры Zyxel) Так почему бы не поставить туда Asterisk? Важно, чтобы роутер имел минимум 128 Мб оперативки. Сказано — сделано!
Тем приятнее, что специалисты Zyxel даже подготовили мануал по разворачиванию Asterisk для своих роутеров. В принципе, чтобы развернуть на роутере телефонию, достаточно следовать пошаговой инструкции. А я расскажу, как я усовершенствовал и довел функционирование этой системы до той, что крутилась на отдельном виртуальном сервере.
Первое, с чем я столкнулся, была неясная проблема с запуском роутера после программной перезагрузки. Оказалось, что моя флешка, подключенная к USB порту роутера, потребляет ток до 0.16А. Этого оказалось достаточно, чтобы LTE модем в роутере Zyxel Keenetic LTE периодически не мог стартовать. Все вылечилось подключением флешки через внешний USB-хаб с дополнительным питанием. Взял проверенный временем и многими людьми D-Link DUB-H7. На этом проблемы закончились. Полагаю, что роутеры с парой USB портов будут работать без таких костылей.
Теперь приступаем к настройкам Астериска. Здесь уже надо править все ручками. Есть два пути: зайти по SSH и там править (MC присутствует) или же зайти по шаре на IP-адрес роутера и править файлы при помощи Notepad++. Меня устраивали оба варианта и я приступил к делу. Добавил своих пользователей, прописал транк мультифона в файле sip.conf. Осталось только сделать голосовую очередь. Голосовой файл приветствия я поместил в \192.168.1.1Asterisk-bluevarlibasterisksoundsru, а в файл extensions.conf внес следующие правки.
;------------------ Multifon — exten => _8..........,1,NoOp()
exten => _8..........,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _8..........,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _8..........,n,Answer()
exten => _8..........,n,Wait(2)
exten => _8..........,n,Playback(/opt/var/lib/asterisk/sounds/itsp_names/multifon)
exten => _8..........,n,Dial(SIP/Multifon/7${EXTEN:1},,T)
exten => _8..........,n,Hangup()
[multifon-incoming];===== Incoming call from Multifon =====
exten => _........,1,NoOp()
exten => _........,n,Wait(4)
exten => _........,n,Answer()
exten => _........,n(play),NoOp()
exten => _........,n,Wait(1)
exten => _........,n,Playback(hello)
exten => _........,n,Wait(0,5)
exten => _........,n,Playback(priv)
exten => _........,n,Set(TIMEOUT(digit)=1)
exten => _........,n,NoOp()
exten => _........,n,WaitExten(7)
exten => _1,1,NoOp()
exten => _1,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _1,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _1,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _1,n(dial_ext),Dial(SIP/101,60,mt)
exten => _2,1,NoOp()
exten => _2,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _2,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _2,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _2,n(dial_ext),Dial(SIP/302,60,mt)
exten => _3,1,NoOp()
exten => _3,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _3,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _3,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _3,n(dial_ext),Dial(SIP/304,60,mt)
Итак, все заработало. Исходящие звонки идут через Мультифон, внутренние звонки между абонентами бесплатны, а входящие через Мультифон могут быть адресованы любому из трех абонентов. Но мне этого показалось мало. И жаль, что только Мегафон дает альтернативную сотовой линии SIP связь. Как быть, если захочется воспользоваться другим сотовым провайдером? Решение проблемы есть!
Шаг третий: привязываем к нашему Астериску любого оператора сотовой связи
Последним шагом стало подключение к нашему серверу телефонии любого оператора сотовой связи. Самым логичным решением явилось бы подключение GSM-SIP шлюза, который на выходе дает SIP-транк. Но стоимость таких устройств на 1 sim-карту начинается от 9 тыс.рублей, поэтому было решено пойти другим путем. Находим модем с поддержкой голосовых функций. В нашем случае это оказался Huawei E3131. Как его разлочить и включить голосовые функции многократно рассказано в сети, поэтому на это отвлекаться не буду. Вставляем нужную нам sim-карту в порт USB-хаба и первым делом отключаем в меню его работу в качестве 3G модема.
После чего начинаем конфигурировать файлы Астериска. Первым делом установим пакет Dongle командой в консоли opkg install asterisk11-chan-dongle. После установки, открываем файл dongle.conf и правим, чтобы получилось следующее:
interval=15
[defaults]
context=dongle-incoming
rxgain=0
txgain=0
usecallingpres=yes
callwaiting=no
dtmf=inband
mindtmfgap=45; minimal interval from end of previews DTMF from begining of next in ms
mindtmfduration=80; minimal DTMF tone duration in ms
mindtmfinterval=200; minimal interval between ends of DTMF of same digits in ms
[GSM1]
audio=/dev/ttyUSB1
data=/dev/ttyUSB2
imei=*****************; E3131 — ввести IMEI модема
Сохраняем файл и переходим к файлу extensions.conf. Мультифон можно закомментировать, а для работы с модемом добавить.
;------------------ GSM1 Donle — exten => _8..........,1,NoOp()
exten => _8..........,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _8..........,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _8..........,n,Answer()
exten => _8..........,n,Wait(2)
exten => _8..........,n,Playback(/opt/var/lib/asterisk/sounds/itsp_names/beeline-gsm)
exten => _8..........,n,Dial(DONGLE/GSM1/8${EXTEN:1},,T)
exten => _8..........,n,Hangup()
[dongle-incoming]; для входящих вызовов:
exten => s,1,NoOp()
exten => s,n,Wait(4)
exten => s,n,Answer()
exten => s,n(play),NoOp()
exten => s,n,Wait(1)
exten => s,n,Playback(hello)
exten => s,n,Wait(0,5)
exten => s,n,Playback(priv)
exten => s,n,Set(TIMEOUT(digit)=1)
exten => s,n,NoOp()
exten => s,n,WaitExten(7)
exten => _1,1,NoOp()
exten => _1,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _1,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _1,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _1,n(dial_ext),Dial(SIP/101,60,mt)
exten => _2,1,NoOp()
exten => _2,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _2,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _2,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _2,n(dial_ext),Dial(SIP/302,60,mt)
exten => _3,1,NoOp()
exten => _3,n,Set(__SIP_CODEC_OUTBOUND=ulaw)
exten => _3,n,Set(__SIP_CODEC_INBOUND=ulaw)
exten => _3,n,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _3,n(dial_ext),Dial(SIP/304,60,mt)
Теперь все завелось и заработало, как надо. Входящие звонки на номер принимает Астериск и пользователь выбором цифры определяет, куда ему звонить. Исходящий звонок идет через любого оператора сотовой связи, где бы вы ни находились. То есть можно вставить в USB-модем свою sim-карту и ехать в любую точку планеты. Там достаточно иметь выход в сеть, а на смартфоненоутбуке иметь SIP-клиента, который подключится к вашему серверу Asterisk. Решение обкатано и работает. Возникающие глюки лечились добавлением USB-хаба с внешним питанием и заменой флешки, так как некоторые накопители работали со сбоями. На всю работу по вводу телефонии в работу уйдет один вечер.
Чтобы эта работа не пропала, можно одной командой создать бэкап всего Астериска на флешке:
Бонус для владельцев Zyxel Keenetic LTE
Надо отметить, что этот роутер также оснащен двумя SIP-клиентами с физическими портами FXS, к которым можно подключить любой аналоговый телефон. И этот клиент легко подключается к серверу Астериск, который крутится на нем же.
Бонус для владельцев Zyxel Keenetic*
Если не хочется тратиться на покупку SIP-телефонов, то роутеры линейки Keenetic поддерживают DECT-адаптер от Zyxel, который добавляет функцию SIP-телефонии с возможностью подключения любой беспроводной трубки стандарта DECT.
Заключение
Задача бесплатной связи между разнесенными абонентами с частыми и длительными переговорами решена. Задача «присутствия» абонента в городе и бесплатная связь с владельцем номера, где бы владелец ни находился, также решена. Решение с виртуализацией на сетевом накопителе QNAP-451 выигрывает за счет возможности конфигурировать Asterisk через web-интерфейс. Зато решение с роутером не требует практически никаких затрат. Астериск — это просто! Зачем платить за роуминг, когда связь может быть бесплатной?
Хочу отдельно поблагодарить команду Zyxel за отзывчивость, помощь в экспериментах и увеличение функциональности своих устройств.
Автор: shuvaevgl