Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #107, НОЯБРЬ 2007 г.

Строим телефонную сеть

Сергей «grinder» Яремчук

Хакер, номер #107, стр. 107-152-1

(grinder@ua.fm)

Asterisk: самый популярный сервер IP-телефонии

Несмотря на развитие различных систем обмена информацией, таких как электронная почта и службы мгновенного обмена сообщениями, обычный телефон еще долго будет оставаться самым популярным средством связи. Ключевым событием в истории телекоммуникаций и интернета стало появление технологии передачи голоса поверх IP-сетей, поэтому за последние годы изменилось само понятие телефона. Использование VoIP современно, удобно, дешево, так как можно объединить удаленные офисы, даже не прибегая к услугам операторов телефонной связи. Какие еще доводы нужны для того, чтобы поднять свой сервер IP-телефонии?

Проект Asterisk

По адресу en.wikipedia.org/wiki/List_of_SIP_software находится один из самых больших списков серверов и клиентов SIP (протокол установления сессии для работы пользовательских сеансов, включающих передачу видеоданных и голоса). В этом списке 10 серверов, распространяемых под свободной лицензией, но администраторы чаще всего предпочитают Asterisk IP-PBX (www.asterisk.org). Этот проект возник, можно сказать, случайно - его создатель Марк Спенсер (Mark Spencer, кстати, Gaim/Pidgin тоже его рук дело) не имел достаточно денег, чтобы купить для своей компании обычную АТС, и потому вынужден был создавать его софтовую реализацию. Открытость кода способствовала быстрому росту популярности нового продукта как среди разработчиков, так и среди потребителей. Выпускается Asterisk под двойной лицензией. Кроме GNU GPL возможно создание закрытых модулей, содержащих проприетарный код. Такой подход позволяет включить поддержку закрытых кодеков и оборудования.

Несмотря на свою софтовость, Asterisk обладает всеми функциями классической АТС, и даже больше. Вот только некоторые из них: центр обработки вызовов, голосовая почта, возможность проведения конференций, что в итоге делает его мощной и легкорасширяемой платформой для создания телекоммуникационного сервиса любого масштаба. Поддерживаются практически все популярные протоколы IP-телефонии (SIP, H.323, MGCP, Skinny/SCCP, Google Talk, Skype), собственный IAX и некоторые другие для работы видео и факса. Кроме обслуживания локальных клиентов Asterisk умеет передавать голосовой трафик между серверами. Есть модули для сопряжения с аналоговыми (FXO/FXS) и цифровыми (Т1/E1) линиями.

Если функциональности недостаточно, для написания диалплана норма можно воспользоваться собственным языком Asterisk, создать модуль на Cи либо использовать универсальный интерфейс интеграции с внешними системами обработки данных AGI. Чтобы упростить разработку модулей, предназначенных для решения различных задач, предложено несколько уровней API (channel, application, codec, file format). Поэтому новые возможности (например, кодеки) появляются в Asterisk очень быстро и их внедрение проходит безболезненно. Кроме этого, модульность Asterisk позволяет администраторам подключать только необходимые функции, модифицируя систему под свои нужды. Сервер Asterisk можно установить на компьютерах, работающих под управлением GNU/Linux, Free/Net/OpenBSD, Mac OS X/Darwin, Open/Solaris. Клиенты доступны практически для всех систем, в том числе и Windows. Исключение составляют драйверы Zaptel и ISDN-устройств, реализации которых пока есть не для всех платформ.

Установка Asterisk

К сожалению, четких указаний насчет аппаратных средств дать невозможно - слишком много тонкостей и нюансов, поэтому за примерными конфигурациями компьютеров отсылаю на страницу сайта voip.rus.net «Производительность Asterisk-систем» (voip.rus.net/tiki-index.php?page=Asterisk+dimensioning). Если твоя цель - знакомство с Asterisk, можно использовать один из дистрибутивов, в которых уже имеется настроенный и полностью готовый к работе сервер: AsteriskNow (www.asterisknow.org), Trixbox (www.trixbox.org), VoIPonCD (www.voiponcd.com).

Asterisk присутствует в репозитариях пакетов большинства дистрибутивов. Так, в Ubuntu команда sudo apt-cache search asterisk выдает приличный список пакетов, после установки которых сразу же можно приступать к настройке. Но установка из репозитария имеет один минус - как правило, в нем версия Asterisk прилично отстает от текущей, которую можно скачать с официального сайта. Поэтому рассмотрим универсальный способ установки на примере того же Ubuntu, хотя все сказанное (за редким исключением) относится и к остальным дистрибутивам.

Устанавливаем пакеты, необходимые для компиляции:

$ sudo apt-get install build-essential automake autoconf bison flex libtool libncurses5-dev libssl-dev

Кроме того, настоятельно рекомендуется установить библиотеку libpri, даже если не нужна поддержка Primary Rate ISDN (первичный тип цифровой сети с интеграцией услуг). Это можно сделать либо через репозитарий: sudo apt-get install libpri1.2, либо используя исходные тексты:

$ wget -c downloads.digium.com/pub/libpri/libpri-1.4-current.tar.gz

Компиляция библиотеки стандартна, поэтому не будем на этом останавливаться.

Теперь скачиваем с сайта исходные тексты Asterisk и конфигурируем:

$ wget -c downloads.digium.com/pub/asterisk/asterisk-1.4.11.tar.gz

$ tar xzvf asterisk-1.4.11.tar.gz

$ cd asterisk-1.4.11

$ ./configure --prefix=/usr

По окончании работы скрипта в консоли мы увидим эмблему проекта и некоторую информацию о настройках.

$ make

$ sudo make install

Примечание: если производится установка версии 1.2, то для поддержки формата mp3 перед командой make следует ввести «make mpg123», версия 1.4 уже никак не реагирует на эту команду.

После компиляции, помимо всего прочего, будут установлены следующие исполняемые файлы:

  1. /usr/sbin/asterisk - демон сервера Asterisk, который и обеспечивает всю работу;
  2. /usr/sbin/safe_asterisk - скрипт для запуска, перезапуска и проверки работы сервера Asterisk;
  3. /usr/sbin/astgenkey – скрипт для создания закрытого и публичного RSA ключей в формате PEM, которые необходимы для работы Asterisk.

Чтобы установить шаблоны конфигурационных файлов и документацию, набираем:

$ sudo make samples

Примеры конфигурационных файлов будут скопированы в /etc/asterisk. Если в этом каталоге уже находятся файлы конфигурации, они будут переименованы с префиксом «.old». Для сборки документации потребуется пакет doxygen, если его нет, устанавливаем:

$ sudo apt-get install doxygen

$ sudo make progdocs

Аналогично ставим и пакет с расширениями asterisk-addons (этот шаг не обязательный, его можно смело пропустить). Многие модули, входящие в состав этого набора, являются экспериментальными. Их стоит устанавливать, только если требуется запись информации в БД, поддержка mp3-файлов и протокола ooh323c (Objective Systems Open H.323 for C):

$ wget -c downloads.digium.com/pub/asterisk/asterisk-addons-1.4.2.tar.gz

$ tar xzvf asterisk-addons-1.4.2.tar.gz

$ cd asterisk-addons-1.4.2

$ ./configure; make; sudo make install; sudo make samples

Установка Asterisk закончена. Сначала рекомендуется запустить сервер в отладочном режиме и просмотреть вывод на наличие ошибок:

$ sudo /usr/sbin/asterisk -vvvgc

Если получаем сообщение «Asterisk Ready» и приглашение консоли управления, значит все в порядке. Выходим:

*CLI> stop now

Теперь можно переходить к дальнейшей настройке.

Настройка поддержки интерфейсных карт

Если планируется подключение сервера Asterisk с помощью специальных интерфейсных плат к обычным телефонным сетям, следует позаботиться о наличии соответствующих драйверов, реализованных в виде модуля ядра. Но даже если таких устройств в компьютере нет, эти драйверы все равно рекомендуется установить. Дело в том, что во всех Zaptel-устройствах есть таймер, и для полноценной работы сервера IP-телефонии он является необходимым. Но если Zaptel-устройства под рукой нет, для его эмуляции можно использовать специальный драйвер — ztdummy.

Из репозитария устанавливаем пакеты zaptel, zaptel-source и собираем модули под свою систему:

$ sudo apt-get install zaptel zaptel-source

$ sudo module-assistant prepare

$ sudo m-a -t build zaptel

В /usr/src появится пакет zaptel-modules-*_i386.deb, устанавливаем его с помощью dpkg. После этого проверяем работу модулей ядра:

$ sudo depmod -a

$ sudo modprobe ztdummy

И если нужна поддержка устройств:

$ sudo modprobe zaptel

$ sudo modprobe wcfxo

Чтобы обеспечить их автоматическую загрузку, выполняем следующую команду:

$ echo 'ztdummynzaptelnwcfxo' >> /etc/modules

Создаем правила для UDEV:

$ sudo mcedit /etc/udev/rules.d/51-zaptel.rules

KERNEL="zapctl", NAME="zap/ctl"

KERNEL="zaptimer", NAME="zap/timer"

KERNEL="zapchannel", NAME="zap/channel"

KERNEL="zappseudo", NAME="zap/pseudo"

KERNEL="zap0-9*", NAME="zap/%n"

Также можно использовать исходные тексты или CVS-версию драйвера. При самостоятельной компиляции понадобятся заголовочные файлы ядра (или исходные тексты):

$ sudo apt-get install linux-headers-`uname -r`

Создадим символическую ссылку, чтобы Asterisk нашел исходники ядра:

$ sudo ln -s /usr/src/linux-headers-2.6.20-15-generic /usr/src/linux-2.6

Теперь получаем последнюю версию драйверов:

$ cd /usr/src

$ wget -c downloads.digium.com/pub/zaptel/zaptel-1.4-current.tar.gz

Компилируем и устанавливаем:

$ tar xzvf zaptel-1.4-current.tar.gz

$ cd /usr/src/zaptel-1.2.17.1

$ ./configure

$ make

$ sudo make install

И чтобы вручную не создавать конфигурационные файлы:

$ sudo make config

После этой команды будет создан скрипт для автоматического запуска модулей, входящих в состав Zaptel, и конфиг /etc/default/zaptel (или /etc/sysconfig/zaptel), в котором будет указано, какие модули необходимо загружать. Рекомендую в этом файле оставить только необходимое. Пробуем загрузить модуль:

$ sudo modprobe ztdummy

$ lsmod | grep ztdummy

ztdummy 6184 0

zaptel 189860 1 ztdummy

Все нормально. После установки в системе появятся еще два файла:

  1. /etc/zaptel.conf – описывает конфигурацию аппаратного обеспечения;
  2. /etc/asterisk/zapata.conf - настройки сервера Asterisk для работы драйвера Zap-канала.

Подробные указания для всевозможных устройств даны в документации. На русском по этому поводу можно почитать в документе «Конфигурация драйвера ядра Zaptel» (voip.rus.net/tiki-index.php?page=Asterisk+config+zaptel.conf). Но на этом не останавливаемся, впереди у нас еще много работы. После настройки проверяем работу командой ztcfg -vv.

Регистрация пользователей

Если теперь посмотреть в каталог /etc/asterisk, можно обнаружить большое количество файлов. Но размер журнальной статьи позволит нам познакомиться только с некоторыми из них. Так, в asterisk.conf указаны каталоги, которые будет задействовать Asterisk во время работы, расположение и владелец сокета, используемого для подключения удаленной консоли управления, а также дефолтные параметры запуска сервера. Некоторые каталоги во время установки не создаются, это придется сделать вручную:

$ sudo mkdir -p /var/{run,log,spool}/asterisk

$ sudo adduser --system –-no-create-home asterisk

$ sudo addgroup --system asterisk

Добавим пользователя asterisk в группу audio:

$ sudo adduser asterisk audio

$ sudo chown asterisk:asterisk /var/run/asterisk

$ sudo chown -R asterisk:asterisk /var/{log,spool}/asterisk

Дальше нас интересует файл sip.conf, где определяются серверы и клиенты SIP, с которыми будет дружить наш Asterisk. Каждый из них представлен в файле отдельным блоком, который начинается с оглавления, заключенного в квадратные скобки. Параметров в sip.conf довольно много, ограничимся лишь добавлением SIP-аккаунта:

$ sudo mcedit /etc/asterisk/sip.conf

[grinder]

type=friend

host=dynamic

; defaultip=192.168.1.200

username=grinder

secret=password

language=ru

nat=no

canreinvite=no

context=office

callerid=grinder <1234>

mailbox=1234@office

; перед использованием параметра allow следует отключить все кодеки

disallow=all

; порядок следования кодеков не имеет значения

allow=ulaw

allow=alaw

Поле type указывает, что может делать этот клиент. При значении user ему будет разрешено только принимать входящие звонки, при peer он сможет только звонить, а friend означает все действия сразу, то есть user+peer. В поле host указывается IP-адрес, с которого разрешено подключение этого клиента. Если он может подключаться с любого адреса, указываем host=dynamic. А чтобы в этом случае вызвать клиента, когда он еще не зарегистрирован, в defaultip следует записать IP-адрес, по которому его всегда можно будет найти. В username и secret указываем логин и пароль, используемые клиентом при подключении. Параметр Language задает код языка приветствий и специфичные настройки сигналов телефонов, которые определены в файле indications.conf. При работе клиента за NAT'ом в соответствующем поле необходимо установить значение yes. Отключение canreinvite заставляет весь голосовой RTP-трафик проходить через Asterisk. Если клиенты поддерживают SIP re-invites, им можно разрешить соединяться напрямую, указав canreinvite=yes. Поле сontext определяет план набора, в который попадают вызовы, поступающие от этого клиента, а callerid - строку, которая будет выводиться при звонке от клиента. По умолчанию используется контекст default, который берет все настройки из контекста demo. Последний предназначен исключительно для демонстрационных целей, в рабочей системе необходимо создать свой контекст. Поле mailbox указывает на голосовой ящик 1234 в контексте office. Остальные клиенты настраиваются аналогично.

После определения SIP-аккаунтов наши клиенты могут регистрироваться на сервере Asterisk и совершать исходящие вызовы. Чтобы у них была возможность принимать звонки, следует обратиться к файлу extensions.conf, в котором описывается план набора (Dialplan), распределяющий звонки в системе. Здесь же указываются все разрешенные расширения.

$ sudo mcedit /etc/asterisk/extensions.conf

[office]

include => default

exten => 1234,1,Dial(SIP/grinder,20)

exten => 1234,2,Voicemail(grinder)

Здесь все просто. За пользователем grinder закрепляем номер 1234, и, если он не ответит на звонок, ему можно будет оставить сообщение в голосовой почте. Цифра после номера означает приоритет, который определяет последовательность выполнения задач. Теперь, если Asterisk запущен, следует подключиться к его консоли, выполнив на той же машине asterisk -r, и с помощью команды reload заставить его перечитать конфигурационные файлы. Есть и команды для перезагрузки конкретного файла. Например, план набора перечитывается командой extensions reload.

Сервер готов к приему клиентов. По адресу www.asteriskguru.com/tutorials/configuration_asterisk_softphone.html выбираем себе софт-клиент и пробуем соединиться. Мне, например, нравится бесплатная версия простой и понятной в использовании программы ZoIPer (ранее Idefisk, www.zoiper.com/free.php). Есть версии для Linux, Windows и Mac OS X. Еще один неплохой и также мультиплатформенный клиент - X-Lite (www.xten.com).

Если все нормально, в консоли должно появиться сообщение вроде «Registered SIP 'grinder' at 192.168.0.1 port 5060», набираем номер и звоним.

Мы настроили Asterisk в минимальной конфигурации, но это далеко не все, что он может. За кадром осталось подключение к другому серверу IP-телефонии, парковка вызова, музыка во время ожидания, биллинг, использование GUI для администрирования сервера и прочее, но мы постараемся восполнить эти пробелы в следующих статьях.

Проект CallWeaver

Чтобы избежать проблем с двойным лицензированием, был создан форк Asterisk, названный CallWeaver (www.callweaver.org/blog). Правда, он обладает меньшей функциональностью, но поддерживает большое количество протоколов и работу по аналоговым и цифровым каналам. Разработчики отказались от ztdummy, однако теперь ядро должно быть собрано с Timer Frequency 1000 HZ. Чтобы в Ubuntu самому не пересобирать ядро, достаточно установить пакет linux-lowlatency (за подробностями обращайся к статье «Наперегонки со временем» из рубрики Unixoid – прим. редактора).

Содержание
ttfb: 7.9801082611084 ms