SIP-транк отваливается (Unreachable): настройка Qualify и Keep-Alive в Asterisk
Симптомы: входящие звонки не поступают, транк «засыпает»
Утром или после периода неактивности клиенты не могут дозвониться в компанию — в трубке звучит «Абонент временно недоступен» или короткие гудки. При этом исходящие звонки работают, и сразу после совершенного исходящего звонка входящая связь внезапно восстанавливается. В консоли Asterisk транк светится красным:
Contact provider-trunk/sip:provider.ru is Unreachable. State: Non-qualified. RTT: 0.000 msПричины периодического засыпания транка
| Фактор сбоя | Почему это происходит | Решение в настройках |
|---|---|---|
| Таймаут NAT-таблицы роутера | Роутер закрывает открытый UDP-порт через 30–60 секунд бездействия | Включить постоянный пинг keep-alive / qualify |
| Смена IP при регистрации | Провайдер ожидает перерегистрацию, но таймер не истек | Уменьшить registration_expiration до 120 с |
| Блокировка провайдером OPTIONS | Провайдер считает частые опросы флудом | Увеличить интервал qualify до 60 секунд |
Почему транк «засыпает» без звонков?
Если ваш сервер телефонии находится за офисным роутером (NAT), роутер открывает временное «окно» для входящих пакетов из интернета только тогда, когда сервер сам отправляет что-то наружу. Если звонков нет 2-3 минуты, роутер закрывает трансляцию портов в своей таблице NAT, и сервер провайдера больше не может доставить входящий звонок до вашей АТС.
Как заставить Asterisk удерживать канал открытым (Keep-Alive)
Вариант 1. Для современного драйвера PJSIP (pjsip.conf)
Добавьте опрос провайдера специальными короткими служебными пакетами SIP OPTIONS каждые 25–30 секунд (это сбрасывает таймер NAT роутера):
[provider-aor]
type = aor
contact = sip:provider.telecom.ru:5060
qualify_frequency = 25 ; Пинговать провайдера каждые 25 секунд!
qualify_timeout = 3.0 ; Таймаут ответа в секундах
[provider-reg]
type = registration
outbound_auth = provider-auth
server_uri = sip:provider.telecom.ru:5060
client_uri = sip:74951234567@provider.telecom.ru:5060
expiration = 120 ; Перерегистрация каждые 2 минутыВариант 2. Для старого драйвера chan_sip (sip.conf)
[rostelecom]
type = peer
host = provider.telecom.ru
qualify = yes ; Включить опрос Keep-Alive (каждые 60 сек)
qualifyfreqok = 25000 ; Опрашивать каждые 25000 мс (25 сек)
nat = force_rport,comedia ; Корректная обработка NAT
insecure = port,inviteПерезагрузите модуль телефонии:
# Для PJSIP:
asterisk -rx "pjsip send qualify provider-trunk"
asterisk -rx "pjsip show endpoints"
# Для CHAN_SIP:
asterisk -rx "sip reload"
asterisk -rx "sip show peers"Совет: В настройках FreePBX откройте Connectivity → Trunks → ваш транк → вкладка pjsip Settings → Advanced и установите параметр Qualify Frequency = 25.
Частые вопросы (FAQ)
Что означает статус «Reachable» и значение RTT (например, 12 ms)?
Статус Reachable означает, что транк активен и отвечает на сигналы. RTT (Round Trip Time) — это сетевой пинг до сервера провайдера в миллисекундах (норма: от 5 до 40 ms).
Что делать, если провайдер не отвечает на пакеты SIP OPTIONS?
Некоторые операторы связи блокируют пакеты OPTIONS. В этом случае в PJSIP укажите <code>qualify_frequency = 0</code> (отключить опрос), но уменьшите интервал перерегистрации <code>expiration = 60</code>.
Поможет ли настройка UDP Timeout на роутере?
Да! На продвинутых роутерах (например, MikroTik) увеличьте значение <i>IP → Firewall → Connections → Tracking → UDP Timeout</i> со стандартных 10 секунд до <b>300 секунд</b>.
Почему транк падает только по выходным дням?
Потому что в выходные нет активного исходящего трафика сотрудников, и таймаут сессии NAT на роутере успевает гарантированно истечь при отсутствии настроенного <code>qualify</code>.