SIP Error 302 Moved Temporarily: переадресация вызовов и Contact URI
- Вызов сбрасывается сразу после набора, а в логах фиксируется получение ответа
302 Moved Temporarily. - Аппаратная переадресация на IP-телефоне (Call Forward) не работает через транк оператора.
- Циклическое перенаправление вызовов (Call Forwarding Loop), приводящее к исчерпанию лимита Max-Forwards.
- Подмена Caller ID при переадресации, вызывающая блокировку вызова антифрод-системой оператора.
1. Архитектура ответа SIP 302 Moved Temporarily (RFC 3261 §21.3.2)
Ответ 302 Moved Temporarily информирует клиента о том, что вызываемый абонент временно доступен по другому адресу, указанному в обязательном заголовке Contact. Клиент, получивший 302, должен завершить текущую транзакцию (отправить ACK) и инициировать новый запрос INVITE по адресу из заголовка Contact.
2. Анализ переадресации в SIP-дампе
sngrep -c -d any "302 Moved"Пример структуры пакета перенаправления:
SIP/2.0 302 Moved Temporarily
Via: SIP/2.0/UDP 192.168.1.10:5060;branch=z9hG4bK-abc
From: ;tag=1234
To: ;tag=5678
Call-ID: call-999@192.168.1.10
CSeq: 1 INVITE
Contact: 3. Разрешение или запрет обработки 302 в Asterisk (chan_pjsip)
По умолчанию Asterisk может либо самостоятельно следовать по адресу переадресации, либо передавать 302 обратно инициатору. Настройка поведения в pjsip.conf:
[endpoint-template](!)
type=endpoint
; Разрешить Asterisk выполнять переадресацию локально
follow_early_media_fork=yes
; Запрет клиентам отправлять 302 в транк (перехват на PBX)
devicestate_priorities=14. Обработка переадресации внутри Dialplan без отправки 302 оператору
Вместо использования функции Call Forward на телефоне настройте перевод внутри диалплана:
[internal-forward]
exten => 200,1,NoOp(Проверка локальной переадресации)
same => n,Set(FWD_NUM=${DB(CF/200)})
same => n,GotoIf($["${ISNULL(${FWD_NUM})}" = "0"]?forward:dial_local)
same => n(dial_local),Dial(PJSIP/200,20)
same => n,Hangup()
same => n(forward),NoOp(Перевод звонка на мобильный ${FWD_NUM})
same => n,Set(CALLERID(num)=+74951112233) ; Установка доверенного CallerID компании
same => n,Dial(PJSIP/${FWD_NUM}@telecom_trunk,30)
same => n,Hangup() Частые вопросы (FAQ)
Почему оператор связи блокирует звонок после 302 переадресации?
При автоматическом следовании по 302 АТС часто сохраняет исходный номер звонящего клиента в поле From. Если этот номер не принадлежит вашему пулу, оператор отклонит вызов ошибкой 403 Forbidden или 608 Rejected.
Какой заголовок является обязательным в ответе SIP 302?
Заголовок Contact, содержащий один или несколько новых URI-адресов назначения для перенаправления вызова.
Как защититься от бесконечного цикла переадресаций (Loop)?
Протокол SIP использует заголовок Max-Forwards (по умолчанию 70), значение которого уменьшается на 1 при каждом хопе. При достижении 0 возвращается ошибка 483 Too Many Hops.
В чем разница между SIP 301 и SIP 302?
301 Moved Permanently указывает, что номер навсегда изменил адрес, и клиент должен обновить свои адресные книги. 302 Moved Temporarily указывает на временную переадресацию (например, включен Call Forwarding).