Серверы STUN и TURN в IP-телефонии: решение проблемы односторонней слышимости
- При звонке один из собеседников не слышит другого (односторонняя слышимость / One-Way Audio).
- Звонок успешно соединяется, но ровно через 30 секунд происходит автоматический обрыв связи.
- IP-телефон за домашним роутером не принимает входящие звонки от офисной АТС.
- В SIP-пакетах (SDP) передается локальный «серый» IP-адрес (например,
192.168.1.15) вместо публичного белого адреса.
1. В чем корень проблемы: почему звук исчезает за роутером (NAT)
Протокол SIP работает хитро: управляющие команды (вызов, поднятие трубки, гудки) передаются по одному порту (обычно UDP 5060), а сам живой голос (RTP-аудиопоток) летит напрямую по случайным динамическим портам (от 10000 до 20000).
Когда домашний телефон находится за роутером (NAT), он отправляет серверу сообщение: «Я готов принимать звук на адрес 192.168.1.50». Но сервер АТС в интернете ничего не знает про домашнюю сеть абонента и пытается отправить звук на локальный адрес в никуда. В итоге — один абонент говорит, а второй слышит тишину.
2. Что делает STUN-сервер (Session Traversal Utilities for NAT)
STUN-сервер — это бесплатный интернет-помощник для телефона. Телефон делает запрос к STUN-серверу и спрашивает: «Под каким публичным IP-адресом и портом меня видит интернет?». Получив ответ, телефон вставляет правильный внешний IP-адрес в SIP-пакет, и звук начинает ходить в обе стороны.
3. Что делает TURN-сервер (Traversal Using Relays around NAT)
Если роутер использует сложный симметричный NAT (Symmetric NAT, часто встречается в сетях сотовых операторов 4G/LTE), обычный STUN не справляется. В этом случае на помощь приходит TURN-сервер: он выступает в роли прямого ретранслятора (прокси), через который принудительно прокачивается весь голосовой трафик.
4. Как прописать публичный STUN-сервер в настройках IP-телефона
- Зайдите в веб-интерфейс вашего IP-телефона или софтфона (MicroSIP, Zoiper).
- Перейдите в раздел Network (Сеть) или SIP Account → Advanced (Дополнительно).
- Найдите пункт STUN Server и активируйте его (переведите в положение Enabled).
- В поле адреса укажите любой надежный публичный STUN-сервер:
stun.l.google.com:19302stun.sipgate.net:10000stun.ekiga.net
- Сохраните настройки. Телефон автоматически определит свой внешний адрес и устранит проблему одностороннего звука.
Частые вопросы (FAQ)
Почему звонок сбрасывается ровно через 30 секунд?
Когда телефон не получает подтверждающих ACK пакетов из-за блокировки портов роутером или когда RTP-аудиопоток не доходит до АТС, сервер считает, что связь потеряна, и принудительно завершает сессию по таймауту RTP Timeout (обычно 30-32 секунды).
Нужно ли включать функцию SIP ALG на домашнем роутере?
В 99% случаев функцию SIP ALG на роутере нужно СТРОГО ОТКЛЮЧАТЬ. Этот встроенный механизм пытается модифицировать заголовки пакетов, но делает это некорректно, что и порождает односторонний звук и сбои регистрации.
В чем главный недостаток TURN-сервера по сравнению со STUN?
TURN пропускает через себя весь массив голосовых данных, что создает огромную нагрузку на интернет-канал и процессор TURN-сервера, в то время как STUN только подсказывает внешний адрес и не участвует в передаче голоса.
Как решить проблему NAT на стороне самой АТС Asterisk?
В настройках PJSIP эндпоинта укажите параметры: direct_media=no, rtp_symmetric=yes, force_rport=yes и rewrite_contact=yes.