[OpenSER-Users] OpenSER+mediaproxy changes SIP dst port so client never receives ACK, causing timeout

Höskuldur hoskuldur at gmail.com
Sun Apr 27 16:01:23 CEST 2008


I hope I'm not waisting your time with a problem that has a obvious
  solution, I've actually tried to find a similar case without any
  success.

  I'm making a call between two NATed clients which are using STUN.
  The call goes through OpenSER which is configured to use mediaproxy -
  see my config at the bottom of my email

  Below is a dump from the location table:

  MySQL / openser / location
  _______________________________________________________________________
  |             contact            |           received        |   flag |
  -----------------------------------------------------------------------
  |sip:1007 at 130.XXX.XXX.XXX:49162  |sip:130.XXX.XXX.XXX:49163  |   1    |
  |sip:1003 at 85.XXX.XXX.XXX:3676     | sip:85.XXX.XXX.XXX:3688    |   1    |
  -----------------------------------------------------------------------

  The problem is that the call from 1003 to 1007 initiates OK, but
  disconnects after 20-30 seconds.

  From my logs it looks like OpenSER stops sending SIP messages to port
  49163 after getting SDP from 1007,  but starts sending to 49162
  instead, so 1007 never gets the ACK message.

  So 1007 repeatedly sends SDP description but OpenSER replies to the
wrong port.

  Please see the attached picture, graph from Wireshark.If the picture
  doesn't attach, it can be found here:
  http://hoski.public.is/openser.jpg

  So my question is, why does OpenSER stop sending SIP messages to port:
  49163 and how can I fix it?


  Thanks in advance,
  Hoski

  listen = XX.XXX.XX.XXX
  mpath = "/usr/lib/openser/modules"
  children = 8
  debug = 3
  fork = yes
  group = "openser"
  user = "openser"
  disable_tcp = no
  log_facility=LOG_LOCAL7
  log_stderror = no
  tcp_children = 4
  fifo = "/tmp/openser_fifo"
  fifo_db_url="mysql://openser:XXXX@localhost/openser"
  # ATH: Próeftir BOSTON
  fifo_group = "openser"
  fifo_mode = 0666
  fifo_user = "openser"
  mhomed = no
  server_signature = yes
  sock_group = "openser"
  sock_mode = 0600
  sock_user = "openser"
  unix_sock = "/tmp/openser.sock"
  unix_sock_children = 1
  reply_to_via = no
  sip_warning = no
  check_via = no
  dns = no
  rev_dns = no
  syn_branch = yes
  disable_core_dump = no
  dns_try_ipv6 = yes
  dns_use_search_list = yes

  loadmodule "usrloc.so"
  modparam("usrloc", "user_column", "username")
  modparam("usrloc", "domain_column", "domain")
  modparam("usrloc", "contact_column", "contact")
  modparam("usrloc", "expires_column", "expires")
  modparam("usrloc", "q_column", "q")
  modparam("usrloc", "callid_column", "callid")
  modparam("usrloc", "cseq_column", "cseq")
  modparam("usrloc", "methods_column", "methods")
  modparam("usrloc", "flags_column", "flags")
  modparam("usrloc", "user_agent_column", "user_agent")
  modparam("usrloc", "received_column", "received")
  modparam("usrloc", "socket_column", "socket")
  modparam("usrloc", "use_domain", 0)
  modparam("usrloc", "desc_time_order", 0)
  modparam("usrloc", "timer_interval", 60)
  modparam("usrloc", "db_url", "mysql://openser:openserrw@localhost/openser")
  modparam("usrloc", "db_mode", 1)
  modparam("usrloc", "matching_mode", 0)
  modparam("usrloc", "cseq_delay", 20)

  loadmodule "mediaproxy.so"
  modparam("mediaproxy", "mediaproxy_socket",
  "/var/run/mediaproxy/proxydispatcher.sock")
  modparam("mediaproxy", "sip_asymmetrics",
 "/etc/openser/sip-asymmetric-clients")
  modparam("mediaproxy", "rtp_asymmetrics",
 "/etc/openser/rtp-asymmetric-clients")
  modparam("mediaproxy", "natping_interval", 30)

  loadmodule "rr.so"
  modparam("rr", "enable_full_lr", 0)
  modparam("rr", "append_fromtag", 1)
  modparam("rr", "enable_double_rr", 1)
  modparam("rr", "add_username", 0)

  loadmodule "tm.so"
  modparam("tm", "fr_timer", 30)
  modparam("tm", "fr_inv_timer", 120)
  modparam("tm", "wt_timer", 5)
  modparam("tm", "delete_timer", 2)
  modparam("tm", "retr_timer1p1", 1)
  modparam("tm", "retr_timer1p2", 2)
  modparam("tm", "retr_timer1p3", 4)
  modparam("tm", "retr_timer2", 4)
  modparam("tm", "noisy_ctimer", 0)
  modparam("tm", "ruri_matching", 1)
  modparam("tm", "via1_matching", 1)
  modparam("tm", "unix_tx_timeout", 2)
  modparam("tm", "restart_fr_on_each_reply", 1)
  modparam("tm", "fr_timer_avp", "s:callee_fr_timer")
  modparam("tm", "fr_inv_timer_avp", "s:callee_fr_inv_timer")
  modparam("tm", "pass_provisional_replies", 0)

  loadmodule "xlog.so"
  modparam("xlog", "buf_size", 4096)
  modparam("xlog", "force_color", 1)

  loadmodule "domain.so"
  modparam("domain", "db_url", "mysql://openser:XXXXXXX@localhost/openser")
  modparam("domain", "db_mode", 1)
  modparam("domain", "domain_table", "domain")
  modparam("domain", "domain_col", "domain")

  loadmodule "nathelper.so"
  modparam("nathelper", "natping_interval", 180)
  modparam("nathelper", "ping_nated_only", 0)
  modparam("nathelper", "received_avp", 42)
  modparam("nathelper", "rtpproxy_sock", "unix:/var/run/rtpproxy.sock")
  modparam("nathelper", "rtpproxy_disable", 1)
  modparam("nathelper", "rtpproxy_disable_tout", 60)
  modparam("nathelper", "rtpproxy_tout", 1)
  modparam("nathelper", "rtpproxy_retr", 5)
  modparam("nathelper", "sipping_method", "OPTIONS")

  loadmodule "textops.so"

  loadmodule "sl.so"
  modparam("sl", "enable_stats", 1)

  loadmodule "uri.so"

  loadmodule "registrar.so"
  modparam("registrar", "default_expires", 3600)
  modparam("registrar", "min_expires", 60)
  modparam("registrar", "max_expires", 0)
  modparam("registrar", "default_q", 0)
  modparam("registrar", "append_branches", 1)
  modparam("registrar", "use_domain", 0)
  modparam("registrar", "case_sensitive", 0)
  modparam("registrar", "desc_time_order", 0)
  modparam("registrar", "received_avp", 42)
  modparam("registrar", "received_param", "received")
  modparam("registrar", "max_contacts", 0)
  modparam("registrar", "retry_after", 0)
  modparam("registrar", "use_branch_flags", 0)
  modparam("registrar", "method_filtering", 0)
  modparam("registrar", "path_mode", 2)
  modparam("registrar", "path_use_received", 0)
  modparam("registrar", "nat_flag", 6)

  loadmodule "maxfwd.so"
  modparam("maxfwd", "max_limit", 256)

  loadmodule "mysql.so"
  modparam("mysql", "ping_interval", 300)
  modparam("mysql", "auto_reconnect", 1)

  loadmodule "auth.so"
  modparam("auth", "nonce_expire", 300)
  modparam("auth", "rpid_suffix",
";party=calling;id-type=subscriber;screen=yes")
  modparam("auth", "rpid_avp", "s:rpid")

  loadmodule "auth_db.so"
  modparam("auth_db", "db_url", "mysql://openser:XXXXXX@localhost/openser")
  modparam("auth_db", "user_column", "username")
  modparam("auth_db", "domain_column", "domain")
  modparam("auth_db", "password_column", "password")
  modparam("auth_db", "password_column_2", "ha1b")
  modparam("auth_db", "calculate_ha1", 1)
  modparam("auth_db", "use_domain", 0)
  modparam("auth_db", "load_credentials", "rpid")

  loadmodule "uri_db.so"
  modparam("uri_db", "db_url", "mysql://openser:XXXXXXX@localhost/openser")
  modparam("uri_db", "uri_table", "uri")
  modparam("uri_db", "uri_user_column", "username")
  modparam("uri_db", "uri_domain_column", "domain")
  modparam("uri_db", "uri_uriuser_column", "uri_user")
  modparam("uri_db", "subscriber_table", "subscriber")
  modparam("uri_db", "subscriber_user_column", "username")
  modparam("uri_db", "subscriber_domain_column", "domain")
  modparam("uri_db", "use_uri_table", 0)
  modparam("uri_db", "use_domain", 0)

  ########################################################################
  # Request route 'main'
  ########################################################################
  route[0]
  {
        xlog("L_INFO", "New request - M=$rm RURI=$ru F=$fu T=$tu
 IP=$si ID=$ci\n");
        force_rport();
        if(msg:len > max_len)
        {

                xlog("L_INFO", "Message too big - M=$rm RURI=$ru F=$fu
 T=$tu IP=$si
  ID=$ci\n");
                sl_send_reply("513", "Message Too Big");
                exit;
        }
        if (!mf_process_maxfwd_header("10"))
        {

                xlog("L_INFO", "Too many hops - M=$rm RURI=$ru F=$fu
 T=$tu IP=$si ID=$ci\n");
                sl_send_reply("483", "Too Many Hops");
                exit;
        }
        if(!is_method("REGISTER"))
        {
                if(nat_uac_test("19"))
                {
                        record_route(";nat=yes");
                }
                else
                {
                        record_route();
                }
        }
        if(is_method("CANCEL") || is_method("BYE"))
        {
                end_media_session();
        }
        if(loose_route())
        {
                if(!has_totag())
                {

                        xlog("L_INFO", "Initial loose-routing rejected
 - M=$rm RURI=$ru
  F=$fu T=$tu IP=$si ID=$ci\n");
                        sl_send_reply("403", "Initial Loose-Routing Rejected");
                        exit;
                }
                if(nat_uac_test("19") || search("^Route:.*;nat=yes"))
                {
                        fix_nated_contact();
                        setflag(6);
                }

                route(3);
        }
        if(is_method("REGISTER"))
        {
                route(2);
        }
        if(is_method("INVITE"))
        {
                route(4);
        }
        if(is_method("CANCEL") || is_method("ACK"))
        {
                route(8);
        }

        route(9);
  }

  ########################################################################
  # Request route 'stop-media-proxy'
  ########################################################################
  route[1]
  {
        if(isflagset(22))
        {
                end_media_session();
        }

  }

  ########################################################################
  # Request route 'base-route-register'
  ########################################################################
  route[2]
  {
        sl_send_reply("100", "Trying");
        if(!www_authorize("", "subscriber"))
        {

                xlog("L_INFO", "Register authentication failed - M=$rm RURI=$ru
  F=$fu T=$tu IP=$si ID=$ci\n");
                www_challenge("", "0");
                exit;
        }
        if(!check_to())
        {

                xlog("L_INFO", "Spoofed To-URI detected - M=$rm
 RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                sl_send_reply("403", "Spoofed To-URI Detected");
                exit;
        }
        consume_credentials();
        if(!search("^Contact:[ ]*\*") && nat_uac_test("19"))
        {
                fix_nated_register();
                setflag(6);
        }
        if(!save("location"))
        {

                xlog("L_ERR", "Saving contact failed - M=$rm RURI=$ru
 F=$fu T=$tu
  IP=$si ID=$ci\n");
                sl_reply_error();
                exit;
        }

        xlog("L_INFO", "Registration successful - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
        exit;

  }

  ########################################################################
  # Request route 'base-outbound'
  ########################################################################
  route[3]
  {
        if(isflagset(6))
        {
                if(!isflagset(22) && !search("^Content-Length:[ ]*0"))
                {
                        setflag(22);
                        use_media_proxy();
                }

                t_on_reply("2");
        }
        else
        {

                t_on_reply("1");
        }
        if(!isflagset(21))
        {

                t_on_failure("1");
        }
        if(isflagset(29))
        {
                append_branch();
        }
        if(is_present_hf("Proxy-Authorization"))
        {
                consume_credentials();
        }

        xlog("L_INFO", "Request leaving server, D-URI='$du' - M=$rm RURI=$ru
  F=$fu T=$tu IP=$si ID=$ci\n");
        if(!t_relay())
        {
                sl_reply_error();
                if(is_method("INVITE") && isflagset(6))
                {
                        end_media_session();
                }
        }
        exit;

  }

  ########################################################################
  # Request route 'base-route-invite'
  ########################################################################
  route[4]
  {
        sl_send_reply("100", "Trying");
        if(!proxy_authorize("", "subscriber"))
        {

                xlog("L_INFO", "Proxy authentication failed - M=$rm
 RURI=$ru F=$fu
  T=$tu IP=$si ID=$ci\n");
                proxy_challenge("", "0");
                exit;
        }
        if(!check_from())
        {

                xlog("L_INFO", "Spoofed From-URI detected - M=$rm RURI=$ru F=$fu
  T=$tu IP=$si ID=$ci\n");
                sl_send_reply("403", "Spoofed From-URI Detected");
                exit;
        }
        if(nat_uac_test("19"))
        {
                fix_nated_contact();
                setflag(6);
        }

        route(5);
  }

  ########################################################################
  # Request route 'invite-find-callee'
  ########################################################################
  route[5]
  {
        if(!is_domain_local("$ruri"))
        {
                setflag(20);

                route(7);
        }
        if(does_uri_exist())
        {

                xlog("L_INFO", "Callee is local - M=$rm RURI=$ru F=$fu
 T=$tu IP=$si
  ID=$ci\n");
                route(6);
        }
        else
        {

                xlog("L_INFO", "Callee is not local - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                route(7);
        }
        exit;

  }

  ########################################################################
  # Request route 'invite-to-internal'
  ########################################################################
  route[6]
  {
        if(!lookup("location"))
        {

                xlog("L_INFO", "Local user offline - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                sl_send_reply("404", "User Offline");
        }
        else
        {

                xlog("L_INFO", "Local user online - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                route(3);
        }
        exit;

  }

  ########################################################################
  # Request route 'invite-to-external'
  ########################################################################
  route[7]
  {
        if(isflagset(20))
        {

                xlog("L_INFO", "Call to foreign domain - M=$rm
 RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                route(3);
                exit;
        }

        xlog("L_INFO", "Call to unknown user - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
        sl_send_reply("404", "User Not Found");
        exit;

  }

  ########################################################################
  # Request route 'base-route-local'
  ########################################################################
  route[8]
  {
        t_on_reply("1");
        if(t_check_trans())
        {

                xlog("L_INFO", "Request leaving server - M=$rm
 RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
                if(!t_relay())
                {
                        sl_reply_error();
                }
        }
        else
        {

                xlog("L_INFO", "Dropping mis-routed request - M=$rm
 RURI=$ru F=$fu
  T=$tu IP=$si ID=$ci\n");
        }
        exit;

  }

  ########################################################################
  # Request route 'base-route-generic'
  ########################################################################
  route[9]
  {
        xlog("L_INFO", "Method not supported - M=$rm RURI=$ru F=$fu T=$tu
  IP=$si ID=$ci\n");
        sl_send_reply("501", "Method Not Supported Here");
        exit;

  }

  ########################################################################
  # Request route 'base-filter-failover'
  ########################################################################
  route[10]
  {
        if(!t_check_status("408|500|503"))
        {

                xlog("L_INFO", "No failover routing needed for this
 response code -
  M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
                route(1);
                exit;
        }

  }

  ########################################################################
  # Reply route 'base-standard-reply'
  ########################################################################
  onreply_route[1]
  {
        xlog("L_INFO", "Reply - S=$rs D=$rr F=$fu T=$tu IP=$si ID=$ci\n");
        exit;

  }

  ########################################################################
  # Reply route 'base-nat-reply'
  ########################################################################
  onreply_route[2]
  {
        xlog("L_INFO", "NAT-Reply - S=$rs D=$rr F=$fu T=$tu IP=$si ID=$ci\n");
        if(nat_uac_test("1"))
        {
                fix_nated_contact();
        }
        if(isflagset(6) && status=~"(180)|(183)|2[0-9][0-9]")
        {
                if(!search("^Content-Length:[ ]*0"))
                {
                        use_media_proxy();
                }
        }
        exit;

  }

  ########################################################################
  # Failure route 'base-standard-failure'
  ########################################################################
  failure_route[1]
  {
        route(10);
        route(1);
  }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: openser.JPG
Type: image/jpeg
Size: 60724 bytes
Desc: not available
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20080427/ef8610e2/attachment.jpeg>


More information about the sr-users mailing list