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