Thanks again.
So then my config should look something like:
# Caller NAT detection route route[NAT] { #!ifdef WITH_NAT force_rport(); if (nat_uac_test("19")) { if (method=="REGISTER") { fix_nated_register(); } else { fix_nated_contact(); } setflag(FLT_NATS);
# If both clients are behind nat we can check to see if they are behind the same # external IP and optimize the media path to go directly between them else if ( $si==$dd || $si==rd) { xlog("L_INFO", "Detected Two Clients Behind the Same NAT - Disabling RTPproxy");
# Do not use rtpproxy as the clients seem to be behind the same NAT resetflag(FLT_NATS); resetflag(FLT_NATB); } } } #!endif return; }
# RTPProxy control route[RTPPROXY] { #!ifdef WITH_NAT if (is_method("BYE")) { unforce_rtp_proxy(); } else if (is_method("INVITE")){ force_rtp_proxy(); } if (!has_totag()) add_rr_param(";nat=yes"); #!endif return; }
Rgds Deon
On Dec 20, 2010, at 3:37 PM, Daniel-Constantin Mierla wrote:
Hello,
that's a hint for a very old version, where cfg file language didn't had support for variables and avpops module was used for comparison (as you could see, $dd is stored in an avp and them compared with src ip -- no longer need for such workaround, just do if($si==$dd) ...).
You have to plug the when you force usage of rtp proxy, so you skip it in such cases.
Cheers, Daniel
On 12/20/10 2:32 PM, Deon Vermeulen wrote:
Hi Daniel
Thank you so much for your feedback.
I came upon the below post, but I'm unable to find the example Norman posted. http://www.mail-archive.com/users@openser.org/msg01932.html
In short the end solution is:
# If both clients are behind nat we can check to see if they are behind the same # external IP and optimize the media path to go directly between them else if ( isflagset(2) and isflagset(3) ) { log(1, "Both Clients are behind NAT");
# Store the destination domain into an AVP avp_printf("i:450", "$dd"); if ( avp_check("i:450", "eq/$src_ip/g") ) { xlog("L_INFO", "Detected Two Clients Behind the Same NAT - Disabling Mediaproxy"); # Do not use mediaproxy as the clients seem to be behind the same NAT resetflag(2); resetflag(3); } }
I haven't tested yet, but would I be right in saying my config should look something like:
####### Routing Logic ########
# Main SIP request routing logic # - processing of any incoming SIP request starts with this route route {
# per request initial checks route(REQINIT); # NAT detection route(NAT);
# Caller NAT detection route route[NAT] { #!ifdef WITH_NAT force_rport(); if (nat_uac_test("19")) { if (method=="REGISTER") { fix_nated_register(); } else { fix_nated_contact(); } setflag(FLT_NATS);
# If both clients are behind nat we can check to see if they are behind the same # external IP and optimize the media path to go directly between them else if ( isflagset(FLT_NATS) and isflagset(FLT_NATB) ) { log(1, "Both Clients are behind NAT"); # Store the destination domain into an AVP avp_printf("i:450", "$dd"); if ( avp_check("i:450", "eq/$src_ip/g") ) { xlog("L_INFO", "Detected Two Clients Behind the Same NAT - Disabling RTPproxy"); # Do not use rtpproxy as the clients seem to be behind the same NAT resetflag(FLT_NATS); resetflag(FLT_NATB); } } }
#!endif return; }
# RTPProxy control route[RTPPROXY] { #!ifdef WITH_NAT if (is_method("BYE")) { unforce_rtp_proxy(); } else if (is_method("INVITE")){ force_rtp_proxy(); } if (!has_totag()) add_rr_param(";nat=yes"); #!endif return; }
Rgds Deon
On Dec 20, 2010, at 2:41 PM, Daniel-Constantin Mierla wrote:
Hello,
On 12/20/10 11:25 AM, Deon Vermeulen wrote:
Hi List
Can someone please help me?
I need to implement PBX Services for a customer that has 10 IP Phones at his Main site and then 20 IP Phones located over 5 Branches.
My goal is to have RTP go end to end and not proxied.
I had a look at the below link and tried it, but with no luck.
http://kamailio.org/dokuwiki/doku.php/examples:caller-callee-behind-same-nat
Here is a partial output of my kamailio.cfg file if someone would be so kind to help me.
#!ifdef WITH_NAT # ----- rtpproxy params ----- modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:7722")
# ----- nathelper params ----- modparam("nathelper", "natping_interval", 30) modparam("nathelper", "ping_nated_only", 1) modparam("nathelper", "sipping_bflag", FLB_NATSIPPING) modparam("nathelper", "sipping_from", "sip:pinger@x.x.x.x")
# params needed for NAT traversal in other modules modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)") modparam("usrloc", "nat_bflag", FLB_NATB) #!endif
####### Routing Logic ########
# Main SIP request routing logic # - processing of any incoming SIP request starts with this route route {
# per request initial checks route(REQINIT); # NAT detection route(NAT);
# Caller NAT detection route route[NAT] { #!ifdef WITH_NAT force_rport(); if (nat_uac_test("19")) { if (method=="REGISTER") { fix_nated_register(); } else { fix_nated_contact(); } setflag(FLT_NATS);
}
#!endif return; }
# RTPProxy control route[RTPPROXY] { #!ifdef WITH_NAT if (is_method("BYE")) { unforce_rtp_proxy(); } else if (is_method("INVITE")){ force_rtp_proxy(); } if (!has_totag()) add_rr_param(";nat=yes"); #!endif return; }
what you have to do is to check if the source is natted and $si==$dd, then callee and caller are behind same nat (if there is one level of nat), so you don't force rtpproxy usage.
Cheers, Daniel
-- Daniel-Constantin Mierla Kamailio (OpenSER) Advanced Training Jan 24-26, 2011, Irvine, CA, USA http://www.asipto.com
-- Daniel-Constantin Mierla Kamailio (OpenSER) Advanced Training Jan 24-26, 2011, Irvine, CA, USA http://www.asipto.com