NAT, SIP и Asterisk

Трансляция сетевых адресов (NAT) является обычной практикой в сети и нередко мешает прохождению голосовых пакетов (нет звука) и инициализации соединений (нет соединения). Решение этой проблемы требует понимания принципов работы NAT и VoIP. В этой статье рассматривается протокол SIP и Asterisk, но проблемы и решения применимы и к большинству других приложений и протоколов.

Reinvite

NAT, SIP и Asterisk

Клиент за NAT

NAT, SIP и Asterisk

[sip_phone]
nat=yes
qualify=300 ; проверять соединение каждые 300 мс.

nat=force_rport,comedia

При такой конфигурации Asterisk использует внешний IP адрес externip для вызовов клиентов с параметром nat=yes. Дополнительно параметр qualify=yes поддерживает соединение, не позволяя удалять запись из таблицы трансляций.

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

NAT, SIP и Asterisk
Все усложняется если и Asterisk, и клиенты, находятся за NAT. Клиенты с внешней стороны не смогут получать SIP сообщения и принимать звонки. Или в SIP сообщении будет указан локальный IP адрес телефона, что приведет к потере звука.
Чтобы избежать потери звука запретите re-invite в файле sip.conf

Опция canreinvite устарела. Используйте ‘directmedia’.

  • directmedia=yes
  • directmedia=nonat
  • directmedia=update
  • directmedia=outgoing

Но клиенты находящиеся за NAT, все равно не смогут инициировать соединение с Asterisk и направить голосовые пакеты RTP на требуемый екстеншен. Для того чтобы это работало, надо пробросить требуемые порты через брандмауер на Asterisk. Диапазон RTP портов используемых Asterisk, назначается в файле rtp.conf.

По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответствии с вашими потребностями (3 порта на каждый конкурирующий вызов).
Для нормальной работы за NAT, потребуется пробросить диапазон RTP портов в соответствии с настройками в файле rtp.conf и порт SIP (обычно 5060). В iptables это будет выглядеть так:

Где eth0 внешний интерфейс, а 192.168.1.10 IP адрес Asterisk.

Основные параметры конфигурации NAT для Asterisk

localnet

Параметр ‘localnet’ список сетевых адресов, которые считаются «внутренними».

externaddr

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

externhost

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

В дополнение к вышесказанному Asterisk имеет дополнительный параметр «NAT» для разрешения вопросов, связанных со входящими SIP или медиа сессиями. В частности, в зависимости от настроек ‘NAT=’ как описано ниже, Asterisk может переопределить адрес/порт информацию, указанную в SIP/SDP сообщениях.

настройки могут совмещаться:

media_address

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

icesupport

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

directmedia

Для отключения прямых RTP потоков (peer-to-peer) используйте опцию:

устаревшие настройки sip.conf

externip= Этот параметр задается в секции [general] файла sip.conf и указывает внешний IP адрес, или имя хоста на вашем устройстве NAT.

Этот адрес будет использован для общения с устройствами с установленным параметром nat=force_rport.
localnet = Этот параметр задается в секции [general] файла sip.conf и указывает на локальную сеть и используется для обращения к устройствам с параметром nat=no.

Возможные значения:
NAT= yes, no, never, route

Начиная с версии Asterisk 11: nat=yes is deprecated, use nat=force_rport,comedia instead

  • nat = no без NAT RFC3581
  • nat = force_rport использовать rport, даже если его нет
  • nat = comedia отправить медиа поток на порт Asterisk, независимо от указаний SDP.
  • nat = auto_force_rport установить ‘force_rport’ параметр если Asterisk обнаружил NAT (по умолчанию)
  • nat = auto_comedia установить ‘comedia’ параметр если Asterisk обнаружил NAT

Asterisk будет отправлять голосовые пакеты на порт и IP адрес с которого их получает а не указанные в SIP и SDP сообщениях.
Это будет работать только, если телефоны за NAT будут использовать для одинаковый порт для голосовых пакетов RTP и одинаковый (но отличный от голосового) для сигнализации RTCP.

directmedia

  • directmedia=yes
  • directmedia=nonat
  • directmedia=update
  • directmedia=outgoing

qualify = Эта опция имеет два назначения.Первое поддерживать запись в таблице трансляций NAT и контролировать регистрацию телефона.
Возможные значения:

Этот параметр задает проверку по умолчанию каждые 2 секунды.

Это выключает проверку.

ключает проверку через заданное время в 300 ms.

rtp.conf

Задает первый порт диапазона для приема и оправки голосовых пакетов RTP.

Задает последний порт диапазона для приема и оправки голосовых пакетов RTP.

В Asterisk начиная с версии 11 появилась поддержка stun. icesupport должно быть включено.

Настройка res_pjsip для работы через NAT

В данной статье приведены примеры рабочей конфигурации драйвера канала 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.
Устройства используемые в примере:

Устройство IP адрес в примере
VOIP телефон (7777) 10.10.2.77
PC/Asterisk 10.10.2.10
Маршрутизатор LAN: 10.10.2.1
WAN: 123.123.123.123
ITSP SIP шлюз 203.0.113.1(gw1.example.com)
203.0.113.2(gw2.example.com)

Для наглядности, в примере использованы фальшивые детали:
TSP номер аккаунта : 123456789 и DID номер входящий от провайдера IP телефонии (ITSP): 3216111.

Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.


Источник: wiki.pro-voip.ru