Страница 1 из 1

PJSIP и два ната

СообщениеДобавлено: 23 окт 2022, 09:04
shumiloff
Добрый день, коллеги!

При попытке переезда на PJSIP столкнулся с историей, которую не смог решить сам не смотря на чтение документации. Обращался к нескольким людям, сведущим в астериске, они тоже бились часами, но помочь не смогли. Сразу скажу, что прочитал наверное с десяток статей про проблему "обрыва после 30 секунд", но решения оттуда тоже не помогли. Не верю, что в PJSIP такие проблемы нельзя решить штатно.

Суть следующая: есть некий объект с неподконтрольным нам сетевым оборудованием. За маршрутизатором стоит наш сервер с asterisk. На маршрутизаторе прокинуты на белый статический адрес X.X.X.X порты SIP и диапазон для RTP. На интерфейсе сервера с астериском соответственно, серый адрес Y.Y.Y.Y. Получить отдельный белый адрес на этом объекте мы к сожалению не можем.

К астериску подключаются абоненты. Будем считать для простоты, что это обычные сип клиенты, которые также могут находиться за своим собственным натом.

Например, есть два клиента с номерами 77777 и 77778, конфигурация у обоих их одного темплейта. Делаем вызов 77777 -> 77778. Вызов успешно проходит, звук и видео в обе стороны, но при отправке 200 ОК (SDP) в сторону инициировавшего вызов 77777 астер в поле Contact отправляет свой серый IP адрес Y.Y.Y.Y, на котором собственно и поднят транспорт. Астер за натом, другого адреса у него нет. Клиент соответственно пытается отправить ACK на этот самый чужой адрес Y.Y.Y.Y, который ему естественно, недоступен. Астер не дождавшись ACK делает несколько повторов и рубит соединение.

Фактически всё что нужно - это чтобы для конкретного транспорта астер в поле contact подставлял extern_ip например, но никто не знает, как этого добиться. хочется именно понять, разобраться, что влияет на формирование поля Contact для 200 OK - какой параметр, на что конкретно обратить внимание?

Чего только не советовали за последние 2 недели.

И да, я знаю, что такое rewrite_contact и что он предназначен для переписывания именно поля contact, но в соответствии с документацией он заменяет ip адрес этого поля на адрес источника. Для меня в этом случае непонятно из описания, что считается источником - инициатор вызова (клиент) или астер, являющийся отправителем пакета 200 ОК. Похоже, что второе, т.к. значение этой директивы не оказывает влияния на содержимое поля contact в моём случае и похоже, что она служит для решения проблемы именно клиентов за nat.

external_ip, локальные сети, external_signaling_address естественно, тоже прописаны.

Re: PJSIP и два ната

СообщениеДобавлено: 24 окт 2022, 04:16
ded
Всё это несистемные пляски с бубном. Завтра будет два объекта - будете плясать с двумя бубнами?
Там, где за маршрутизатором стоит ваш сервер с asterisk, сделайте на нём пир IAX2 и регистрацию на ваш центральный asterisk. На котором пропишите тут проблемный пир как host=dynamic.
И всё будет ОК, и маршрутизация удобней, и нет гимора с extern IP & Contact,