SIP с CommuniGate Pro

  • Проверено на версии — 2.3
  • Требуется — кластер балансировки с двумя модулями балансировки, сервер CommuniGate Pro (CGP) с SIP-доменом и абонентами

Сценарий описывает настройку SIP-сигнализации через балансировщик 5А, когда вызовы обслуживает CommuniGate Pro. По итогу софтфон регистрируется и совершает звонок, а сигнализация проходит через балансировщик. Если бэкенд — Asterisk, см. SIP с Asterisk.

Что получится

  • Софтфон MicroSIP регистрируется через адрес балансировщика 172.27.2.13:60.
  • Вызовы между абонентами 2001 и 2002 проходят в обе стороны тем же путём.
  • Доступность CGP проверяет SIP-монитор: он отправляет OPTIONS и получает SIP-ответ.

Сквозной пример

Во всех шагах используются одни и те же значения. Подставьте вместо них свои.

ОбъектЗначение
Адрес балансировщика (для клиента)172.27.2.13
Входной UDP-порт сервиса60
Модули балансировки172.27.2.13, 172.27.2.14
Клиентский сервер CGP172.27.2.22
Порт участника группы (SIP UDP)5070
SIP-доменcgate.local
Абоненты2001, 2002

Имя SIP-домена должно разрешаться в адрес балансировщика. Для проверки допустима запись в файле hosts:

172.27.2.13 cgate.local

Перед началом

  • В CGP созданы SIP-домен cgate.local и учётные записи абонентов 2001 и 2002.
  • CGP слушает SIP по UDP на порту 5070.
  • Модули балансировки и ПК с софтфоном имеют маршрут до CGP.

Настройка CommuniGate Pro

  1. Войдите в WebAdmin CGP.
  2. Откройте Settings → Real-Time → SIP → Transport.
  3. В блоке UDP задайте Local IP Address — all addresses и порт 5070.
  4. Откройте Settings → Network → LAN IPs и добавьте подсеть модулей балансировки 172.27.2.0-172.27.2.255 и их адреса 172.27.2.13, 172.27.2.14.
  5. При необходимости разрешите сигнализацию от этих адресов в Settings → Network → Client IPs.

Настройка SIP-транспорта CGP

Адреса балансировщика в LAN IPs CGP

Адреса балансировщика в Client IPs CGP

⚠️

Порт 8010, который часто виден в конфигурации CGP, относится к WebAdmin и в SIP-сигнализации не участвует.

Отдельных настроек CGP «под балансировщик» не требуется: сигнализация проходит как есть, когда адреса балансировщика для CGP свои (LAN IPs).

Создание SIP-монитора

  1. Откройте раздел Мониторы кластера и нажмите Добавить монитор.

  2. Заполните форму Новый монитор:

    • Название — sip-udp-options;
    • Протокол — SIP;
    • Описание — Проверка SIP-ответа CGP запросом OPTIONS;
    • Таймаут проверки, мс — 3000;
    • Перегрузка порта — выключена (проверяется порт участника группы 5070);

    Секция Запрос:

    • Метод — OPTIONS;
    • Транспорт — UDP;
    • SIP URI — sip:cgate.local;
    • Пользователь в From — 5a-monitor (значение по умолчанию).

    Секция Ожидаемый ответ: Допустимые коды ответа — 100, 200.

  3. Нажмите Сохранить.

Допустимые коды ответа должны включать 100. CGP может сначала ответить промежуточным 100 Trying, а затем финальным 200, а монитор проверяет строку статуса первого полученного сообщения. Если оставить только 200, проверка будет падать, хотя сервер отвечает.

⚠️

Обычный монитор с протоколом UDP для проверки SIP не подходит. Он отправляет одно и то же тело запроса, поэтому CGP принимает пробы за повтор одной транзакции и отвечает на порт первой из них: монитор ответа не получает и переводит группу в состояние недоступности. Монитор с протоколом SIP собирает каждый запрос заново — с новыми Call-ID, Via и tag, — поэтому CGP отвечает на каждую пробу.

Создание группы серверов

  1. Откройте раздел Клиентские серверы и выберите вкладку Группы серверов.
  2. Если сервер CGP ещё не добавлен, добавьте его: Имя сервера — 172.27.2.22, IP-адрес — 172.27.2.22.
  3. Нажмите Добавить группу и заполните форму создания группы:
    • секция Информация о группе: Имя группы — sip, Описание — sip;
    • секция Серверы в группе: Добавить сервер — Сервер 172.27.2.22, Порт 5070, Вес 1;
    • секция Проверка здоровья: Подключенные мониторы — sip-udp-options; Порог успешных проверок — 1;
    • секция Условия переключения группы: Параметр — Количество доступных серверов, значение — 1.
  4. Нажмите Сохранить. В таблице серверов группы колонка Состояние покажет ОК: 2/2 — сервер доступен с обоих модулей балансировки.

Группа серверов sip

Создание конфигурации балансировки

  1. Откройте раздел со списком конфигураций балансировки и нажмите Добавить конфигурацию.
  2. На вкладке L4/L7 в секции Общие настройки конфигурации:
    • Название — sip_cgate.local;
    • Адрес — оставьте пустым, тогда сервис принимает трафик на адресах модулей балансировки;
    • Порт — 60;
    • L4 протокол — UDP;
    • L7 протокол — оставьте пустым;
    • VRF — оставьте пустым, если серверы в общей сети.
  3. На вкладке Сервисы в секции Настройки сервиса нажмите Добавить группу серверов: Приоритет — 1, Группа — sip.
  4. В секции Трансляция адресов выберите Режим трансляции адресов — Автоматически.
  5. Нажмите Добавить.
  6. В списке конфигураций балансировки включите созданную конфигурацию переключателем в её строке. Появится уведомление «Конфигурация балансировки "sip_cgate.local" включена».

Конфигурации балансировки, вкладка L4/L7

Конфигурации балансировки, Настройки сервиса

⚠️

Важно: порт конфигурации должен быть уникален в кластере. Подробнее.

Поле Адрес пустое, поэтому сервис слушает на адресах модулей балансировки, а софтфон обращается к одному из них — в примере 172.27.2.13. Если в конфигурации включена отказоустойчивость (HA), в поле Адрес указывают VIP, и софтфон обращается к нему: параметры отказоустойчивости.

Настройка MicroSIP

  1. В MicroSIP откройте настройки аккаунта (правой кнопкой мыши по окну → Параметры).

  2. Заполните поля:

    • Имя аккаунта — balancer;
    • SIP-сервер — cgate.local:60;
    • SIP-прокси — cgate.local:60;
    • Имя пользователя — 2001;
    • Логин — 2001;
    • Домен — cgate.local;
    • Транспорт — UDP;
    • Публичный адрес — локальный IP ПК с софтфоном, на автоподстановку не полагайтесь;
    • Перерегистрация — 300;
    • Keep-alive — 15;
    • STUN, ICE и внешний сервер выключены.

Поле SIP-прокси обязательно должно указывать на адрес балансировщика и входной порт сервиса. Причины — в следующем разделе.

Настройки SIP-аккаунта MicroSIP

На скриншоте поле SIP-прокси ещё не заполнено — это состояние до исправления.

⚠️

Все учётные записи на ПК с софтфоном должны обращаться к балансировщику. Если у какой-то записи в SIP-сервере указан адрес CGP напрямую, она может не зарегистрироваться, и вызовы на неё будут завершаться кодом 480.

Почему звонок не проходит без SIP-прокси

Регистрация и звонок — разные механизмы. REGISTER софтфон отправляет на адрес из поля SIP-сервер — в примере cgate.local:60, то есть через балансировщик. INVITE при наборе номера MicroSIP строит как INVITE sip:<номер>@<домен> без порта и отправляет на адрес из поля SIP-прокси.

Если SIP-прокси пустое, INVITE отправляется на порт по умолчанию 5060, где сервис не слушает. Регистрация при этом проходит, а вызов завершается по таймауту. Если в прокси указан адрес CGP напрямую, INVITE идёт мимо балансировщика.

SIP-проксиКуда отправляется INVITEРезультат
cgate.local:60на адрес балансировщиказвонок проходит
172.27.2.22:5070напрямую на CGPCGP отвечает, но балансировка не участвует
пустона cgate.local:5060, где сервис не слушаетзвонок падает по таймауту

Проверка регистрации

  1. Убедитесь, что в MicroSIP появился статус «На линии».

  2. Откройте журнал CGP: WebAdmin → Monitors → Logs, и выберите файл за нужное время. Успешная регистрация выглядит как последовательность:

    REGISTER sip:cgate.local:60  from udp[172.27.2.13]
    401-REGISTER                 (запрос пароля, это нормально)
    REGISTER + Digest
    200-REGISTER
  3. Проверьте Contact абонента в Users → <абонент> → Real-Time → Registrations: там должен быть локальный адрес ПК с софтфоном, а не адрес Docker-сети вида 172.18.* и не чужой NAT.

Источник в первой строке — адрес модуля балансировки, через который прошёл запрос, а не адрес ПК.

ℹ️

Время в журнале CGP идёт по часовому поясу сервера. Веб-просмотрщик показывает только хвост файла, полный текст проще выгрузить. Для разбора звонков удобен уровень логирования SIP All Info.

Проверка звонка

Звонок проверяется в обе стороны: 2002 → 2001 и 2001 → 2002. Ниже — звонок абонента 2002 на абонента 2001.

  1. Позвоните между абонентами 2001 и 2002: в примере вызывающий — 2002, вызываемый — 2001.
  2. Дождитесь соединения и убедитесь, что голос слышен в обе стороны.
  3. Завершите разговор и понаблюдайте за BYE в журнале CGP.

Успешный вызов в журнале CGP выглядит так (сокращённо):

08:35:05.240 inp: req <- udp[172.27.2.13]:52811 INVITE sip:2001@cgate.local      ← пришёл через балансировщик
08:35:05.242 2001@cgate.local has 1 registration(s)
08:35:05.242 out: req [172.27.2.22]:5070 -> udp[172.27.1.121]:57195 INVITE        ← к вызываемому напрямую
08:35:05.287 out: rsp -> udp[172.27.2.13]:52811 180-INVITE
08:35:20.332 ACCOUNT(2001@cgate.local) inp call connected. alerting=15 sec
08:35:20.334 out: rsp -> udp[172.27.2.13]:52811 200-INVITE(final)
08:35:20.377 inp: req <- udp[172.27.2.13]:52811 ACK
08:35:28.045 inp: req <- udp[172.27.1.121]:25285 BYE                              ← отбой нажал абонент
08:35:28.095 ACCOUNT(2001@cgate.local) inp call completed(2002@cgate.local). duration=8 sec

Признаки успеха:

  • INVITE приходит в CGP от адреса модуля балансировки, а не от ПК напрямую;
  • есть цепочка 180 → 200-INVITE → ACK → BYE, строки call connected и call completed;
  • проверено в обе стороны, голос слышен.

Входящий INVITE к вызываемому абоненту и запросы внутри разговора (BYE) идут между сервером и софтфоном напрямую, минуя балансировщик, — это штатное поведение, см. как идёт трафик.

Частые ошибки

ОшибкаПричинаИсправление
Группа не переходит в статус Активнамонитор со статичным телом, CGP отвечает на порт первой пробыиспользуйте монитор с протоколом SIP
SIP-монитор недоступенсервер отвечает 100, а в допустимых кодах только 200добавьте 100 в Допустимые коды ответа
«На линии», но звонок не проходитINVITE ушёл на порт 5060, где сервис не слушаетзаполните SIP-прокси адресом балансировщика и входным портом
Звонок сразу сбрасываетсявызываемый абонент не зарегистрирован (его учётка идёт мимо балансировщика)направьте учётку вызываемого абонента на балансировщик
Соединение есть, но голоса нетContact или SDP содержит Docker- или NAT-адресукажите в MicroSIP Публичный адрес — локальный IP ПК
Звонок соединился и через несколько секунд оборвалсяcall completed и BYE от адреса клиентатрубку положил абонент; обрыва на балансировщике нет
Много строк 401-INVITE(resending)клиент не подтвердил 401 своим ACKна звонок не влияет, особенность клиента
483 Too Many HopsREGISTER зацикливается через балансировщикпроверьте LAN IPs и Trusted Proxy в CGP; в MicroSIP заполните SIP-прокси
404 или «неверный номер»INVITE дошёл, но абонента или маршрута нетпроверьте абонента и маршруты в CGP, а не в 5А
В журнале CGP SIP failed to parse PROXY protocol headersк CGP обращается TCP-проба, а адрес балансировщика указан доверенным проксина UDP-сигнализацию не влияет; проверьте, каким монитором проверяется сервер

Ограничения

  • L4 UDP-балансировка не анализирует и не переписывает поля Via, Contact, Record-Route и SDP: сигнализация транслируется как есть.
  • Статус «На линии» — это успешная регистрация, а не подтверждение прохождения звонка.
  • Голос (RTP) идёт напрямую между абонентами и через балансировщик не проходит.
  • Входящий INVITE вызываемому абоненту и запросы внутри разговора идут от сервера к клиенту напрямую, минуя балансировщик; через него проходит только сигнализация от клиента к серверу.
  • Для нескольких серверов CGP в группе нужна общая база регистраций (кластер CGP) или persistence по IP клиента, иначе регистрация и вызов могут попасть на разные серверы.
  • Сценарий проверен с софтфоном MicroSIP по транспорту UDP.

Дальше