[Kamailio-Users] SDP IP address not rewritten

Klaus Darilion klaus.mailinglists at pernau.at
Thu Feb 11 11:35:20 CET 2010



Am 11.02.2010 04:04, schrieb Vikram Ragukumar:
> Klaus,
>
> ----- ----------- -------- ----- --------
> |Nokia|---|SMC7004VWBR|---|Internet|---|Proxy|---------|Asterisk|
> ----- ----------- -------- ----- --------
> Cellphone Wireless Router Kamailio+rtpproxy
>
> An update on what i've been able to find. The NAT detection section of
> my Kamailio.cfg was testing for NAT using nat_uac_test("19"). Turns out
> that after the first couple of REGISTER messages that the Cellphone
> sends out,subsequent messages have the IP:Port_num in both the Via
> header and the Contact header as PublicIP:Port_num and
> Source port = Port in the Via header. So nat_uac_test("19") doesn't flag
> the message as having come from a UA that is behind NAT.
>
> I presume the method to fix this issue is by using nat_uac_test("31"),
> so that the SDP ip address checks are run(which will pass). Is there
> anything else that needs to be done ?

Unless you have to support asymmetric SIP clients (fortunately almost 
all SIP clients are meanwhile symmetric) I suggest a more pragmatic 
approach: remove the test completely and perform NAT traversal always :-)

regards
klaus



>
> Thanks in advance.
> Regards,
> Vikram.
>
> Klaus Darilion wrote:
>> You have to debug this yourself.
>>
>> Add log statements to the .cfg file, e.g. add
>> xlog("L_INFO","calling rtpproxy ...");
>> just before the call to force_rtpproxy().
>>
>> then verify the logfile if rtpproxy is called.
>>
>> Increase debugging (debug=4) and verify the log file for potential
>> problems.
>>
>> Configure rtpproxy/kamilio to use a UDP socket instead of the unix
>> socket. Then you can use ngrep/tcpdump to watch the communication
>> between kamailio and rtpproxy.
>>
>> regards
>> klaus
>>
>> Am 09.02.2010 01:25, schrieb Vikram Ragukumar:
>>> 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;
>>> }
>>> }
>>>
>>> _______________________________________________
>>> Kamailio (OpenSER) - Users mailing list
>>> Users at lists.kamailio.org
>>> http://lists.kamailio.org/cgi-bin/mailman/listinfo/users
>>> http://lists.openser-project.org/cgi-bin/mailman/listinfo/users
>




More information about the sr-users mailing list