Asterisk и NAT
Рубрики: Asterisk
14 Апр 2016Для голосовой связи в IP-телефонии обычно используется протокол SIP. Трафик взаимодействия устройств по этому протоколу состоит из непосредственно трафика сигнализации SIP и трафика передачи голоса — RTP. Для корректной работы голосовой связи нам нужно обеспечить прохождение обоих видов этого трафика через НАТ.
Клиент находится за NAT, а Asterisk — снаружи
В этом случае в конфигурационном файле sip.conf астериск нам надо указать что мы включаем НАТ и используем внешний IP, чтобы астериск для всех клиентов кроме указанных в localnet использовал externip.
[general] localnet=172.16.12.0/255.255.255.0 ; локальная сеть externip=85.165.01.12 ; внешний ip адрес [phone1] nat=yes ; включить НАТ qualify=300 ; проверять соединение каждые 300 мс.
указываем параметр qualify — чтобы опрашивать устройство каждые 300 миллисекунд.
Дополнительно на устройстве SIP можно указать в настройках оборудования параметро Reinvite — это позволить пускать RTP-трафик не через IP-атс Asterisk, а напрямую между SIP-устройствами.
В случае, если у нас и телефонная станция и клиенты находятся за NAT, нам нужно принудительно запретить Reinvite с клиентов, поскольку они не смогут завязывать соединения с другими клиентами SIP за НАТ напрямую. Эти соединения, конечно, могли бы работать внутри, но это не имеет смысла, поскольку обычно в локальной сети и так высокая скорость. Кроме того, в конфигурационном файле rtp.conf нам нужно определить диапазон портов, в котором будет идти трафик RTP, и этот входящий трафик надо транслировать на Asterisk с сервера NAT (в данной статье это не описывается). Обычно для работы RTP необходимо использовать не менее 10 портов.
sip.conf
[general] canreinvite => no
rtp.conf.
[general] rtpstart=10000 rtpend=10010
Давайте подведем итог, какие параметры в конфигурационных файлах могут быть нам полезны.
sip.conf :
port={номер_порта} порт для SIP-сигнализации (по умолчанию UDP 5060)
bindaddr={адрес} IP-адрес, с которого работает сервер Asterisk, если указано 0.0.0.0, то любой адрес.
externip={IP-адрес} внешний адрес интерфейса, на котором работает NAT (используется для nat=yes).
localnet={IP-адрес_сети}/{маска_сети} — определяет адрес локальной сети (используется при nat=no).
nat={yes|no|never|route} — определяет как будет подключаться пользователь к серверу Asterisk.
qualify={yes|no|время_в_мс} — как часто будет проверяться регистрация SIP-клиента
rtp.conf :
rtpstart={стартовый номер порта}
rtpend={конечный номер порта} — диапазон портов используемых для RTP, по умолчанию UDP 10000 — 20000
Если вы используете для NAT оборудование CISCO, то может возникнуть проблема с обработкой трафика SIP. Оборудование подменяет в заголовках SIP внутренний адрес клиента на свой, при этом не меняет порт. В результате этого оборудование пытается отсылать NOTIFY и INVITE на порт, указанный в полях Contact и Via и пакеты к клиенту не попадают.
Самое простое решение — отключить на Cisco sip-nat и работать с этими пакетами как обычные с обычными.
На маршрутизаторах (IOS):
no ip nat service sip tcp port 5060 no ip nat service sip udp port 5060
Если в качестве роутера для NAT вы используете межсетевой экран CISCO PIX или CISCO ASA, нужно отключить инспекцию трафика SIP
policy-map global_policy class inspection_default no inspect sip
- Комментарии к записи Asterisk и NAT отключены
Возможность комментирования закрыта модератором.