Траблшутинг сброса звонков ровно на 30-й секунде в Asterisk (NAT / ACK Timeout)
- Входящие или исходящие звонки стабильно сбрасываются ровно на 30–32 секунде после поднятия трубки.
- Односторонняя слышимость или полное отсутствие звука первые 30 секунд разговора.
- В системном логе Asterisk фиксируется предупреждение:
Retransmission timeout reached on transmission ... for seqno ... (Critical Response). - В дампе трафика sngrep видно, что вызывающая сторона отправляет пакет
200 OK, но не получает в ответ подтверждающий пакетACK.
1. Причина сброса звонка на 30-й секунде
В протоколе SIP при установлении вызова сторона, принявшая звонок, отправляет пакет 200 OK. Инициатор обязан подтвердить прием пакетом ACK. Если из-за NAT, неправильной маршрутизации или некорректного IP в заголовке Contact пакет ACK не доходит за время таймера транзакции SIP (T1/T2, стандартно 32 секунды), станция разрывает сессию отправкой BYE.
2. Корректная настройка NAT в /etc/asterisk/pjsip.conf
В секции транспорта необходимо явно указать внешний публичный белый IP-адрес и локальные подсети:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; Укажите ваш внешний публичный статический IP-адрес
external_media_address=203.0.113.50
external_signaling_address=203.0.113.50
; Укажите локальные подсети, которые НЕ нужно натить
local_net=192.168.0.0/16
local_net=10.0.0.0/8
local_net=172.16.0.0/123. Конфигурация параметров эндпоинта за NAT
[trunk-provider]
type=endpoint
context=from-pstn
disallow=all
allow=alaw
allow=ulaw
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
ice_support=no
aors=trunk-provider-aorrtp_symmetric=yes: отправляет медиапоток RTP обратно на тот же IP/порт, с которого он пришел;force_rport=yes: отвечает на порт, с которого фактически пришел UDP-пакет (RFC 3581);rewrite_contact=yes: переписывает заголовок Contact адресом из сетевого уровня IP-пакета.
4. Настройка параметров межсетевого экрана (Router/Firewall)
На пограничном маршрутизаторе (MikroTik, pfSense, Cisco, FortiGate):
- Обязательно отключите SIP ALG (SIP Helper):
# Для MikroTik: /ip firewall service-port disable sip - Увеличьте таймаут UDP-соединений для SIP (UDP Timeout) до 300 секунд.
- Пробросьте диапазон RTP портов на PBX (по умолчанию UDP
10000-20000).
5. Проверка диаграммы вызова через sngrep
sngrep -cНайдите звонок, завершившийся за 32 секунды. Убедитесь, что после SIP/2.0 200 OK отправляется и успешно принимается ACK.
Частые вопросы (FAQ)
Почему звонок рвется именно на 30-й, а не на 10-й или 60-й секунде?
Стандарт RFC 3261 определяет таймер транзакции Timer B/Timer F (64*T1 = 32 секунды). В течение этого времени отправляющая сторона 7 раз повторяет пакет 200 OK. Если ACK так и не получен, соединение принудительно разрывается по таймауту.
Почему включенный SIP ALG на роутере ломает связь?
SIP ALG пытается на лету модифицировать SIP-пакеты в памяти роутера, но часто делает это с ошибками: портит контрольные суммы, некорректно меняет Call-ID или заголовки Via/Contact, приводя к потере ACK и отсутствию звука.
Как исправить проблему 30 секунд, если у сервера динамический внешний IP?
Используйте параметр external_signaling_address = your-dynamic-host.ddns.net, настроив регулярное обновление Dynamic DNS через cron или демон ddclient.
Что делать, если ACK теряется только на софтфонах вне офиса?
Убедитесь, что в конфигурации эндпоинта включены директивы force_rport=yes и rewrite_contact=yes, а на клиентском софтфоне отключен STUN (если PBX сама обрабатывает NAT).