Односторонняя слышимость в VoIP/SIP: проброс RTP портов и NAT на роутере
Классическая проблема телефонии: «Алло, вас не слышно!»
Сотрудник звонит клиенту или принимает входящий звонок. Соединение успешно устанавливается, таймер разговора идет, но возникает один из симптомов:
- Сотрудник отлично слышит клиента, но клиент не слышит сотрудника вообще (полная тишина).
- Клиент слышит менеджера, а менеджер слышит только тишину.
- Звонок самопроизвольно сбрасывается ровно через 30–32 секунды.
Схема разделения сигнализации и голоса в SIP
| Тип протокола | За что отвечает | Стандартные порты | Причина тишины |
|---|---|---|---|
| SIP (Сигнализация) | Гудки, набор номера, снятие трубки | 5060 UDP / 5061 TLS | Работает исправно (звонок проходит) |
| RTP (Голосовой поток) | Передача самого звука голоса | 10000–20000 UDP | Заблокирован роутером (NAT) |
Почему возникает односторонняя слышимость простыми словами?
Протокол SIP передает только команду: «Привет, соедини меня с номером 100». А сам голос летит отдельным потоком по протоколу RTP на случайных UDP-портах. Офисный роутер (NAT) пропускает текстовую команду SIP, но не знает, какому именно компьютеру в локальной сети отдавать входящие голосовые пакеты, и просто отбрасывает их.
Пошаговый план устранения неисправности
- Обязательно отключите SIP ALG на офисном роутере (MikroTik, Keenetic, TP-Link, Zyxel):
Функция SIP ALG (Application Layer Gateway) в 99% случаев криво переписывает заголовки пакетов и ломает звук.
# Отключение SIP Helper на роутерах MikroTik в Terminal: /ip firewall service-port disable sip - Настройте внешний IP-адрес (NAT) в Asterisk:
Если АТС находится за роутером, откройте файл
/etc/asterisk/pjsip.conf(илиsip.conf) и пропишите внешний белый IP-адрес вашей компании:[transport-udp] type = transport protocol = udp bind = 0.0.0.0:5060 local_net = 192.168.1.0/24 ; Ваша локальная сеть external_media_address = 203.0.113.15 ; Внешний белый IP офиса external_signaling_address = 203.0.113.15 - Пробросьте диапазон RTP-портов на роутере:
В настройках Port Forwarding (Виртуальные серверы) на роутере пробросьте диапазон UDP 10000-20000 на внутренний локальный IP-адрес сервера Asterisk.
- На стороне софтфона / IP-телефона:
В настройках аккаунта MicroSIP/Yealink включите параметр NAT: STUN-сервер (например,
stun.l.google.com:19302) или активируйте опцию Rport.
Почему звонок падает через 30 секунд? Если АТС не получает подтверждающих ACK пакетов от удаленной стороны из-за закрытого NAT, она считает, что соединение разорвалось, и принудительно вешает трубку ровно через 32 секунды.
Частые вопросы (FAQ)
Что такое SIP ALG и почему его все рекомендуют выключать?
SIP ALG задумывался как умный помощник для модификации SIP-пакетов через NAT. На практике в домашних и офисных роутерах он работает с ошибками, повреждая контрольные суммы и адреса портов в SDP-сессиях.
Можно ли сузить диапазон портов 10000-20000 в Asterisk?
Да, в файле <code>/etc/asterisk/rtp.conf</code> можно задать, например, <code>rtpstart=10000</code> и <code>rtpend=10500</code> (на каждый одновременный разговор требуется по 2 порта).
Поможет ли VPN избавиться от проблем с NAT?
Да! Объединение удаленных IP-телефонов и сервера АТС через WireGuard, OpenVPN или IPSec полностью устраняет проблему NAT и односторонней слышимости.
Что делать, если у нас динамический IP-адрес от провайдера?
Используйте динамический DNS (DDNS). В настройках Asterisk PJSIP вместо внешнего IP укажите доменное имя: <code>external_media_address = myoffice.ddns.net</code>.