Ошибка Asterisk PJSIP: Failed to create session media: ICE negotiation failed
- В консоли Asterisk регистрируется ошибка:
ERROR[...]: res_pjsip_session.c: Failed to create session media: ICE negotiation failed. - Звонки через WebRTC (SIP.js, JsSIP) мгновенно сбрасываются сразу после отправки 200 OK или ACK.
- Односторонняя слышимость или полное отсутствие медиатрафика (RTP) при звонках между клиентами за NAT.
- В дампе SIP SDP-кандидаты (ice-ufrag, ice-pwd, a=candidate) отбрасываются либо не согласуются клиентом.
1. Включение поддержки ICE и мультиплексирования RTP/RTCP
В файле /etc/asterisk/pjsip.conf убедитесь, что в профиле конечной точки (endpoint) для WebRTC активированы ключевые директивы:
[webrtc_endpoint](!)
type = endpoint
webrtc = yes
ice_support = yes
use_avpf = yes
media_encryption = dtls
dtls_verify = fingerprint
dtls_cert_file = /etc/asterisk/keys/asterisk.pem
dtls_ca_file = /etc/asterisk/keys/ca.crt
dtls_setup = actpass
rtcp_mux = yes
media_use_received_transport = yes2. Настройка внешнего адреса и STUN-сервера
Если сервер находится за NAT, добавьте в /etc/asterisk/pjsip.conf в секцию транспорта:
[transport-wss]
type = transport
protocol = wss
bind = 0.0.0.0:8089
local_net = 192.168.1.0/24
local_net = 10.0.0.0/8
external_media_address = 203.0.113.10
external_signaling_address = 203.0.113.10В файле /etc/asterisk/rtp.conf настройте STUN:
[general]
rtpstart=10000
rtpend=20000
icesupport=true
stunaddr=stun.l.google.com:193023. Открытие портов на межсетевом экране
ufw allow 8089/tcp
ufw allow 10000:20000/udp
# Либо для iptables:
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT4. Применение настроек и перезагрузка модулей
asterisk -rx "pjsip reload"
asterisk -rx "module reload res_rtp_asterisk.so"
asterisk -rx "pjsip show endpoint <endpoint_name>" Частые вопросы (FAQ)
Что вызывает ошибку 'ICE negotiation failed' в Asterisk?
Ошибка возникает, когда стек PJSIP и клиентский WebRTC-браузер не могут согласовать общую пару ICE-кандидатов из-за блокировки UDP-портов RTP, некорректного внешнего IP за NAT или отключенного rtcp_mux.
Почему для WebRTC обязательно включать rtcp_mux?
Современные браузеры по стандарту WebRTC требуют совмещения трафика RTP и RTCP на одном порту (bundle-only / rtcp-mux). Если rtcp_mux = no, сборка медиасессии аварийно завершится.
Нужен ли TURN-сервер для Asterisk?
Asterisk выступает в роли медиарелея (B2BUA), поэтому ему обычно достаточно внешнего STUN или жестко заданного external_media_address, однако клиентским браузерам за жестким Symmetric NAT может потребоваться внешний TURN (coturn).
Как проверить генерацию ICE-кандидатов в SIP CLI?
Включите дебаг протокола RTP командой 'rtp set debug on' и дебаг PJSIP командой 'pjsip set logger on' в CLI Asterisk.