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#id2550431

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

_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to