Суть в двух словах:
Есть Астериск 18 (chan_pjsip), есть клиент за NAT'ом (PhonerLite) на TLS, в нем прописан STUN.
В Астериске из настроек, касающихся сабжа, стоит max_contacts=1, rewrite_contact='yes'.
Клиент регистрируется на Астериске. В фазе REGISTER клиент в поле Contact отдает серверу вместо своих локальных корректные внешние IP и порт маршрутизатора (получающиеся после прохождения им NAT и определенные STUN-сервером). Поэтому Астериск в своих ответах на REGISTER, успешно коммуницирует с клиентом через эти IP и порт (роутер пробрасывает с этого порта пакеты на рабочую станцию клиента на порт софтфона).
Но когда проходит входящий вызов от другого клиена, находящегося, скажем, в одной локалке с Астериском, то софтфон за NAT, после пришедшего INVITE отправляя на Астериск RINGING и все последующие сообщения, в поле Contact уже указывает не тот динамический порт на маршрутизаторе из первого шага, а свой локальный порт для входящих SIP-соединений (5061). IP при этом по прежнему шлется внешний, тут все ок.
Ну и понятно, что после этого Астериск начинает слать все SIP-сообщения на клиента за NAT'ом уже на этот порт, о котором маршрутизатор с NAT'ом знать ничего не знают, поэтому и дропает все эти пакеты, вплоть до BYE. Поэтому когда вызывающий абонент кладет трубку, софтфон за NAT это не видит (секунды разговора продолжают идти).
Хочу понять, это косяк Астериска, косяк софтфона, особенности реализации SIP, и каков минимальный набор костылей нужно городить, чтобы это обойти (при условии, что настройки роутера нам недоступны, типа поднятия UPnP NAT, проброса индивидуальных портов до каждого софтфона итп), или просто руки кривые.
И да, вопрос ни коим образом не касается RTP/SRTP и его настроек (голос ходит нормально), вопрос исключительно по обрыву сигнализации по направлении от Астера к клиенту с момента установки голосового соединения (от клиента на Астер пакеты продолжают ходить, поэтому, если трубку кладет вызываемый абонент за NAT, у вызывающего, который звонит из локалки Астериска, не преодолевая NAT, звонок успешно прекращается).