NAT, SIP и Asterisk
Трансляция сетевых адресов (NAT) является обычной практикой в сети и нередко мешает прохождению голосовых пакетов (нет звука) и инициализации соединений (нет соединения). Решение этой проблемы требует понимания принципов работы NAT и VoIP. В этой статье рассматривается протокол SIP и Asterisk, но проблемы и решения применимы и к большинству других приложений и протоколов.
Reinvite
Клиент за NAT
[sip_phone]nat=yes
qualify=300 ; проверять соединение каждые 300 мс.
nat=force_rport,comedia
При такой конфигурации Asterisk использует внешний IP адрес externip для вызовов клиентов с параметром nat=yes. Дополнительно параметр qualify=yes поддерживает соединение, не позволяя удалять запись из таблицы трансляций.
SIP клиенты и Asterisk за NAT
Все усложняется если и 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.
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
Источник: