Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

PJSIP_ICE_NEGOTIATION_FAILED IP-Телефония и СКУД

Ошибка Asterisk PJSIP: Failed to create session media: ICE negotiation failed

Обновлено: 24.08.2026 · Официальная документация ↗
  • В консоли 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 = yes

2. Настройка внешнего адреса и 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:19302

3. Открытие портов на межсетевом экране

ufw allow 8089/tcp
ufw allow 10000:20000/udp
# Либо для iptables:
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT

4. Применение настроек и перезагрузка модулей

asterisk -rx "pjsip reload"
asterisk -rx "module reload res_rtp_asterisk.so"
asterisk -rx "pjsip show endpoint <endpoint_name>"
💡 Практика специалистов: Если Asterisk развернут в облаке (AWS EC2, GCP, Azure), обязательно прописывайте публичный Elastic IP в параметр external_media_address в pjsip.conf, иначе ICE будет отдавать клиентам серый внутренний адрес инстанса.

Частые вопросы (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.

Полезные материалы
Рекомендуем