вторник, 22 января 2013 г.


Безопасность и надежность систем IP-видеонаблюдения: мифы и реалии

Существующему до сих пор мнению о незащищенности цифровых систем IР-видеонаблюдения автор противопоставляет весомые аргументы в пользу IP-систем, необходимую и достаточную безопасность которых обеспечивают функции защиты, встроенные в современное сетевое оборудование для корпоративных сетей. Пользователю лишь остается сделать правильный выбор сетевого оборудования
С наступлением эпохи цифровизации аудио-и видеоинформации, с массовым распространением телекоммуникационных сетей на базе протокола IP естественным шагом производителей систем видеонаблюдения стал выпуск цифровых систем видеонаблюдения для сетей IP. Эти системы уже не используют коаксиальный кабель для передачи в аналоговой форме картинки и звука, как это делают классические системы видеонаблюдения, а преобразовывают его в цифровую форму и передают по стандартным каналам связи и локальным вычислительным сетям от камер на посты наблюдения и ксистемам архивирования.
Использование цифрового формата и стандартного для большинства сетей протокола IP позволяет строить системы IР-видеонаблюдения с недостижимыми для аналоговых систем показателями гибкости и масштабируемости. Кроме того, появляется возможность использовать в таких системах стандартное телекоммуникационное и компьютерное оборудование, что существенно снижает начальные инвестиции и стоимость сопровождения систем.
Однако, по мнению некоторых адептов аналоговых систем видеонаблюдения, использование стандартного сетевого оборудования и есть одна из слабых точек систем IР-видеонаблюдения, что позволяет говорить об их общей ненадежности и незащищенности перед злоумышленниками. Для того чтобы расставить все точки над "и", рассмотрим компоненты, типовую схему построения систем IP-видеонаблюдения и механизмы обеспечения безопасности.
Состав системы IР-видеонаблюдения
Источником видеосигнала для систем IP-видеонаблюдения являются цифровые камеры, на выходе которых аудио- и видеосигнал представлен в цифровом формате (IP-пакеты) с интерфейсом подключения в виде порта FastEthernet, который непосредственно подсоединяется к такому сетевому оборудованию, как коммутатор или маршрутизатор. Это могут быть сетевые устройства, выделенные специально для систем наблюдения или совместно используемые для передачи всех корпоративных данных и подключения рабочих мест пользователей. В последнем случае может показаться, что безопасность системы видеонаблюдения зависит от действий любого пользователя компьютерной сети компании, и, если на месте пользователя окажется злоумышленник, он сможет безнаказанно нарушить ее работу. Немного позже разочаруем строящего радужные планы горе-хакера, а сейчас отметим, что при правильном выборе и настройке сетевого оборудования доступ произвольного пользователя к данным и оборудованию системы IP-видеонаблюдения невозможен.
Итак, мы получили оцифрованный сигнал от камер, подключили камеры к сетевому оборудованию, а теперь будем использовать компьютерную сеть для передачи аудио- и видеоинформации непосредственно к посту видеонаблюдения. Этот пост может находиться как в 100 м от объекта наблюдения, так и в 2000 км от него. Замечательный показатель, который недостижим для традиционных аналоговых систем видеонаблюдения. Однако нам он интересен с точки зрения масштабов IP-сети - от расстояний и количества объектов наблюдения зависит состав и конфигурация сетевого оборудования системы IP-видеонаблюдения и меры, необходимые для обеспечения ее безопасности. Это может быть один коммутатор, к которому подключены и камеры наблюдения, и компьютеры поста наблюдения, а также несколько маршрутизаторов и коммутаторов, обеспечивающих в совокупности передачу на значительные расстояния информации, поступающей от множества камер. Заметим, что в первом случае при использовании медного кабеля максимальное удаление камер от поста наблюдения составит 200 м (ограничение стандарта FastEhernet).
Таким образом, с учетом компьютеров поста видеонаблюдения, мы можем выделить три участка (рис. 1) любой системы IP-видеонаблюдения, которые важны с точки зрения обеспечения безопасности:
  1. видеокамера и кабель подключения видеокамеры к сетевому оборудованию - самый незащищенный физически участок,
  2. сетевое оборудование в виде маршрутизаторов и коммутаторов, которые осуществляют передачу информации в необходимую точку расположения поста наблюдения,
  3. зона кабельного подключения компьютеров поста наблюдения к сетевому оборудованию, которое осуществляет передачу видеосигнала.
Рассмотрим механизмы защиты для каждого участка.
Системы защиты локальных систем IР-видеонаблюдения
На физических аспектах защиты первого участка останавливаться нет смысла, так как они ничем не отличаются от традиционных систем аналогового видеонаблюдения. Единственное, что может получить злоумышленник без риска быть обнаруженным (при условии свободного доступа к кабелю), - лишь картинку с камеры. При этом, однако, ему потребуется специализированный программно-аппаратный комплекс на базе ноутбука, изготовить который под силу только эксперту, разбирающемуся в компьютерных сетях, программировании и цифровой электронике одновременно. Попытка же повлиять на видеосигнал, идущий с камеры (не говоря уже о подключении какого-либо источника видеосигнала вместо видеокамеры), будет мгновенно обнаружена и запротоколирована системой. Такую реакцию обеспечивают механизмы контроля целостности передаваемой информации, заложенные в сетевые протоколы FastEthernet, IP и HTTP, которые осуществляют передачу данных от видеокамер по сети. Таким образом, безопасность участка подключения видеокамера - кабель у систем IP-видеонаблюдения выше, чем у аналоговых систем.
Рассмотрим с точки зрения безопасности участок сетевого оборудования, который абсолютно незнаком большинству специалистов по аналоговым системам видеонаблюдения. Не обладая специальными знаниями о принципах защиты информации в корпоративных сетях и необходимым для этого оборудованием, некоторые специалисты делают поспешные заявления и проводят так называемые "тест-драйвы" сетевого оборудования, которое предназначено не для создания корпоративных сетей, а для домашнего применения. Давайте же, наконец, прольем свет на этот часто используемый для спекуляций вопрос.
При построении современных корпоративных компьютерных сетей к ним предъявляются высокие требования в части надежности и безопасности передаваемых данных. Эти требования, как правило, даже выше требований к надежности и безопасности систем видеонаблюдения. Ведь зачастую информация для служебного пользования, циркулирующая в корпоративной сетевой среде, имеет значительно большую ценность, нежели картинка с видеокамеры, установленной у входа на склад. Сетевое оборудование для корпоративных сетей таких производителей, как Cisco Systems или Allied Telesis, имеет централизованную многоуровневую защиту и разграничение прав доступа на уровне пользователей и портов сетевых устройств, обеспечивает фильтрацию передаваемых данных на основе правил, заданных администратором. Рассмотрим подробнее такие механизмы безопасности сетевых коммутаторов, как виртуальные локальные сети VLAN, Port Security, авторизация доступа на базе 802.1х.
Технология VLAN
VLAN, как базовую и наиболее распространенную технологию ограничения доступа, поддерживают практически все коммутаторы для корпоративных сетей. Можно даже сказать, что если в коммутаторе нет поддержки VLAN, этот коммутатор явно не для сети современного предприятия.
С помощью этой технологии все устройства системы IP-видеонаблюдения выделяются в отдельную группу, изолированную от всех остальных устройств и пользователей, подключенных к сети, - виртуальную локальную сеть VLAN. Таким образом возводится барьер, который ограничивает обмен данными только в пределах одной конкретной VLAN. Пользователи, а вместе с ними и потенциальные злоумышленники, естественно, подключены к другой аналогичной VLAN; это означает, что у злоумышленника нет физического доступа к устройствам, работу которых у него есть желание нарушить. Единственный путь - взломать управляющую консоль коммутатора и вручную добавить свой компьютер в VLAN системы IР-видеонаблюдения. Одна незадача - доступ к консоли возможен только с рабочего места администратора, но никак не с произвольного рабочего места пользователя. Круг замкнулся.
Port Security
Итак, первый рубеж защиты, блокирующий доступ произвольных пользователей компьютерной сети компании к системе IP-видеонаблюдения, установлен. Второй рубеж призван блокировать доступ посторонних лиц, не являющихся сотрудниками компании, а значит, и потенциальных злоумышленников, непосредственно к компьютерной сети и сетевому оборудованию. Этот рубеж и состоит из механизмов Port Security. Это наиболее распространенное среди производителей коммутаторов для локальных сетей название специальных функций, охраняющих каждый порт сетевого оборудования от подключения неавторизованных устройств. Ведь даже самому неграмотному хакеру известно, что свободная розетка локальной сети в офисе подключена к порту коммутатора, который можно использовать для доступа в корпоративную сеть.
Работа же механизмов Port Security состоит в идентификации подключаемых к портам коммутаторов сетевых устройств и пресечении неавторизованного доступа. В момент подключения любого сетевого устройства, например ноутбука, механизм Port Security по таким характеристикам, как МАС-адрес подключаемого устройства, его IP-адрес, однозначно определяет его как "своего" или "чужого", и в последнем случае (например, для гостей компании), разрешает доступ только к сети Интернет.
Более жесткие настройки Port Security состоят в назначении администратором соответствия каждого компьютера компании конкретному порту коммутатора, к которому он должен быть подключен, и при нарушении этого правила порт коммутатора полностью выключается до его ручного включения администратором. Безусловно, злоумышленник может установить любой MAC- и IP-адрес на свой ноутбук, однако для этого ему необходимо выяснить не только сами адреса, но и принадлежность их портам коммутатора. А эта конфиденциальная информация известна только администратору безопасности компьютерной сети компании.
Авторизация доступа на базе 802.1х
Наконец, третий рубеж, контролирующий все сетевые подключения персональных компьютеров и ноутбуков пользователей с помощью паролей, в частности, по данным их учетных записей в среде Microsoft Windows. Речь идет о протоколе 802.1Х. Здесь надо отметить, что зачастую правила Port Security усложняют и увеличивают объем работ по администрированию и доставляют множество хлопот мобильным пользователям с ноутбуками. В таких случаях проектировщики сетевых решений останавливаются на варианте, состоящем из связки VLAN и протокола 802.1Х. Этот протокол позволяет реализовать централизованный контроль доступа ксети компании компьютеров и пользователей в точках их подключения, на портах коммутаторов.
Для использования в локальной сети авторизации по протоколу 802.1Х необходимы коммутаторы с поддержкой 802.1Х и сервер авторизации RADIUS, который выполняет авторизацию либо с использованием внутренней базы данных пользователей, либо перенаправляет запрос на корпоративный сервер авторизации, например, Active Directory. При успешной аутентификации и авторизации подключения на коммутатор загружаются установленные для конкретного пользователя и его группы правила обработки сетевого трафика, которые разрешают (или блокируют) доступ пользователя к определенным частям сетевой инфраструктуры компании. Таким образом, администратор может ограничить доступ к системе IP-видеонаблюдения только с определенных компьютеров, в определенное время и определенных пользователей. Поддержка 802.1Х встроена во многие операционные системы, поэтому, как правило, работа этой схемы контроля доступа прозрачна для конечного пользователя.
Необходимые и достаточные механизмы
Таким образом, в распоряжении проектировщиков и инсталляторов системы IP-видеонаблюдения существуют по крайней мере три механизма обеспечения безопасности, которые следует грамотно использовать. Эти механизмы необходимы и достаточны для полной защиты систем IP-видеонаблюдения как в случае выделенного сетевого оборудования для системы видеонаблюдения, так и в случае совместного использования общей компьютерной сети компании для работы системы IP-видеонаблюдения. Здесь читатель, знакомый с сетевыми технологиями, заметит, что автор никак не упомянул различные приложения для сканирования сети и атак на сетевое оборудование, например сканеры портов и IP-сетей, flood-приложения. Дело в том, что на современном уровне развития сетевого оборудования для корпоративных сетей этот вопрос уже решен и остался в прошлом. Современные сетевые устройства для корпоративных сетей умеют обнаруживать аномалии в сетевом трафике. Они отличают обычный сетевой трафик при нормальной работе пользователя от моментов сканирования или атаки на какой-либо узел сети с компьютера злоумышленника - в этих случаях порт коммутатора, к которому подключен такой враждебный компьютер, автоматически отключается до вмешательства администратора и службы безопасности.
Когда нужна защита VPN
В случаях построения территориально распределенных систем IP-видеонаблюдения или вынужденного использовании небезопасных участков телекоммуникационных сетей операторов связи (таких, где нет возможности реализовать меры защиты) необходимо использовать оборудование с поддержкой шифрования передаваемых по сети данных. А именно оборудование с поддержкой технологии виртуальных частных сетей VPN (Virtual Private Network). Этот тип сетевого оборудования обеспечивает установление зашифрованных туннелей для передачи конфиденциальных данных через небезопасные сетевые соединения. Кроме шифрования оборудование поддерживает контроль целостности передаваемой информации и защиту от ее искажения злоумышленниками.
Схема подключения VPN
В большинстве случаев типовой схемой подключения для сетей VPN является схема "точка -точка" с выделенным сетевым центром, в котором устанавливается так называемый концентратор VPN. К нему подключаются и с ним взаимодействуют маршрутизаторы VPN, установленные на объектах наблюдения. Маршрутизаторы VPN обеспечивают защиту передаваемых данных по безопасному туннелю от необходимого числа IP-видеокамер на пост наблюдения, в котором размещен концентратор VPN. В то же время никаких физических ограничений на размещение и число концентраторов VPN нет.
Конфигурация сети, состоящей из устройств VPN, может быть такой, какой требуется из соображений безопасности и географии размещения объектов наблюдения.
Концентраторы и маршрутизаторы
В качестве концентраторов VPN используются специализированные устройства, выпускаемые такими производителями, как Cisco Systems, Linksys, Allied Telesis и многими другими. В то же время стандартные маршрутизаторы для IP-сетей могут быть дополнены аппаратными модулями шифрования VPN и выступать в роли центрального узла сети VPN, в частности, такой возможностью обладают маршрутизаторы ISR компании Cisco Systems. Речь идет о маршрутизаторах Cisco серий 800, 1800, 2800 и 3800, которые можно использовать для построения не только небольших сетей VPN из десятка узлов, но и крупных, насчитывающих десятки и сотни узлов территориально распределенных сетей. Важной особенностью маршрутизаторов ISR является возможность использования модулей шифрования, поддерживающих криптографические алгоритмы по российским стандартам ГОСТ и имеющих соответствующие сертификаты Гос-техкомиссии, ФСБ и ФСТЭК, что позволяет применять их при установке IP-видеонаблюдения на режимных объектах государственных заказчиков в РФ.
В местах установки IP-видеокамер или в точке их подключения к небезопасной сети устанавливаются маршрутизаторы VPN, которые обеспечивают безопасное подключение одной или нескольких IP-видеокамер к концентратору VPN. Так же как и IP-видеокамера, маршрутизатор VPN имеет один или несколько интерфейсов FastEthernet, что позволяет подключать к нему IP-видеокамеры напрямую, то есть без каких-либо дополнительных устройств. В качестве маршрутизатора VPN для подключения одной или двух камер рационально использовать, например, такие модели, как Cisco 850 ISR или Linksys RV042, а для подключения десятка камер будут оптимальны такие модели, как Cisco 870 ISR или Linksys RV016.
И концентраторы и маршрутизаторы VPN, рассчитанные на использование в корпоративных сетях, поддерживают достаточно сильные алгоритмы шифрования 3DES или AES, стойкость к взлому которых сегодня более чем достаточна для защиты систем IP-видеонаблюдения Задержка шифрования, как правило, не превышает 100 мс в случае аппаратного шифрования/дешифрования. Этот важный момент необходимо учесть при выборе оборудования, поскольку не все производители устанавливают аппаратный криптографический процессор, и - как следствие - при больших потоках данных возможны существенные задержки в передаче видеоинформации. Что касается масштабируемости, то, например, такой концентратор VPN, как Cisco ASA 5505, сможет обработать данные с 10 точек подключения IP-видеокамер.
Резюме
При правильном выборе сетевого оборудования и его настройке процесс обеспечения безопасности сети для IP-видеонаблюдения принципиально ничем не отличается от корпоративной компьютерной сети, и, более того, эти сети могут сосуществовать в пределах одной корпоративной компьютерной сети Системы IP-видеонаблюдения не только не уступают аналоговым системам по показателям безопасности, но и при условии проектирования и установки квалифицированными специалистами значительно более защищены от воздействий как неопытных хакеров, так и достаточно квалифицированных злоумышленников. В любом случае задача взлома или нарушения работы системы IP-видеонаблюдения при использовании описанных в статье систем защиты является нетривиальной.
Для защиты систем IP-видеонаблюдения, сосредоточенных на небольшой территории, достаточно использовать механизмы защиты, встроенные в коммутаторы корпоративного уровня таких производителей, как Cisco Systems, Allied Telesis, Linksys и некоторых других. При выборе оборудования следует удостовериться в поддержке технологий VLAN, Port Security и 802.1Х. Как минимум, необходима поддержка VLAN.
Для защиты территориально распределенных систем IP-видеонаблюдения необходимо использовать технологии и оборудование сетей VPN. При выборе оборудования следует удостовериться в поддержке аппаратного шифрования/дешифрования по стандартам 3DES или AES.
Журнал "Системы безопасности" #4, 2008

суббота, 12 января 2013 г.

Технология PoE – простое подключение IP-камер

Чтобы не прокладывать кабель питания к месту установки IP-камеры, можно использовать технологию PoE.

Что такое PoE.

PoE (Power of Ethernet) – это технология передачи питания по витой паре вместе с данными. Для этого Вам потребуется дополнительное оборудование: инжектор FSE-4 и сплиттер FD-1 (FD-2). Инжектор вводит питание в UTP кабель, а сплиттер выделяет его и подает на видеокамеру.
Подключение IP-камер без функции PoE (Power over Ethernet)
Многие IP-видеокамеры уже содержат встроенный сплиттер. Это упрощает подключение, так как требуется только инжектор
Подключение IP-камер с функцией PoE (Power over Ethernet)
Обратите внимание, что инжектор FSE-4 является четырех портовым. Это позволяет подключить к нему 4 удаленных устройства.
Пример подключения множества IP-камер с использованием PoE (Power over Ethernet)
В таблице ниже приведена таблица соответствия между различными моделями IP-камер AXIS и необходимыми моделями инжекторов и сплиттеров для организации питания камер с использованием технологии Power over Ethernet.
МодельПоддержка PoEИнжекторСплиттер
Фиксированные сетевые камеры
AXIS 206-FSE-4FD-1 (5V) или FD-2
AXIS 207-FSE-4FD-1 (5V) или FD-2
AXIS 207W-FSE-4FD-1 (5V) или FD-2
AXIS 207MW-FSE-4FD-1 (5V) или FD-2
AXIS 210-FSE-4FD-1 (12V) или FD-2
AXIS 210A+FSE-4-
AXIS P1311+FSE-4-
AXIS 211+FSE-4-
AXIS 211A+FSE-4-
AXIS 211M+FSE-4-
AXIS 211W+FSE-4-
AXIS 221+FSE-4-
AXIS 223M+FSE-4-
AXIS Q1755+FSE-4-
AXIS M1011-FSE-4FD-1 (5V) или FD-2
AXIS M1011 W-FSE-4FD-1 (5V) или FD-2
AXIS M1031-FSE-4FD-1 (5V) или FD-2
Фиксированные купольные сетевые камеры
AXIS 209FD+FSE-4-
AXIS 209FD-R+FSE-4-
AXIS 209MFD+FSE-4-
AXIS 209MFD-R+FSE-4-
AXIS 216FD+FSE-4-
AXIS 216FD-V+FSE-4-
AXIS 216MFD+FSE-4-
AXIS 216MFD-V+FSE-4-
AXIS M3011+FSE-4-
AXIS P3301+FSE-4-
AXIS P3301-V+FSE-4-
AXIS 225FD+FSE-4-
AXIS 225FD 22mm+FSE-4-
Сетевые PTZ-камеры
AAXIS 212 PTZ+FSE-4-
AXIS 212 PTZ-V+FSE-4-
AXIS 213 PTZ-FSE-2HFD-1H (13V)
AXIS 214 PTZ-FSE-4FD-1 (12V)
AXIS 215 PTZ-FSE-4FD-1 (12V)
AXIS 215 PTZ-E---


Поднимаем систему обратного дозвона Callback

Статья из журнала "Хакер"

Самый верный способ сэкономить на звонках – использовать IP-телефонию. Но, к сожалению, даже если установить на мобильный телефон какой-нибудь Skype-клиент, ты сможешь использовать его только при наличии Wi-Fi или 3G. Чтобы обойти эту привязанность к интернету, можно организовать систему callback, которая будет звонить обоим абонентам по VoIP и связывать их между собой. В этом случае нет необходимости ни в интернете, ни в продвинутом телефоне, ни даже в VoIP-клиенте.
Система callback существует давно и предлагается многими VoIP-компаниями. Можно зайти на сайт, ввести два номера телефона, и специальный сервис позвонит обоим абонентам, чтобы соединить их между собой. Я даже пользовался когда-то этим с мобильного телефона, открывая страницу такого сервиса в веб-браузере. Этим можно воспользоваться разок где-нибудь за границей в роуминге, но использовать постоянно – нет. Совсем другое дело – организовать удобный сервис саму. Схема такая: ты звонишь на определенный номер, где установлен специальный сервер, тот сбрасывает звонок и сам перезванивает. Тебе остается набрать специальный PIN-код (выполнить авторизацию) и номер для звонка, после чего дожидаться соединения. Это называется обратным звонком, или callback’ом. Штука удобная и довольно простая в организации.

Мини-АТС

Если при слове «Мини-АТС» у тебя возникает ассоциация с жутко дорогостоящим оборудованием, которое устанавливается в офисах, оно ошибочно. Помимо аппаратных АТС’ок, огромное распространение получили программные продукты, в том числе бесплатный сервер Asterisk. Собственно, Asterisk будет сердцем нашей системы. Про базовую установку сервера и первичную настройку, чтобы все заработало, у нас были две статьи. PDF-версии ты найдешь на диске, а также можешь прочитать их на сайте (www.xakep.ru/magazine/xa/107/152/1.asp и www.xakep.ru/magazine/xa/108/154/1.asp). Я не рекомендую использовать для наших целей сборки типа TrixBox, Elastix и т.д.; проще будет установить и настроить все вручную. Но повторять то, о чем мы писали отдельные статьи, я сейчас не буду.
Итак, предположим, что Asterisk у нас есть. Первое, что нужно сделать – это купить и зарегистрировать на Asterisk местный городской номер, который отдается по SIP. На него мы будем звонить. Можно, конечно, не покупать SIP-номер, а использовать обычный аналоговый, который приходит по меди. Но тогда придется докупить VoIP-шлюз с FXO-портом, а с ним могут возникнуть проблемы: на древних и не очень древних АТС не всегда работает определение Caller ID, которое нам очень нужно. Да и вообще, дополнительное звено в цепочке только понизит надежность системы. По этой причине SIP-номер, безусловно, предпочтительнее. Следующий шаг – покупка (и настройка) аккаунта у VoIP-провайдера, через который мы будем звонить. Можно купить несколько и при звонках за рубеж использовать один, в Москву – другой, по России – третий. Выбор большой.
Еще пара замечаний. В качестве номера можно использовать свой сотовый номер, только для подключения его к Asterisk потребуется VoIP-GSM шлюз, а они стоят дорого: примерно от 5000 рублей за порт. Есть обходной путь – использовать для этого 3G-модем, стоимость которого не превышает 1000 рублей. Для сотового телефона желательно прикупить любой SIM Dialer, который позволит пользоваться такой схемой звонков максимально удобно – по сути, звонящему нужно будет только выбрать контакт в записной книге, а звонок и запрос к callback-системе будет произведен автоматически. Подробнее о VoIP-GSM шлюзе и SIM Dialer’е ты можешь прочитать во врезках.

Обработка звонков

Теперь, когда все приготовления выполнены, Asterisk настроен по инструкциям из статей, можно приступать к организации нашего сервиса. И начнем мы с того, что поменяем так называемый контекст. Для этого открываем на Астериске файл /etc/asterisk/extensions.conf (в этом файле описывается план набора, то есть как будут себя вести все входящие и исходящие вызовы) и находим контекст, в который приходят все входящие извне звонки: у меня он называется [fromgorod]. При входящем звонке система будет определять номер звонящего, и, если он есть в «списке», звонок будет отправляться на голосовое меню (IVR), в котором будет предложено набрать PIN-код, а далее – номер для звонка. Пусть мой городской номер 310309:
[fromgorod]
exten => 310309,1,NoOp(zvonyat s nomera ${CALLERID(all)})
exten => 310309,n,NoOp(${STRFTIME(${EPOCH},,%d.%m.%Y-%H:%M:%S)})
exten => 310309,n,GoToIf($["${CALLERID(number)}" = "8901234567"]?ivr,s,1)
exten => 310309,n,Answer() ;Отвечаем
......
Функция NoOp позволяет вывести в консоль Asterisk текст или состояние переменной. Первая строка выводит в консоль Caller ID звонящего, а вторая – дату и время звонка. Для работы системы это не нужно, но при отладке очень полезно. Строка «exten => 310309,n,GoToIf($["${CALLERID(number)}" = "8901234567"]?ivr,s,1)» – это неполное ветвление, оно проверяет, с какого номера пришел вызов. Если с номера 8901234567, то вызов уходит в контекст IVR; если же номер другой, тогда обработка вызова пройдет по обычной схеме. Обрати внимание, что номер может приходить без 8 в начале.
Если callback-системой будет пользоваться пара человек, то прописать под каждый их номер еще одну строчку в конфиге не будет большой проблемой. Но что, если их будет 50? Изящнее всего прописать всех пользователей в специальной базе данных. Вместе с Asterisk часто используют MySQL, чтобы записывать в нее логи звонков – CDR. В результате на сервере создается база Asterisk, в которой есть таблица CDR. Мы в этой базе создадим еще одну таблицу – callback. Для этого в консоли набираем «mysql -u asterisk -p asterisk», далее указываем пользователя, таблицу и запрос на ввод пароля. После ввода пароля создаем таблицу (телефон, PIN-код, переменная callback, имя) и заполняем параметрами одного из пользователей:
CREATE TABLE `callback` (
`phone` varchar(80) NOT NULL default '',
`pin` int(11) NOT NULL default '4321',
`callback` int(11) NOT NULL default '0',
`user` varchar(255) NOT NULL default ''
);

INSERT INTO callback(phone, pin, user) values('8901234567', '2602', 'Aggressor');
Итак, база с данными есть, как же Asterisk узнает об этом? Все достаточно просто, нужно дополнить наш контекст [fromgorod]:
exten => 310309,1,NoOp(zvonyat s nomera ${CALLERID(all)})
exten => 310309,n,NoOp(${STRFTIME(${EPOCH},,%d.%m.%Y-%H:%M:%S)})
exten => 310309,n,MYSQL(Connect connid localhost asterisk asterisk asterisk)
exten => 310309,n,MYSQL(Query resultid ${connid} select pin, callback from callback where phone=${CALLERID(number)})
exten => 310309,n,MYSQL(Fetch fetchid ${resultid} pin callback)
exten => 310309,n,NoOp(pin -> ${pin} callback# -> ${callback})
exten => 310309,n,MYSQL(Clear ${resultid})
exten => 310309,n,MYSQL(Disconnect ${connid})
exten => 310309,n,GoToIf($["${pin}" != ""]?ivr-pass,s,1)
exten => 310309,n,Answer() ;Отвечаем
Каждая строчка, по сути, говорит сама за себя: сначала обращаемся к базе, далее с помощью SQL-запроса получаем параметры для номера звонящего абонента и обрабатываем их. Непонятной может показаться последняя строчка «GoToIf($["${pin}" != ""]?ivr-pass,s,1)». Если в результате запроса номер найдется в базе, то переменная pin будет не пустой, и тогда дальше обработка вызова пойдет в контексте ivr-pass.

Настраиваем IVR

Итак, номер пользователя определяется и сверяется с базой данных. Что дальше? Необходимо проиграть ему инструкции, как ввести PIN-код, чтобы произвести авторизацию пользователя, и обработать вход. Голосовые меню, которые взаимодействуют с пользователем, называются IVR. После того, как номер абонента определился, звонок перекидывается на контекст ivr-pas:
[ivr-pass]
exten => s,1,Background(WelcomePass) ;
exten =>s,n,WaitExten(10)
exten => _XXXX,1, GoToIf($["${EXTEN}" = "${pin}"]?ivr,s,1)
exten => _XXXX,n,Hangup
exten => t,1,Hangup
exten => i,1,Hangup
Здесь мы воспроизводим ролик WelcomePass (его необходимо предварительно скопировать в /var/lib/asterisk/sounds/ru). Потом ждем выбора пользователя 10 сек. Если за 10 секунд никакой номер не введен, то кладем трубку: exten => t,1,Hangup. Если введен PIN не больше четырех символов, опять же, кладем трубку: exten => i,1,Hangup. Никто не мешает, к примеру, вместо Hangup прописать возможность еще пару раз ввести PIN, и только после третьей неудачной попытки класть трубку. Так или иначе, если были введены четыре символа, которые совпадают с PIN-кодом, то мы переходим в контекст ivr.
[ivr]
exten =>s,1,Set (inum=0)
exten =>s,n,Set (tnum=0)
exten => s,n,Background(Welcome)
exten =>s,n,WaitExten(10)
exten => 1,1,GoTo(ivr-out,s,1)
exten => 2,1,GoTo(ivr-ch-pin,s,1)
exten => i,1,Playback(pbx-invalid)
exten => i,n,Set(inum=$[${inum} + 1])
exten => i,n,GotoIf($["${inum}" < "3"]?s,1)
exten => i,n,Hangup()
exten => t,1,Set(tnum=$[${tnum} + 1])
exten => t,n,GotoIf($["${tnum}" < "3"]?s,1)
exten => t,n,Hangup()
Контекст ivr начинается с обнуления двух переменных inum и tnum – это количество неверных попыток ввода и количество прошедших таймаутов. При каждом неверном вводе воспроизводится стандартный ролик pbx-invalid, а переменная inum увеличивается на 1. После трех ошибок кладется трубка, то же самое происходит и с переменной tnum. Далее воспроизводится ролик Welcome, за ним ожидаем ввод номера для звонка. В нашем меню две опции: 1 – позвонить и 2 – сменить PIN-код:
[ivr-out]
exten => s,1,Set (inum=0)
exten => s,n,Set (tnum=0)
exten => s,n,Background(beep)
exten => s,n,WaitExten(10)
exten => 89XXXXXXXXX,1,Dial(SIP/bla1/${EXTEN}
exten => 89XXXXXXXXX ,n,Hangup
exten => 8495XXXXXXX,1,Dial(SIP/bla2/${EXTEN}
exten => 8495XXXXXXX ,n,Hangup
exten => 8[2-8]XXXXXXXXX,1,Dial(SIP/blabla3/${EXTEN}
exten => 8[2-8]XXXXXXXXX ,n,Hangup
exten => i,1,Playback(pbx-invalid)
exten => i,n,Set(inum=$[${inum} + 1])
exten => i,n,GotoIf($["${inum}" < "3"]?s,1)
exten => i,n,Hangup()
exten => t,1,Set(tnum=$[${tnum} + 1])
exten => t,n,GotoIf($["${tnum}" < "3"]?s,1)
exten => t,n,Hangup()
[ivr-ch-pin]
exten => s,1,Background(beep)
exten => s,n,WaitExten(10)
exten => _XXXX,1,MYSQL(Connect connid localhost asterisk asterisk asterisk)
exten => _XXXX,n,MYSQL(Query resultid ${connid} update callback set `pin`=${EXTEN} where phone=${CALLERID(number)})
exten => _XXXX,n,MYSQL(Disconnect ${connid})
exten => _XXXX,n,Hangup()
exten => i,1,Hangup()
exten => t,1,Hangup()
В контексте ivr-out прописаны исходящие звонки. Вначале воспроизводится стандартный «бииип», после которого можно набирать номер для звонка. В конфиге у нас прописаны три направления: сотовые, Москва и межгород; каждое направление соединяется через определенный транк (аккаунт VoIP-провайдера): blabla1, blabla2 или blabla3. Можно обойтись одним, но для каждого направления можно выбрать наиболее выгодного VoIP-оператора, этим мы и воспользовались.
В контексте ivr-ch-pin, который отвечает за смену PIN’а: сначала воспроизводится «бииип», после чего дается 10 сек на ввод нового PIN’а. Когда новый PIN введен, происходит подключение к базе и обновление PIN-кода в таблице.

Call-файлы в Asterisk'е

Собственно, с этого момента система уже работает. Мы звоним на наш номер, авторизуемся с помощью PIN-кода, далее вводим номер телефона, на который Asterisk и перенаправляет наш звонок. Тестовый звонок… да, все работает! Однако в самом начале статьи мы говорили о том, что наша callback-система должна сама перезванивать, чтобы мы тратились на исходящие звонки с сотового. Как же это сделать?
В Астериске есть так называемые call-файлы, которые позволяют инициировать вызов и соединять два номера. Создаем конфиг и заполняем следующим:
Channel: SIP/blabla1/8901234567
MaxRetries: 2
RetryTime: 3
WaitTime: 20
Context: ivr-pass
Extension: s
Priority: 2
Archive: Yes
Что за... и за что отвечает:
  • Channel – указывает тип, название транка и номер телефона;
  • MaxRetries – параметр определяет количество попыток дозвона. Как только они будут исчерпаны, файл удалится;
  • RetryTime – время между повторениями;
  • WaitTime – этот параметр указывает, сколько времени необходимо ждать поднятия трубки до того, как прекратить попытку дозвониться;
  • Context – это контекст, выполнение которого начнется после поднятия трубки;
  • Extension – это номер в контексте ivr-pass, который будет набран, когда возьмут трубку (пишем тут s);
  • Priority – это приоритет экстеншина s, с которого начнется обработка (укажем 2)
  • Archive – если поставить Yes, тогда после выполнения call-файла в /var/spool/asterisk/outgoing_done можно будет посмотреть историю обработки вызова.
Если созданный файл переместить в /var/spool/asterisk/outgoing/, то Астериск сразу начнет звонить на номер 8901234567 (причем рекомендуется call-файл именно перемещать, а не копировать). Время каждой попытки дозвона – 20 секунд, после чего номер набирается заново, и так два раза. Если во время одной из попыток абонент возьмет трубку, то система попытается набрать экстеншен s в контексте callback.

Настраиваем callback

Добавить гибкости, подставляя нужный номер, можно при помощи AGI (AsteriskGatewayInterface), интерфейса взаимодействия с внешними скриптами. Внешний скрипт можно написать на Perl, PHP, C, Bash. Предлагаю написать нужный нам скрипт на Bash – это проще и быстрее всего, выглядеть он будет так:
#!/bin/bash
echo Channel: SIP/blabla1/$1 > /tmp/$2
echoMaxRetries: 2 >> /tmp/$2
echoRetryTime: 3 >> /tmp/$2
echoWaitTime: 20 >> /tmp/$2
echo Context: ivr-pass >> /tmp/$2
echo Extension: s >> /tmp/$2
echo Priority: 2 >> /tmp/$2
echo Archive: Yes >> /tmp/$2
mv /tmp/$2 /var/spool/asterisk/outgoing
Готовый файл называем callback.agi и перемещаем в /var/lib/asterisk/agi-bin. При вызове скрипта из контекста в Астериске ему будут переданы две переменных: номер телефона ($1 в скрипте), на который будем перезванивать, и имя call-файла ($2 в скрипте).
Когда мы создавали таблицу callback,то сделали в ней поле callback, которое по умолчанию равно 0. При входящих звонках мы получаем значение этого поля вмести с PIN-кодом. Если состояние этого поля не равно 0, то будем перезванивать. Отредактируем контекст ivr-pass и создадим новый callback:
[ivr-pass]
exten => s,1, GoToIf($["${callback}"! = "0"]?callback,s,1)
exten => s,n,Background(WelcomePass) ;
exten =>s,n,WaitExten(10)
exten => _XXXX,1, GoToIf($["${EXTEN}" = "${pin}"]?ivr,s,1)
exten => _XXXX,n,Hangup
exten => t,1,Hangup
exten => i,1,Hangup
[callback]
exten => s,1,AGI(callback.agi,${callback},${UNIQUEID})
exten =>s,n,hangup
Первая строка в [callback] запускает скрипт под названием callback.agi и передает две переменных: номер и UNIQUEID в качестве названия для call-файла. Таким образом и происходит обратный вызов.

Плюсы и минусы

Результат всех этих действий – полноценная callback-система. Ее плюсы очевидны: можно реально экономить при звонках, особенно за пределы своего города или в роуминге. Из минусов – при звонке будет теряться твой CallerID, у абонента вместо этого будет высвечиваться номер VoIP-оператора. Как вариант, можно найти такого VoIP-прова, который позволяет подставить свой (или даже произвольный) CallerID. Еще один минус системы – увеличенное время соединения. У меня при звонке через sim-dialer от момента вызова номера в контакт листе до «гудков» на набранный номер уходит примерно 20-25 секунд. Но я готов ждать :). В ближайших планах – прикрутить к системе биллинг и реализовать заказ звонка через сайт, продавая callback как услугу. :)

SimDialer

Использовать callback-систему в «голом» виде не всегда удобно. Ведь приходится вручную звонить на номер доступа, отвечать на звонок и вручную набирать PIN-код и номер для соединения. Я бы, возможно, и не стал браться за всю эту затею, если бы мой знакомый не заказал себе набор SimDialer. Он представляет собой набор из маленького чипа и контактов, которые накладываются поверх SIM-карты. После его установки в телефоне появляется новое SIM-меню. В меню указывается номер доступа к нашей системе и сам PIN-код. Важный пункт – bypassprefixes, в котором перечисляются номера телефонов, набор на которые должен осуществляться напрямую. В результате использовать callback-систему становится проще простого. Ты открываешь телефонную книгу, находишь нужный номер и просто звонишь. Если номер есть в bypassprefixes, то звонок пойдет через GSM, а если нет, то через номер доступа, причем SimDialer сам пошлет DTMF-сигналами в Астериск нужный номер и PIN-код. Увы, насколько бы тонким ни был чип, но все же не во все телефоны удастся его запихнуть. К тому же, на iPhone такая штука почему-то не заработала. В качестве альтернативы я нашел приложение CardCaller, которое предназначено для звонков по карточкам IP-телефонии. Оно умеет само вводить номер телефона и PIN-код, но, к сожалению, не поддерживает callback.

Настраиваем GSM-шлюз

В качестве номера доступа удобно использовать не только SIP-номер, но и обычный федеральный сотовый. Чтобы подключить сотовый номер к Астериску, нужен VoIP-GSM шлюз, для этого отлично подойдет 3G USB-модем HUAWEI Е1550, который активно продают операторы сотовой связи. С его использованием можно не только сделать традиционный callback, но и реализовать обратный вызов через SMS. Прежде чем подключить модем, нужно убедиться, что он поддерживает голос, это может определить прога MICRO-BOX HUAWEI MODEM UNLOCKER. Она же снимет привязку к определенному оператору.
Для нормальной работы нам потребуется ядро 2.6.32 и выше. Скачиваем и устанавливаем модуль для Asterisk (www.makhutov.org/svn/chan_datacard), который реализует работу с 3G-модемом. Далее проверяем, появился ли chan_datacard.so в /usr/lib/asterisk/modules. Появился? Хорошо. Руками копируем ./trunk/etc/datacard.conf в /etc/asterisk. В этом конфиге по умолчанию прописаны два устройства [datacard0] и [datacard1] – одно удаляем, оно нам не нужно. Меняем разъем, куда подключен шлюз, и контекст для него:
[datacard0]
audio=/dev/ttyUSB1
data=/dev/ttyUSB2
context=datacard-incoming
group=1
rxgain=3
txgain=3
Теперь сохраняет изменения, перезапускаем Астериск – он готов к работе. Можно прописать контекст и принимать/совершать звонки, а можно проверить баланс или отправить SMS:
CLI>datacardsms datacard0 89000000000 Hello!
CLI>datacardussd datacard0 *102#
[datacard0] Got USSD response: 'Баланс 155.49 р. Аня+Саша=любовь. Аутебя? Шли ИИмя+Имя на 5050 3р'


Полные версии конфигов на диске  поставляемым с  журналом.


Как сэкономить и заработать с помощью Asterisk

Sergey Jaremchuk feat. Andrey Matveev
Кризис заставляет нас потуже затянуть пояса и по-новому взглянуть на многие вещи. Ситуация в IT-сфере несколько сходная: чтобы сэкономить, организации перепланируют использование имеющихся ресурсов, делая ставку на объединение функциональных возможностей, серверов и сетей. В этой статье рассмотрим, как с помощью IP-PBX Asterisk можно сократить расходы компании на телефонную связь и даже немного заработать самому.
Содержание:
  1. Тонкое сопряжение
  2. Подключаемся к SIP провайдеру
  3. Настраиваем Callback
  4. Простенький биллинг
  5. Экономия на телефонах
  6. Экономим на факс-сервере
  7. Эаключение
  8. Врезка: Продаю Украину, Белоруссию, Казахстан
  9. Врезка: Лимитируем пустые разговоры
  10. Врезка: Управление компьютером при помощи Asterisk
  11. Боковые выносы

Тонкое сопряжение
Средняя и тем более крупная организация часто имеет свои филиалы в разных городах или странах. Если в удаленных офисах есть возможность воздвигнуть IP-PBX сервера на базе Asterisk, то почему бы не объединить их в единую сеть. Этим мы убьем сразу несколько зайцев: сведем на нет стоимость звонков между «точками», обеспечим безопасное голосовое соединение (путем применения IPsec шифрования к потоку голосовых данных), создадим все условия для проведения аудио- и видеоконференций, а также получим все дополнительные телефонные свойства, присущие VoIP: запись телефонных разговоров, IVR (система предварительно записанных голосовых сообщений, выполняющая функцию маршрутизации звонков внутри call-центра), альтернативный GSM-роуминг и т.д. Продемонстрировав начальству выгоду от внедрения подобного решения, можно в корне изменить отношение к IT-подразделению (сотрудников которого зачастую считают вечными нахлебниками) и получить щедрые премиальные.
Итак, у нас есть два сервера Asterisk. Давай организуем их совместную работу, объединив их диалпланы и увеличив соответственно возможности. Подружить два Asterisk’a можно по протоколу установления сессии SIP (Session Initiation Protocol, RFC 3263), либо по IAX2 (Inter-Asterisk eXchange protocol, протокол обмена VoIP данными между IP-PBX Asterisk, RFC 5456). Мы выберем второй вариант, так как IAX2 лучше адаптирован для работы из-за NAT, использует единственный порт (4569/UDP) для передачи сигнальных данных и медиапотока (т.е. меньше проблем с настройкой файеров на шлюзах, меньше проблем с провами, которые любят резать подключения по нестандартным портам) и поддерживает функцию объединения каналов (эта способность позволяет отправлять голосовые данные множества вызовов под одним заголовком. Если между двумя офисами одновременно выполняются десятки звонков, выигрыш в пропускной способности за счет использования транка может быть значительным.) Помимо всего перечисленного, по сравнению с протоколом SIP, IAX2 позволяет прилично экономить сетевой трафик, так как сигнальная информация передается в битовых полях, а не текстом.
Все необходимые настройки производятся в файле iax.conf. Один из серверов будет подключаться к другому для оперативного обмена данными.
$ sudo nano /etc/asterisk/iax.conf
; Подключаемся ко второму Asterisk
[general]
;register => :@<имя или IP адрес>
register => userB:password@synack.ru
; Данные для подключения
[synack]
type=friend
user=username
secret=password
host=synack.ru
context=synack
Теперь необходимо добавить в диалплан описание нового маршрута:
$ sudo nano /etc/asterisk/extensions.conf
[synack]
exten => _5XXX,1,NoOp()
exten => _5XXX,n,Dial(IAX2/synack/${EXTEN})
exten => _5XXX,n,Hangup()
Вот, собственно, и все настройки на первом сервере.
На другой стороне описание в iax.conf и настройки практически аналогичны. Учитывая, что этот сервер принимает подключение, убираем параметр register.
$ sudo nano /etc/asterisk/iax.conf
[office]
type=friend
user=user
secret=password
host=dynamic
; В целях безопасности разрешим подключения только с нужного IP-адреса
deny=0.0.0.0/0
permit=11.22.33.44
context=office
А в конфиге extensions.conf задаем второй пул номеров:
exten => _8XXX,1,Dial(IAX2/office/${EXTEN})
Если в подчинении несколько IP-PBX Asterisk, добавляем их так же, как и первый сервер.
Необходимый минимум для подключения выполнен. Далее наращиваем эту схему, изменяя диалплан в зависимости от ситуации и потребностей. Например, в экстеншенах Asterisk можно указывать время действия правила. Так, чтобы звонить в удаленный офис можно было только в рабочее время, используем такую конструкцию:
exten => 3000,1,GotoIfTime(9:00-18:00|mon-fri|*|*?OUT,s,1)
Вариантов действительно много, экспериментируй.

Подключаемся к SIP провайдеру
За последние несколько лет SIP провайдеров, предлагающих свои услуги по весьма демократичным ценам, наплодилось предостаточно. Используя их возможности, можно существенно сэкономить на междугородных и международных звонках. Для Asterisk нет принципиальной разницы, подключаться к одному или нескольким SIP провайдерам сразу, но для нас второй вариант подключения выглядит предпочтительнее, поскольку в диалплане можно предписать ранжирование операторов связи по каждому направлению на основе критерия цена-качество. Таким образом можно звонить по разным направлениям, исходя из требуемого качества и установленных провайдерами расценок. Кстати, именно на этом подходе основана работа китов современного SIP’остроения вроде sipnet.ru.
Принцип настройки подключения и создания диалплана практически полностью совпадает с IAX2. Все установки для SIP производятся в файле sip.conf.
$ sudo nano /etc/asterisk/sip.conf
[general]
...
useragent=SipPhone
register=myusername:mypassword@sipnet.ru/2223322
; Используемые кодеки
disallow=all
allow=ulaw
allow=alaw
allow=gsm

[sipnet]
type=friend
username=myusername
secret=mypassword
callerid=sipnet
host=sipnet.ru
nat=yes
fromuser=sipnet
fromdomain=sipnet.ru
dtmfmode=rfc2833
insecure=invite
context=sipnet
Этот конфиг можно взять за основу для подключения к любому SIP серверу. Конечно, разные провайдеры могут использовать специфические установки, поэтому придется прошерстить раздел FAQ на офсайте поставщика сервиса в поисках примеров, нюансов и советов по обходу подводных камней.
Далее разбираемся с входящими и исходящими звонками:
$ sudo nano /etc/asterisk/extensions.conf
[sipnet-in]
exten => 101,1,Set(CALLERID(name)="Sipnet call")
exten => 101,n,Dial(SIP/101,20)
exten => 101,n,Playback(vm-nobodyavail)
exten => 101,n,Voicemail(101)
exten => 101,n,Hangup()

[sipnet-out-moscow]
exten => _749[59]ZXXXXXX,1,Set(CALLERID(all)="SipPhone" <2223322>)
exten => _749[59]ZXXXXXX,n,Dial(SIP/sipnet/${EXTEN},20)
exten => _749[59]ZXXXXXX,n,Hangup()
Увеличить
Рис. 1. Соединение двух серверов Asterisk по протоколу SIP

Настраиваем Callback
Сегодня не редкость, когда менеджеры работают далеко за пределами офиса, связываясь при необходимости с руководством или работниками по мобильному телефону. В итоге в месяц за переговоры приходится платить достаточно приличную сумму. А если таких работников в офисе не один десяток? Затраты на переговоры будут весьма значительны. Но выход есть: приобрести безлимитный пакет и при поступлении звонка перезванивать вызывающему, который далее уже сам выбирает, что ему нужно — звонить кому-нибудь в офисе, делать еще один исходящий звонок, например междугородний, оставить или прослушать голосовое сообщение и так далее. При помощи Asterisk организовать это достаточно просто, причем существует сразу несколько вариантов. Самый простой способ — создание в каталоге /var/lib/asterisk/outgoing специального .call файла, который подхватывается и обрабатывается Asterisk на лету. Создаем в extensions.conf описание нового диалплана:
$ sudo nano /etc/asterisk/extensions.conf
[IncomingCall]
; Проверяем номер звонящего, если совпадает, запускаем скрипт
exten => s,1,GotoIf($["${CALLERID(num)}" = "9151234567"]?callback)
; Аналогично описываются и остальные номера, на которые должен осуществляться перезвон
; Если номер в списке отсутствует, обрабатываем вызов обычным образом
exten => s,n,Goto(normal)
exten => s,n(callback),System(/etc/asterisk/scripts/callback 8${CALLERID(num)} &)
exten => s,n,Hangup()
exten => s,n(normal)
; Экстеншен, с которого будет производиться звонок
[InternalCall]
exten => 123,1,Dial(SIP/123)
exten => 123,n,Hangup()
exten => _89X.,1,Dial(SIP/${EXTEN}@GW_IP)
exten => _89X.,n,Hangup()
Теперь собственно скрипт, который создаст нужный call файл. Напомним, что используя директиву System, можно создать файл на лету:
exten => h,6,System(echo Channel: SIP/${CALLERID(num)} > /tmp/${CALLERID(num)}.call)
Но отдельный скрипт нагляднее и проще редактируется.
$ sudo nano /etc/asterisk/scripts/callback
#!/bin/sh
sleep 5
cat << EOF > /tmp/$NUMBER.call
# Получаем номер, переданный в качестве параметра
NUMBER=$1
# Канал, используемый для исходящего звонка
echo "Channel: SIP/$NUMBER@InternalCall
# Количество повторных попыток (т.е. при значении 1 звонить будет 2 раза)
MaxRetries: 1
# Время в секундах, через которое будет произведена вторая попытка
RetryTime: 30
# Ожидание ответа на вызов
WaitTime: 30
Context: InternalCall # Контекст
Extension: 777 # Экстеншен
Priority: 1
AlwaysDelete: Yes" >/var/spool/asterisk/tmp/$NUMBER
EOF # Закончили формировать файл
# Теперь копируем файл
chown asterisk:asterisk /tmp/$NUMBER.call
mv /tmp/$NUMBER.call /var/spool/asterisk/outgoing/
Принцип работы довольно прост: абонент звонит, Asterisk определяет принадлежность к списку и в случае совпадения создает call скрипт, который затем используется для осуществления исходящего звонка.
Создавать файл сразу в каталоге outgoing нельзя, если Asterisk его успеет прочитать до того, как он будет полностью записан, произойдет сбой в работе скрипта. Поэтому рекомендуется в outgoing перемещать уже готовый файл. Далее развиваем идею, подключая нужные функции.
Напомним, что Callback можно организовать и средствами web, когда пользователь набирает свой номер телефона в специальном поле браузера, а call файл создает специальный CGI скрипт. Такая схема будет полезной и в службе поддержки. Пользователи не очень любят тратить свои кровные на переговоры с подобными сервисами, здесь Callback будет очень кстати. В таком варианте в экстеншен лучше жестко забить номер (например, службы поддержки или менеджера), с которым Asterisk будет соединять удаленного абонента. Для этого достаточно добавить в «InternalCall» вызов нужного номера.
Немного усложнив описанные выше скрипты, можно разрешить подключаться любому пользователю по карточке с PIN кодом для осуществления платного звонка в выбранном направлении. В этом случае после перезвона абоненту Asterisk запрашивает PIN код, извлекает из БД текущий баланс и выводит его звонившему (о биллинговой системе мы поговорим чуть ниже). Далее абонент указывает номер, на который он хотел бы позвонить.
А вообще, событие (триггер) для Сallback может генерировать SMS сообщение, e-mail, сигнал от системы видеонаблюдения (за подробностями обращайся к статье «Звездное попурри», опубликованной в апрельском номере ][ за 2009 год), событие на сервере (допустим, пропадание питания в электросети) и так далее. Например, при недостатке средств на счету автоматически генерируется .call файл, обеспечивающий дозвон до клиента с напоминанием о необходимости пополнения счета.
Увеличить
Рис. 2. Настройка Callback в дистрибутиве Elastix

Простенький биллинг
Если ты решил немного подзаработать с Asterisk, то без системы учета звонков не обойтись. В интернете можно найти не одно готовое решение вроде A2billingAsterisellastCDRviewAstBill, но в 9 случаях из 10 его придется адаптировать под конкретные условия. Как бы странно это ни прозвучало, но зачастую проще написать биллинговую систему или учет разговоров самому, тем более что в поставке Asterisk все для этого имеется.
Увеличить
Рис. 3. A2billing предоставляет широкие возможности по учету звонков
Asterisk сохраняет данные о каждом вызове в CDR файл (Call Detail Record). Такие записи содержат — CallerID, направление, канал, время начала вызова, ответа абонента и окончания, продолжительность переговоров, результат и некоторые другие сведения. По умолчанию Asterisk генерирует отчет в CSV файл, но очень просто подключить вывод CDR в базы MySQL, PostgreSQL, unixODBC, RADIUS. Если ранее этого не было сделано, то для импорта записей из CSV файла в MySQL используй скрипт, который найдешь на прилагаемом к журналу диске (сам скрипт размещен по адресу www.voip-info.org/wiki/view/Asterisk+CDR+csv+mysql+import).
Для поддержки MySQL Asterisk нужно собрать с поддержкой этой СУБД. По лицензионным соображениям соответствующий модуль вынесли в AddOns. При установке Asterisk из репозитария своего дистрибутива достаточно добавить в систему нужный пакет. В Debian/Ubuntu команда для этого проста:
$ sudo apt-get install asterisk-mysql
Затем создаем базу данных и наполняем ее таблицами:
$ mysql -uroot -p
mysql> CREATE DATABASE asterisk;
mysql> GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost \
    IDENTIFIED BY 'astpassw';
Пример для создания таблиц БД можно найти в документации Asterisk в файле cdr_mysql.txt (в Ubuntu он лежит в/usr/share/doc/asterisk-mysql, также ты найдешь его на диске).
Подключаем вывод CDR в MySQL, указав параметры подключения к серверу и базе данных «asterisk»:
$ sudo nano /etc/asterisk/cdr_mysql.conf
[global]
hostname=localhost
dbname=asterisk
table=cdr
password=astpassw
user=asteriskcdruser
port=3306
sock=/tmp/mysql.sock
Теперь загрузим нужный модуль через консоль Asterisk:
$ asterisk -r
CLI> module load cdr_addon_mysql.so
В случае правильных настроек увидим запись о загрузке модуля и подключении к БД, просмотреть его состояние можно при помощи команды «cdr mysql status». Чтобы модуль загружался автоматически после рестарта Asterisk, добавим в/etc/asterisk/modules.conf строку:
load = cdr_addon_mysql.so
Все, теперь ведется протоколирование звонков, и можно управлять выборкой по своему усмотрению. Чтобы дать задание MySQL, следует использовать в диалплане одноименную команду. Примерно, так:
$ sudo nano /etc/asterisk/extensions.conf
; Подключаемся к базе данных
exten => _X.,1,MYSQL(Connect connid localhost asterisk astpassw asterisk)
; Суммируем все звонки, произведенные абонентом (в billsec они хранятся в секундах),
результат запроса сохраняется в переменной ${resultid}
exten => _X.,2,MYSQL(Query resultid ${connid} SELECT SUM(billsec) FROM cdr WHERE \
    src=\'${CALLERID(num)}\')
; Сохраняем результат в billing, в found будет 1, если запрос возвратил результат
exten => _X.,3,MYSQL(Fetch found ${resultid} billing)
; Очищаем переменную
exten => _X.,4,,MYSQL(Clear ${resultid})
; Проверяем, выполнен ли запрос, если нет - выходим
exten => _X.,5,GotoIf($["${found}" = "1"]?true:false)
; Проверяем количество времени и, если оно меньше определенного значения,
; разрешаем позвонить
exten => _X.,6,GotoIf($["${billing}" < "время"]?call:end)
exten => _X.,7,n(call),Dial(звоним)
exten => _X.,8,,MYSQL(Clear ${resultid})
exten => _X.,9,n,Hangup()
exten => _X.10,n(false),Playback(end)
exten => _X.1,n,Hangup()
; Обязательно отключаемся от БД, иначе процесс будет висеть в памяти,
; и быстро исчерпается лимит подключений к MySQL
exten => h,1,MYSQL(Disconnect ${connid})
Формат данных можно посмотреть, выполнив SQL запрос. Скажем, для номера 123:
SELECT SUM(billsec) FROM `asterisk`.`cdr` WHERE src='123'
Пример, конечно, самый простой, SQL запрос в более сложном биллинге будет содержать большее количество полей. Кроме этого, для хранения промежуточных результатов лучше использовать дополнительные таблицы. Вариантов достаточно много, но главное — понять процесс. За основу своей системы можно взять существующие системы биллинга. Чтобы не включать SQL запросы в экстеншен, проще записать их в AGI скрипт, который и выполнять в случае необходимости.
Также не забываем о специальных анализаторах CDR записей. Например, Asterisk Queue/CDR Log Analyzer или Asterisk-Stat.
Увеличить
Рис. 4. Анализ CDR записей в Asterisk Queue/CDR Log Analyzer

Экономия на телефонах
Asterisk позволяет программно эмулировать функции, доступные в более дорогих моделях телефонов. За счет этого можно немного сэкономить при покупке аппаратов, а если ими уже завален офис, то сделать работу пользователей удобнее. Например, чтобы не мучать сотрудников компании запоминанием длинных номеров, используют сокращенный набор (speed dial), то есть назначают длинному и, как правило, часто используемому номеру, короткую комбинацию из 2-3 цифр. Примерно, так:
exten => *01,1,Dial(SIP/нужный_номер@${TRUNK},20)
Кстати, многие софтофоны поддерживают буквенный набор:
exten => lenok,1,Dial(SIP/server2/79101234567,20)
Теперь такая ситуация. Кто-то позвонил, но менеджер не успел поднять трубку, клиент может остаться недовольным и набрать шефа, которому сказать все, что он думает о работе сервиса. Телефон с АОН или софтофон позволяет увидеть номер звонившего и набрать его (recall), простые же аппараты часто лишены такой функции. Используя возможность записи в базу Asterisk из диалплана, легко реализовать это самому.
Для примера обеспечим возможность вызова последнего звонившего абонента комбинацией «*22″, или организуем ему Callback при нажатии «*21″.
$ sudo nano /etc/asterisk/extensions.conf
[IncomingCall]
; Запоминаем номер звонившего
exten => _5XX,1,Set(_To=${EXTEN})
exten => _5XX,n,Set(_From=${CALLERID(num)})
; Сохраняем номер для быстрого вызова комбинацией *22
exten => _5XX,n,Set(DB(${To}/LastCaller)=${From})
; Сохраняем для вызова *21
exten => _5XX,n,Set(DB(${From}/LastCalled)=${To})
; Звоним
exten => _5XX,n,Dial(SIP/${EXTEN},20)
exten => _5XX,n,Hangup()
; По *22 услышим номер, после чего звоним
exten => *22,1,Set(tmp=${DB(${CALLERID(num)}/LastCaller})
exten => *22,n,SayDigits(${tmp})
exten => *22,n,Dial(${tmp},1)
; Теперь номер *21
exten => *21,1,Set(tmp=${DB(${CALLERID(num)}/LastCalled)})
exten => *21,n,SayDigits(${tmp})
exten => *21,n,Set(DB(${tmp}/CallBack)=${CALLERID(num)})
exten => *21,n,Hangup()
А вот так можно реализовать возможность повторного набора номера последнего вызванного абонента (т.е. re-dial):
[default]
include => macro-recall

exten => _X.,1,Macro(recall,${EXTEN})
exten => *0,1,DBget(toCall=redial/${CALLERID})
exten => *0,2,Macro(recall,${toCall})
exten => *0,102,Hangup()

[macro-recall]
exten => s,1,DBput(redial/${CALLERID}=${ARG1})
exten => s,1,Dial(SIP/${ARG1},20)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(u${ARG1})
exten => s-BUSY,1,Voicemail(b${ARG1})
exten => _s-.,1,Goto(s-NOANSWER,1)
Примеры, конечно, несколько упрощены, но главное понять суть и возможности Asterisk.
Не забываем о функциях парковки вызова (Call Parking), перехвата вызова другому абоненту (Call Pickup), которые поддерживаются в стандартной инсталляции Asterisk. Экстеншен для Call Parking можно узнать, просмотрев значения parkext иparkpos в файле features.conf:
[general]
; Экстеншен для парковки
parkext => 700
; Слоты для парковки
parkpos => 701-720
Причем парковку вызова можно использовать и не по прямому назначению, например, для постановки звонка на удержание (Сall hold) для короткой консультации с другим специалистом. Для вызова Call Pickup обычно используется комбинация «*8″.
Увеличить
Рис. 5. Смотрим возможности Asterisk

Экономим на факс-сервере
Казалось бы, чего проще — отсканировать документ и отправить по e-mail, ан нет, факсимильная связь жива, и, судя по всему, жить будет еще долго. Причины банальны: распространенность оборудования, доступность линий связи и сложившиеся привычки. Поэтому приходится подстраиваться. Для передачи факса по IP-сетям (FoIP, Fax over IP) используются две технологии: Т.37 и T.38. Первая определяет формат данных и процесс передачи сообщения посредством e-mail с предварительным его сохранением. Второй стандарт описывает процесс передачи факса в реальном времени. Технология T.38 интересует нас сегодня в большей степени.
Передача факса по VoIP-сетям не такая уж и простая задача, как кажется на первый взгляд: кодеки, адаптированные для работы с голосом, и функции подавления шумов искажают сигнал факса, а задержки, характерные для IP-сетей, не дают возможности нормально принять сигнал (аппараты просто не адаптированы для этого). В рекомендациях к Т.38 сказано, что можно использовать как UDP, так и TCP протокол. Однако во избежание издержек чаще применяют именно UDP, компенсируя возможные потери введением избыточности. В качестве кодека при передаче по VoIP настоятельно рекомендуется использовать G.711.
В Asterisk поддержка Т.38 появилась далеко не сразу: вначале были доступны отдельные патчи, затем некоторые функции были включены в исходный код. В результате Asterisk 1.4.20.1 поддерживает только прозрачные T.38 сессии на SIP каналах. Поэтому до недавнего времени были популярны следующие варианты реализации: использование модулей RxFAX/TxFAX, их аналог SendFAX/ReceiveFAX (оба используют SpanDSP) или HylaFax + iaxmodem (как вариант Т.37). Затем в asterisk-addons был добавлен код для работы с библиотекой SpanDSP, позволяющей отправлять и получать факсы по G711 каналу. А уже с 1.6.0 код для работы с библиотекой SpanDSP был включен в основную ветку (реализовано посредством модуля app_fax). Правда, первое время его использование вызывало множество ошибок, но большую часть из них разработчики устранили в версии 1.6.2. Помимо этого, был перепроектирован сам процесс установления связи по T.38, и в результате Asterisk может получать и принимать факсы по G711 и T.38. В начале апреля 2009 компания Digium представила модули Fax For Asterisk(res_fax и res_fax_digium), которые позволяют работать с факсами как через телефонную линию, так и по IP-сети. Подключение к одной факсовой линии бесплатно, за дополнительные линии нужно платить (каждая лицензия по $38.50). К версии 1.8 планируется полностью перевести Asterisk на Fax For Asterisk (код которого в настоящее время открыт), заменив тем самым модуль app_fax. Как видишь, сегодня вариантов реализации несколько, что уже вызывает путаницу.
Рассмотрим то, что идет в стандартной поставке. В репозитариях дистрибутивов, вероятно, уже имеется модуль для работы с факсом, но чтобы свести к минимуму количество возможных ошибок, лучше использовать последнюю версию Asterisk и SpanDSP. Последний ставится обычным образом (потребуется libtiff), затем нужно собрать Asterisk с параметром «—with-spandsp«. На этапе «make menuselect» можно просмотреть наличие модуля app_fax (в Applications). После установки смотрим список приложений:
$ sudo asterisk -r
CLI>core show applications like fax
ReceiveFAX: Receive a FAX
SendFAX: Send a FAX
Переходим к настройке.
$ sudo nano /etc/asterisk/sip.conf
[general]
t38pt_udptl = yes
Теперь пишем экстеншены:
$ sudo nano /etc/asterisk/extensions.conf
exten => _5,n,Dial(${TRUNK_SIP}/ххх,120,M(sendfax))
; Отправка
[macro-sendfax]
exten => _X.,1,Set(FAXFILE=//var/spool/asterisk/fax/fax)
exten => _X.,n,SendFAX(${FAXFILE}.tif)
exten => _X.,n,Hangup
; Прием
[macro-receivefax]
exten => _X.,1,Answer()
exten => _X.,n,Wait(3)
exten => _X.,n,ReceiveFAX(faxfilename)
Все, миссия выполнена, Asterisk научился работать с факсами.
Увеличить
Рис. 6. Команда «make menuselect» покажет наличие app_fax

Заключение
Как видишь, немного отойдя от стандартной схемы использования Asterisk, можно сделать много чего полезного и интересного, в том числе, и с финансовой точки зрения. Конечно, придется некоторое время экспериментировать и подбирать наиболее оптимальные настройки, но затем дирекция будет в восторге.
Увеличить
Рис. 7. Интерфейс FreePBX позволяет настроить большинство параметров Asterisk в удобной форме

Врезка: Продаю Украину, Белоруссию, Казахстан
Еще один вариант заработка: можно продавать свободные телефонные линии на разные направления. Допустим, центральный офис компании находится в России (Москве), а дилерские отделы на Украине, в Белоруссии и Казахстане. В каждом филиале, естественно, есть телефонные линии местных операторов. Админ центрального офиса может продавать знакомым звонки в эти страны по дешевым тарифам. «Знакомый» регистрируется на Asterisk и звонит через VoIP-сеть по предоставленным направлениям. Для конторы это будут местные звонки, которые не тарифицируются, а админу лишняя копеечка.

Врезка: Лимитируем пустые разговоры
Если мы знаем, что секретарша любит за счет конторы потрепаться со своей подругой из Владивостока (телефонный код 4232), при вызове набираем номер подружки (допустим, 102030), но ограничиваем продолжительность звонка десятью минутами (600000 мс), предупреждаем вызывающего абонента (секретутку) о разрыве соединения через 5 минут (300000 мс) и повторяем оповещение каждую минуту (60000 мс):
exten => _84232102030,1,Dial(SIP/8${EXTEN}@${OUTGOING},,L[600000:300000:60000])

Врезка: Управление компьютером при помощи Asterisk
Использование в диалплане функции System() открывает поистине широкие возможности по управлению любым сервером с помощью телефона. Процесс прост – набираем номер, затем пароль, и Asterisk выполняет заранее определенную команду. Например, очень просто реализовать «красную кнопку», полностью удаляющую данные с харда (работодатели, ведущие черные и серые зарплаты, будут тебе очень признательны ;-). Программ для «очистки» диска в интернете можно найти невероятное количество. А линуксовая утилита winexe позволяет удаленно выполнять команды в Windows NT/2k/XP/2k3. Ставим ее в Linux систему, на которой работает Asterisk, и создаем простенький диалплан:
exten => s,n,Read(auth||4||1|5)
exten => s,n,GotoIf($["${auth}" = "000"]?yes:no) ; пароль
exten => s,n(yes),System(winexe -U /% // "c:\script.bat" \
    >>/var/log/asterisk/win.log)
exten => s,n(no),Hangup()
Теперь на удаленном хосте будут выполнены все команды, описанные в файле script.bat.

Боковые выносы
INFO
  • Еще одним вариантом создания call файла является использование AMI (Asterisk Manager Interface) — интерфейса управления Asterisk. Для этого достаточно послать все необходимые команды в 5038 порт.
  • О настройке биллинговой системы AstBill читай в статье «Звездные счета», опубликованной в февральском номере ][ за 2008 год.
WWW
Статья опубликована в мартовском номере журнала «Xakep» за 2010 год.