Asterisk: chan_pjsip.c Failed to set remote RTP address - invalid SDP c= line
- Предупреждение:
WARNING: chan_pjsip.c: Failed to set remote RTP address - invalid SDP c= line. - Вызов успешно устанавливается по SIP-сигнализации (200 OK), но сразу прерывается или наблюдается односторонняя слышимость.
- В теле SDP пакета от удаленного узла содержится некорректный IP:
c=IN IP4 0.0.0.0или немаршрутизируемый адрес. - SIP сессия сбрасывается с ошибкой RTP timeout через 30 секунд.
1. Анализ полученного SDP пакета в PJSIP History
Включите дамп SIP сигнализации в CLI:
asterisk -rvvv
pjsip set logger onИзучите тело входящего пакета INVITE или 200 OK на предмет секции Connection Data (c=):
v=0
o=root 12345 1 IN IP4 192.168.1.100
s=Asterisk
c=IN IP4 0.0.0.0 <-- ОШИБКА: НЕДОПУСТИМЫЙ RTP АДРЕС
t=0 0
m=audio 10000 RTP/AVP 8 02. Включение механизмов симметричного RTP в pjsip.conf
Если удаленный абонент или оператор отправляет 0.0.0.0 при удержании (Hold) или за NAT, включите автоопределение адреса по первому пришедшему RTP пакету в /etc/asterisk/pjsip.conf:
[my_endpoint]
type = endpoint
context = from-external
disallow = all
allow = alaw,ulaw
; Симметричный RTP и форсирование портов
rtp_symmetric = yes
force_rport = yes
rewrite_contact = yes
direct_media = no
asymmetric_rtp_codec = no3. Проверка диапазона портов RTP в rtp.conf
Убедитесь, что диапазон RTP портов не заблокирован локальным файрволом:
# /etc/asterisk/rtp.conf
[general]
rtpstart=10000
rtpend=20000Откройте UDP порты в брандмауэре Linux:
# UFW (Ubuntu/Debian)
ufw allow 10000:20000/udp
# Firewalld (RHEL/CentOS/Rocky)
firewall-cmd --permanent --add-port=10000-20000/udp
firewall-cmd --reload4. Отключение логирования PJSIP
asterisk -rx "pjsip set logger off" Частые вопросы (FAQ)
Почему удаленная сторона отправляет c=IN IP4 0.0.0.0?
В устаревшем стандарте RFC 2543 отправка IP 0.0.0.0 в строке c= использовалась для перевода звонка в режим удержания (Music on Hold). Современный стандарт RFC 3264 требует использовать атрибут a=sendonly или a=inactive.
Что делает директива rtp_symmetric = yes?
Она указывает Asterisk игнорировать IP и порт из SDP c=/m= строк и отправлять исходящий медиапоток RTP строго на тот IP и порт, с которого фактически начали поступать входящие RTP пакеты.
Зачем отключать direct_media (direct_media = no)?
direct_media = no заставляет весь аудиопоток проходить через Asterisk, предотвращая сбои прямой передачи медиа между клиентами, находящимися за разными NAT-маршрутизаторами.
Как перезагрузить конфигурацию PJSIP без разрыва текущих звонков?
Выполните команду: asterisk -rx "pjsip reload".