Troubleshooting SIP
Назначение и область применения#
Документ описывает диагностику и устранение проблем SIP-контура SmartCPD: компоненты balancer, mgw, amd, типовые SIP-ошибки, переменные сервисов и трассировку в Homer.
Это не общий runbook по контуру и не инструкция по проектированию SIP. Первичная диагностика платформы, портал, лицензия, метрики и не-SIP сервисы — в Troubleshooting. Проектирование и call flow — в SIP.
Аудитория#
- инженер внедрения;
- техническая эксплуатация;
- support;
- DevOps на стороне заказчика.
Границы документа#
Входит#
- управление переменными SIP-сервисов для диагностики;
- состав и роли
balancer,mgw,amd; - типовые проблемы и ошибки SIP-компонентов;
- диагностика
amdи связанного CDR; - SIP-трассировка в Homer;
- быстрый справочник по симптомам.
Не входит#
- общая экспресс-диагностика контура, портал, лицензия, метрики — Troubleshooting;
- установка и первичный setup — Установка, Docker;
- SIP-проектирование, транки и call flow — SIP;
- ведение проекта внедрения — Внедрение;
- устройство observability-контура — Мониторинг.
1. Управление переменными сервисов#
Параметры сервисов рекомендуется изменять через конфигурацию стека.
Для временного изменения переменной можно использовать:
docker service update \
--env-add VAR=NEW_VALUE \
smartcp_<service>Например:
docker service update \
--env-add X_LOGLEVEL=4 \
smartcp_balancerВажно:
- после выполнения
docker service updateсервис перезапускается; - изменение действует до следующего передеплоя стека;
- временное изменение необходимо зафиксировать в заявке;
- после диагностики следует вернуть исходное значение или внести изменение в стек штатным способом.
Все SIP-компоненты должны использовать одну и ту же версию. Использование компонентов разных версий не гарантирует совместимость. Исключение допускается только для hotfix-патчей конкретного сервиса.
2. Состав SIP-компонентов#
2.1. balancer#
balancer — пограничный SIP-компонент SmartCPD, выполненный на OpenSIPS.
Сервис:
- работает в сетевом режиме
host; - принимает SIP-трафик от дайлера;
- добавляет в
INVITEпараметры клиента, маршрутизации и уникальный UUID вызова; - передает вызов на воркер;
- принимает обратный вызов от воркера;
- направляет вызов на SBC или SIP-провайдера;
- применяет настройки транков и маршрутизации из веб-портала продукта;
- выполняет защиту от DDoS-подобных запросов;
- контролирует доступность воркеров.
2.1.1. Переменные окружения#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
DEBUG_MODE | no | Отладка OpenSIPS. Используется преимущественно при разработке |
X_LOGLEVEL | 3 | Уровень логирования SmartCPD |
O_LOGLEVEL | 3 | Уровень логирования ядра OpenSIPS |
BALANCER_MIHTTP_ENABLE | false | Включение HTTP-интерфейса MI OpenSIPS |
BALANCER_MIHTTP_PORT | 8088 | Порт MI HTTP |
В облачной инсталляции BALANCER_MIHTTP_ENABLE включен.
2.1.2. Уровни логирования#
Допустимые значения:
| Значение | Уровень |
|---|---|
-3 | alert |
-2 | critical |
-1 | error |
1 | warning |
2 | notice |
3 | info |
4 | debug |
X_LOGLEVEL=3 является штатным и наиболее информативным уровнем для анализа SIP-флоу.
Повышение O_LOGLEVEL допустимо только:
- для тяжелых случаев отказа ПО;
- на тестовых или стендовых окружениях;
- по согласованию с ответственными специалистами.
В продуктивной среде повышать O_LOGLEVEL не следует.
2.1.3. MI HTTP#
При включенном MI HTTP интерфейс доступен по адресу:
http://<BALANCER_IP>:<BALANCER_MIHTTP_PORT>/mi/При значениях по умолчанию:
http://<BALANCER_IP>:8088/mi/2.2. mgw#
mgw — сервис поддержки SIP-сигнализации, выполненный на OpenSIPS.
Сервис:
- принимает вызов от
balancer; - распаковывает параметры детекции из SIP-заголовков;
- удерживает вызов;
- принимает обратный вызов от
amd; - отправляет его балансировщику, с которого пришел исходный вызов;
- после соединения с абонентом выводит
amdиз вызова; - соединяет плечи A и B через B2B-прокси;
- предоставляет метрики Prometheus для Grafana;
- проверяет доступность движка детекции через REST health check;
- сообщает балансеру о своей доступности через SIP
OPTIONS.
Если движок детекции недоступен, mgw возвращает 503 на OPTIONS. В результате балансер исключает ноду из балансировки.
Потеря части воркеров может привести к:
- перегрузке оставшихся воркеров;
- увеличению времени обработки;
- росту числа отказов.
2.2.1. SIP-порты#
| Порт | Назначение |
|---|---|
| UDP/5002 | SIP-взаимодействие с balancer |
| UDP/5050 | SIP-взаимодействие с amd |
2.2.2. Переменные окружения#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
FUNCTIONAL_CODE | 503 | SIP-код отказа сервиса |
FUNCTIONAL_REASON | Service Unavailable | SIP-причина отказа |
MGW_LOGLEVEL | 3 | Уровень логирования mgw |
MGW_MODE | balanced | Режим работы сервиса |
MGW_MODE не следует переопределять.
Все функциональные отказы возвращаются с кодом и причиной, заданными FUNCTIONAL_CODE и FUNCTIONAL_REASON, а также с заголовком:
X-AMD-STATUS: functional2.3. amd#
amd — сервис обеспечения медиавзаимодействия для SIP, выполненный на Asterisk.
Сервис:
- получает команду от
mgwпо ARI; - инициирует дозвон до абонента через
mgw; - записывает раннее медиа при наличии ответа
183с SDP; - передает аудио на анализ движку детекции через REST после получения
200 OK; - при отсутствии признаков автоответчика в раннем медиа записывает аудио средствами Asterisk;
- передает запись на анализ после завершения записи;
- при наличии соответствующей настройки записывает события о звонках в БД CDR.
Именно amd отвечает за запись вызовов в CDR.
Если проблема относится к работе движка детекции, БД или другого внешнего сервиса, необходимо обратиться к соответствующему разделу документации.
3. Типовые проблемы balancer#
3.1. Сервис не запускается#
Симптом#
В логах присутствует сообщение:
Config-server unavailable, restarting...Диагностика#
Получить логи сервиса:
docker service logs smartcpd_balancer --no-trunc -fПроверить:
- доступность сервиса конфигурации;
- сетевое соединение между
balancerи сервисом конфигурации; - разрешение имени сервиса;
- наличие необходимых параметров конфигурации;
- состояние контейнеров сервиса конфигурации.
Устранение#
Провести диагностику сервиса конфигурации. После восстановления его доступности проверить автоматический запуск balancer.
3.2. Нет реакции на INVITE#
Возможная причина#
IP-адрес шлюза источника запросов помещен в черный список DDoS-защиты.
Диагностика по логам#
Проверить наличие сообщения:
[DDoS] Dropped INVITE from <IP_ADDRESS> cause=bl_count=11Диагностика через MI HTTP#
Запросить содержимое коллекции блокировок:
/cachedb_local/cache_fetch_chunk?arg=["*"%2C"collection5"]В ответе будет JSON со значениями вида:
name: <IP_ADDRESS>
value: <INVALID_ATTEMPT_COUNT>Если значение счетчика равно 11, запросы с этого IP игнорируются.
Устранение#
Удалить IP-адрес из списка блокировок:
/cachedb_local/cache_remove_chunk?arg=["<IP_ADDRESS>"%2C"collection5"]После удаления проверить повторную обработку INVITE.
3.3. Нет реакции на OPTIONS#
Возможная причина#
balancer не работает с публичными адресами напрямую и не bind-ит их интерфейсы. Для подключения используются DNAT и SNAT.
Прохождение пакетов через NAT в Linux контролируется модулем conntrack, который кэширует состояния соединений и маршрутов.
Если шлюз клиента некоторое время был недоступен, conntrack может сохранить состояние недоступности. В результате система перестает предпринимать попытки отправить запрос или ответ этому шлюзу.
Диагностика#
Проверить:
- наличие SIP-пакетов на интерфейсе;
- правила
DNATиSNAT; - состояние сетевого интерфейса;
- наличие записей и состояний
conntrack; - доступность шлюза клиента.
Устранение#
При подтверждении проблемы очистить соответствующую запись или кэш conntrack вручную согласно процедурам эксплуатации операционной системы.
После очистки проверить прохождение:
OPTIONSот балансера к шлюзу;- ответов от шлюза;
- повторной регистрации или SIP-доступности транка.
3.4. INVITE отклоняется с кодом 401 Unauthorized#
Возможная причина 1: неавторизованный шлюз#
Проверить:
- настройки транка на веб-портале продукта;
- наличие транка в настройках маршрутизации;
- соответствие IP-адреса и порта источника настроенному транку;
- логи
balancer.
При первом запросе балансер получает учетные данные из сервиса конфигурации. При успешном поиске появляется сообщение:
[CONFIG] New valid trunk found udp:192.168.31.245:6060 for trunksegment 0011223344/597ba2e4-6196-49ad-ab87-8230f6c4d0e2Данные сохраняются в локальный кэш.
При отсутствии авторизации:
- увеличивается счетчик неудачных попыток;
- запросы с этого
IP:PORTотклоняются примерно 30 секунд; - повторный запрос к сервису конфигурации в этот период не выполняется;
- при достижении 11 невалидных попыток IP блокируется на один час.
Признак валидного входящего запроса#
При успешной авторизации в логе появляется:
[PBX] New inbound INVITE request from udp:192.168.31.245:6060 for segment ID 0011223344/597ba2e4-6196-49ad-ab87-8230f6c4d0e2Сообщение содержит:
- источник запроса;
- SIP-метод;
- идентификатор сегмента;
- параметры детекции.
Возможная причина 2: 401 от SBC или провайдера клиента#
В схеме B2B ответ 401 Unauthorized может быть сформирован не balancer, а SBC или SIP-провайдером клиента.
В этом случае необходимо:
- открыть SIP-трассировку;
- определить, на каком плече сформирован ответ;
- проверить настройки авторизации на стороне SBC или провайдера;
- обратиться к соответствующему разделу документации по интеграции с SBC или провайдером.
3.5. Вызовы завершаются с кодом 408 Timeout#
Возможные причины#
- на вызов SmartCPD в сторону SBC или провайдера нет ответа;
- SBC или провайдер возвращает
408; - ответ теряется на сетевом уровне;
- проблема связана с маршрутизацией, NAT или доступностью внешнего узла.
Диагностика#
Требуется доступ к SIP-трассировке.
Необходимо определить:
- отправлялся ли запрос на SBC или провайдера;
- какой узел не ответил;
- был ли получен ответ от внешнего узла;
- на каком плече сформирован
408; - соблюдаются ли тайминги SIP-диалога.
3.6. INVITE отклоняется с кодом 500 Service full#
Причина 1: все воркеры заняты#
Все доступные воркеры заняты либо не имеют ресурсов для нового вызова.
Диагностика#
Проверить:
- общую нагрузку кластера;
- ошибки и отказы движка детекции;
- количество активных SIP-сессий;
- значение
loadна каждом воркере; - соответствие текущей нагрузки параметру
max.
При устойчивой перегрузке необходимо пересмотреть сайзинг продукта.
Причина 2: недоступен resolver#
balancer получает адреса воркеров через сервис resolver. Если resolver недоступен, балансер не может получить актуальный список воркеров и отклоняет все вызовы.
Необходимо провести диагностику сервиса resolver.
Проверка списка воркеров через MI HTTP#
Выполнить запрос:
/load_balancer/lb_listСписок не должен быть пустым.
Для каждого воркера проверить раздел Resources:
| Поле | Назначение |
|---|---|
load | Текущее количество SIP-сессий на воркере |
max | Максимально допустимая нагрузка |
enabled | Состояние воркера и доступность по OPTIONS |
Ожидаемые условия:
load < max
enabled = trueПроверка логов#
Проверить сообщения с тегом:
[DISPATCHER]Особое внимание обратить на сообщения, содержащие операцию:
removeОни могут указывать на исключение воркера из балансировки.
Причина 3: сервис воркеров не работает на нодах кластера#
Проверить:
- состояние Docker-сервиса воркеров;
- наличие задач сервиса на всех необходимых нодах;
- ошибки запуска контейнеров;
- сетевую доступность
mgw; - ответы воркеров на
OPTIONS.
4. Ошибки mgw#
4.1. Balanced mode with wrong headers!#
Причина#
В INVITE, поступившем от balancer, отсутствуют обязательные заголовки либо в компонентах используются несовместимые версии.
Обязательные заголовки#
| Заголовок | Назначение |
|---|---|
X-SCPD-DuID | Оригинальный Call-ID |
X-SCPD-TRACE-ID | UUID детекции |
X-SCPD-Route | IP и порт балансера для обратного вызова |
X-SCPD-INN | ИНН клиента, внутренний ID или тенант |
X-SCPD-ProfileID | ID профиля детекции |
X-SCPD-TrunkIn | Метка входящего транка |
X-SCPD-TrunkOut | Метка исходящего транка |
X-SCPD-SegmentID | Метка сегмента маршрутизации |
X-SCPD-SegmentName | Имя сегмента маршрутизации в Base64 |
X-SCPD-TariffLabel | Имя тарифа в Base64 |
Диагностика#
- Открыть SIP-трассировку.
- Проверить входящий
INVITEна сторонеmgw. - Проверить наличие всех обязательных заголовков.
- Проверить корректность значений заголовков.
- Сверить версии
balancer,mgwиamd.
4.2. DS not in list!#
Причина#
Некорректно переопределен режим работы сервиса.
Диагностика и устранение#
Проверить значение переменной:
MGW_MODEШтатное значение:
MGW_MODE=balancedПеременную не следует переопределять. После возврата корректного значения проверить перезапуск сервиса и обработку нового вызова.
4.3. trigger_call fail#
Причина#
Сервис amd недоступен по ARI.
Диагностика#
Проверить:
- состояние сервиса
amd; - доступность ARI;
- сетевое соединение между
mgwиamd; - логи
amd; - наличие ошибок авторизации или подключения к ARI.
Устранение#
Провести диагностику сервиса amd в соответствии с соответствующим разделом документации.
4.4. SmartCPD Engine health check failed#
Причина#
Движок детекции недоступен по REST.
Диагностика и устранение#
Проверить:
- доступность REST health endpoint;
- состояние сервиса движка;
- сетевое соединение между воркером и движком;
- ошибки в логах движка;
- корректность адреса и параметров подключения.
Дальнейшую диагностику выполнять по соответствующему разделу документации по движку SmartCPD.
5. Диагностика amd и CDR#
5.1. В CDR отсутствует запись о вызове#
Шаг 1. Проверка поступления вызова в amd#
Проверить лог amd на наличие сообщения:
<CALL_ID> [ACQUIRE] Action:...Если сообщения нет:
- вызов не дошел до
amd; - необходимо проверять цепочку выше —
mgwиbalancer; - проверить SIP-трассировку и логи соответствующих сервисов.
Шаг 2. Проверка ошибки записи в БД#
Если сообщение о поступлении вызова есть, проверить логи за период вызова на наличие:
Failed to insert call detail record into database!При наличии сообщения проверить:
- доступность БД;
- сетевое соединение с БД;
- учетные данные;
- права пользователя;
- наличие свободного места;
- ошибки схемы или миграций;
- корректность параметров подключения.
Шаг 3. Проверка включения CDR#
При запуске amd должно присутствовать сообщение:
CDR simple logging enabled.Если сообщение отсутствует, проверить:
- настройки записи CDR;
- параметры подключения к БД;
- наличие необходимых переменных окружения;
- доступность БД во время запуска сервиса.
Классы причин#
Причины отсутствия записи в CDR относятся к одному из двух классов:
- вызов не пришел в
amdили не прошел черезbalancer; - возникла проблема с настройками или доступностью БД.
5.2. В CDR указано stage_error=call_controller_unavailable#
Причина#
Недоступен или отказал движок детекции.
Диагностика#
Проверить соответствующий раздел документации по движку SmartCPD:
- состояние движка;
- доступность REST;
- ошибки обработки задач;
- сетевое соединение;
- лимиты ресурсов.
Все вызовы с такой ошибкой направляются на оператора.
6. SIP-трассировка в Homer#
6.1. Ограничения захвата#
В состав продукта может быть включен инструмент сбора SIP-трассировки Homer.
Захват выполняется:
- только для аутентифицированных запросов;
- только для
INVITE; - только для плеча A — между дайлером и SmartCPD;
- только для плеча B — между SmartCPD и SBC или провайдером.
Сигнализация между воркерами в трассировку не попадает. Это сделано для:
- уменьшения объема малоинформативного трафика;
- экономии дискового пространства БД;
- снижения расходов на передачу данных в Homer.
6.2. Определение идентификатора вызова#
Для связывания двух плеч одной детекции используется sip_trace_id. Он является UUID вызова.
UUID можно получить двумя способами.
Способ 1. Из CDR#
Найти соответствующую запись вызова в БД CDR и использовать значение поля:
sip_trace_idСпособ 2. Из начального INVITE#
- Найти начальный
INVITEот дайлера. - Открыть
Details. - Найти поле:
correlation_idЗначение correlation_id соответствует sip_trace_id.
6.3. Поиск вызова#
Для поиска двух плеч одного вызова:
- В виджете фильтра открыть настройки полей.
- Добавить поле фильтрации по
correlation_id. - Вставить в него значение
sip_trace_id. - Очистить остальные поля фильтра.
- Убедиться, что временной диапазон включает время вызова.
- Выполнить поиск.
В результате должны отобразиться два плеча вызова, связанные одним UUID.
6.4. Что проверять в трассировке#
При анализе отказа проверить:
- направление вызова;
- источник и получателя каждого SIP-сообщения;
- SIP-коды ответов;
- наличие ответов на
INVITE,OPTIONSи последующие запросы; - место формирования ошибки;
- соответствие
Call-ID,correlation_idиsip_trace_id; - задержки между запросами и ответами;
- различия между плечом A и плечом B.
7. Быстрый справочник#
| Симптом | Первичная проверка |
|---|---|
Config-server unavailable, restarting... | Сервис конфигурации |
Нет реакции на INVITE | DDoS blacklist и лог [DDoS] |
Нет реакции на OPTIONS | NAT, conntrack, доступность шлюза |
401 Unauthorized | Транк, маршрутизация, источник ответа |
408 Timeout | SIP-трассировка плеча B |
500 Service full | Список воркеров, load, max, enabled, resolver |
Balanced mode with wrong headers! | Заголовки X-SCPD-* и версии компонентов |
DS not in list! | Значение MGW_MODE |
trigger_call fail | Доступность amd по ARI |
SmartCPD Engine health check failed | REST health движка |
| Нет записи в CDR | Логи amd, БД, сообщение CDR simple logging enabled. |
stage_error=call_controller_unavailable | Движок детекции |