При звонке меня слышат, а я нет: односторонняя слышимость SIP и NAT в Asterisk
- При звонке один из собеседников отлично слышит речь, а второй находится в полной тишине (односторонний звук).
- Звонок принимается, но через ровно 20–30 секунд происходит автоматический обрыв соединения.
- Проблема возникает только при звонках на удаленные телефоны (Home Office) или через внешнего SIP-провайдера.
- В локальной сети между двумя соседними кабинетами звук работает идеально в обе стороны.
В чем физика проблемы? (Почему звук идет только в одну сторону)
В IP-телефонии звонок разделен на две части: сигналы управления (SIP по порту 5060) и сам голос (RTP-аудиопоток по случайным портам 10000–20000). Сигналы вызова успешно проходят через роутер (NAT), и телефон звонит. Но когда вы берете трубку, голосовой поток от сервера отправляется на внутренний «серый» IP-адрес вашего телефона (например, 192.168.1.55), который невидим в интернете. В итоге звук уходит в никуда.
Пошаговое исправление в настройках Asterisk / FreePBX:
Шаг 1. Укажите публичный IP и локальные подсети АТС
Сервер телефонии должен четко знать свой внешний IP-адрес, чтобы правильно сообщать его удаленным абонентам в SDP-пакетах.
Для FreePBX:
- Откройте меню Settings (Настройки) -> Asterisk SIP Settings.
- На вкладке General найдите блок NAT Settings.
- Нажмите кнопку Detect Network Settings (Автоопределение): система заполнит ваш внешний адрес (External Address) и локальную сеть (Local Networks, например
192.168.1.0 / 24).
Для классического Asterisk (pjsip.conf / sip.conf):
В файле /etc/asterisk/pjsip.conf для транспорта пропишите:
[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.10 ; Ваш реальный белый IP
external_signaling_address=203.0.113.10Шаг 2. Проброс диапазона RTP-портов на интернет-роутере
Голосовые пакеты должны беспрепятственно долетать до сервера АТС:
- Зайдите на ваш главный маршрутизатор (MikroTik, Keenetic, Cisco).
- Создайте правило Port Forwarding (Проброс портов):
- Протокол: UDP
- Диапазон внешних портов:
10000-20000 - Внутренний IP: адрес вашего сервера Asterisk (например,
192.168.1.50) - Внутренний порт:
10000-20000
Шаг 3. Включение поддержки NAT для учетных записей абонентов
В настройках каждого внутреннего номера (Extension) удаленного сотрудника:
- Для PJSIP: установите
force_rport = yes,rewrite_contact = yes,rtp_symmetric = yes. - Для chan_sip: установите
nat = force_rport,comediaиdirectmedia = no.
Частые вопросы (FAQ)
Почему звонок обрывается ровно через 30 секунд при отсутствии звука?
Если сервер Asterisk не получает ни одного входящего RTP-пакета с голосом в течение таймаута (rtptimeout), он считает, что связь оборвалась, и принудительно завершает вызов сигналом BYE.
Что такое Direct Media (canreinvite)?
Это функция, заставляющая телефоны передавать голос напрямую друг другу в обход сервера АТС. Если один из аппаратов за NAT, Direct Media обязана быть отключена (no), иначе звука не будет.
Нужно ли пробрасывать порты 10000-20000 на домашнем роутере удаленного сотрудника?
Нет. Достаточно пробросить порты только на роутере в офисе, где стоит сервер АТС. На стороне клиента роутер сам откроет обратный порт благодаря механизму symmetric RTP (comedia).
Как отключить SIP ALG на роутере и зачем это нужно?
SIP ALG пытается модифицировать IP-адреса внутри пакетов, но делает это с ошибками, порождая односторонний звук. В роутерах (Zyxel, Asus, TP-Link) найдите меню NAT / Firewall и снимите галочку с 'SIP Passthrough' или 'SIP ALG'.