SIP с Asterisk

  • Проверено на версии — 2.3
  • Требуется — кластер балансировки с двумя модулями балансировки, сервер Asterisk с SIP-аккаунтом и регистрацией

Сценарий описывает настройку SIP-сигнализации через балансировщик 5А, когда вызовы обслуживает Asterisk. Здесь Допустимые коды ответа можно оставить пустыми — код добавлять не нужно.

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

  • Софтфон MicroSIP регистрируется через адрес балансировщика 172.27.2.13:70.
  • Вызов на контрольный номер проходит через балансировщик.
  • Отключение конфигурации балансировки останавливает звонки: софтфон не получает ответа, а регистрация теряется при следующей перерегистрации.

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

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

ОбъектЗначение
Адрес балансировщика (для клиента)172.27.2.13
Входной UDP-порт сервиса70
Модули балансировки172.27.2.13, 172.27.2.14
Клиентский сервер Asterisk172.27.2.22
SIP UDP-порт Asterisk5060
Абонент1001
Контрольный номер999

Порты разные: вход сервиса — 70, SIP-порт Asterisk — 5060. Тогда звонок не пройдёт мимо балансировщика, если в софтфоне указан неверный адрес.

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

  • В Asterisk создан SIP-аккаунт 1001 с регистрацией.
  • Агенты и ПК с софтфоном имеют маршрут до Asterisk.

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

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

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

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

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

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

Поле Допустимые коды ответа оставьте пустым: тогда подойдёт любой SIP-ответ, и проверка проходит как при ответе 200, так и при 401, которым Asterisk запрашивает аутентификацию. На доступность сервера это не влияет — важно, что он отвечает по SIP.

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

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

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

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

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

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

⚠️

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

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

Настройка MicroSIP

  1. Откройте настройки аккаунта MicroSIP и заполните поля:

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

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

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

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

Поле SIP-прокси в MicroSIP задаёт исходящий прокси, через который идут все запросы. В этом сценарии поле SIP-сервер указывает прямо на Asterisk (172.27.2.22), поэтому прокси — единственное, что направляет регистрацию и звонки через балансировщик.

Если SIP-прокси пустое или в нём указан адрес Asterisk, запросы отправляются на 172.27.2.22:5060 в обход балансировщика. В поле должна быть точка входа сервиса — 172.27.2.13:70.

SIP-проксиКуда отправляются REGISTER и INVITEРезультат
172.27.2.13:70на адрес балансировщикарегистрация и звонок идут через балансировщик
172.27.2.22:5060напрямую на AsteriskAsterisk отвечает, но балансировка не участвует
пустона адрес из SIP-сервера (172.27.2.22:5060)как в предыдущей строке

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

  1. Убедитесь, что в MicroSIP появился статус «На линии». Если статус не появился, дождитесь перерегистрации (поле Перерегистрация в MicroSIP).

  2. Снимите трафик инструментом TCP Dump на агенте кластера. Успешная регистрация выглядит как последовательность (значения примерные):

    172.27.1.121.53010 > 172.27.2.13.70: UDP, length 644   # REGISTER без авторизации
    172.27.2.13.70 > 172.27.1.121.53010: UDP, length 436   # 401 Unauthorized
    172.27.1.121.53010 > 172.27.2.13.70: UDP, length 692   # REGISTER с учётными данными
    172.27.2.13.70 > 172.27.1.121.53010: UDP, length 428   # 200 OK

Признак успеха — ответ 200 OK на парный REGISTER (второй после 401).

Особенность stream-логов

В журнале сетевого агента прошедшая дейтаграмма может быть помечена как UDP 200. Это служебный код stream-модуля балансировщика, а не SIP-ответ Asterisk: модуль не разбирает SIP и не знает, каким кодом ответил сервер. Запись появляется по завершении UDP-сессии, поэтому REGISTER, keep-alive и INVITE одного клиента могут попасть в одну строку. Регистрацию подтверждает только 200 OK на стороне клиента.

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

Звонок проверяется вызовом на контрольный номер Asterisk.

  1. В MicroSIP наберите контрольный номер 999.
  2. Дождитесь соединения и убедитесь, что голос слышен.
  3. По трафику на 172.27.2.13:70 должны пройти INVITE, ACK и BYE.

Порядок методов такой:

INVITE sip:999@172.27.2.22 SIP/2.0
Route: <sip:172.27.2.13:70;lr>
SIP/2.0 401 Unauthorized
INVITE ... Authorization: Digest ...
SIP/2.0 100 Trying
SIP/2.0 200 OK
ACK
BYE / 200 OK

Ответ 401 Unauthorized на первый INVITE — это запрос аутентификации, а не ошибка: софтфон повторяет запрос с учётными данными.

Проблема на этапе INVITEЧто проверять
INVITE не отправляется с софтфонаSIP-прокси в аккаунте MicroSIP: должно быть 172.27.2.13:70
INVITE отправляется, ответа нетгруппа получила статус неактивной; проверьте монитор sip-udp-options
INVITE идёт напрямую на 172.27.2.22:5060звонок в обход балансировщика; исправьте SIP-прокси
Ответ 404 Not Foundномер отсутствует в dialplan Asterisk, а не в 5А

Контрольное отключение конфигурации

  1. В списке конфигураций балансировки выключите переключатель у sip_udp_config и в окне Отключение конфигурации нажмите Отключить.
  2. Появится уведомление «Конфигурация балансировки "sip_udp_config" выключена».
  3. Зарегистрированный софтфон потеряет связь с сервером: при следующей перерегистрации ответа не будет, и звонок не пройдёт. Статус «На линии» может сохраняться до этого момента.
  4. Включите конфигурацию обратно и дождитесь перерегистрации.

Это подтверждает, что через балансировщик проходит именно балансируемый трафик: без включённой конфигурации адрес 172.27.2.13:70 не обслуживается.

Особенности Asterisk

  • Asterisk отвечает на проверочный OPTIONS корректным SIP-ответом, поэтому в SIP-мониторе достаточно оставить Допустимые коды ответа пустыми — подойдёт любой SIP-ответ, в том числе 401.
  • CGP может сначала ответить промежуточным 100 Trying, а монитор проверяет код первого ответа; поэтому в сценарии с CGP код 100 добавлен в допустимые.
  • Регистрация и звонок проходят один и тот же путь: входной порт 70 балансировщика, а Asterisk принимает запросы на 5060.

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

ОшибкаПричинаИсправление
Группа не переходит в статус АктивнаSIP-монитор не дождался SIP-ответаПроверьте, что Asterisk отвечает на OPTIONS по своему порту
Звонок не проходит после отключенияконфигурация балансировки выключенаВключите переключатель у конфигурации
«На линии», вызов не проходитINVITE идёт напрямую на серверПроверьте SIP-прокси
Соединение есть, но голоса нетContact или SDP содержит Docker- или NAT-адресУкажите в MicroSIP Публичный адрес — локальный IP ПК

Ограничения

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

Дальше