Hello,
I am running Kamailio version 1.5 and rtpproxy version 1.2. I have enabled NAT support in Kamailio.cfg. I have a UA behind NAT (UA IP:192.168.2.101), and the UA registers with an Asterisk server (Public IP) through an outbound proxy running Kamailio and rtpproxy with Public IP.
Registration succeeds, however when making an outbound call from the UA to a cellphone, there is only one sided voice. This is happening because Asterisk is addressing rtp streams to the UA's local IP address instead of its PublicIP:port.
Why is the IP address not being rewritten in the SDP ? Is there an alternate way of invoking rtpproxy (with flags) such that the IP address in the SDP is rewritten ?
Thanks and Regards, Vikram.
PS : Below is the main routing section of my kamailio.cfg
route{ if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); exit; } # NAT detection route(4); if (has_totag()) { # sequential request withing a dialog should # take the path determined by record-routing if (loose_route()) { if (is_method("BYE")) { setflag(1); # do accounting ... setflag(3); # ... even if the transaction fails } route(1); } else { if (is_method("SUBSCRIBE") && uri == myself) { # in-dialog subscribe requests route(2); exit; } if ( is_method("ACK") ) { if ( t_check_trans() ) { # non loose-route, but stateful ACK; must be an ACK after a 487 or e.g. 404 from upstream server t_relay(); exit; } else { # ACK without matching transaction ... ignore and discard.\n"); exit; } } sl_send_reply("404","Not here"); } exit; } # CANCEL processing if (is_method("CANCEL")) { if (t_check_trans()) t_relay(); exit; } t_check_trans(); # record routing if (!is_method("REGISTER|MESSAGE")) record_route(); # account only INVITEs if (is_method("INVITE")) { setflag(1); # do accounting } if (!uri==myself) { append_hf("P-hint: outbound\r\n"); route(1); } # requests for my domain if( is_method("PUBLISH|SUBSCRIBE")) route(2); if (is_method("REGISTER")) { if (isflagset(5)) { setbflag(6); # setbflag(7); } if (!save("location")) sl_reply_error(); exit; } if ($rU==NULL) { # request with no Username in RURI sl_send_reply("484","Address Incomplete"); exit; } # apply DB based aliases (uncomment to enable) ##alias_db_lookup("dbaliases"); if (!lookup("location")) { switch ($retcode) { case -1: case -3: t_newtran(); t_reply("404", "Not Found"); exit; case -2: sl_send_reply("405", "Method Not Allowed"); exit; } } # when routing via usrloc, log the missed calls also setflag(2); route(1); } route[1] { if (check_route_param("nat=yes")) { setbflag(6); } if (isflagset(5) || isbflagset(6)) { route(5); } /* example how to enable some additional event routes */ if (is_method("INVITE")) { #t_on_branch("1"); t_on_reply("1"); t_on_failure("1"); } if (!t_relay()) { sl_reply_error(); } exit; } # Presence route /* uncomment the whole following route for enabling presence server */ route[2] {
# if presence enabled, this part will not be executed if (is_method("PUBLISH") || $rU==null) { sl_send_reply("404", "Not here"); exit; } return; } # Caller NAT detection route /* uncomment the whole following route for enabling Caller NAT Detection */ route[4]{ force_rport(); if (nat_uac_test("19")) { if (method=="REGISTER") { fix_nated_register(); } else { fix_nated_contact(); setflag(6);#VR } setflag(5); } return; } # RTPProxy control /* uncomment the whole following route for enabling RTPProxy Control */ route[5] { if (is_method("BYE")) { unforce_rtp_proxy(); } else if (is_method("INVITE")){ force_rtp_proxy(); } if (!has_totag()) add_rr_param(";nat=yes"); return; } branch_route[1] { xdbg("new branch at $ru\n"); } onreply_route[1] { xdbg("incoming reply\n");
if ((isflagset(5) || isbflagset(6)) && status=~"(183)|(2[0-9][0-9])") { force_rtp_proxy(); } if (isbflagset(6)) { fix_nated_contact(); } } failure_route[1] { if (is_method("INVITE") && (isbflagset(6) || isflagset(5))) { unforce_rtp_proxy(); }
if (t_was_cancelled()) { exit; } }