eng

Проект Ферзух (versuch - попытка. нем.) представляет собой H323 прокси с опциональным проксирования медиа потока. Иногда такое программное обеспечение называют програмным коммутатором. Ферзух позволяет как концентировать так и коммутировать VoIP потоки, и транслировать их между сетями разных операторов. Причем возможно подключение как отдельных H323 оконечных или транзитных устройств, так и целых сетей с выделенным номерным планом.
Исторически проект родился из необходимости контроля VoIP трафика в локальной сети примерно в 2003 году. В начальном варианте ядра использовались части кода из проекта Романа Свирского OpenH323Proxy. Развите проекта происходило в акцентом на повышение производительности при внешнем управлении ядром. На данный момент использованине библиотеки PWLib сведено только к использованию в составе собственно стека OpenH323.

Техническое особенности:
Маршрутизация звонков на основе Called / Calling номеров, тех префиксов. Возможно использование внешнего route-сервера.
Использование Perl-регулярных выраженй для трансляций номеров.
Возможность выбора альтернативных маршрутов.
Ограничение по количеству одновременных звонков на каждый шлюз.
Авторизация/аутентификация по E164, локальных ACL, IP вызывающего шлюза, Radius сервер.
Поддрежка H323 v1 и v2. Частичная поддержка v3.
Возможность трансляции номеров (Perl выражениями или внешним route-сервером).
Проксирование RTP/RTCP (отключаемо), H225, H245 трафика между устройствами.
Сбор статистики: в CDR файлы расширенного формата, Radius accounting (Cisco like), ведение протокола работы с заданием уровня отладки.
Базовое конфигурирование через текстовые файлы.
Возможность управления и мониторинга черз стандартную telnet консоль, с дальнейшим выводом данных мониторинга на Web и тд.
Изменение конфигураций без прерывания сервиса.

Установка:

Требования:
Система: FreeBSD после 5.0, Linux после 2.6
Библиотеки:
OpenH 323 & PWLib . Рекомендуется взять последние stable с www.voxgratia.org
pcre++/pcre. Рекомендуется последние. На данный момент доступны pcre-6.7 & pcre++-0.95

Сборка (для релиза 1.0.2):
Чтобы собрать проект необходимо выполнить стандартную GNU последовательность:
./configure
make (gmake для FreeBSD)
make install (gmake install)

Пользователям FreeBSD проще сразу поставить versuch из портов со всеми зависимостями.

Для сборки проекта с отладочной информацией необходимо выполнить make debug.
./configure --help - выводит возможные ключи конфигурирования.
В каталоге scripts/ лежат тривиальные файлы для запуска и мониторинга демона versuch.

Настройка:
Все файлы, необходимые для настройки находятся в каталоге установки (по умолчанию - ${INSTALLPREFIX}/versuch), или в текущем.
Пустые строки и строки начинающиеся с "#" игнорируются. В случае неправильного написания параметра значение ставится по умолчанию, но никакой ошибки не выводится.

Основной файл конфигурации versuch.ini:

Секция [main]: общие параметры
ID Идентификатор прокси. Фигурирует в запросах на авторизацию и аккаунтинг к Radius-серверу и в статистике в текстовых файлах. Служит для разделения данных в случае обработки данных с разных прокси. По умолчанию - пустая строка.
LocalAddress Адрес привязки сигнального канала. Может быть актуально в случае наличия на сервере нескольких сетевых интерфейсов. По умолчанию "*", что означает привязку ко всем IP адресам сервера.
Диапазоны портов:
Q931PortRange Диапазон портов для исходящих сигнальных соединений. По умолчанию: 10000-59000
H245PortRange Диапазон портов для исходящих соединений управления каналом. По умолчанию: 10000-59000
RTPPortRange Диапазон портов для исходящих медиа потоков. По умолчанию: 10000-59000
 
StatusPort Номер порта для привязки управляещего соединения для telnet. По умолчанию: 2016
IncomingTranslateCalled Список правил для трансляции CalledPartyNumber для всех входящих звонков. По умолчанию пуст.
В качестве правил трансляции используются Perl-регулярные выражения с некоторыми ограничениями, вызванными использованием библиотеки pcre/pcre++.
Пример трансляции в E164 звонков из Москвы:
IncomingTranslateCalled=/^810//
IncomingTranslateCalled=/^8(1|2|3|4|5|6|7|8|9)/7$1/
IncomingTranslateCalled=/^(.......)$/7495$1/
DefaultMinDigits Минимальное количество цифр в CalledPartyNumber для всех звонков. По умолчанию: 0 - без ограничений.
BlockG711 Блокировка G711-го кодека в управляющих H245 сообщениях. По умолчанию - no. Данная функция не отработана в случае с FastStart.
GatewaysConfig Имя файла с описанием голосовых шлюзов с которыми работает versuch. По умолчанию - gateways.cfg
BlockRoutingCauses Список кодов Q931 при которых прекращается перебор возможных путей дозвона. По умолчанию - пуст.
К примеру строчка BlockRoutingCauses=17,19 вызовет остановку перебора маршрута при "Busy" или "No answer".
DebugSourceHost IP адрес хоста, для звонков с которого выполняется низкоуровневая отладка пакетов. По умолчанию - 0.0.0.0 (надеюсь ни один роутер такой адрес не пропустит :-) )
Будте осторожны при использовании данной фукции - ее включение сильно замедляет работу прокси. К тому же в библиотеке pwlib есть ошибка, при которой происходит утечка ресурсов в случае вывода содержимого полей сообщений H323.

Секция [Accounting] : параметры сбора статистики звонков
type Режим статистики, возможны: log, radius, both или none. По умолчанию - none.
radiushost IP адрес Radius сервера для статистики. По умолчанию - 127.0.0.1.
port Номер порта Radius сервера для статистики. По умолчанию - 1813.
secret Ключ для записи статистики в Radius сервер. По умолчанию - пустая строка.
vsaprefix Префикс, добавляемый к VSA-атрибутам в RadAcct запросах. Служит для совместимости. По умолчанию - пустая строка.
logfile Путь и название текстового файла для логов. По умолчанию - /dev/null.
logrotatetime Время в минутах для "ротации" логов. По умолчанию - 60 (каждый час).
logumask Маска для новых файлов в процессе ротации логов. По умолчанию - 0600.
Режимы сбора статистики:
radmode Возможные значения: 1 или 2. По умолчанию - 2.
В режиме "1" на каждый звонок генерируется одна запись с указание входящих и исходящих парметров звонка (транзитный режим)
В режиме "2" на каждый звонок генерируется по записи как для входящих, так и исходящих данных (режим Cisco)
radstoponly В случае указания "yes" запись начала звонка не генерируется. По умолчанию - no.

Секция [Auth] : параметры для авторизации и аутентификации звонков
type Тип статистики, возможны: radius или text. По умолчанию - text.
В случае режима "text" используется diap-peer-ы для направления звонков.
В случае режима "radius" запрашивается аутентификация и направления для звонка у Radius сервера.
radiushost IP адрес Radius сервера для авторизации. По умолчанию - 127.0.0.1.
port Номер порта Radius сервера для авторизации. По умолчанию - 1812.
secret Ключ для запросов на Radius сервер. По умолчанию - пустая строка.
vsaprefix Префикс, добавляемый к VSA-атрибутам в RadAcct запросах. Служит для совместимости. По умолчанию - пустая строка.
peerfile Имя файла с описание dial-peer-ов. По умолчанию - peers.cfg.


Файл описания шлюзов gateways.cfg

Данный файл содержит описания шлюзов, на которые будет звонить versuch. Он является необходимым как для случая Radius авторизации, так и маршрутизации посредством dial-peer-ов.
Описание шлюза начинается с произвольного названия в квадратных скобках до конца файла или следующего указания шлюза в квадратных скобках.
Остальные поля описания шлюза состоят из пар название=значение.
[gateway_name] Произвольное название шлюза. По нему будет идиентифицироватся направление звонка в Radius ответе или dial-peer-е.
Address IP адрес шлюза
Capacity Количество единовременных звонков, которые может принять шлюз.
Defer Сообщение Q931, получение которого с целевого шлюза задерживается от пересылки на исходный шлюз до момента Connect.
Данная опция необходима в случае нестандартного поведения целевого шлюза и избежания неадекватной последовательности пакетов на исходный шлюз. Например некоторые устройства шлют в ответ Alerting сразу же за CallProceeding не взирая на фактическое состояние звонка и в случае пребора нескольких целевых шлюзов исходный может получить несколько Alerting-ов : Defer=Alerting исправит ситуацию.

Файл описания dial-peer-ов peers.cfg

Файл является не нужным в случае аутентификации на стороннем Radius-сервере. Формат файла и описаний dial-peer-ов соотвествует файлу описания шлюзов gateways.cfg. Выбор списка шлюзов для звонка происходит из анализа DestinationPattern для CalledNumber и SourcePattern для CallingNumber соответсвенно, которые анализируются как Perl регулярные выражения. Если совпадение выявлено до направление добавляется в список. На порядок списка влияет только Preference, длина совпадения не анализируется. При обнаружении признака Huntstop список маршрутов отсекается.
[peer_name] Произвольное название dial-peer-а
DestinationPattern Perl регулярное выражение для анализа CalledPartyNumber
SourcePattern Perl регулярное выражение для анализа CallingPartyNumber
Target Название исходящего шлюза из файла описаний шлюзов gateways.cfg
Preference Приоритет сортировки списка маршрутов. Целое число. Чем больше, тем приоритет выше.
HuntStop Признак остановки поиска направления. "0" если не останавливать (значение по умолчанию).
Proxy Признак проксирования медиа потока. "1" если проксируется (значение по умолчанию).
dst_translate Perl регулярное выражение для трансляции CalledPartyNumber
src_translate Perl регулярное выражение для трансляции CallingPartyNumber
dst_bill_translate Выражение для генерации поля DST-NUMBER-BILL в статистике от CalledPartyNumber. Обычно добавляется какой-либо префикс для удобства обработки данных в билинге, например: dst_bill_translate=/^(.+)$/00001#$1/
src_bill_translate Выражение для генерации поля SRC-NUMBER-BILL в статистике от CallingPartyNumber.

Аутентификация и аккунтинг

Аутентификация:
Для управления маршрутизацией и аутентификацией звонков возможно использование Radius-сервера. Так как смысла в только аутентификации без маршрутизации нет, то логичнее назвать такой способ - "управление звонками с помощью внешнего route-сервера". Формат запросов, аналогичный шлюзам Cisco, и избыточность данных в запросе позволяет использовать любой Radius-сервер или специальный route-сервер. В случае с маршрутизацией от route-сервера файл peers.cfg игнорируется. Запрос происходит один раз в момент поступления звонка. Для совместимости с популярными route-серверами в Auth запросе добавлены AV-пары:
request-type=route
routing-request=1
route-retries=1

Route-сервер может принять решение о звонке на основании любых стандартных атрибутов: CalledNumber, CallingNumber, SourceGWIP и тд. В случае ответа от Radius-сервера RAD_ACCESS_ACCEPT в теле ответа ищутся Vendor Specific атрибуты. Пути звонка передаются в формате: имя_шлюза/признак_проксирования/calling_number/called_number/calling_bill_number/called_bill_number Где:
- имя_шлюза из файла описания шлюзов gateways.cfg.
- calling_number и called_number подменяют сооветсвующие значения в сообщениях H323 к целевому шлюзу.
- calling_bill_number и called_bill_number фигурируют только в статистике звонка.
- признак_проксирования - 0 или 1 - отрицательно или положительно соответственно
В случае наличия нескольких возможных путей передаются несколько таких атрибутов в порядке снижения приоритета.

В случае негативного ответа от Radius-сервера то вызывающему шлюзу отправляется сообщение ReleaseComplete с кодом Q931::NoRouteToNetwork и сигнальный канал к шлюзу закрывается. Для передачи дополнительных полей в запросе используются Cisco VSA атрибуты, поэтому на Raidus сервере необходимо выставлять поддрежку Cisco Dictionary.

Сбор статистики:
Аккаунтинг в Radius отличается от такового в текстовые файлы только протоколом персылки и формой хранения. Разницы между информационными элементами как таковой нет. Для совместимости с существующими биллинговыми ситемами информация сохраняется в избыточном виде. Режим сбора статистики настраиватеся в главном конфигурационном файле versuch.ini. Если основной режим прокси это транзит трафика, то обычно отключается генерация стартовой записи статитики (это имеет смысл только для Raidus-режима). Если предоставляется on-line сервис, то поступление информации о начале разговора становится актуальным. Режим сбора статистики Cisco-like реализован для совместимости с билингами уже заточенными под работы с голосовыми шлюзами Cisco и "болезненно" воспринимают получение от NAS-a одной записи отображащей всю информацию относительно транзита звонка. Ниже сокращенно приводится формат записи статитики в режиме транзита удачного звонка:

Mon Oct 30 18:35:57 2006, HOST=testhost, DST-NUMBER-IN=88888888888, SRC-NUMBER-IN=8888888, DST-NUMBER-OUT=88888888888, SRC-NUMBER-OUT=8888888, SRC-NUMBER-BILL=00001#8888888, DST-NUMBER-BILL=00003#88888888888, SRC-IP=77.77.7.77, DST-IP=88.888.888.88, SRC-RTP-IP=77.77.7.77, DST-RTP-IP=88.888.888.88, SRC-USER=77.77.7.77, INITIAL-INCOMING-LOCAL-ADDRESS=99.99.9.9, OUTGOING-LOCAL-ADDRESS=33.33.3.3, SETUP-TIME=18:33:06.000 +0300 Mon Oct 30 2006, CONNECT-TIME=18:33:11.000 +0300 Mon Oct 30 2006, DISCONNECT-TIME=18:35:57.000 +0300 Mon Oct 30 2006, DISCONNECT-CODE-Q931=16, INTERNALCAUSE=CalledNormal, ROUTE-RETRIES=1, SRC-BYTES-IN=230503, DST-BYTES-IN=271033, SRC-BYTES-OUT=271033, DST-BYTES-OUT=230503, SRC-CODEC=g729, DST-CODEC=g729, CALLID=C2F8EDDA676211DB8348C3473A2FCA7B, CONFID=C2F8511A676211DB8346C3473A2FCA7B, PROXY-MODE=1, ELAPSED-TIME=166, SOURCE-FASTSTART=1, DESTINATION-FASTSTART=1, SOURCE-TUNNELLING=0, DESTINATION-TUNNELLING=0
В первом поле идет значение даты когда запись была создана. Остальные поля состоят из пар название=значение. В случае Raidus-аккаунтинга они представляются в виде аттрибутов. Описание полей:
HOST Значение ID из файла versuch.ini
DST-NUMBER-IN и SRC-NUMBER-IN Входящие значения CalledNumber и CallingNumber
DST-NUMBER-OUT и SRC-NUMBER-OUT Исходящие (после трансляций) значения CalledNumber и CallingNumber
SRC-NUMBER-BILL и DST-NUMBER-BILL Информационные поля, вызванные трансляцией. Основное значение - упрощение биллингования.
SRC-IP и DST-IP Адреса входящего и исходящего шлюзов. В данном месте прежде всего имеется в виду сигнальный канал.
SRC-RTP-IP и DST-RTP-IP Адреса входящего и исходящего медиа потоков.
SRC-USER Поле добавлено для совместимости - в данном случае IP адрес шлюза сгенерировавшего звонок.
INITIAL-INCOMING-LOCAL-ADDRESS и
OUTGOING-LOCAL-ADDRESS
Адреса локальных интерфейсов, на который был принят и с которого был сгенерирован звонок.
SETUP-TIME
CONNECT-TIME
DISCONNECT-TIME
Моменты времени прохождения соотвествующих сообщений H225
DISCONNECT-CODE-Q931 Десятичный код завершения разговора.
INTERNALCAUSE Внутрений код завршения разговра
ROUTE-RETRIES Количество попыток прозвона по данному номеру. Каждая неудачная попытка увеличивает значение на еденицу.
SRC-BYTES-IN
DST-BYTES-IN
SRC-BYTES-OUT
DST-BYTES-OUT
Количество байт прошедших через прокси.
SRC-CODEC
DST-CODEC
Выбранные кодеки для медиа потока
CALLID
CONFID
Соотвествующие поля из сигнальных H225 сообщений
PROXY-MODE Признак проксирования медиа потока. 0 если медиа не проксировалось, 1 соотвественно наоборот
ELAPSED-TIME Время разговора. Вычисляется между моментами прохождения сообщений Connect и Release.
SOURCE-FASTSTART
DESTINATION-FASTSTART
SOURCE-TUNNELLING
DESTINATION-TUNNELLING
Признаки особенностей H323 v2

В случае Radius-режима поля, которые не подходят под формулировки стандартных полей (SessionTime, InputOctets и тд.) кодируются с помощью стандрантных Cisco VSA атрибутов. Поэтому, как и в случае с авторизацией, необходимо убедится в поддержке Cisco dictionary на Radius-сервере.


Управление

Управление осуществляется через консоль Telnet. По умолчанию versuch ожидает подключения клиента Telnet на порт 2016. При вводе несуществующего запроса выводится список допустимых команд. К сожалению пока не осталось реализованным автозаполнение. Список возможных команд:
showlist или list Показать список активных звонков. Команда list выводит список звонков с разделителями, что удобно для дальнешей обработки, но неудобно для человека.
reloadconfig Перечитать все файлы конфигурации без прерывания сервиса.
q или Q Закрыть сесию Telnet
counters Выводит итоговую информацию относительно общего количества попыток и звонков, прошедших через versuch. Основное смысл - удобство отрисовки нагрузки в графиках.
uptime Выводит время работы демона в секундах. Необходимо в некоторых случаях прорисовок на графических диаграммах.
details:CallRef Где CallRef соотвествующее поле (Q931 CallReference) из спиcка звонков. Выводит всю информацию относительно указанного звонка.
kill:CallRef Где CallRef соотвествующее поле (Q931 CallReference) из спиcка звонков. Обрыв соотвествующего звонка.
shutdown:CallRef Где CallRef соотвествующее поле (Q931 CallReference) из спиcка звонков. Попытка завершения звонка путем рассылки сообщений ReleaseComplete обоим шлюзам.
TraceLevel:level Установка уровня трассировки в работе прокси. [!! Не злоупотребляйте; возможны перегрузки !!]

При нажатии клавиш стрелок вверх/вниз происходит прокрутка списка введеных запросов.

Заключение:

В случае если через versuch прокси начнет протекать трафик, требующий значительное количество сокетов (это возможно примерно уже при 100-200 звонках одновременно) необходимо провести донастройки ядера системы, так как значений по умолчанию быстро перестает хватать.

В целом ядро уже вступило в зрелый возраст, но что нибудь постоянно добавляется....

С уважением
warlock

14nov 2006
contact: warlock at elcat dot kg

download

SourceForge.net Logo