Hello, That is my first post here :) I am playing around with NAT traversal and mediaproxy on opensips 1.6.3. (media-dispatcher 2.4.3, media-relay 2.4.3, python 2.6) I've just encounterd a problem with my configuration that really worries me.
Here is my script: # main request routing logic route { # ----------------------------------------------------------------- # Sanity Check Section # ----------------------------------------------------------------- if (!mf_process_maxfwd_header("10")) { sl_send_reply("483", "Too Many Hops"); exit; }; if (msg:len > max_len) { sl_send_reply("513", "Message Overflow"); exit; }; # ----------------------------------------------------------------- # Record Route Section # ----------------------------------------------------------------- if (method=="INVITE" && nat_uac_test("3")) { record_route_preset("xx.yy.zz.vv:5060;nat=yes"); } else if (method!="REGISTER") { record_route(); }; # ----------------------------------------------------------------- # Call Tear Down Section # ----------------------------------------------------------------- if (method=="BYE" || method=="CANCEL") { end_media_session(); }; # ----------------------------------------------------------------- # Loose Route Section # ----------------------------------------------------------------- if (loose_route()) { if ((method=="INVITE" || method=="REFER") && !has_totag()) { sl_send_reply("403", "Forbidden"); exit; }; if (method=="INVITE") { if (!proxy_authorize("","subscriber")) { proxy_challenge("","0"); exit; } else if (!db_check_from()) { sl_send_reply("403", "Use From=ID"); exit; }; consume_credentials(); if (nat_uac_test("3") || search("^Route:.*;nat=yes")) { setflag(6); use_media_proxy(); }; }; route(1); exit; }; # ----------------------------------------------------------------- # Call Type Processing Section # ----------------------------------------------------------------- if (uri!=myself) { route(4); route(1); exit; }; if (method=="ACK") { route(1); exit; } else if (method=="CANCEL") { route(1); exit; } else if (method=="INVITE") { route(3); exit; } else if (method=="REGISTER") { route(2); exit; }; lookup("aliases"); if (uri!=myself) { route(4); route(1); exit; }; if (!lookup("location")) { sl_send_reply("404", "User Not Found"); exit; }; route(1); } route[1] { # ----------------------------------------------------------------- # Default Message Handler # ----------------------------------------------------------------- t_on_reply("1"); if (!t_relay()) { if (method=="INVITE" || method=="ACK") { end_media_session(); }; sl_reply_error(); }; } route[2] { # ----------------------------------------------------------------- # REGISTER Message Handler # ---------------------------------------------------------------- sl_send_reply("100", "Trying"); if (!search("^Contact:[ ]*\*") && nat_uac_test("31")) { setflag(6); fix_nated_register(); force_rport(); }; if (!www_authorize("","subscriber")) { www_challenge("","0"); exit; }; if (!db_check_to()) { sl_send_reply("401", "Unauthorized"); exit; }; consume_credentials(); if (!save("location")) { sl_reply_error(); }; } route[3] { # ----------------------------------------------------------------- # INVITE Message Handler # ----------------------------------------------------------------- if (nat_uac_test("3")) { setflag(7); force_rport(); fix_nated_contact(); }; if (!proxy_authorize("","subscriber")) { proxy_challenge("","0"); exit; } else if (!db_check_from()) { sl_send_reply("403", "Use From=ID"); exit; }; consume_credentials(); lookup("aliases"); if (uri!=myself) { route(4); route(1); exit; }; if (!lookup("location")) { sl_send_reply("404", "User Not Found"); exit; }; route(4); route(1); } route[4] { # ----------------------------------------------------------------- # NAT Traversal Section # ----------------------------------------------------------------- if (isflagset(6) || isflagset(7)) { if (!isflagset(8)) { setflag(8); use_media_proxy(); }; }; } onreply_route[1] { if ((isflagset(6) || isflagset(7)) && (status=~"(180)|(183)|2[0-9][0-9]")) { if (!search("^Content-Length:[ ]*0")) { $avp(s:media_relay) = "xx.yy.zz.vv"; use_media_proxy(); }; }; if (nat_uac_test("1")) { fix_nated_contact(); }; } Here is my call flow: UA1(behindNAT)-------Opensips,mediaproxy----------Asterisk(publicip)----UA2(behind NAT) If the call is originated from UA1 side, there is a both-ways audio. The problem occurs in opposite scenario, if UA2 is calling UA1. In db there are following entries: | 101 | UA1number | NULL | sip:888000...@192.168.1.3:5070;transport=udp | sip:publicIPofNAT1:5070 (received PUBLIC_IP address) | 100 | UA2number | NULL | sip:888000...@publicip | NULL (received NULL) What is more in the moment of registration UA1 got proper OK with fixed contact header. SIP/2.0 200 OK. Via: SIP/2.0/UDP 192.168.1.3:5070;branch=z9hG4bK7D96184AEFB2EED63B82FD3A45BBE48F;rport=5070;received=publicIPofNAT1. From: "888000111" <sip:888000...@xx.yy.zz.vv>;tag=2BB8EBF2B8EB6C2C37E49E57CCBE64F0. To: "888000111" <sip:888000...@xx.yy.zz.vv>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.64ed. Call-ID: 33c3b0c29730be2d838ed1ad3b05d...@xx.yy.zz.vv. CSeq: 2 REGISTER. Contact: <sip:888000...@192.168.1.3:5070;transport=udp>;expires=180;received="sip:publicIPofNAT1:5070". Server: OpenSIPS (1.6.3-notls (i386/linux)). Content-Length: 0. And now two scenarios: 1) UA1 is calling UA2 - no problem occured. RTP stream traverse between publicIPofNAT1 --- mediaproxy --- Asterisk publicIP 2) UA2 i s calling UA1 - one-way audio (no audio on UA1 side) As i can see from SDP, RTP stream is set up between 192.168.1.3 and Asterisk publicIP which is totaly wrong, because UA1 is behind the nat. Could anybody help me to tune the script i am using. Is there any data i should paste here. Thx in advance _______________________________________________ Users mailing list Users@lists.opensips.org http://lists.opensips.org/cgi-bin/mailman/listinfo/users