Klaus / Daniel
Thanks again for assistance with this.
I've tried the solution based on add_contact_alias() and
handle_ruri_alias() and it works perfectly.
Richard
On 22 June 2012 13:47, Klaus Darilion <klaus.mailinglists(a)pernau.at> wrote:
On 22.06.2012 13:50, Richard Brady wrote:
Thanks guys, fantastic answers.
You mention that NAT detection happens before save() and the flag is set
by lookup() which makes much more sense. However, if Kamailio is not the
registrar, as is the case with my current project, those functions are
not called, so an alternative is needed. There are clearly several
options.
The solution I have gone for is to replace fix_nated_register() with
fix_nated_contact() so that the REGISTER request is relayed with a
modified Contact header containing the external ip:port of the client.
The cleanest solution would be to use add_contact_alias() and
handle_ruri_alias(). The do not change the contact but put the public
address into a uri parameter. Thus, the URI seen by the client is always the
one it sends:
http://www.kamailio.org/docs/modules/3.2.x/modules_k/nathelper.html#id25504…
That is then stored by the registrar (FreeSWITCH
in my case) and used
later to originate calls for that user. The FreeSWITCH know to send
those calls to Kamailio through either use of the Path header and module
in Kamailio, or through static configuration of fs_path or proxy
parameters in FreeSWITCH.
This is fine.
The works for the first INVITE to the registered
client behind NAT. But
that client sends back a 200 OK with a Contact header containing its
private IP address, and so fix_nated_contact() needs to be invoked on
that response, and normally it would be due to FLB_NATB being set, but
if Kamailio was not the registrar then that flag is not set. So I need
to detect NAT on the client at the time of receiving the reply, or
alternatively by having the registrar store a cookie and setting it
based on that.
You are correct. For in-dialog messages received from SIP clients I would
always use add_contact_alias() and remove the NAT flags completely.
I suppose then my next question then is can I call nat_uac_test() on a
UAS?
Today, almost any SIP clients are SIP symmetric. This means, that they
receive SIP from the some port/connection where they send. Thus, skip the
NAT tests completely and always use add_contact_alias() for messages receive
from SIP clients and handle_ruri_alias() for messages sent to SIP clients.
Depending on if you use Freeswitch also as media relay you can also remove
the media proxy stuff from the Kamailio config.
On important thing is NAT-keep-alive. This is usually done by nathelper
module by querying the location table for contact with NAT-flag set. Thus,
either you do NAT keep-alive by freeswitch (e.g sending OPTIONS requests) or
do it in your Kamailio proxy (e.g. set the nat_bflag
http://www.kamailio.org/docs/modules/3.2.x/modules_k/usrloc.html#id2541477
and call save("location","0x02") before relaying REGISTER to
freeswitch.
Then Kamailio will do NAT-pinging. Note, if you want to keep-alive only for
successfully registered clients, you man want to call save() in the
reply-route of the REGISTER request).
regards
Klaus