PJSIP и два ната
Добавлено: 23 окт 2022, 08:04
Добрый день, коллеги!
При попытке переезда на 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 естественно, тоже прописаны.
При попытке переезда на 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 естественно, тоже прописаны.