Asterisk 11 за NAT, нет звука в одну сторону, нет слышимости... Что делать?

Опубликовано в Asterisk

Asterisk 11 за NAT

Преодоления NAT для Asterisk бывает очень сложной задачей (нет звука), потому как RTP трафик и SIP сигнализация идут отдельно. В интернете практически все описания настроек опции NAT, сводятся к более старым версия Asterisk 1.8.  Попытаемся рассмотреть опции настроек, для актуального Asterisk 11. Если у вас нет звука, нет звука в одну сторону, нет слышимости, прочтите внимательно эту инструкцию.

Клиент за NAT

Asterisk Клиент за NAT

Когда клиент пытается инициировать сеанс связи, оно отправляет SIP сообщение, содержащее его IP-адрес и некоторую дополнительную информацию. Получив это сообщение, Asterisk использует его, чтобы определить, куда отправить ответ на это сообщение. Поскольку устройство находится за NAT, SIP-сообщение будет иметь серый  адрес, например, 192.168.1.104. Тем не менее, мы можем сообщить Asterisk, игнорировать SIP-адрес этого сообщения, а вместо этого использовать то, что поставляется сетевым стеком.  Рассмотрим какие опции мы можем использовать в sip.conf для преодоления NAT:

nat=no                 ;не выполнять никакой специальной обработки NAT, кроме той что указана в RFC 3581.
nat=force_rport        ;даже если ни одного параметра rport не было указано, действовать, так, как если бы он был.
nat=comedia            ;отправлять RTP пакеты обратно к порту с которого они были получены, игнорируя требуемый порт в SDP заголовке.
nat=auto_force_rport   ;если Asterisk сможет определить, что устройство находится за NAT, установить опцию force_rport. Значение по умолчанию, если не указана опция nat.
nat=auto_comedia       ;если Asterisk сможет определить, что устройство находится за NAT, установить опцию comedia.
nat=force_rport,comedia ;опция заменяющая nat=yes в более новых версия Asterisk.

Стоит заметить что начиная с версии Asterisk 11: nat=yes устарело, и необходимо использовать nat=force_rport,comedia.

RFC 3581 позволяет одному клиенту использовать параметр rport, для того чтобы передать другому клиенту, что оно должно реагировать  на адрес источника IP и порт запрос, а не на IP адрес прописанный в SIP заголовке. Установка параметра rport может произойти, когда устройство знает, что он находиться за NAT и не может записать информацию, которая была бы необходима, для связи в обоих направлениях, в заголовке SIP.  Asterisk всегда читает параметр rport, если он передается, но так как это происходит не так часто, как хотелось бы, мы можем заставить Asterisk предположить, что устройство будет передавать параметр rport. Выполняя это, мы заставляем Asterisk всегда отвечать на адрес IP и порт источника сообщения, от которого он получил запрос. Если настройки NAT явно не определены, Asterisk будет выполнять auto_force_rport, в качестве параметра по умолчанию. Вы можете принудительно изменить такое поведение, установив nat=force_rport.

Во многих реализациях NAT, при не получении пакетов поддержки диалога,  может происходить закрытие соединения. В Asterisk для предотвращения этого используется опция qualify=yes, выполняющая отправку OPTIONS серверу  каждые 2000 миллисекунд (2 секунды), не давая закрыть сессию NAT устройством. Также можно указать свое время в миллисекундах:

qualifyfreq=60    ;проверки доступности (зондирование) клиента, на  дальнем конце каждые 60 секунд.
qualify=120000    ;проверять соединения методом OPTIONS каждые 10 секунд.
qualify=yes       ;проверять соединения методом OPTIONS каждые 2 секунд.

 

SIP клиенты и Asterisk за NAT

SIP клиенты и Asterisk за NAT

Есть два основных варианта, когда Asterisk находится за NAT: externaddr и extern хост.

Внешний адрес шлюза (маршрутизатора) во внешнюю сеть. «externaddr = hostname[:port]» указывает статический адрес[:port] который будет использован в SIP и SDP сообщениях. Имя хоста (hostname) поднимается каждый раз, когда [пере]загружается sip.conf. Если порт не назначен, используется значение указанное в параметре «udpbindaddr».

externaddr = 174.54.76.98          ;использовать этот адрес.
externaddr = 174.54.76.98:4600     ;использовать этот адрес и порт.

«externhost = hostname[:port]» то же что и «externaddr» только это 'hostname' обновляемое через «externrefresh» секунд (по умолчанию 10сек.).

externhost=pbx.voiplab.by:9999   ;внешнее имя хоста, NAT
externrefresh=180                ;задать интервал обновления

Параметр 'localnet' указывает список сетевых (серых) адресов, согласно RFC1918, которые считаются «внутренними».

localnet=192.168.0.0/255.255.0.0   ;адреса согласно RFC 1918 
localnet=10.0.0.0/255.0.0.0        ;адреса согласно RFC 1918
localnet=172.16.0.0/24             ;адреса согласно RFC1918 с CIDR обозначением 
localnet=169.254.0.0/255.255.0.0   ;zeroconf локальная сеть согласно RFC 3927

Обработка RTP медиа потоков.

В том случае когда вы используете внешнего VoIP провайдера, а ваш Asterisk находиться за NAT устройством, необходимо использовать опцию directmedia=no:

directmedia=yes           ;направляет трафик по оптимальному пути, разрешая re-INVITE
directmedia=no            ;запрещает перенаправления трафика, в этом случае все RTP потоки проходят через Asterisk
directmedia=nonat         ;позволяет перенаправление трафика только когда отправитель не за натом.
directmedia=update        ;использует UPDATE для перенаправления трафика, вместо re-INVITE
directmedia=outgoing      ;возможность отправлять только directmedia реинвайты на исходящие плечо вызова (используется для смягчения re-INVITE сценария потенциальных ‘бликов’)
directmedia=nonat,update  ;работает аналогично как и directmedia=yes
directrtpsetup=yes              ;устанавливает прямые звонки без re-INVITE, не будет работать для видео и в случае если получатель отправляет RTP информацию и fmtp заголовки как 200 OK, которые не совпадают с отправленными INVITE, также не будет работать если устройства за натом.
directmediadeny=0.0.0.0/0       ;указывает ACL доступа по directmedia
directmediapermit=172.16.0.0/16     ; указывает разрешенную подсеть
directmediaacl=acl_example          ;использует данный ACL из acl.conf
ignoresdpversion=yes            ;asterisk будет учитывать номер версии в SDP пакетах, и будет модифицировать SDP сессию если номер версии измениться. Заставляет Asterisk, игнорировать номер версии SDP сессии, и обрабатывать все SDP данные как новые. Эта опция позволяет взаимодействовать с устройствами, которые имеют нестандартную реализацию SDP(наблюдалось в Microsoft OCS), по умолчанию выкл.

Стоит упомянуть, если ваш провайдер VoIP использует RTP медиа сервер с IP адресом отличным от SIP сервера, а сам Asterisk находиться за NAT, опция directmedia=no может не подойти для вас.

Asterisk будет всегда использовать симметричный режим RTP, как определено в RFC 4961, это означает то, что Asterisk всегда будет отправлять пакеты из того же порта, и то которого их получил. Значение по умолчанию directmedia=yes, так что если у вас есть конечные точки за NAT, вы должны установить опцию directmedia=no.

IP адрес используемый для RTP (аудио, видео и текста) в SDP может быть переназначен параметром media_address. Данный параметр может быть использован только в секции [general].

media_address = 167.14.23.15

ICE/STUN/TURN использование может быть включено глобально или для конкретного пира, с помощью icesupport опции, по умолчанию эта опция выключена.

icesupport=yes

Задать диапазон используемых RTP портов можно в rtp.conf:

rtpstart=10000
rtpend=10100

Коментарии: