Sip телефон за nat настройка
Часто пользователи IP телефонии сталкиваются с проблемой односторонней слышимости. Проблема в том, что в SIP протоколе, в части где описываются возможности голосового соединения (кодеки, IP адреса и порты обмена) - в протоколе SDP (Session Description Protocol), имеется запись о IP адресе на котором клиент ожидает соединения, и этот IP адрес, естественно является "серым", то есть из сети, которая находится за NAT-ом. А прямое соединение на этот немаршрутизируемый IP естественно невозможно. Однако, все современные IP шлюзы, понимают, что такая ситуация может возникнуть и разруливают её соответствующим образом - то есть они не обращают внимание на этот адрес, а пакеты шлют на тот адрес с которого приходят к нему пакеты, то есть на наш реальный IP, находящийся на выходе из NAT.
SIP телефоны (софтфоны) вполне корректно работают из под NAT, и порты никакие пробрасывать не надо.
В процессе изучения Mikrotik и анализа проходящего VoIP трафика, выяснилось, что роутер по умолчанию лезет в SIP/SDP протокол и подменяет установленный там IP на свой внешний (так называемый SIP ALG). Таким образом, со стороны это выглядит так, как будто и нет никакого NAT-а. И всё в порядке, и всё в общем то работает. Однако если у вас проблема с односторонней слышимостью, то вам необходимо отключить SIP ALG на роутере. Делается это следующей командой в консоли RouterOS
/ip firewall service-port disable sip
Еще одна часто возникающая проблема с роутерами Mikrotik - это зависшие UDP соединения. По наблюдениям это происходит в результате цепочки событий
1. Происходит отключение Интернет соединения
2. Устройство, находящееся за NAT, отправляет запрос в сторону SIP сервера
3. Создается ошибочная запись в таблице conntrack
4. Интернет соединение восстанавливается
5. Таблица NAT netfilter не может получить корректную информацию для новых запросов
В результате SIP-устройства не могут зарегистрироваться, хотя запросы отправляются (клиенты Ростелеком с подключением по технологии PON страдают в первую очередь, т.к. раз в сутки биллинг провайдера принудительно разрывает сессию) .
TCPDUMP в данной ситуации показывает, что UAC отправляет в сторону сервера REGISTER, сервер отвечает запросом авторизации (SIP/2.0 401 Unauthorized), а в ответ ничего не приходит. Лечится это либо перезагрузкой роутера или удалением UDP соединений из консоли Mikrotik
/ip firewall connection remove [find where protocol=udp and dst-address
/ip firewall connection remove [find where connection-type=sip and assured=no]
Если нет возможности перезагрузить роутер или удалить UDP сессии, то можно попробовать выключить SIP устройство на 15-20 минут и потом включить снова.
Если проблема не постоянная, а то появляется, то исчезает, то возможно поможет отключение технологии fastpath (необходимо перезагрузить роутер после выполнения этих команд)
/ip settings set allow-fast-path=no
/ip firewall filter disable [/ip firewall filter find where action=fasttrack-connection]
В новых версиях RouterOS появился параметр sip-timeout, который теоретически может помочь в решении данной проблемы. Попробуйте выполнить следующую команду
/ip firewall service-port set sip disabled=no ports=5060,5061 sip-direct-media=yes sip-timeout=5m
SIP-телефон или SIP-адаптер часто приходится подключать к Интернет через маршрутизатор с функцией NAT. В качестве маршрутизатора может выступать либо DSL-модем либо отдельное устройство.
Также NAT может быть реализован и на стороне провайдера Интернет, что в итоге приводит к двойному NAT для SIP-клиента.
При таком подключении нет никакой необходимости делать «исправление» NAT на стороне абонента, т.е. подменять IP-адреса в SIP-сигнализации. Все необходимое для нормальной работы абонентов, подключенных через NAT, сделает сервер SIPNET, однако для этого необходимо, чтобы внутренний (приватный) адрес SIP-клиента был назначен из правильного диапазона адресов согласно RFC 1918. При использовании других адресов «исправления» NAT на стороне SIPNET не происходит и возникают различные проблемы, например, с односторонней слышимостью, входящими вызовами и проч.
Формально допустимые внутренние адреса:
- 10.0.0.0 - 10.255.255.255
- 172.16.0.0 - 172.31.255.255
- 192.168.0.0 - 192.168.255.255
Интернет-провайдер может делать NAT на своей стороне и выдавать своим абонентам приватные адреса согласно RFC6598:
Если маршрутизатор имеет встроенную поддержку протокола SIP (т.наз. SIP ALG), то в этом случае, как правило, включение STUN только мешает.
- SIP ALG в маршрутизаторах, как правило, работают некорректно, так называемую "поддержку SIP" (SIP Helper, SIP Passthrough. ) следует, по возможности, отключать. Рекомендации для TP-Link можно найти здесь, для некоторых других маршрутизаторов - здесь. При использовании в SIP-программе или устройстве транспортного протокола TLS можно не отключать SIP ALG в маршрутизаторе
- В зависимости от конкретной реализации STUN-клиента в программе/устройстве, от типа используемого NAT'а, от задержек в сети и прочих факторов включение STUN может привести к нежелательным последствиям. Рекомендуется с осторожностью подходить к использованию этой технологии.
Делать на DSL-модеме или маршрутизаторе «проброс портов», «port forwarding» или «virtual server» для сигнализации и RTP-трафика в подавляющем большинстве случаев не требуется. Согласно принципу своей работы, любое NAT-устройство не пропускает новые входящие соединения извне. Для того, чтобы это не мешало входящему трафику SIP-сигнализации, необходимо чтобы SIP-устройство или программа периодически генерировали трафик из внутренней сети наружу. Обычно это обеспечивается путем регулярной (примерно каждые 50-170 сек) отправки keepalive пакетов. «Проброс» порта сигнализации позволяет избежать отправки keepalive пакетов и может быть рекомендован только в том случае, если никаким другим способом не удалось добиться устойчивого прохождения входящих вызовов. При подключении через двойной NAT "проброс" портов лишь на одном из NAT-устройств не решает проблему.
Если входящие вызовы на SIP-устройство или программу не проходят вообще или проходят только в течение короткого промежутка времени (обычно < 3-5 минут) после включения или перезагрузки SIP-агента либо после исходящего вызова с него, то:
- необходимо убедиться в том, что устройство (или программа) успешно регистрируется на сервере; статус регистрации следует проверять не только в программе или устройстве, но и в своем Личном кабинете
- необходимо включить механизм keepalive (на SIP-агенте)
- либо уменьшить интервал keepalive, если механизм keepalive уже был включён ранее
- если устройство не имеет функции keepalive, то можно попробовать уменьшить интервал перерегистрации (Register Expire) до значения, чуть меньшего чем то время, в течение которого вызовы проходят; не устанавливайте интервал перерегистрации менее 60 секунд!
- либо настроить «port forwarding» (на маршрутизаторе) для того порта, который фактически используется клиентской стороной для сигнализации SIP
- необходимо убедиться, что входящим соединениям не мешает встроенный в маршрутизатор firewall.
По умолчанию, как правило, на клиентской стороне для сигнализации SIP используется порт 5060/UDP, однако программные и аппаратные устройства SIP-телефонии позволяют менять это значение или же выбирать этот порт динамически.
Если у вас нет звука, нет звука в одну сторону, нет слышимости, прочтите внимательно эту инструкцию.
Reinvite
Первый абонент запрашивает соединение у второго , сообщая свой IP адрес. Второй отвечает, сообщая свой IP. Голосовые пакеты направляются напрямую абонентам, минуя SIP сервер. Передача голосовых пакетов напрямую абонентам, минуя Asterisk, называется RE-INVITE или Native Bridge.
Клиент за NAT
В простейшей ситуации SIP клиент находясь за NAT , обращается к внешнему интерфейсу Asterisk. SIP клиент при регистрации на сервере создает запись в таблице трансляций, которая сохраняется, пока проходит хотя бы один пакет в минуту. В файле sip.conf требуется определить параметры сети и свойства удаленного пира.
При такой конфигурации Asterisk использует внешний IP адрес externip для вызовов клиентов с параметром nat=yes . Дополнительно параметр qualify=yes поддерживает соединение, не позволяя удалять запись из таблицы трансляций.
SIP клиенты и Asterisk за NAT
Чтобы избежать потери звука запретите re-invite в файле sip.conf
По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответсвии с вашими потребностями (3 порта на каждый конкурирующий вызов).
Где eth0 - внешний интерфейс, а 192.168.1.10 - IP адрес Asterisk.
Основные параметры конфигурации NAT для Asterisk
sip.conf
Поддержка NAT в Asterisk 12
localnet
externaddr
externhost
настройки могут совмещаться:
media_address
icesupport
directmedia
устаревшие настройки sip.conf
bindaddr= IP адрес Asterisk, если указано 0.0.0.0, то любой адрес.
externip= Этот параметр задается в секции [general] файла sip.conf и указывает внешний IP адрес, или имя хоста на вашем устройстве NAT .
Этот адрес будет использован для общения с устройствами с установленным параметром nat=force_rport.
localnet= Этот параметр задается в секции [general] файла sip.conf и указывает на локальную сеть и используется для обращения к устройствам с параметром nat=no.
Начиная с версии Asterisk 11: nat=yes is deprecated, use nat=force_rport,comedia instead
nat = force_rport - использовать rport, даже если его нетdirectmedia
qualify= Эта опция имеет два назначения.Первое - поддерживать запись в таблице трансляций NAT и контролировать регистрацию телефона.
Этот параметр задает проверку по умолчанию каждые 2 секунды.
Это выключает проверку.
Включает проверку через заданное время в 300 ms.
rtp.conf
Задает первый порт диапазона для приема и оправки голосовых пакетов RTP .
Задает последний порт диапазона для приема и оправки голосовых пакетов RTP .
В Asterisk начиная с версии 11 появилась поддержка stun. icesupport должно быть включено.
В данной статье приведены примеры рабочей конфигурации драйвера канала PjSIP, когда Asterisk находится за NAT (Network Address Translation). Asterisk подключается через NAT к провайдеру IP телефонии (ITCP). Этот пример подходит для большинства простых сценариев NAT при следующих условиях: Asterisk и телефоны находятся в частной сети. Маршрутизатор имеет локальный и публичный интерфейсы. Маршрутизатор реализует функции Трансляции Сетевых Адресов (NAT ) и файерволла. На маршрутизаторе настроен проброс SIP и RTP портов на локальный IP адрес сервера Asterisk. В данном примере проброшены порты 5060 TCP/UDP и UDP 10000-10100 на LAN 10.10.2.10.Устройства используемые в примере:
Для наглядности, в примере использованы фальшивые детали:
pjsip.conf конфигурация
Подразумевается, что вы ознакомились со статьей о конфигурации Asterisk pjsip.conf и имеете основные представления о работе Asterisk. Для этого примера, важно отметить опции - local_net, external_media_address и external_signaling_address в transport секции и direct_media в endpoint секции. Остальные параметры могут зависеть от конкретной конфигурации, модели телефона, сетевых настроек, специфики провайдера IP телефонии и т.д.
local_net
Диапазон адресов локальной сети.
external_media_address
external_signaling_address
direct_media
Удаленные телефоны за NAT
Выше приведенный пример подразумевает, что телефон находится в локальной сети, так же как и сервер Asterisk.
Но может так статься, что Asterisk расположен на внешнем IP адресе, а удаленные телефоны находятся за NAT , или же и Asterisk, и телефоны расположены за NAT , т.е. имеет место двойной NAT ? В этих случаях пригодятся следующие настройки оконечных точек (ENDPOINTS)
NAT или трансляция сетевых адресов — довольно часто используется в сети. Но при использовании NAT необходимо учитывать тот факт, что данная технология может создавать препятствия для прохождения голосовых пакетов, а также инициализации соединений. Существует несколько схем нахождения SIP клиента и сервера Asterisk за NAT. Рассмотрим некоторые из них и способы решения проблем.
Рассмотрим случай, когда SIP клиент ( телефон) находится за NAT, а Asterisk — снаружи. В данном случае голосовые пакеты будут перенаправляться на немаршрутизируемый адрес в сети, что в свою очередь соответственно приведет к потере звука.
В данной ситуации решением проблемы будет заключаться в следующем: в файле sip.conf указывается что включен NAT и используется внешний IP, тогда Asterisk будет использовать внешний IP для всех клиентов, кроме явно указанных в праметре localnet. Также стоит установить для сервера параметр qualify, равный примерно 300 миллисекунд — сервер будет опрашивать устройства в сети через заданный промежуток времени. Также возможно целесообразно будет разрешить использовать устройствам технологию Reinvite.
Пример:
sip.conf
[general]
localnet=192.168.1.10/255.255.255.0 ; локальная сеть
externip=88.128.221.1 ; внешний ip адрес
[client]
nat=yes ; включить НАТ
qualify=300 ; проверять соединение каждые 300 мс.
Следующий случай — сервер Asterisk находится за NAT, а клиенты снаружи. В данной ситуации проблема может заключаться в следующем — поток RTP приходит не с того IP на который настроен транк, а с другого или же маршрутизатор определил поток как не принадлежащий текущей сессии — то чаще всего проявляется это в наличие голоса от звонящего и в тоже время полное отсутствие звука от того кому был совершен звонок.
Пример:
[general]
localnet=192.168.1.10/255.255.255.0 ; локальная сеть
externip=88.128.221.1 ; внешний ip адрес
[client]
nat=yes ; включить НАТ
canreinvite=no
rtp.conf
rtpstart=10000
rtpend=20000
Для избежания потери голоса запрещаем reinvite. Для того чтобы клиенты за NAT могли инициировать соединения с Asterisk и направлять RTP-пакеты на нужный экстеншен — необходимо пробросить требуемые порты через файервол на сервере. Смотрим диапазон портов, используемых Asterisk для RTP, в файле rtp.conf.
Читайте также: