[OpenSIPS-Users] NAT: Why replacing "Contact" with the received public IP:port instead of adding a parameter with it?

Klaus Darilion klaus.mailinglists at pernau.at
Fri Nov 7 14:04:14 CET 2008


Hi Inaki!

Funny - I am thinking of this since long time and had exactly the same 
idea yesterday, except that:
  - I would name the function add_received_to_contact()
  - I thought of searching for "received" not in t_relay but during 
loose_route() (by design the received param can only be in loose-routed 
messages and this allows overriding $du manuall)
  - remove the receive param from RURI before forwarding (although it is 
allowed by RFC 3261, maybe make this optional)

unfortunately I did not had time yet to implement it

regards
klaus

Iñaki Baz Castillo schrieb:
> Hi, a common solution for UA's behind NAT is using
> "fix_nated_contact()" to replace the private address with the received
> address, so in-dialog request would be properly routed.
> But this breaks the "Contact" the UA set in the REGISTER. This is:
> 
> - The UA registers with "Contact: <sip:user at PRIVATE_ADDRESS>".
> - But later it receives in-dialog requests to RURI "sip:user at PUBLIC_ADDRESS".
> 
> AFAIK, a UA could refuse that in-dialog request because it has a RURI
> different than the UA registered URI.
> 
> So I wonder, wouldn't be more ellegant to add a "Contact" parameter
> "received" with the public address, and when the proxy receives an
> in-dialog request then set the destination uri with that parameter
> value? This is:
> 
> --------------------------------------------------------------------------
>   alice (NAT)            Proxy                 bob
>       <F1> INVITE  --->
>                                  <F2> INVITE  --->
>                                   <-----  <F3> BYE
>        <-----  <F4> BYE
> 
> 
> <F1>
> INVITE sip:bob at domain.org SIP/2.0
> Contact: <sip:alice at PRIVATE_ADDRESS>
> 
> <F2>
> INVITE sip:bob at BOB_IP SIP/2.0
> Contact: <sip:alice at PRIVATE_ADDRESS;received="sip:PUBLIC_ADDRESS">
> 
> <F3>
> BYE sip:alice at PRIVATE_ADDRESS;received="sip:PUBLIC_ADDRESS" SIP/2.0
> 
> --------
> Now the Proxy sets the destination URI $du with "sip:PUBLIC_ADDRESS"
> so the BYE is forwarded tu alice public address without changing the
> RURI.
> --------
> 
> <F4>
> BYE sip:alice at PRIVATE_ADDRESS;received="sip:PUBLIC_ADDRESS" SIP/2.0
> --------------------------------------------------------------------------
> 
> 
> 
> This could be done manually in the script or with a new function (that
> I suggest) in nathelper module, something as:
> 
> if nat_uac_test("19") {
>     if ! is_method("REGISTER") {
>        add_contact_received();
>     }
> }
> 
> Opcionally, this parameter could be inspected automatically during
> t_relay to set the destination uri (not sure about it), or it could be
> done in the script by checking manually a parameter "received" in the
> Contact URI (note that this is not a parameter in the Contact heade,
> but in the Contact URI:
> 
>     Contact: <sip:user at IP;received=x.x.x.x>     !=     Contact:
> <sip:user at IP>;received=x.x.x.x
> 
> The parameter must appear in the Contact URI since it must appear in
> the RURI of the in-dialog request.
> 
> Opinions?
> 
> 
> 
> 



More information about the Users mailing list