Home » Asterisk » Ограничение на звонки для группы номеров в asterisk

Ограничение на звонки для группы номеров в asterisk

Опишу простую задачу и столь же простое решение по ограничению звонков для определенной группы номеров в астериск. Например, вам нужно создать диапазон номеров 500-510, которым нужно разрешить совершать только локальные звонки. Все остальные звонки должны быть закрыты.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на . Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Расскажу, зачем это может понадобиться. Например, у вас есть офисная АТС на астериск, которой пользуются сотрудники в офисе. Вам хочется, чтобы удаленные сотрудники так же подключались к этому серверу, например, со своих смартфонов и совершали звонки сотрудникам в офисе. Звонить во вне большого смысла нет, так как sip тарифы не сильно отличаются от тарифов мобильных операторов.

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

Я расскажу на примере расширения функционала, описанного в своей статьи по установке и настройке asterisk.

Создаем отдельный шаблон в /etc/asterisk/sip.conf для новой группы номеров.

[ext-users](!)
type=friend
context=ext
host=dynamic
nat=yes
qualify=yes
canreinvite=no
sipreinvite=no 
dtmfmode=rfc2833
disallow=all
allow=ulaw
allow=alaw
allow=g729

Добавляем туда же несколько номеров.

[500](ext-users) 
callerid="500" <500> 
secret=password1 
 
[501](ext-users) 
callerid="501" <501> 
secret=password2
 
[502](ext-users) 
callerid="502" <502> 
secret=password3

Создаем новый экстеншен в /etc/asterisk/extensions.conf.

[ext] 
;Конференция
exten => 999,1,Answer()
exten => 999,n,ConfBridge(1,confer)
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},30,Tt)

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

Не забудьте настроить доступ к asterisk на шлюзе, выполнив проброс необходимых портов, если доступ к серверу будет не по vpn.

Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.

Другие материалы по asterisk:

Онлайн курс Infrastructure as a code

Если у вас есть желание научиться автоматизировать свою работу, избавить себя и команду от рутины, рекомендую пройти онлайн курс Infrastructure as a code. в OTUS. Обучение длится 4 месяца. Что даст вам этот курс:
  • Познакомитесь с Terraform.
  • Изучите систему управления конфигурацией Ansible.
  • Познакомитесь с другими системами управления конфигурацией - Chef, Puppet, SaltStack.
  • Узнаете, чем отличается изменяемая инфраструктура от неизменяемой, а также научитесь выбирать и управлять ей.
  • В заключительном модуле изучите инструменты CI/CD: это GitLab и Jenkins
Смотрите подробнее программу по .

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

10 комментариев

  1. Андрей

    Добрый день. Подскажите пожалуйста как в Freepbx для одного пользователя добавить несколько транков в поле Context

  2. Добрый день. У нас в компании у секретаря 2 номера (телефон+трубка). При входящих звонках с внешки если в голосовом меню выбрать нужную цифру, то звонок идет сразу на оба номера одновременно, там прописан следующий код:

    exten => t,n,Dial(SIP/300&SIP/310)

    когда я пытаюсь реализовать одновременный звонок на 2 телефона секретаря внутри компании, то ничего не выходит. Либо получается звонить на 2 номера сразу, но при этом на другие внутренние номера не идут звонки, либо exten на 2 номера не срабатывает. Как это можно реализовать?

    • в extensions.conf прописано следующее:

      ;Звонок на внутренний номер
      exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
      exten => _XXX,n,Dial(SIP/${EXTEN},Tt)
      ;exten => 300,n,Dial(SIP/300&SIP/310)

    • Вы что-то путаете, или я не понимаю, что вы пишите. Звонок с внешних номеров к секретарю и с локальных описывается одинаково. Просто они стоят в разных экстеншенах. Если работает с внешними номерами, то такой же код должен работать и с внутренними.

      • Вот голосовое меню, тут отрабатывает:

        [company_tree]
        exten => s,1,Answer()
        ;Отвечаем на входящий звонок
        exten => s,2,Background(/etc/IVR/golos)
        ;Проигрываем запись текста нашего голосового дерева
        exten => s,3,WaitExten(3)
        ;Немного времени на осмысление дерева и выбор интересующего направления, в данном случае 3 секунд

        ;Звонок на добавочный номер
        exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => _XXX,n,Dial(SIP/${EXTEN:0})

        ;Договорной отдел Терентьева Татьяна
        exten => 1,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 1,n,Dial(SIP/218)
        ;Бухгалтерия ВСЯ
        exten => 2,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 2,n,Dial(SIP/303)
        ;Юредический отдел Гуляева Лена
        exten => 3,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 3,n,Dial(SIP/307)
        ;Отдел снабжения Корешкова Ольга
        exten => 4,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 4,n,Dial(SIP/106)
        ;Коммерческий отдел Кикало
        exten => 5,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 5,n,Dial(SIP/202)
        ;Производственая база Субботин Леха
        exten => 6,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => 6,n,Dial(SIP/103)
        ;Соеденяем с секретарем по таймауту
        exten => t,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;Запись разговора
        exten => t,n,Dial(SIP/300&SIP/310)
        ;Проигрываем запись сначала
        exten => 0,1,Goto(company_tree,s,1)

        Вот это основной extensions.conf. Тут не хочет:

        #include "company.tree"

        [general]
        static=yes
        writeprotect=no

        [globals]
        DIR_RECORDS=/mnt/calls/

        [default]

        [macro-recording]
        exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
        exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${$
        exten => s,n,Set(CDR(filename)=${fname}.mp3);
        exten => s,n,Set(CDR(realdst)=${ARG2});
        exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
        exten => s,n(no),Verbose(Exit record);

        ;Вешаем трубку
        [handup-sip]
        exten => _X!,1,HangUp()

        ;Исходящие звонки

        ;[call-sek]
        ;Звонок на 2 номера секретаря (Телефон+трубка)
        ;exten => 300,1,Dial(SIP/300&SIP/310)

        [call-out]
        ;Звонок на внутренний номер
        exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
        exten => _XXX,n,Dial(SIP/${EXTEN})

        ;Звонок на внешний номер
        exten => _XXX.,1,Macro(recording,${CALLERID(num)},${EXTEN})
        exten => _XXX.,n,Dial(SIP/${EXTEN}@out1) ;звонки на мобильные и другие города
        exten => _XXX.,n,Dial(SIP/${EXTEN}@out2) ;звонки на мобильные и другие города
        exten => _XXX.,n,Dial(SIP/${EXTEN}@out3) ;звонки на мобильные и другие города
        exten => _XXX.,n,Dial(SIP/${EXTEN}@out4) ;звонки на мобильные и другие города

        exten => _XXXXXXX,n,Dial(SIP/7342${EXTEN}@out1) ;звонки на Пермские номера
        exten => _XXXXXXX,n,Dial(SIP/7342${EXTEN}@out2) ;звонки на Пермские номера
        exten => _XXXXXXX,n,Dial(SIP/7342${EXTEN}@out3) ;звонки на Пермские номера
        exten => _XXXXXXX,n,Dial(SIP/7342${EXTEN}@out4) ;звонки на Пермские номера

        include => handup-sip

        ;Входящие звонки
        [call-in]
        ;exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
        exten => line1,1,Goto(company_tree,s,1)
        exten => line2,n,Goto(company_tree,s,1)
        exten => line3,n,Goto(company_tree,s,1)
        exten => line4,n,Goto(company_tree,s,1)

        • В каком плане не хочет? Что происходит, если позвонить 300?

          • Не хочет в [call-out] (звонок на внутренний номер). При той конфигурации, которую я скинул выше, если звонить на номер 300. То просто идет звонок на стационарный секретарю.

            При такой конфе звонит и на трубку и на стационар, но на другие внутренние не звонит:

            [call-out]
            ;Звонок на внутренний номер
            exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
            exten => 300,n,Dial(SIP/300&SIP/310) ===ТУТ ДОБАВИЛ===
            exten => _XXX,n,Dial(SIP/${EXTEN})

            Если опустить строчку вниз, то звонок просто идет на стационар:

            [call-out]
            ;Звонок на внутренний номер
            exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
            exten => _XXX,n,Dial(SIP/${EXTEN})
            exten => 300,n,Dial(SIP/300&SIP/310) ===ТУТ ДОБАВИЛ===

            • У вас ошибки. Должно быть так:
              [call-out]
              ;Звонок на внутренний номер
              exten => 300,1,Macro(recording,${CALLERID(num)},${EXTEN})
              exten => 300,n,Dial(SIP/300&SIP/310)
              exten => _XXX,1,Macro(recording,${CALLERID(num)},${EXTEN})
              exten => _XXX,n,Dial(SIP/${EXTEN})

              Вы, похоже, просто не понимаете до конца, как диалплан работает.

              • Заработало!!!! Спасибо Вам большое за помощь. Да, я не до конца разобрался и понял, но благодаря Вам знаю и понимаю теперь чуточку больше.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.