HOW TO (как сделать) свой sip сервер для голосового общения без посторонних ушей, установка, запуск
# 5 лет, 10 месяцев назад (отредактировано 5 лет, 9 месяцев назад)
Ставим вариант самого сервера и кодеков к нему. Следует отметить, что кодек g729 т.н. «коммерческий», он есть не во всех клиентских программах (которыми и будем звонить), да и сам Астериск его будет использовать ограниченно — без транскодинга (т.е. только звонок с 729 на 279 кодек). Это существенно. Сам сервер будет реализовывать несколько задач — связь между своими клиентами (хозяевами и их приятелями), и звонки во внешний мир. Звонки во внешний мир будут реализованы через посредников (шлюзы) типа sipnet.tu и мегафоноф мультифон. Разумеется, для удобства будут запущены сервисы маршрутизации — типа набираешь 7-мизначный номер, сервер сам понимает, что звоним внутри Города и дописывая нужные циферки для понимаемого шлюзом размера направляет звонок в нужное место.
Сама установка —
Можете получить аборт с установкой g729, это не беда, на самом деле (см. абзац ниже, о транскодинге, а также http://archlinux.org.ru/forum/topic/15534/?page=1#post-160755), он не очень и нужен. Это внешние гады пригибают к использованию g729 — путем предоставления выбора «или на полосе 32кб\с g729 или фиговая связь, требующая полосы 100кб\с с поддерживаемым кодеком», но благодаря своему серверу все будет хорошо.
Редактируем несколько конфигов. Главный, запрет на загрузку некоторых модулей и «план звонков». Вопреки конкурирующим хаутушкам я не иду «в самый конец файла» что-то дописывать. Главный (в наших целях) конфиг включает в себя описание как самих клиентов сервера, так и выходы на Город (т.н. транки). Поскольку и клиенты, и транки множественны и имеют повторяющиеся описания, для сокращения текста в конфиге применяются шаблоны-описания. Следует вновь и вновь отметить, что Астериск использует ту же логику, что и (видимо) большинство программ — по умолчанию считываются ВСЕ конфиги, лежащие в директории. В данном случае это /etc/asterisk, куда и надо попасть командой —
Как и (видимо) везде, текст в конфигах ПЕРЕОПРЕДЕЛЯЕТ установки параметров по умолчанию. Как следствие — вряд ли следует использовать положенный в директорий тестовый диалплан, следует посмотреть и другие конфиги, возможно, часть из них вообще куда-нибудь вынеся. Я вынес (в другой директорий) следующие конфиги —
Перед конфигурацией двух главных файлов Астериска надо продумать идеологию, терминологическую целостность, это важно. Вам надо продумать следующие вопросы — будут ли ваши клиенты пользоваться индивидуальными каналами на внешнюю связь (типа Мультифон), возможно кто-то (несколько клиентов) будет пользоваться общим для всех, кто-то своим личным (соотв. и определяться у получателей звонков они будут согласно этому выбору). От этого зависит указание меток (произвольные наборы букв, называемые Контекст).
Открыв на редактирование все пишу вверху файла —
Пожалуйста обратите внимание на осмысленный выбор кодеков. Поскольку сети у нас по-прежнему не Ах, то я сознательно выбрал на дистанции «сервер-телефон» кодек gsm. Я, конечно, могу пользоваться программой CSipSimle со включенным g729, но эта программа, как и большиство других, подъедает батарейку в режиме ожидания. Я пользуюсь Акробитсом, поскольку в нем есть пуш. Так вот, Астерикс транскодинг с применением g729 делать не будет, отказывается по религиозным соображениям (или я не познал как). А по требованию к сети дела обстоят так — g729 требует ок. 30кб\с, gsm ок. 32 (но качество звука хуже), а другие кодеки, совместимые с моим sipnet.ru, хотят 100 кб\с и более. Заведомо известно, что эти 100 я не везде могу получить. Заведомо известно, что от сервера до сипнета или мегафона у меня честные 100мбит. Т.е. от сервера до телефона я применю gsm, а от сервера до шлюза (транка и т.д.) — что шлюзу угодно. И от телефона до телефона (через сервер) тоже будет только кодек gsm без транскодинга (перекодирования в другие кодеки).
Также пожалуйста будьте готовы к чудесам в распределении звонков. Если, скажем, Астериск еще относительно подробно документирован, то тот же Мегафон со своим мультифоном — нет. При одновременном использовании зарегистрированного для Входящих подключения к мультифону и реальной симки в реальном телефоне могут быть чудеса. Мануалы операторов типа Мультифона могут давать свои инструкции по поднастройке, например, Мультифон дает такую http://multifon.ru/media/devices/instruction/Asterisk_set1_1.pdf. Но это полдела и эту инструкцию читать не надо. Надо на телефоне набрать *137# и указать самому Мультифону правила поведения.
С sip.conf закончили.
Теперь диалплан, в котором , открыв на редактирование, нажимая ctl+k удаляем все лишнее (это особенно важно во вазимосвязи с последним абз.). На самом деле в моем случае лишним оказалось все. Это потому, что предпочтительно терминологическое единообразие — как мы яхту назвали в первом конфиге, так и в диалплане следует именовать, а не разбираться с наследием и вкусами других авторов. Что совсем нехорошо, так это то, что реальные форматы описания настроек в текущей версии (13.6) ощутимо отличаются от загаженной поисковой выдачи (это вечное «погугли», «поиск рулит» на тематических форумах. ). Например во всех увиденных мануалах вместо правильного include => noday,*,*,9,may (разделитель параметров запятая)
настойчиво пишут include => noday|*|*|9|may
Лично я начинал с простого диалплана, но хотелось-то продвинутого. На личный рост от простого до продвинутого ушло около недели. В ходе этого роста пришло понимание, что имеет смысл сперва описать универсальные для всех правила звонков и затем из вставлять в индивидуальные. Какие ставились цели и задачи —
а) как ни наберешь Москву городские (+749. или 849. или 49. ) звонок пойдет через Сипнет, поскольку тот на городские в небольших кол-вах бесплатен
б) как ни наберешь СПБ городские (+749. или 849. или 49. или просто семизначный) звонок пойдет через Сипнет поскольку тот на городские в небольших кол-вах бесплатен
в) как ни наберешь Российские сотовые, они пойдут через личные мегафоновы мультифоны, поскольку это что-то ок. 1,5 за минуту
вводим (напомню, открыть, полностью зачистить — это проще, чем сперва убить файл, потом создать и не забыть потом изменить права на файл) —
г) как ни наберешь номер (имя) своего, внутреннего абонента, так он и пойдет без посредников в виде ОПСОСов
д) можно даже установить правила перехвата — набираешь Кремль, а попадаешь в Палату №6. Причем индивидуально для каждого звонящего и в разное время суток
У смежных правил набора есть (вроде) система приоритетов — если описания правил одного уровня, то исполняется то, которое более подробно. Например, 78ХХХХХХХХХ и 789234ХХХХХ — исполнится второе. Инклуды считаются более низким уровнем. Т.е. если второй пример будет вставлен оператором include, то вопреки ожиданиям он пойдет вторым. Именно этим объясняются неразъясненные примеры экстеншенов с казалось бы лишними операторами include (т.е. когда один из include вставляет блок, используемый только в одном месте — так делается для уравнивания приоритетов).
Этого для начала достаточно. Далее можно углубляться в настройки маршрутизации звонков, принимать входящие и раздавать их лично или группам, конференц-связь, и пр. Отмечу, что музыка для проигрывания сперва должан быть сконвертирована в формат gsm и затем засунута куда надо, т.е. /var/lib/asterisk/sounds/en/puchkom.gsm
Стартуем службу и меняем права на нужный директорий для логов (и музЫк при необходимости)-
При изменении конфигов НЕ надо перезапускать службу. При тестировании и настройках под рутом надо войти в консоль Астериска (при запущенной службе)-
Здесь будут и логи (по мере возможности, меру подробности регулируем добавлением v, т.е. asterisk -rvvvvvv), и здесь можно после изменения конфигов давать команды —
sip reload — это после изменения sip.conf
dialplan reload — это после изменения диалплана
sip show peers — а покажи мне всех известных системе клиентов и их состояние
sip show registry — а покажи мне все поднятые входящие линии
core show translation — а покажи нам таблицу кодеков, возможности перекодировки
В консоли вы увидите, как на ваш сервер почти сразу начнут ломиться враги, массово и непрерывно —
схема_1 — используется лицами для организации за чужой счет звонков по нужным им направлениям, многие ай-пи из атакующих — неожиданно из Палестины, просто пытаются совершить транзитный звонок на нужные им номера без регистрации и будут отбиты, если в терминах инструкции событие incoming у вас в диалплане не предусматривает такого транзита —
и это уже после того, как сколько-то тысяч айпишников мы забанили в iptables, который за 18 часов работы заблокировал 125 тысяч попыток (36мб).
схема_2 — будут ломиться с попытками регистрации клиентов с логинами-паролями из стандартных хаутушек, типа логин 100, пароль 100 т.п. — будет отбита при использовании нормальных паролей —
Это нормально. Поэтому НЕЛЬЗЯ применять глупые малозначные (типа 101) пароли даже для отладки. Наверняка ваш сервер стои ЗА роутером, потому не забудьте включить проброс портов в роутере на сервер (5060). Помните, что роутеры бывают разные и у их изготовителей могут быть своеобразные представления о роутинге (помню, вроде это был ДЛинк, имеющий внешний ip и из локалки никак не позволял обращаться к своему же внешнему ip).
Загрузки процессора как-то не особо и видно, никак не больше чем почтовый сервер.
Сейчас, на время обкатки, адаптации и тестирования, я ломящимся жуликам вместо аборта организовал поднятие трубки и проигрывание патриотической песни. Что позволило посмотреть загрузку процессора — в пределах 1-2%.
Источник
IP АТС в облаке своими руками за 10 минут
Пользователи АТС могут совершать звонки друг другу и на реальные телефонные номера, отдельная группа пользователей (Операторы) могут также принимать входящие звонки, приходящие на АТС с обычных телефонов (об этом далее) или по SIP, соответственно они могут переводить вызовы на обычных пользователей и друг другу при необходимости. SIP-телефон — софтфон или железный телефон, с поддержкой SIP, Web SDK/Mobile SDK — клиентское приложение для браузера или смартфона, сделанное с помощью соответствующего SDK от VoxImplant.
Итак, для создания IP АТС нам потребуется бесплатный аккаунт разработчика VoxImplant, который можно получить тут.
После создания и активации аккаунта можно зайти в панель управления, где преимущественно и будет происходить вся дальнейшая наша работа. Для начала нам потребуется создать приложение (Application), а в нем пользователей (Users), которые будут соответствовать пользователям и операторам АТС, при создании пользователя можно выбрать будет ли у него отдельный лицевой счет VoxImplant (Separate account balance) или же при его звонках сумма будет списываться с общего счета аккаунта (по умолчанию) — пока ничего не меняем, делаем по умолчанию. ВАЖНО: Используйте для логин/username 3х значные цифровые коды (101, 102, 103 и т.д.) — в своих скриптах мы будем исходить из такого формата. Теперь можно приступать непосредственно к созданию функционала АТС, серверные приложения VoxImplant представляют собой набор сценариев, по которым обрабатываются звонки, проходящие через платформу. Сценарии эти пишутся на обычном Javascript, в котором доступны несколько неймспейсов и классов для работы с функциями VoxImplant (подробнее можно посмотреть по ссылке). Сценарии создаются и редактируются в разделе «Сценарии». Всего у нас будет предусмотрено 3 типа сценариев обработки звонков: для входящих, для исходящих и для звонков между пользователями, назовем их PBX in, PBX out и PBX local соответственно. Начнем с самого простого PBX local:
«И это все?» — спросите вы 🙂 Да, это все, так как forwardCallToUser — это одна из helper-функций, которую мы написали для ускорения и облегчения создания приложений. По сути, за этой функцией скрывается кусочек Javascript-кода, а-ля:
Где easyProcess — еще одна из helper-функций, более подробно со всеми функциями можно ознакомиться в документации к VoxEngine, так как у нас сейчас не стоит задача изучить VoxImplant досконально, то продолжим без углубления в нюансы. Следующий скрипт (PBX out) отвечает за отправку исходящих звонков на обычные телефонные номера:
В данном коде мы используем функцию callPSTN, чтобы перенаправить звонок в телефонную сеть с указанием Caller ID — 74957893798, который нужно предварительно авторизовать в разделе Settings -> Caller IDs, чтобы АОН при звонке показывал что это мы звоним. Для первого параметра просто откидывает префикс из 1 цифры (позже мы настроим эту цифру во время привязки сценариев к приложению), которая сигнализирует что звонок надо пропустить в ТфОП, то есть номер вводится в виде 974952200022, после того как 9 откинули останется 74952200022 — обычный московский номер. Тут тоже все достаточно просто, теперь переходим к самому интересному сценарию — обработка входящих звонков (PBX in), я буду добавлять «мясо» по частям, чтобы было понятнее:
Соединение с платформой мы разрешили, теперь нужно заняться обработкой звонка, внутри предыдущего листенера добавляем обработку события соединения звонка:
Обработчик на соединение звонка повесили, теперь нужно повесить обработчик на разъединение:
И обработчик завершения проигрывания нашего приветствия:
Вы, наверное, заметили функцию forwardCallToOperator, мы к ней вернемся сразу как подключим обработку нажатий кнопок на телефоне для ввода добавочного номера. Ранее мы уже включили обработчик с помощью вызова e.call.handleTones(true), теперь надо его объявить:
Ну а теперь пришло время самых интересных функций — forwardCallToExtension и forwardCallToOperator:
Все готово, объединяем наши части и получаем полный скрипт. Дело осталось за малым — заставить сценарии работать с помощью правил. Для этого перейдем в раздел «Роутинг» и создадим 3 новых правила: local, out, in
При создании правила local, учитывая что имена пользователям вы задали в виде 101, 102, 103 и т.д. в поле Маска указываем 12 <2>и прикрепляем сценарий PBX local, чтобы назначить его в качестве активного, если подключенные к нашей АТС пользователи решат позвонить на внутренний номер своего коллеги.
Аналогично для правила out в поле Pattern указываем 92+ (помните ту самую 9, которую мы отпиливаем с помощью e.destination.substring(1) в методе callPSTN) и назначаем сценарий PBX out. Сохраняем.
И последнее правило in: в Pattern указываем что-то в духе (74957893798|100) и прикрепляем PBX in. Сохраняем. 74957893798 – это просто пример, который вы можете подключить к своему приложению в разделе Phone numbers. А 100 позволяет позвонить на нашу АТС по SIP, используя URL вида sip:100@appname.accountname.voximplant.com, где appname — название вашего приложения, которые вы указали во время его создания, а accountname — имя аккаунта VoxImplant, которое вы указали при регистрации. Если у вас уже есть купленный номер, поддерживающий форвардинг по SIP, то вы сможете его подключить к АТС, например, направив вызовы на тот SIP URI (sip:100@appname.accountname.voximplant.com), который мы сделали для входящих звонков по SIP.
Теперь наша АТС готова к подключению SIP-телефонов (или клиентских приложений на базе VoxImplant SDK), приему и обработке вызовов, локальным звонкам между пользователями АТС и исходящим звонками на реальные номера.
Источник