·11 мин·3 просмотров

Обрывы звонков в Asterisk: мониторинг и диагностика

Полное руководство по диагностике и устранению обрывов звонков в Asterisk: NAT, SIP ALG, session timers, кодеки, нехватка ресурсов и настройка проактивного мониторинга.

A
Astervis
Команда инженеров и продактов

Обрывы звонков — самая изматывающая проблема в любом колл-центре на базе Asterisk. Каждый разорванный вызов означает потерянный контакт с клиентом, раздражённого оператора и, весьма вероятно, упущенную выручку. Хуже того, обрывы связи печально известны сложностью диагностики: за ними могут стоять десятки разных первопричин — от банальных ошибок в настройке NAT до тонких проблем с качеством сети.

В этом руководстве разобраны все типовые причины обрывов звонков в Asterisk, приведены точные команды диагностики и готовые правки конфигурации, а также показано, как настроить проактивный мониторинг, чтобы ловить проблемы раньше, чем их заметят ваши абоненты.

Почему Asterisk обрывает звонки

Прежде чем браться за исправления, полезно понять схему прохождения вызова. Звонок в Asterisk проходит три отдельные фазы, и обрыв может произойти в любой из них:

  1. Установка вызова (INVITE, 200 OK, ACK): обрывы здесь выглядят как звонки, которые на мгновение соединяются и тут же разрываются — обычно в пределах 0–5 секунд.
  2. Обмен медиа (RTP-потоки аудио): обрывы уже во время разговора, часто на 15-й, 30-й или 60-й секунде — либо через случайные интервалы.
  3. Поддержание сессии (re-INVITE, OPTIONS, session timers): обрывы через предсказуемые интервалы, например ровно 15 или 30 минут.

У каждой фазы свой набор сценариев отказа. Разберём их по порядку.

Причина 1: проблемы с прохождением NAT

Симптомы: звонок обрывается ровно через 30 секунд. Односторонний звук перед обрывом. В локальной сети всё работает, а для удалённых внутренних номеров — нет.

NAT — причина номер один среди всех обрывов звонков в Asterisk. Когда сервер Asterisk стоит за NAT-роутером, SIP-сигнализация и RTP-потоки несут в себе внутренние IP-адреса, до которых внешние абонентские устройства просто не могут достучаться.

Диагностика

Проверьте текущую конфигурацию NAT:

# For chan_sip (legacy) asterisk -rx "sip show settings" | grep -i nat # For chan_pjsip (modern) asterisk -rx "pjsip show endpoint <endpoint_name>"

Включите отладку SIP, чтобы увидеть, что происходит на самом деле:

asterisk -rx "pjsip set logger on" # Сделайте тестовый звонок и посмотрите SIP-заголовки на предмет внутренних IP # Ищите в заголовках Contact: и Via: адреса вида 192.168.x.x или 10.x.x.x

Решение

Для pjsip.conf (рекомендуется для Asterisk 16+):

[transport-udp] type=transport protocol=udp bind=0.0.0.0 external_media_address=YOUR.PUBLIC.IP external_signaling_address=YOUR.PUBLIC.IP local_net=192.168.0.0/16 local_net=10.0.0.0/8 local_net=172.16.0.0/12 [endpoint-template](!) type=endpoint direct_media=no rtp_symmetric=yes force_rport=yes rewrite_contact=yes

Для sip.conf (устаревший вариант):

[general] externip=YOUR.PUBLIC.IP localnet=192.168.0.0/255.255.0.0 localnet=10.0.0.0/255.0.0.0 nat=force_rport,comedia directmedia=no

Ключевой момент: direct_media=no (или canreinvite=no в старом синтаксисе) прогоняет весь RTP через Asterisk. Это дороже по ресурсам, но закрывает 90% обрывов, связанных с NAT.

Причина 2: SIP ALG (Application Layer Gateway)

Симптомы: случайные обрывы. Из одних сетей звонки проходят, из других — нет. SIP-заголовки искажены: порты или IP не совпадают с тем, что отправлял Asterisk.

Во многих домашних и корпоративных роутерах есть SIP ALG — механизм, который «помогает» SIP-трафику, переписывая заголовки пакетов. На практике SIP ALG почти всегда создаёт больше проблем, чем решает.

Диагностика

Сравните то, что отправляет Asterisk, с тем, что получает удалённая сторона:

# Снимаем SIP-трафик на сервере Asterisk tcpdump -i eth0 -n -s 0 port 5060 -w /tmp/sip_capture.pcap # Разбираем в Wireshark или через sngrep sngrep -I /tmp/sip_capture.pcap

Решение

Отключите SIP ALG на роутере или межсетевом экране:

  • Linux iptables: modprobe -r nf_nat_sip nf_conntrack_sip
  • pfSense: System, Advanced, Firewall and NAT, снять галочку Disable Firewall Scrub
  • Ubiquiti/EdgeRouter: set system conntrack modules sip disable
  • Большинство домашних роутеров: ищите в настройках межсетевого экрана пункты SIP ALG, SIP Passthrough или VoIP Passthrough и выключайте их

Причина 3: рассогласование session timers

Симптомы: звонок обрывается ровно через 15 минут, 30 минут или другой предсказуемый интервал.

SIP session timers (RFC 4028) нужны, чтобы выявлять «зависшие» вызовы за счёт периодического обновления сессии. Если значения таймеров у Asterisk и удалённой стороны не совпадают, одна из сторон посчитает сессию истёкшей и завершит вызов.

Диагностика

asterisk -rx "pjsip show endpoint <endpoint>" | grep -i timer grep -i "session-expires" /var/log/asterisk/full

Решение

; pjsip.conf [endpoint-template](!) type=endpoint timers=no ; Полностью отключить session timers ; ЛИБО настроить их корректно: timers=yes timers_min_se=90 ; Минимальное время жизни сессии (в секундах) timers_sess_expires=1800 ; Время жизни сессии (по умолчанию 1800 = 30 мин)

Если ваш SIP-провайдер требует session timers, приведите значение Min-SE в соответствие с его требованиями:

timers_min_se=900 ; Подогнать под минимум провайдера (часто 900 с = 15 мин) timers_sess_expires=1800 ; Ставим больше, чем min_se

Причина 4: сбои согласования кодеков

Симптомы: вызов соединяется, но сразу же обрывается (за 1–3 секунды). Звука нет вообще. В трассировках виден SIP 488 Not Acceptable Here.

Если Asterisk и удалённая сторона не могут договориться об общем аудиокодеке, вызов либо не устанавливается, либо разрывается сразу после старта медиасессии.

Диагностика

asterisk -rx "pjsip show endpoint <endpoint>" | grep -i allow asterisk -rx "core show channels verbose"

Решение

Убедитесь, что у обеих сторон есть хотя бы один общий кодек:

; pjsip.conf [endpoint-template](!) type=endpoint allow=!all,g722,ulaw,alaw ; g722 в приоритете (широкополосный), запасные — ulaw/alaw

Совет: порядок имеет значение. Первый кодек в списке считается предпочтительным. Ставьте на первое место тот, что даёт лучшее качество.

Причина 5: нехватка ресурсов

Симптомы: количество обрывов растёт под нагрузкой. В часы пик Asterisk перестаёт отвечать. Перед обрывом качество звука деградирует — речь рвётся и «роботизируется».

Asterisk требователен к процессору, особенно при транскодировании между разными кодеками и при записи разговоров. Исчерпание CPU, памяти или файловых дескрипторов неизбежно приводит к обрывам.

Устали угадывать, что происходит в очередях?

Astervis даёт 30+ реалтайм-графиков, KPI операторов и CRM-интеграцию для вашего Asterisk PBX. On-premise. Установка за 5 минут. От $119/мес flat без ограничения на операторов.

Попробовать бесплатно

Диагностика

asterisk -rx "core show channels count" asterisk -rx "core show uptime" top -bn1 | head -20 free -h ulimit -n # Лимит файловых дескрипторов ss -unp | grep asterisk | wc -l

Решение

  1. Поднимите лимит файловых дескрипторов:
# /etc/security/limits.conf asterisk soft nofile 65536 asterisk hard nofile 65536
  1. Избегайте лишнего транскодирования — используйте один и тот же кодек с обеих сторон вызова.

  2. Оптимизируйте диапазон RTP-портов:

; rtp.conf [general] rtpstart=10000 rtpend=20000 ; 10 000 портов = 5 000 одновременных звонков
  1. Следите за загрузкой CPU — если Asterisk стабильно занимает более 80% процессора, масштабируйтесь горизонтально или обновляйте железо.

Причина 6: межсетевой экран и сетевые проблемы

Симптомы: периодические обрывы, совпадающие с сетевыми событиями. Обрывы затрагивают часть транков, а не все. Провалы звука или односторонний звук перед обрывом.

Межсетевые экраны, которые некорректно отслеживают UDP-соединения, начинают отбрасывать RTP-пакеты. Перегрузка сети, jitter и потери пакетов ухудшают звук и в итоге приводят к обрывам.

Диагностика

ping -c 100 provider.sip.address | tail -5 cat /proc/sys/net/netfilter/nf_conntrack_udp_timeout cat /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream asterisk -rx "rtp show stats"

Решение

# Увеличиваем таймаут отслеживания UDP-соединений (30 с по умолчанию мало для звонков) echo 180 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout echo 180 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream # Закрепляем в /etc/sysctl.conf net.netfilter.nf_conntrack_udp_timeout=180 net.netfilter.nf_conntrack_udp_timeout_stream=180

Убедитесь, что межсетевой экран пропускает:

  • SIP-сигнализацию: UDP/TCP 5060 (или ваш нестандартный порт)
  • RTP-медиа: UDP 10000-20000 (диапазон должен совпадать с rtp.conf)
  • TLS/SRTP: TCP 5061 для шифрованного SIP

Причина 7: сбои qualify и keep-alive

Симптомы: в выводе pjsip show endpoints устройства отображаются как Unreachable или UNKNOWN. Звонки на отдельные внутренние номера не проходят, тогда как остальные работают.

Asterisk рассылает сообщения OPTIONS или NOTIFY, чтобы проверить, доступны ли ещё абонентские устройства. Если устройство не отвечает на такие проверки, Asterisk помечает его как недоступное.

Диагностика

asterisk -rx "pjsip show endpoints" | grep -E "Unavail|Unreachable" asterisk -rx "pjsip show aor <aor_name>"

Решение

; pjsip.conf [aor-template](!) type=aor qualify_frequency=60 ; Проверять каждые 60 секунд qualify_timeout=5.0 ; Ждать ответа 5 секунд max_contacts=1

Для нестабильных сетей увеличьте таймаут:

qualify_timeout=10.0 ; Мягче для каналов с высокой задержкой

Проактивный мониторинг: перехватить обрыв до того, как он случится

Разбираться с обрывами постфактум — когда клиенты уже жалуются — дорого и нервно. Настоящее решение — проактивный мониторинг, который замечает деградацию раньше, чем она превратится в обрывы.

Что мониторить

МетрикаПочему это важноПорог оповещения
Активные каналыПланирование ёмкостиБолее 80% от максимума
Распределение длительности звонковОбрывы выглядят как короткие звонкиВсплеск звонков короче 10 с
ASR (Answer-Seizure Ratio)Доля несостоявшихся вызововНиже 90%
ACD (Average Call Duration)Резкое падение сигнализирует о проблемахНиже 50% от нормы
Потери RTP-пакетовКачество звукаВыше 1%
JitterКачество звукаВыше 30 мс
Коды ответов SIPПаттерны ошибокВсплеск 408, 480, 503
Статус регистрации транковСвязностьЛюбой незарегистрированный транк
Загрузка CPU/памятиНехватка ресурсовCPU выше 80%

Анализ обрывов по данным CDR

В базе CDR (Call Detail Records) лежит ценный материал для расследования. Запросы помогут найти закономерности в обрывах:

-- Ищем звонки аномально малой длительности (вероятные обрывы) SELECT calldate, src, dst, duration, disposition, channel FROM cdr WHERE duration < 10 AND disposition = 'ANSWERED' AND calldate > NOW() - INTERVAL 24 HOUR ORDER BY calldate DESC; -- Доля обрывов по часам (находим самые проблемные периоды) SELECT HOUR(calldate) as hour, COUNT(*) as total_calls, SUM(CASE WHEN duration < 10 AND disposition = 'ANSWERED' THEN 1 ELSE 0 END) as short_calls, ROUND(SUM(CASE WHEN duration < 10 AND disposition = 'ANSWERED' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as drop_rate_pct FROM cdr WHERE calldate > NOW() - INTERVAL 7 DAY GROUP BY HOUR(calldate) ORDER BY drop_rate_pct DESC; -- Доля обрывов по транкам (выявляем проблемных провайдеров) SELECT SUBSTRING_INDEX(channel, '-', 1) as trunk, COUNT(*) as total_calls, SUM(CASE WHEN duration < 10 AND disposition = 'ANSWERED' THEN 1 ELSE 0 END) as potential_drops, ROUND(AVG(duration), 1) as avg_duration FROM cdr WHERE calldate > NOW() - INTERVAL 30 DAY GROUP BY trunk ORDER BY potential_drops DESC;

Автоматическое выявление обрывов в Astervis

Команды CLI и SQL-запросы хороши для разовой диагностики, но для непрерывного мониторинга они не масштабируются. Astervis даёт дашборды реального времени, специально сделанные под колл-центры на Asterisk, и автоматизирует весь этот процесс:

  • Мониторинг звонков в реальном времени — на живом дашборде видно каждый активный вызов, его длительность, кодек и метрики качества
  • Автоматическое выявление обрывов — Astervis подсвечивает аномально короткие звонки и показывает проблемы по конкретным транкам через тепловые карты: сразу видно, когда и где происходят обрывы
  • Контроль работы операторов — можно сопоставить обрывы с конкретными операторами, очередями или временными интервалами и понять, системная это проблема или дело в отдельном сотруднике
  • Мониторинг состояния транков — статус регистрации, объём вызовов и метрики качества по каждому транку с мгновенными оповещениями, если транк упал
  • Историческая аналитика — 30+ графиков: динамика объёма звонков, время ожидания в очереди, KPI операторов и многое другое — и всё это без единой строчки SQL

Astervis подключается к вашему серверу Asterisk за считанные минуты одной командой установки и сразу начинает собирать данные. Вместе с ручными шагами диагностики выше вы получаете и глубокий разбор инцидентов, и автоматический мониторинг, который предотвращает будущие проблемы.

Начните бесплатный 14-дневный период

Шпаргалка: диагностика по симптому

СимптомНаиболее вероятная причинаС какой команды начать
Обрыв ровно через 30 секундПроблемы с NATpjsip show endpoint
Обрыв на 15-й или 30-й минутеРассогласование session timersПроверить настройку таймеров
Случайные обрывы, часть транковSIP ALGОтключить ALG, снять tcpdump
Нет звука, затем обрывНесовпадение кодековПроверить настройки allow
Обрывы в часы пикНехватка ресурсовtop, core show channels count
Один внутренний номер недоступенТаймаут qualifypjsip show endpoints
Обрывы на удалённых номерахМежсетевой экран / таймаут UDPПроверить настройки conntrack

Чек-лист профилактики

Пройдитесь по этому списку при развёртывании нового Asterisk, чтобы обрывы не появились с самого начала:

  • Выставить direct_media=no на всех endpoint
  • Правильно прописать external_media_address и external_signaling_address
  • Отключить SIP ALG на всех роутерах по пути прохождения трафика
  • Поднять таймаут UDP conntrack минимум до 180 секунд
  • Согласовать списки кодеков между Asterisk и всеми SIP-провайдерами
  • Настроить session timers под требования провайдера либо отключить их
  • Выставить лимит файловых дескрипторов от 65536
  • Открыть на межсетевом экране и SIP (5060), и весь диапазон RTP (10000-20000)
  • Настроить мониторинг регистрации транков и качества связи
  • Провести нагрузочный тест одновременными звонками на ожидаемом пике

Заключение

У обрывов звонков в Asterisk почти всегда есть конкретная и устранимая причина. Главные виновники — ошибки в настройке NAT, вмешательство SIP ALG и рассогласование session timers — покрывают подавляющее большинство случаев и чинятся без особых сложностей, как только их удалось опознать.

Ключ к тому, чтобы избавиться от обрывов навсегда, — не только починить текущую поломку, но и выстроить мониторинг, который поймает следующую раньше ваших клиентов. Будь то команды CLI, запросы к CDR или специализированный инструмент вроде Astervis — цель одна: видеть каждый звонок, каждый транк и каждую потенциальную точку отказа.

Ваш колл-центр на Asterisk заслуживает большего, чем оборванные звонки. Начните измерять, начните чинить и начните давать клиентам ту надёжную связь, которой они от вас ждут.

Хватит гадать. Начни видеть.

Реальная картина вашего Asterisk колл-центра: время ожидания, активность операторов, нагрузка на транки и 30+ графиков. On-premise на вашем сервере. Установка за 5 минут. Без карты.

От $119/мес flat. Без ограничения на операторов. Триал 14 дней.

Поделиться