Безопасность asterisk: запрет перевода звонков для внешних абонентов
Зачем это нужно
Запрет перевода звонков для внешних абонентов кажется глупостью: какой смысл, если позвонив с мобильного или внешнего городского номера и начав разговор с местным абонентом, внешний абонент переведёт местного на какой-либо номер? Сам-то он общаться не сможет!
Дело в том, что есть ещё такая вещь, как платные номера. И (например) Вы можете, заключив договор с оператором, сделать внешний номер, все звонки на который будут платными. При этом Вы будете получать определенную сумму со всех звонков на этот номер. А как Вы будете убеждать окружающих, чтобы они позвонили на этот номер (например, переводя Ваших собеседников на эти платные номера) - уже Ваше дело.
Таким образом, мы определились: необходимо как-то ограничить возможность перевода звонков.
Варианты ограничения переводов звонков
Для начала нам необходимо принципиально решить, что мы собираемся ограничивать. И только потом уже решать, как это реализовать.
Вариант 1: ограничим всё всем
Самый простой и самый эффективный вариант: просто запретим возможность перевода звонков. Полностью и всем.
Плюсы:
Теперь нас таким образом никто не взломает. 100% гарантия. Опять же, некоторые сотрудники могут быть рады, поскольку будут избавлены от необходимости переводить звонки.
Минусы:
Секретари и все, кому по работе действительно необходимо переводить звонки, будут недовольны. Вряд ли руководство одобрит этот вариант.
Вариант 2: ограничим звонки только для внешних абонентов
Этот вариант будет посложнее, ведь у нас имеется 3 категории звонков:
- Звонки, приходящие извне, "из города" (это может быть не обязательно звонок из города, это может быть звонок из другого связанного с нашим астериска / филиала, в любом случае источник звонка - не локальный абонент, мы для простоты называем этот звонок "из города").
Здесь нам необходимо запретить возможность перевода звонка для вызывающего абонента. При этом вызываемый абонент (это местные/локальные номера, например, секретарь) должны иметь возможность переводить звонки.
- Местные звонки, не задействующие внешние каналы связи. В данном случае оба абонента должны иметь возможность перевести звонок.
- Исходящие звонки вовне, "в город". В этом случае нужно разрешить звонящему перевести звонок, а вот вызываемый абонент должен быть лишен такой возможности.
Как технически ограничить перевод звонка
В asterisk приложение Dial выполняет соединение одного абонента с другим (создает канал связи между ними). Опции t и T в приложении Dial обеспечивают возможность перевода звонков во время разговора. Убрав параметры t и/или T, можно отключить возможность перевести звонок как вызывающему (звонящему, т.е. тому кто выполнил вызов), так и вызываемому (ответившему на звонок):
t: Разрешает ответившему пользователю перевести звонок;
T: Разрешает звонящему пользователю перевести звонок.
Таким образом, включив (и/или отключив) одну из этих опций, мы обеспечим полный контроль над возможностью перевода звонка.
Входящие звонки извне
При звонках "из города" мы хотим, чтобы вызывающий (т.е. внешний) абонент не мог переводить звонки, а вызываемый (т.е. местный абонент) - наоборот, мог. Для этого подходит опция "t". При этом вызывающий абонент (внешний) не должен иметь возможности перевода звонка (опция "T" отсутствует).
Пример:
exten => _XXXX,n,Dial(SIP/${EXTEN},45,t)
Давайте исходить из того (именно так и должно быть), что для всех входящих звонков в диалплане предусмотрен отдельный контекст, например incoming. В этом контексте описываются все номера, на которые могут позвонить внешние абоненты, а также все действия, которые будут выполняться при звонках внешних абонентов.
Поэтому всё, что нам требуется - найти этот контекст (например, incoming) и во всём контексте убрать опцию "T" из всех вызовов приложения Dial. А если в этом контексте встречается вызов приложения Goto, выполняющего переход (например) на местные звонки, то мы заменяем Goto на Dial (и не забываем не ставить у Dial опцию "T"). А как сделать, если у местных звонков используется обработка (и поэтому поставлен Goto)? В таком случае делаем следующим образом:
Заменяем фрагменты вида:
На следующие:
Местные звонки
Поскольку мы решили, что в данном случае оба абонента могут переводить звонок, мы не вносим в код для местных никаких изменений, т.е. оставляем команды как есть:
exten => _XXXX,n,Dial(SIP/{EXTEN},45,tT)
Исходящие звонки "в город"
При звонках "в город" мы хотим, чтобы отвечающий (т.е. внешний) абонент не имел возможности перевести звонок куда-либо, а вызывающий абонент (местный номер) - мог. Для этого подходит опция "T". При этом вызываемый абонент не сможет перевести звонок (опция "t" отсутствует).
Пример (в данном случае обрабатывается вариант звонка на мобильные по России):
exten => _89XXXXXXXXX,n,Dial(${EXTEN},60,T)
В данном случае мы также будем исходить из того, что для всех исходящих звонков у нас выделен отдельный контекст, и в этом контексте для каждого направления (например: город, межгород, мобильные, международные) указывается отдельный шаблон.
В рамках всего контекста исходящих звонков (назовём его для примера outgoing) во всех эктеншенах (точнее, шаблонах экстеншенов) мы в команде Dial убираем из опций "t", и оставляем "T".
Пример диалплана
Статья опубликована: 13.06.2016
|