Главная страница
Навигация по странице:

  • [

  • type =

  • insecure =

  • context =

  • fromdomain =<имя домена или

  • host =

  • disallow =

  • qualify =

  • canreinvite =

  • nat =

  • [100](

  • 1

  • (

  • Set (

  • same =>

  • Астерикс Начало. Источник httpshabr comrupost264981


    Скачать 28.13 Kb.
    НазваниеИсточник httpshabr comrupost264981
    Дата19.03.2019
    Размер28.13 Kb.
    Формат файлаdocx
    Имя файлаАстерикс Начало.docx
    ТипДокументы
    #70889

    Источник https://habr.com/ru/post/264981/

    На написание этой статьи меня побудило практически полное отсутствие how-to по настройке Астериска, с понятными новичку примерами. В сети можно найти кучу информации по настройке IVR, по настройке авторизации SIP-пользователей через LDAP, мануалов по созданию HA-кластеров с Астерисками внутри, etc., но нет ни одной статьи о том, как завести его с нуля, да и еще с примерами. Практически везде предлагается сразу же использовать все возможности, которые предлагает Астериск, а если убрать часть функционала, предлагаемого в мануале, то в большинстве случаев это приведет к получению неработоспособной конструкции. Эта статья — результат хождения по граблям… чтения мануалов. Если вы находитесь в такой же ситуации, что и я пару лет назад — добро пожаловать под кат.

    И так, ситуация: вы только что узнали про Астериск и его возможности, и захотели использовать его у себя дома, или ваше руководство захотело IP-телефонию в офис.

    Первое что нам необходимо — сервер с установленной операционкой. По ряду причин я выбрал для своих серверов CentOS 6. Все примеры будут с привязкой к этой ОС, так как именно на ней получаются наиболее стабильные сервера. Тем не менее, я ни коим образом не пытаюсь ограничить вас выборе. Астер нормально заведется и под Debian-ом, и под Arch-ем, и даже на FreeBSD. Замечу: желательно не пользоваться гипервизорами на начальном этапе, так как вы можете получить «металлический» голос, либо его полное отсутствие. Про таймеры и прерывания расскажу в следующей статье, так как их описание и настройка выходит за рамки этой статьи. В том случае, если свободного сервера у вас нет и без виртуальной машины не обойтись, обязательно ставьте x86-го гостя.

    После того, как вы установили операционку на сервер, можно приступить к установке Астериска. Добавляем репозитории Didgium: 

    rpm -Uvh http://packages.asterisk.org/centos/6/current/i386/RPMS/asterisknow-version-3.0.1-2_centos6.noarch.rpm

    yum update


    Устанавливаем dnsmasq:

    yum install dnsmasq


    Устанавливаем Астериск:

    yum install asterisk asterisk-configs --enablerepo=asterisk-12


    Важное замечание: цифра в конце строки указывает на мажорную версию Астериска. В примере будет установлена наиболее свежая версия из 12-й ветки, доступная в репозиториях.

    После установки перезагружаем сервер и заходим в шелл Астериска:

    asterisk -rv


    Обратите внимание на ключи, c которыми запускается шелл. Количество ключей «v» влияет на количество выводимой информации при звонке, их количество варьируется от 1 до 14.

    Если установка прошла успешно и Астериск запустился, вы увидите вот такое приглашение:

    asterisk*CLI>


    Поздравляю, Астериск установился и готов к работе. Но пока что шелл нам не нужен, поэтому пишем exit.

    Для того, чтобы сэкономить ваше время и сделать материал понятным, рассмотрим теорию на конкретном примере, а также разберем основные термины, которыми вам придется оперировать при настройке, при общении с саппортом оператора и своими коллегами. Для примера мы заведем двух внутренних пользователей с номерами 100 и 101, и двух операторов телефонии. Один из операторов будет предоставлять нам городские номера через транк с регистрацией, другой будет обеспечивать доступ к направлениям дальней связи, используя транк без регистрации.

    Первое что вам требуется сделать — создать пиров в файле /etc/asterisk/sip.conf. Открываем его:

    nano /etc/asterisk/sip.conf


    И сразу переходим в конец файла. Вставляем следующий текст:

    [internal](!)

    type=friend

    insecure=invite,port

    context=office

    fromdomain=<имя домена или IP>

    host=dynamic

    disallow=all

    allow=alaw

    qualify=yes

    canreinvite=no

    nat=no
    [100](internal)

    secret=XXX

    [101](internal)

    secret=XXX


    Мы завели двух внутренних пиров с номерами 100 и 101. Разберем эти настройки, так как их понимание — ключ к успешному внедрению Астериска.

    [internal](!)

    [internal], это имя шаблона, а (!) указатель шаблона.
    Почему сразу начинаем использовать шаблоны? Потому что они сокращают время настройки и уменьшают количество текста с конфигурационном файле, а для понимания они очень просты.

    type=friend

    Доступные параметры: «peer», «user» и «friend». Очень часто встречается ошибочное мнение относительно того, чем они отличаются. Многие считают, что параметр «user» разрешает только исходящие, «peer» — только входящие звонки, а «friend» разрешает звонки в обе стороны. Это не так. Использование ключа «peer» отключает проверку соответствия имени пользователя и пароля при звонке. При использовании параметра «peer», Астериском проверяется только соответствие IP-адреса и номера порта источника вызова, при использовании «user» — проверяется поле username, а проверка адреса источника не производится. Параметр «friend» заставляет проверять поле username и IP-адрес источника.

    insecure=invite,port
    invite — отключается аутентификация при входящем звонке.
    port — отключается проверка порта источника.

    При первоначальной настройке пропишите оба ключа.

    context=office 

    Контекст, в котором будут обрабатывается исходящие звонки от этого устройства. Подробности чуть ниже.

    fromdomain=<имя домена или IP>

    Имя SIP-домена. Для первоначальной настройки укажите IP адрес сервера с Астериском.

    host=dynamic

    IP-адрес пира. В случае использования авторизации по логину и паролю — ставьте dynamic. Конкретный IP указывается только в том случае, если настройки пира используются для транка без регистрации.

    disallow=all
    allow=alaw

    Указываем разрешенные кодеки.

    В нашем примере первая строка запрещает использование всех кодеков, а вторая — разрешает g711-a. Настройки кодеков индивидуальны для каждого случая, однако, большинство Российских и Украинских провайдеров используют g711a и g729. Последний — пропиетарный, и Астериском поддерживается лишь в Passthrough-режиме (то есть, невозможен транскодинг).

    qualify=yes

    Эта строка заставляет Астериск опрашивать устройство или софтфон пакетами OPTIONS. Необходим для мониторинга и траблшутинга.

    canreinvite=no

    Запрещает пересылать медиа напрямую между устройствами. Рекомендую ставить «no», для упрощения настройки.

    nat=no

    Говорим Астериску, что пир не за натом. Описание ключей и вариантов их использования, если сервер за ним, выходит за рамки статьи. Про варианты обхода расскажу в следующей статье.

    [100](internal)
    secret=XXX
    [101](
    internal)
    secret=XXX

    Тут мы задаем имя пира и берем настройки из шаблона. Единственные уникальные параметры в нашем примере — имя пира и пароль. 
    На этом мы закончили настраивать внутренних пиров, перейдем к настройке стыка с операторами. Добавим 2 записи в конец sip.conf:

    [operator1]

    fromdomain=<имя домена или IP>

    host=1.2.3.4

    insecure=invite,port

    port=5060

    qualify=yes

    type=friend

    username=YourLogin

    secret=YourPass

    disallow=all

    allow=alaw

    context=operator1


    Не буду расписывать значения каждой строки, т.к. все настройки идентичны настройкам внутренних пиров, за исключением поля host. В том случае, если Астериск выступает в роли клиента (а для сервера оператора наш астериск является клиентом), нам нужно указать адрес сервера оператора или его dns-имя.

    Добавим второго оператора:

    [operator2]

    fromdomain=<имя домена или IP>

    host=5.6.7.8

    insecure=invite,port

    port=5060

    qualify=yes

    type=friend

    disallow=all

    allow=alaw.

    context=operator2


    Отличий тоже никаких, за исключением отсутствия строк username и secret, так как, напомню, второй оператор не использует регистрацию.

    Осталось настроить регистрацию на сервере оператора №1. Для этого в файле sip.conf, перед секцией описывающей настройки оператора вставим следующую строку:

    register => udp://YourLogin:YourPass:YourLogin@1.2.3.4/YourLogin


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

    Наверняка вы редактировали файлы конфигурации под пользователем с ограниченными правами. Если это так, то Астериск не сможет получить доступ к файлу конфигурации, поэтому пишем:

    chown asterisk:asterisk /etc/asterisk/sip.conf


    На этом настройка пиров закончена, ее достаточно для работы в минимальной конфигурации, сохраняем и закрываем файл и возвращаемся в шелл Астериска командой:

    asterisk -rv


    В шелле Астериска пишем команду:

    sip reload


    Теперь вы можете зарегистрировать на своем Астериске пользователей с логинами 100 и 101. Проверяется состояние регистрации следующей командой:

    sip show peers


    Если вы все настроили правильно, то увидите примерно вот такой вывод:

    asterisk*CLI> sip show peers

    Name/username Host Dyn Forcerport Comedia ACL Port Status Description

    100/100 10.0.0.52 D Yes Yes 59080 OK (1 ms)

    101/101 10.0.0.57 D Yes Yes 49973 OK (1 ms)

    operator1 1.2.3.4 No No 5060 OK (22 ms)

    operator2 5.6.7.8 No No 5060 OK (22 ms)


    Если вы это видите, то, поздравляю, ваши устройства или софтфоны успешно зарегистрировались и Астериск увидел сервера операторов.

    Состояние регистрации проверяется командой:

    sip show registry


    Если регистрация прошла успешно, то вы должны увидеть вот такой вывод:

    asterisk*CLI> sip show registry

    Host dnsmgr Username Refresh State Reg.Time

    1.2.3.4:5060 N YourLogin 120 Registered

    1 SIP registrations.


    На этом настройка пиров закончена, перейдем к настройке диалплана. Диалплан — это сердце Астериска, с помощью него обрабатываются абсолютно все звонки. Астериск понимает несколько языков, но в нашем примере мы будем использовать стандартный, появившийся в самых первых релизах Астериска. Файл конфигурации хранится в файле /etc/asterisk/extensions.conf.

    Откроем его командой:

    nano /etc/asterisk/extensions.conf


    В стандартных файлах конфигурации хранится много дефолтных правил. Они нам не нужны, поэтому очистим содержимое и пропишем следующее:

    [general]

    static=yes

    writeprotect=no
    [globals]


    Это параметры необходимые для нормального чтения диалплана, поэтому менять их не следует.

    Начнем с простого. Нам нужно позвонить с номера 100, на номер 101. Для этого нужно прописать правило, сразу после секции globals:

    [office]

    exten => _1XX,1,Dial(SIP/${EXTEN})


    Разберем эту строку. 
    [office] — имя контекста, в котором обрабатываются звонки от пира. 
    exten => — указатель начала шага.
    _1XX — маска. На маске остановимся чуть подробнее. С помощью нее сортируются все звонки, попадающие в контекст диалплана. 

    Маска использует набор паттернов для сортировки звонков по caller-id:

    X – любая цифра от 0-9

    N – любая цифра от 2-9

    [234-6] – цифры 2, 3, 4 и 6

    . – любые возможные символы


    Маска начинается с символа "_", который означает что это шаблон. В случае, если вы забудете указать его, Астериск примет 1XX за вызываемый номер и передаст Dialпаттерны вместо номера телефона, и звонок не состоится. 
    1 — номер действия.

    Dial — это приложение. В диалплане можно использовать более 200 различных приложений, которые используются для манипуляций со звонками. Сейчас, в самом начале, мы будем использовать только одно приложение — Dial. Из названия понятно, что оно используется для совершения звонков.

    (SIP/${EXTEN}) — аргументы для приложения. В нашем примере, для внутренних пиров мы используем протокол SIP, поэтому первый аргумент, который мы передаем dial-у — указывает на используемый протокол сигнализации. ${EXTEN} — текущий экстеншен, его значение берется из заголовка (из поля destination).

    / — разделитель для передаваемых аргументов.

    Каждый из параметров разделяется запятыми. В нашем примере используются трехзначные номера, поэтому в маске должно быть 3 паттерна. В случае, если вы захотите использовать иную длину нумерации, то пишите в маске нужное количество паттернов. Теперь сохраняем файл, открываем шелл астериска и пишем команду:

    dialplan reload


    Если возникли проблемы с доступом к файлу, то пишем:

    chown asterisk:asterisk /etc/asterisk/extensions.conf


    И снова перезагружаем диалплан через шелл Астериска.

    Теперь пробуем звонить. Если вы все правильно настроили, то пир с номером 100 дозвонится до пира с номером 101. Сейчас мы можем звонить внутри офиса, между пирами, которые работают в контексте office. Для того что бы позвонить в город, нам нужно написать правило для исходящих звонков через первого оператора. Прописываем его в контекст office, выглядит оно так:

    exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)


    Перезагружаем диалплан и пробуем звонить в город.

    Теперь нам надо принять входящий звонок. Сделаем новый контекст в диалплане, пишем в конец файла:

    [operator1]

    exten => s,1,Dial(SIP/100&SIP/101)


    Поясню что означает «s». Это стандартная маска в Астериске, под которую попадают абсолютно все вызовы. То есть, если мы используем транк с регистрацией, входящий caller-id будет «s».

    Сохраняемся и перезагружаем диалплан. Теперь мы можем принять входящий звонок через оператора, предоставляющего нам городской номер.

    Сейчас нам понадобилось позвонить на сотовый телефон, с федеральным номером. Допишем еще одну строку в контекст [office]:

    exten => _89XXXXXXXXX,1,Dial(SIP/${EXTEN}@operator1)


    Сохраняемся, перезагружаем диалплан и звоним. Все. Теперь мы можем полноценно использовать услуги оператора, предоставляющего городской номер.

    Однако, тут кроется небольшая проблема, которая возникнет при звонке на сотовые телефоны других регионов. Так как номер телефона федеральный, то все звонки пойдут через первого оператора. Поэтому уместно уменьшить размер масок в диалплане. К примеру:

    exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1)

    exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1)

    exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)


    С такой конструкцией все звонки на телефоны с кодами из диапазонов 890982XXXXX-890999XXXXX и 8901421XXXX-8901651XXXX пойдут через первого оператора. Не совсем удобно, соглашусь с этим. В будущих статьях выложу конфигурацию диалплана для автоматического выбора оператора в зависимости от направления звонка, так как подобное опять же выходит за рамки этой статьи.
    Теперь нам осталось пустить междугородние звонки через второго оператора. Добавляем строку в контекст [office]:

    exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567)

    same => n,Dial(SIP/${EXTEN}@operator2)


    Как вы заметили, тут появились новые приложения, которые обрабатывают звонки. Set(CALLERID(num)=74991234567) — так как мы используем транк без регистрации, то это значит что мы должны отсылать оператору caller-id. Этот номер не обязательно должен существовать. Тут мы просто представляемся провайдеру и не более. Какой номер подставлять — зависит от оператора. Некоторые предоставляют услугу подмены caller-id на номер другого оператора, для совершения исходящих вызовов по межгороду или для зоновуй связи. За подробностями обращайтесь к оператору. same => n — указатель, который позволяет не писать каждый раз маску и номер действия. К примеру:

    exten => 78121234567,1,Answer

    exten => 78121234567,1,Set(CALLERID(name)=Trunk_1

    exten => 78121234567,1,Dial(SIP/1000)


    Можно заменить на:

    exten => 78121234567,1,Answer

    same => n,Set(CALLERID(name)=Trunk_1

    same => n,Dial(SIP/1000)


    Во втором случае все гораздо проще, не так ли?

    На этом все, мы настроили Астериск. Теперь мы можем звонить в город, на сотовые, по межгороду и у нас есть внутренняя связь между пирами. Получаем вот такой, вполне рабочий диалплан:

    [general]

    static=yes

    writeprotect=no
    [globals]
    [office]

    exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1)

    exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1)

    exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567)

    same => n,Dial(SIP/${EXTEN}@operator2)

    exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)

    exten => _1XX,1,Dial(SIP/${EXTEN})
    [operator1]

    exten => s,1,Dial(SIP/100&SIP/101)


    написать администратору сайта