Проект Ферзух (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