Александр Михеенко
13.03.2020
3143

Работа PJSIP за NAT

Рассмотрим работу PJSIP за NAT на примере CentOS 8 и Asterisk 16. PJSIP — мультимедийная коммуникационная библиотека, написанная на Си. Поддерживает такие протоколы как SIP, SDP, RTP, STUN, TURN, и ICE. Она сочетает лучшие возможности SIP сигнализации, хорошую проходимость NAT и высокий уровень взаимодействия с приложениями. Network Address Translation (NAT) При настройке с помощью chan_sip […]

Рассмотрим работу PJSIP за NAT на примере CentOS 8 и Asterisk 16.

PJSIP — мультимедийная коммуникационная библиотека, написанная на Си. Поддерживает такие протоколы как SIP, SDP, RTP, STUN, TURN, и ICE. Она сочетает лучшие возможности SIP сигнализации, хорошую проходимость NAT и высокий уровень взаимодействия с приложениями.

Network Address Translation (NAT)

При настройке с помощью chan_sip одноранговые узлы, которые относительно Asterisk расположены за NAT, настраиваются с использованием параметра nat . В Asterisk версии 1.8 и выше доступны следующие параметры nat:

no — Не выполняйте обработку NAT, отличную от RFC 3581.

force_rport — Если параметр rport отсутствует, все равно отправьте ответы на исходный IP-адрес и порт, как если бы присутствовал параметр rport.

comedia — Отправьте медиа на адрес и порт, с которого Asterisk получил его, независимо от того, где SDP указывает, что его следует отправить.

auto_force_rport — Автоматически разрешить отправку ответов на исходный IP-адрес и порт, как если бы присутствовал rport, если Asterisk обнаружит NAT. По умолчанию.

auto_comedia — Автоматически отправлять носитель на порт, с которого Asterisk получил его, независимо от того, где SDP указывает, что его следует отправить, если Asterisk обнаружит NAT.

SIP Settings chan_sip FreePBX 13
SIP Settings chan_sip FreePBX 13

Версии Asterisk до 1.8 имели меньшую степень детализации для параметра nat:

no — Не выполняйте обработку NAT кроме RFC 3581.

yes — Отправьте медиа на порт, с которого Asterisk получил его, независимо от того, где SDP указывает, что его следует отправить; отправлять ответы на исходный IP-адрес и порт, как если бы присутствовал rport; и переписать SIP-контакт на адрес источника и порт запроса, чтобы последующие запросы перешли на этот адрес и порт.

never — Не выполнять обработку NAT.

route — Отправьте носитель на порт, с которого Asterisk получил его, независимо от того, где SDP указывает, что он должен быть отправлен, и перезапишите SIP-контакт по адресу источника и порту запроса, чтобы последующие запросы перешли на этот адрес и порт.

В chan_pjsip параметры  конечной точки , которые управляют поведением NAT:

  • rtp_symmetric — отправляет носитель на адрес и порт, с которого Asterisk получает его, независимо от того, где SDP указывает, что его следует отправить
  • force_rport — отправлять ответы на исходный IP-адрес и порт, как если бы порт присутствовал, даже если это не так
  • rewrite_contact — переписать SIP. Контакт с адресом источника и портом запроса, чтобы последующие запросы перешли на этот адрес и порт.

Asterisk и телефоны, соединяющиеся через NAT с провайдером.

Этот пример подходит для большинства простых сценариев NAT, которые соответствуют следующим критериям:

Asterisk и телефоны находятся в частной сети.

Существует маршрутизатор, взаимодействующий с частными и общедоступными сетями. Где общедоступная сеть интернет.

Маршрутизатор выполняет функции трансляции сетевых адресов и брандмауэра.

Маршрутизатор настроен для переадресации портов, где он отображает необходимые диапазоны трафика SIP и RTP на ваш внутренний сервер Asterisk.

В этом примере маршрутизатор перенаправляет порты WAN TCP / UDP 5060 и UDP 10000-20000 в LAN 192.168.32.47

Устройства, включенные в пример:

VOIP телефон (201)

192.168.32.21

PC / Asterisk 

192.168.32.47

маршрутизатор

LAN: 192.168.32.1

WAN: 176.214.40.2

ITSP SIP-шлюз        

203.0.103.1 (example.com)

203.0.103.2 (example.com)

Ради полного примера и ясности в этом примере мы используем следующие поддельные детали:

Конфигурация pjsip.conf

Мы предполагаем, что вы уже прочитали Описание параметров конфигурации PJSIP в Asterisk с примерами. Для этого примера c NAT важными параметрами конфигурации, являются local_net , external_media_address и external_signaling_address в разделе типа транспорта и direct_media в разделе конечной точки. Остальные параметры могут зависеть от вашей конкретной конфигурации, модели телефона, сетевых настроек, ITSP и т. д.

local_net — Это IP-сеть, которую мы хотим рассмотреть в нашей локальной сети. Для связи с адресами в этом диапазоне мы не будем применять какие-либо настройки, связанные с NAT.

external_media_address — Это внешний IP-адрес для использования при обработке RTP. Когда запрос или ответ отправляется из Asterisk, если пункт назначения сообщения находится за пределами IP-сети, определенной в опции «local_net», и медиа-адрес в SDP находится в локальной сети, тогда медиа-адрес в SDP будет переписан в значение, определенное для external_media_address.

external_signaling_address — Это очень похоже на настройку external_media_address, но для сигнализации SIP вместо RTP media. Упомянутые здесь две внешние опции должны быть установлены на один и тот же адрес, если вы не разделите сигнальный и медиа трафик и направите на разные IP адреса или сервера..

direct_media — Определяет, медиа поток и направляет RTP трафик непосредственно между конечными точками, или через Asterisk.

Вместе эти параметры гарантируют, что дальний конец знает, куда отправлять обратно пакеты SIP и RTP, а direct_media гарантирует, что Asterisk остается на пути передачи мультимедиа. Это важно, потому что наша система имеет частный IP-адрес, на который SIP провайдер не может направить трафик. Мы хотим убедиться, что трафик SIP и RTP возвращается на адрес WAN / Public Internet нашего маршрутизатора. Разделы с префиксом «sipus» — это все настройки, необходимые для входящих и исходящих соединений магистрали SIP, а разделы с именем 201 предназначены для телефона VOIP.

Пример настройки chan_pjsip(pjsip.conf):

[transport-udp-nat]
type=transport
protocol=udp
bind=0.0.0.0
local_net=192.168.32.0/24
local_net=127.0.0.1/32
external_media_address=176.214.40.2
external_signaling_address=176.214.40.2
 
[sipus_reg]
type=registration
transport=transport-udp-nat
outbound_auth=sipus_auth
server_uri=sip:example.com
client_uri=sip:98765432@example.com
contact_user=1999888777
retry_interval=60
 
[sipus_auth]
type=auth
auth_type=userpass
password=************
username=1112223333
realm=gw1.example.com
 
[sipus_endpoint]
type=endpoint
transport=transport-udp-nat
context=from-external
disallow=all
allow=ulaw
outbound_auth=sipus_auth
aors=sipus_aor
direct_media=no
from_domain=gw1.example.com
 
[sipus_aor]
type=aor
contact=sip:gw1.example.com
contact=sip:gw2.example.com
 
[sipus_identify]
type=identify
endpoint=sipus_endpoint
match=203.0.103.1
match=203.0.103.2
 
[201]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
transport=transport-udp-nat
auth=201
aors=201
direct_media=no
 
[201]
type=auth
auth_type=userpass
password=*********
username=201
 
[201]
type=aor
max_contacts=2
PJSIP Settings /etc/asterisk/pjsip.conf
PJSIP Settings /etc/asterisk/pjsip.conf

Для удаленных телефонов за NAT

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

В этих случаях вы можете рассмотреть следующие параметры для удаленных конечных точек.

media_address — IP-адрес, используемый в SDP для обработки медиа

Во время создания SDP IP-адрес, определенный здесь, будет использоваться в

качестве медиа-адреса для отдельных потоков в SDP.

Имейте в виду, что параметр external_media_address, установленный в конфигурации транспорта , также может влиять на конечный медиа-адрес, используемый в SDP.

rtp_symmetric — Обеспечить, чтобы RTP был симметричным. Отправьте RTP обратно на тот же адрес / порт, с которого мы его получили.

force_rport — Принудительное поведение, совместимое с RFC3581, даже если отсутствует параметр rport. По сути, всегда отправляйте ответы SIP обратно на тот же порт, с которого мы получили запросы SIP.

direct_media — Определяет, может ли носитель передаваться напрямую между конечными точками.

rewrite_contact — Определите, будут ли запросы SIP отправляться на исходный IP-адрес и порт вместо адреса, предоставленного конечной точкой.

Таким образом, следующее эквивалентно:

chan_sip (sip.conf) chan_pjsip (pjsip.conf)
[peer101] type=peer nat=yes ;… [peer101] type=endpoint rtp_symmetric=yes force_rport=yes rewrite_contact=yes ;…
[peer102] type=peer nat=no ;… [peer102] type=endpoint rtp_symmetric=no force_rport=no rewrite_contact=no ;…
[peer103] type=peer nat=never ;…   [peer103] type=endpoint rtp_symmetric=no force_rport=no rewrite_contact=no ;…
[peer104] type=peer nat=route ;… [peer104] type=endpoint rtp_symmetric=no force_rport=yes rewrite_contact=yes ;…
SIP Settings /etc/asterisk/sip.conf
SIP Settings /etc/asterisk/sip.conf
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.