Can PJSIP use public SIP signaling through Acrobits SIPIS while forcing RTP for a specific extension through a different private routed network?

Groundwire extension 103 + Acrobits SIPIS + Tailscale: separate SIP signaling and RTP paths

Hello,

I have a somewhat unusual PJSIP/FreePBX setup and I am trying to determine whether Asterisk can use different paths for SIP signaling and RTP for a specific extension.

My setup

I have FreePBX/PJSIP running at:

192.168.60.10

Extension:

103

The client is an iPhone running Groundwire.

The Groundwire account is configured to use:

pbx.lucar.app.br:5061
TLS

The SIP port is publicly reachable and Acrobits SIPIS push notifications are working.

The FreePBX registration shows the Acrobits SIPIS address, for example:

Contact: 103/sip:[email protected]:18937

I understand that this is the Acrobits SIPIS server and not the actual iPhone address.

Tailscale

I also have Tailscale running on a Proxmox server.

The Proxmox server advertises my internal networks to Tailscale.

The iPhone has a stable Tailscale address in the 100.64.0.0/10 range.

For example:

iPhone 103:
100.x.x.x

Proxmox:
192.168.10.20
Tailscale: 100.88.x.x

The FreePBX server can successfully ping the iPhone’s Tailscale IP, and the iPhone can reach the FreePBX through Tailscale.

What I want

I want to keep SIP signaling and push notifications exactly as they are:

iPhone
   |
   | SIP TLS
   v
pbx.lucar.app.br:5061
   |
   v
Acrobits SIPIS / FreePBX

But I would like the RTP media to use the Tailscale path:

iPhone
100.x.x.x
   |
   | Tailscale
   v
Proxmox
   |
   v
FreePBX
192.168.60.10

In other words:

SIP signaling = public Internet / Acrobits SIPIS

RTP media = private routed Tailscale network

Current behavior

When the iPhone is unlocked, I can get audio working when Tailscale is being used.

However, when the iPhone is locked and Groundwire is awakened by the Acrobits push notification, the media path goes through the normal iOS network interface (en0) and the call connects without audio.

The SIP signaling itself works.

The important difference appears to be the SDP/media address.

In some calls I see:

c=IN IP4 192.168.x.x

rather than the Tailscale address.

PJSIP/NAT settings

I have tested:

rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
direct_media=no

I understand that rtp_symmetric can cause Asterisk to learn the RTP source after receiving RTP.

However, in this situation I would like to know whether PJSIP can be configured to explicitly use a different media path for extension 103.

My question

Would it be possible to configure extension 103 so that:

SIP signaling:
pbx.lucar.app.br:5061

while:

RTP:
Tailscale 100.x.x.x

is used for media?

I found discussions mentioning:

media_address
bind_rtp_to_media_address

and also discussions about using different PJSIP transports/interfaces.

Could either of these be used for this scenario?

The important detail is that Tailscale is not running directly on FreePBX. It is running on Proxmox, which routes the Tailscale network to FreePBX.

I would also like to avoid using a Tailscale Exit Node because I only want the VoIP media traffic to use Tailscale, not all iPhone traffic.

If this is not possible with PJSIP, is there another recommended way to tell Asterisk to send RTP for a specific endpoint to a known routed address?

Extension 103 is the test endpoint, so I can provide:

pjsip show endpoint 103
pjsip show aor 103
pjsip show transport
pjsip set logger on

as well as the SDP from a failing call.

Thanks!

No, this goes against how SIP and SDP works so it’s not something that I’m aware anyone allows to be configured for the remote side.