- PVSM.RU - https://www.pvsm.ru -

Как перестать платить за роуминг, или С одним номером по всему свету

Идея этого материала пришла мне в прошлом году, когда сделав большой круг по нашей необъятной, я в конце месяца получил счета за роуминг. Несмотря на уверения сотовых компаний о свободном роуминге внутри страны, смс или Интернет-трафик может тарифицироваться отдельно. А включенные в тариф минуты действуют только в «домашнем регионе». Ну а поскольку в этом году планы предусматривают путешествия не только по родной стране, то я начал реализовывать свою задумку — собственная стационарная АТС дома, которая сможет связаться со мной в любой точке земного шара.
Попутно я решил проблему телефонной связи между квартирами и домами родственников, поскольку время внутренних переговоров исчислялось не просто часами, а десятками часов.
Небольшой спойлер: в результате удалось установить Asterisk на NAS и роутер

Как перестать платить за роуминг, или С одним номером по всему свету - 1

Так я пришел к тому, что нужна собственная телефония. Можно было бы выбрать какой-либо из сервисов SIP-телефонии, которые в большом количестве присутствуют на рынке. Но у меня был сформирован список требований, которым не удовлетворял ни один из операторов:

  • Самостоятельный выбор внутренних номеров
  • Выход на внешние линии связи с возможностью звонков на городские и сотовые номера
  • Возможность выбора оператора, предоставляющего IP-телефонию
  • Возможность задействовать SIM-карту выбранного оператора с обычным «телефонным» тарифом
  • Наличие голосового меню для переадресации входящего звонка нужному абоненту
  • Минимальная или нулевая стоимость обслуживанияподдержания внутренней связи

Многие операторы предоставляют виртуальную АТС и даже голосовое меню. Но эта услуга уже является платной. Некоторые операторы позволяют звонить внутри своей сети бесплатно, но возникает проблема набора длинных номеров. И уж точно никто не позволяет использовать SIM-карту выбранного оператора с минимальной стоимостью звонков или предоплаченными минутами. Так я решил сам стать собственным оператором связи.

Шаг первый. Выбор платформы: виртуализация

Так как я уже имел дело с IP-телефонией, то решено было поднимать свою АТС на базе Asterisk — это бесплатно, есть масса форумов, мануалов и… почему бы нет? Я обзавелся несколькими радиотрубками с поддержкой SIP и начал думать над платформой для работы Астериска. Выносить в облака или на виртуальный сервер- это означало бы, что рано или поздно придется платить, но тогда рушится идея сделать телефонию бесплатно. Поэтому я решил задействовать функцию виртуализации на своём NAS QNAP-451. Об этой фишке сетевого накопителя я уже писал, так что можно почитать подробнее [1]. Производительности системы с головой хватало не только для работы самого Астериска, но и для работы web-интерфейса, поэтому я решил использовать дистрибутив Elastix. Надо сказать, что последний доступный на официальном сайте Elastix.org дистрибутив под номером 5 уже является условно бесплатным, поэтому рекомендую на торрентах поискать дистрибутив версии 4 — он был бесплатен и распространялся свободно, но теперь на сайте не доступен.

Создание пользователей в Elastix описано многократно, а вот остальное освещено в сети не так подробно. Поэтому я опишу подключение SIP-провайдера «Мультифон» от Мегафона и создание голосового меню с переадресацией.

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

Как перестать платить за роуминг, или С одним номером по всему свету - 2

Настройки текстом для тех, кто хочет добавить себе транк Мультифон:

Транк Мультифон

Peer Details:

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.

Как перестать платить за роуминг, или С одним номером по всему свету - 3

После того, как создано голосовое приветствие и загружено на сервер, переходим в пункт меню IVR. Создаем новое голосовое меню и выбираем файл приветствия, а также реакцию на нажатие кнопок. В моем случае я выбрал, что по нажатию цифры «3» будет вызываться номер «101» и так далее. Если же выбирается ошибочная кнопка или звонящий не нажимает ни одну кнопку, то переадресация идет на внутренний номер 304.

Как перестать платить за роуминг, или С одним номером по всему свету - 4

Теперь надо сделать, чтобы входящий звонок попадал на наше голосовое меню. Заходим в пункт Inbound Routes и создаем новое правило. В последнем пункте «Set Destination» выбираем IVR и ранее созданную очередь, которую я назвал «dozvon».

Как перестать платить за роуминг, или С одним номером по всему свету - 5

Сохраняем и пользуемся. Все это проработало около месяца без сбоев, но этого мне показалось мало. Ведь не у каждого дома стоит NAS с виртуалкой или сервер, на котором можно поднять Астериск, но почти у каждого дома есть роутер!

Возможные проблемы и их решение с виртуальным сервером

В процессе создания сервера и переадресации портов, выяснилось, что работа двух виртуалок и одного физического сервера на одном сетевом порту не очень эффективна. Самым простым решением было воспользоваться возможностями системы виртуализации и отдельный сетевой интерфейс выделить под виртуальную машину. Сделать это оказалось очень просто встроенными средствами QNAP. После этого, на первом сетевом интерфейса остался работать сам NAS+1-я виртуальная машина, а на втором сетевом интерфейсе — вторая виртуалка.

Как перестать платить за роуминг, или С одним номером по всему свету - 6

Шаг второй: поднимаем Asterisk на роутере

Так получилось, что я пользуюсь провайдером Yota, но не пользуюсь их оригинальными роутерами. Уже давно у меня поселился отличный роутер от Zyxel — Keenetic LTE. Пару лет назад я его уже испытывал в самых суровых условиях глубинки и остался полностью доволен — об этом есть отдельный материал [2] на Хабре.

В последних прошивках NDMS, а если быть точнее, то начиная с прошивки 2.08.B, для семейства роутеров Zyxel Keenetic включена поддержка пакетов OPKG. Это значит, что можно ставить самый разнообразный софт. (Есть масса софта [3], адаптированного под роутеры Zyxel) Так почему бы не поставить туда Asterisk? Важно, чтобы роутер имел минимум 128 Мб оперативки. Сказано — сделано!
Тем приятнее, что специалисты Zyxel даже подготовили мануал [4] по разворачиванию Asterisk для своих роутеров. В принципе, чтобы развернуть на роутере телефонию, достаточно следовать пошаговой инструкции. А я расскажу, как я усовершенствовал и довел функционирование этой системы до той, что крутилась на отдельном виртуальном сервере.

Первое, с чем я столкнулся, была неясная проблема с запуском роутера после программной перезагрузки. Оказалось, что моя флешка, подключенная к USB порту роутера, потребляет ток до 0.16А. Этого оказалось достаточно, чтобы LTE модем в роутере Zyxel Keenetic LTE периодически не мог стартовать. Все вылечилось подключением флешки через внешний USB-хаб с дополнительным питанием. Взял проверенный временем и многими людьми D-Link DUB-H7 [5]. На этом проблемы закончились. Полагаю, что роутеры с парой USB портов будут работать без таких костылей.

Теперь приступаем к настройкам Астериска. Здесь уже надо править все ручками. Есть два пути: зайти по SSH и там править (MC присутствует) или же зайти по шаре на IP-адрес роутера и править файлы при помощи Notepad++. Меня устраивали оба варианта и я приступил к делу. Добавил своих пользователей, прописал транк мультифона в файле sip.conf. Осталось только сделать голосовую очередь. Голосовой файл приветствия я поместил в \192.168.1.1Asterisk-bluevarlibasterisksoundsru, а в файл extensions.conf внес следующие правки.

Делаем голосовое меню в Asterisk

[external-outgoing]
;------------------ 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 модема.

Как перестать платить за роуминг, или С одним номером по всему свету - 7

После чего начинаем конфигурировать файлы Астериска. Первым делом установим пакет Dongle командой в консоли opkg install asterisk11-chan-dongle. После установки, открываем файл dongle.conf и правим, чтобы получилось следующее:

Рабочий файл dongle.conf

[dongle]
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. Мультифон можно закомментировать, а для работы с модемом добавить.

Прописываем для работы звонков через USB-модем в файле extensions.conf

[dongle-outgoing]; для исходящих вызовов:
;------------------ 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-хаба с внешним питанием и заменой флешки, так как некоторые накопители работали со сбоями. На всю работу по вводу телефонии в работу уйдет один вечер.

Чтобы эта работа не пропала, можно одной командой создать бэкап всего Астериска на флешке:

Делаем бэкап Астериска на флешке

tar cvzf /opt/backup-`date "+%Y-%m-%d_%H-%M"`.tar.gz -C /opt/ bin etc home lib lost+found root sbin share tmp usr var

Бонус для владельцев Zyxel Keenetic LTE

Надо отметить, что этот роутер также оснащен двумя SIP-клиентами с физическими портами FXS, к которым можно подключить любой аналоговый телефон. И этот клиент легко подключается к серверу Астериск, который крутится на нем же.

Бонус для владельцев Zyxel Keenetic*

Если не хочется тратиться на покупку SIP-телефонов, то роутеры линейки Keenetic поддерживают DECT-адаптер от Zyxel, который добавляет функцию SIP-телефонии с возможностью подключения любой беспроводной трубки стандарта DECT.

Заключение

Задача бесплатной связи между разнесенными абонентами с частыми и длительными переговорами решена. Задача «присутствия» абонента в городе и бесплатная связь с владельцем номера, где бы владелец ни находился, также решена. Решение с виртуализацией на сетевом накопителе QNAP-451 выигрывает за счет возможности конфигурировать Asterisk через web-интерфейс. Зато решение с роутером не требует практически никаких затрат. Астериск — это просто! Зачем платить за роуминг, когда связь может быть бесплатной?

Хочу отдельно поблагодарить команду Zyxel за отзывчивость, помощь в экспериментах и увеличение функциональности своих устройств.

Автор: shuvaevgl

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/voip/251119

Ссылки в тексте:

[1] почитать подробнее: https://geektimes.ru/post/269488/

[2] отдельный материал: https://habrahabr.ru/post/261431/

[3] софта: http://pkg.entware-keenetic.ru/binaries/keenle/Packages.html

[4] мануал: https://help.keenetic.net/hc/ru/articles/115001054729

[5] D-Link DUB-H7: http://www.dlink.ru/r/products/150/316.html

[6] Источник: https://geektimes.ru/post/286956/