title: How to configure kamailio server with load balancing and asterisk?
body: <p>I want to configure Kamailio server so that traffic will be forwarded to other four asterisk servers equally. It is working fine with a single asterisk box but I am unable to forward a call to another asterisk box.</p>
  
  <p>Here is the kamailio.cfg that I am using.</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>#!KAMAILIO
   
  #!define WITH_MYSQL
  #!define WITH_AUTH
  #!define WITH_USRLOCDB
  #!define WITH_NAT
  #!define WITH_ASTERISK
   
   
  # *** Value defines - IDs used later in config
  #!ifdef WITH_MYSQL
  # - database URL - used to connect to database server by modules such
  #       as: auth_db, acc, usrloc, a.s.o.
  #!define DBURL "mysql://root:PASS@127.0.0.1/openser"
  #!ifdef WITH_ASTERISK
  #!define DBASTURL "mysql://root:PASS@127.0.0.1/db_portal_mahtab"
  #!endif
  #!endif
  #!ifdef WITH_MULTIDOMAIN
  # - the value for 'use_domain' parameters
  #!define MULTIDOMAIN 1
  #!else
  #!define MULTIDOMAIN 0
  #!endif
   
  # - flags
  #   FLT_ - per transaction (message) flags
  # FLB_ - per branch flags
  #!define FLT_ACC 1
  #!define FLT_ACCMISSED 2
  #!define FLT_ACCFAILED 3
  #!define FLT_NATS 5
   
  #!define FLB_NATB 6
  #!define FLB_NATSIPPING 7
   
  ####### Global Parameters #########
   
  #!ifdef WITH_DEBUG
  debug=4
  log_stderror=yes
  #!else
  debug=4
  log_stderror=no
  #!endif
  
  log_name="kamailio"
  
  memdbg=5
  memlog=5
   log_facility=LOG_LOCAL0
   fork=yes
  children=4
   
  #disable_tcp=yes
  local aliases
     based on reverse DNS on IPs (default on) */
  #auto_aliases=no
  #alias="localhost"
  listen=udp:IPADDRESS:5060
   
  ;port=5060
   
  #!ifdef WITH_TLS
  enable_tls=yes
  #!endif
   
  tcp_connection_lifetime=3605
   
  #!ifdef WITH_VOICEMAIL
  # VoiceMail Routing on offline, busy or no answer
  #
  # - by default Voicemail server IP is empty to avoid misrouting
  voicemail.srv_ip = "" desc "VoiceMail IP Address"
  voicemail.srv_port = "5060" desc "VoiceMail Port"
  #!endif
    
  #!ifdef WITH_ASTERISK
  asterisk.bindip = "IPADDRESSA" desc "Asterisk IP Address"
  asterisk.bindport = "5080" desc "Asterisk Port"
  kamailio.bindip = "IPADDRESSB" desc "Kamailio IP Address"
  kamailio.bindport = "5060" desc "Kamailio Port"
  #!endif
   
  ####### Modules Section ########
   
  # set paths to location of modules (to sources or installation folders)
  #!ifdef WITH_SRCPATH
  mpath="modules_k:modules"
  #!else
  mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/:/usr/local/lib/kamailio/modules_s/"
  #!endif
   
  #!ifdef WITH_MYSQL
  loadmodule "db_mysql.so"
  #!endif
  loadmodule "mi_datagram.so"
  loadmodule "dispatcher.so"
  loadmodule "mi_fifo.so"
  loadmodule "kex.so"
  loadmodule "tm.so"
  loadmodule "tmx.so"
  loadmodule "sl.so"
  loadmodule "rr.so"
  loadmodule "pv.so"
  loadmodule "maxfwd.so"
  loadmodule "usrloc.so"
  loadmodule "registrar.so"
  loadmodule "textops.so"
  loadmodule "siputils.so"
  loadmodule "xlog.so"
  loadmodule "sanity.so"
  loadmodule "ctl.so"
  loadmodule "cfg_rpc.so"
  loadmodule "mi_rpc.so"
  loadmodule "acc.so"
  loadmodule "rtimer.so"
  loadmodule "sqlops.so"
  loadmodule "htable.so"
  loadmodule "ipops.so"
  
  route[CDRS] {
   sql_query("ca","call kamailio_cdrs()","rb");
   sql_query("ca","call kamailio_rating('default')","rb");
   
  }
  
  
  modparam("rtimer", "timer", "name=tst;interval=300;mode=1;")
  modparam("rtimer", "exec", "timer=tst;route=STATS")
  modparam("rtimer", "timer", "name=cdr;interval=300;mode=1;")
  modparam("rtimer", "exec", "timer=cdr;route=CDRS")
   
  modparam("sqlops","sqlcon","ca=&gt;mysql://root:PASS@127.0.0.1/openser")
  
   
  modparam("htable", "htable", "stats=&gt;size=6;")
   route[STATS] {
   
   # clean very old records
   $var(tmc) = $var(tmc) + 1;
   $var(x) = $var(tmc) mod 144;
   if($var(x) == 0)
       sql_query("ca",
     "delete from statistics where time_stamp&lt;$Ts - 864000",
     "ra");
   
   # insert values for Kamailio internal statistics
   sql_query("ca",
    "insert into statistics (time_stamp,shm_used_size,"
    "shm_real_used_size,shm_max_used_size,shm_free_used_size,"
    "ul_users,ul_contacts) values ($Ts,$stat(used_size),"
    "$stat(real_used_size),$stat(max_used_size),$stat(free_size),"
    "$stat(location-users),$stat(location-contacts))",
    "ra");
   
   # init the values for first execution, compute the diff for the rest
   if($var(tmc)==1)
   {
    $var(rcv_req_diff) = $stat(rcv_requests);
    $var(fwd_req_diff) = $stat(fwd_requests);
    $var(2xx_trans_diff) = $stat(2xx_transactions);
   } else {
    $var(rcv_req_diff) = $stat(rcv_requests) - $sht(stats=&gt;last_rcv_req);
    $var(fwd_req_diff) = $stat(fwd_requests) - $sht(stats=&gt;last_fwd_req);
    $var(2xx_trans_diff) = $stat(2xx_transactions) 
           - $sht(stats=&gt;last_2xx_trans);
   }
   # update the values for stats stored in cache (htable)
   $sht(stats=&gt;last_rcv_req) = $stat(rcv_requests);
   $sht(stats=&gt;last_fwd_req) = $stat(fwd_requests);
   $sht(stats=&gt;last_2xx_trans) = $stat(2xx_transactions);
   
   # insert values for stats computed in config
   sql_query("ca",
    "update statistics set tm_active=$stat(inuse_transactions),"
    "rcv_req_diff=$var(rcv_req_diff),fwd_req_diff=$var(fwd_req_diff),"
    "2xx_trans_diff=$var(2xx_trans_diff) where time_stamp=$Ts",
    "ra");
  }
  
  #!ifdef WITH_AUTH
  loadmodule "auth.so"
  loadmodule "auth_db.so"
  #!ifdef WITH_IPAUTH
  loadmodule "permissions.so"
  #!endif
  #!endif
   
  #!ifdef WITH_ALIASDB
  loadmodule "alias_db.so"
  #!endif
   
  #!ifdef WITH_SPEEDDIAL
  loadmodule "speeddial.so"
  #!endif
   
  #!ifdef WITH_MULTIDOMAIN
  loadmodule "domain.so"
  #!endif
   
  #!ifdef WITH_PRESENCE
  loadmodule "presence.so"
  loadmodule "presence_xml.so"
  #!endif
   
  #!ifdef WITH_NAT
  loadmodule "nathelper.so"
  loadmodule "rtpproxy.so"
  #!endif
   
  #!ifdef WITH_TLS
  loadmodule "tls.so"
  #!endif
   
  #!ifdef WITH_ANTIFLOOD
  loadmodule "htable.so"
  loadmodule "pike.so"
  #!endif
   
  #!ifdef WITH_XMLRPC
  loadmodule "xmlrpc.so"
  #!endif
   
  #!ifdef WITH_DEBUG
  loadmodule "debugger.so"
  #!endif
   
  #!ifdef WITH_ASTERISK
  loadmodule "uac.so"
  #!endif
   
  
  
  
  # ----------------- setting module-specific parameters ---------------
   
   
  # ----- mi_fifo params -----
  modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
   
   
  # ----- tm params -----
  # auto-discard branches from previous serial forking leg
  modparam("tm", "failure_reply_mode", 3)
  # default retransmission timeout: 30sec
  modparam("tm", "fr_timer", 30000)
  # default invite retransmission timeout after 1xx: 120sec
  modparam("tm", "fr_inv_timer", 120000)
   
  modparam("dispatcher", "db_url","mysql://root:PASS@127.0.0.1/openser")
  modparam("dispatcher", "table_name", "dispatcher")
  #modparam("dispatcher", "ds_ping_interval", 3)
  modparam("dispatcher", "ds_ping_from", "sip:dispatcher@localhost")
  modparam("dispatcher", "force_dst", 1)
  modparam("dispatcher", "ds_ping_method", "INFO")
  modparam("dispatcher", "ds_ping_reply_codes", "class=2;code=403;code=404;code=484;code=488;code=481;class=3;class=408 ")
  # do failover
  modparam("dispatcher", "flags", 2)
  modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")
  modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")
  modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")
  # -----cmd
  modparam("mi_datagram", "socket_name", "udp:IPADDRESS:8033")
  # ----- rr params -----
  # add value to ;lr param to cope with most of the UAs
  modparam("rr", "enable_full_lr", 1)
  # do not append from tag to the RR (no need for this script)
  #!ifdef WITH_ASTERISK
  modparam("rr", "append_fromtag", 1)
  #!else
  modparam("rr", "append_fromtag", 0)
  #!endif
   
  # ----- registrar params -----
  modparam("registrar", "method_filtering", 1)
  /* uncomment the next line to disable parallel forking via location */
  # modparam("registrar", "append_branches", 0)
  /* uncomment the next line not to allow more than 10 contacts per AOR */
  #modparam("registrar", "max_contacts", 10)
  # max value for expires of registrations
  modparam("registrar", "max_expires", 3600)
  # set it to 1 to enable GRUU
  modparam("registrar", "gruu_enabled", 0)
   
   
  # ----- acc params -----
  /* what special events should be accounted ? */
  modparam("acc", "early_media", 1)
  modparam("acc", "report_ack", 1)
  modparam("acc", "report_cancels", 0)
  /* by default ww do not adjust the direct of the sequential requests.
     if you enable this parameter, be sure the enable "append_fromtag"
     in "rr" module */
  modparam("acc", "detect_direction", 0)
  /* account triggers (flags) */
  modparam("acc", "log_flag", FLT_ACC)
  modparam("acc", "log_missed_flag", FLT_ACCMISSED)
  modparam("acc", "log_extra", 
   "src_user=$fU;src_domain=$fd;src_ip=$si;"
   "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
  modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
  /* enhanced DB accounting */
  #!ifdef WITH_ACCDB
  modparam("acc", "db_flag", FLT_ACC)
  modparam("acc", "db_missed_flag", FLT_ACCMISSED)
  modparam("acc", "db_url", DBURL)
  modparam("acc", "db_extra",
   "src_user=$fU;src_domain=$fd;src_ip=$si;"
   "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
  
  #modparam("acc", "cdr_enable", 1)
  #modparam("acc", "cdr_start_on_confirmed", 1)
  #modparam("acc", "cdr_start_id", "start")
  #modparam("acc", "cdr_end_id", "end")
  #modparam("acc", "cdr_duration_id", "d")
  #modparam("acc", "cdr_log_enable", 1)
  modparam("acc", "cdrs_table", "cdrs")
  #!endif
   
  
   
  # ----- usrloc params -----
  /* enable DB persistency for location entries */
  #!ifdef WITH_USRLOCDB
  modparam("usrloc", "db_url", DBURL)
  modparam("usrloc", "db_mode", 2)
  modparam("usrloc", "use_domain", MULTIDOMAIN)
  #!endif
   
   
  # ----- auth_db params -----
  #!ifdef WITH_AUTH
  modparam("auth_db", "calculate_ha1", yes)
  modparam("auth_db", "load_credentials", "")
   
  #!ifdef WITH_ASTERISK
  modparam("auth_db", "user_column", "username")
  modparam("auth_db", "password_column", "sippasswd")
  modparam("auth_db", "db_url", DBASTURL)
  modparam("auth_db", "version_table", 0)
  #!else
  modparam("auth_db", "db_url", DBURL)
  modparam("auth_db", "password_column", "password")
  modparam("auth_db", "use_domain", MULTIDOMAIN)
  #!endif
   
  # ----- permissions params -----
  #!ifdef WITH_IPAUTH
  modparam("permissions", "db_url", DBURL)
  modparam("permissions", "db_mode", 1)
  #!endif
   
  #!endif
   
   
  # ----- alias_db params -----
  #!ifdef WITH_ALIASDB
  modparam("alias_db", "db_url", DBURL)
  modparam("alias_db", "use_domain", MULTIDOMAIN)
  #!endif
   
   
  # ----- speedial params -----
  #!ifdef WITH_SPEEDDIAL
  modparam("speeddial", "db_url", DBURL)
  modparam("speeddial", "use_domain", MULTIDOMAIN)
  #!endif
   
   
  # ----- domain params -----
  #!ifdef WITH_MULTIDOMAIN
  modparam("domain", "db_url", DBURL)
  # register callback to match myself condition with domains list
  modparam("domain", "register_myself", 1)
  #!endif
   
   
  #!ifdef WITH_PRESENCE
  # ----- presence params -----
  modparam("presence", "db_url", DBURL)
   
  # ----- presence_xml params -----
  modparam("presence_xml", "db_url", DBURL)
  modparam("presence_xml", "force_active", 1)
  #!endif
   
   
  #!ifdef WITH_NAT
  # ----- rtpproxy params -----
  modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
  modparam("rtpproxy", "rtpproxy_disable_tout", 8)
  modparam("rtpproxy", "rtpproxy_tout", 2)
   
  # ----- 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@kamailio.org")
   
  # params needed for NAT traversal in other modules
  modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
  modparam("usrloc", "nat_bflag", FLB_NATB)
  #!endif
   
   
  #!ifdef WITH_TLS
  # ----- tls params -----
  modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
  #!endif
   
  #!ifdef WITH_ANTIFLOOD
  # ----- pike params -----
  modparam("pike", "sampling_time_unit", 2)
  modparam("pike", "reqs_density_per_unit", 16)
  modparam("pike", "remove_latency", 4)
   
  # ----- htable params -----
  # ip ban htable with autoexpire after 5 minutes
  modparam("htable", "htable", "ipban=&gt;size=8;autoexpire=300;")
  #!endif
   
  #!ifdef WITH_XMLRPC
  # ----- xmlrpc params -----
  modparam("xmlrpc", "route", "XMLRPC");
  modparam("xmlrpc", "url_match", "^/RPC")
  #!endif
   
  #!ifdef WITH_DEBUG
  # ----- debugger params -----
  modparam("debugger", "cfgtrace", 1)
  #!endif
   
  ####### Routing Logic ########
  
  
  # Main SIP request routing logic
  # - processing of any incoming SIP request starts with this route
  # - note: this is the same as route { ... }
  request_route {
   
   # per request initial checks
   route(REQINIT);
   
   # NAT detection
   route(NATDETECT);
   
   # handle requests within SIP dialogs
   route(WITHINDLG);
   
   ### only initial requests (no To tag)
   
   # CANCEL processing
   if (is_method("CANCEL"))
   {
    if (t_check_trans())
     t_relay();
    exit;
   }
   
   t_check_trans();
   
   # authentication
   route(AUTH);
   
   # record routing for dialog forming requests (in case they are routed)
   # - remove preloaded route headers
   remove_hf("Route");
   if (is_method("INVITE|SUBSCRIBE"))
    record_route();
   
   # account only INVITEs
   if (is_method("INVITE"))
   {
    setflag(FLT_ACC); # do accounting
   }
   
   # dispatch requests to foreign domains
   route(SIPOUT);
   
   ### requests for my local domains
   
   # handle presence related requests
   route(PRESENCE);
   
   # handle registrations
   route(REGISTRAR);
   
   if ($rU==$null)
   {
    # request with no Username in RURI
    sl_send_reply("484","Address Incomplete");
    exit;
   }
   
   # dispatch destinations to PSTN
   route(PSTN);
   
   # user location service
   route(LOCATION);
   
   route(RELAY);
  }
   
  route[DISPATCH] {
          # round robin dispatching on gateways group '1'
        xlog("trying for dispatch");
          if (!ds_select_domain("1", "4")) {
            send_reply("404", "No destination");
            exit;
          }
          t_on_failure("RTF_DISPATCH");
   route(RELAY);
   exit;
  }
  # Sample failure route
  failure_route[RTF_DISPATCH] {
   if (t_is_canceled()) {
    exit;
   }
   # next DST - only for 500 or local timeout
   if (t_check_status("500")
     or (t_branch_timeout() and !t_branch_replied()))
   {
    if(ds_next_dst())
    {
     t_on_failure("RTF_DISPATCH");
     route(RELAY);
     exit;
    }
   }
  }
  
   
  route[RELAY] {
   
   # enable additional event routes for forwarded requests
   # - serial forking, RTP relaying handling, a.s.o.
   if (is_method("INVITE|SUBSCRIBE")) {
    t_on_branch("MANAGE_BRANCH");
    t_on_reply("MANAGE_REPLY");
   }
   if (is_method("INVITE")) {
    t_on_failure("MANAGE_FAILURE");
   }
   
   if (!t_relay()) {
    sl_reply_error();
   }
   exit;
  }
   
  # Per SIP request initial checks
  route[REQINIT] {
  #!ifdef WITH_ANTIFLOOD
   # flood dection from same IP and traffic ban for a while
   # be sure you exclude checking trusted peers, such as pstn gateways
   # - local host excluded (e.g., loop to self)
   if(src_ip!=myself)
   {
    if($sht(ipban=&gt;$si)!=$null)
    {
     # ip is already blocked
     xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
     exit;
    }
    if (!pike_check_req())
    {
     xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
     $sht(ipban=&gt;$si) = 1;
     exit;
    }
   }
  #!endif
   
   if (!mf_process_maxfwd_header("10")) {
    sl_send_reply("483","Too Many Hops");
    exit;
   }
   
   if(!sanity_check("1511", "7"))
   {
    xlog("Malformed SIP message from $si:$sp\n");
    exit;
   }
  }
   
  # Handle requests within SIP dialogs
  route[WITHINDLG] {
   if (has_totag()) {
    # sequential request withing a dialog should
    # take the path determined by record-routing
    if (loose_route()) {
     if (is_method("BYE")) {
      setflag(FLT_ACC); # do accounting ...
      setflag(FLT_ACCFAILED); # ... even if the transaction fails
     }
     if ( is_method("ACK") ) {
      # ACK is forwarded statelessy
      route(NATMANAGE);
     }
     route(RELAY);
    } else {
     if (is_method("SUBSCRIBE") &amp;&amp; uri == myself) {
      # in-dialog subscribe requests
      route(PRESENCE);
      exit;
     }
     if ( is_method("ACK") ) {
      if ( t_check_trans() ) {
       # no 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
       exit;
      }
     }
     sl_send_reply("404","Not here");
    }
    exit;
   }
  }
   
  # Handle SIP registrations
  route[REGISTRAR] {
   if (is_method("REGISTER"))
   {
    if(isflagset(FLT_NATS))
    {
     setbflag(FLB_NATB);
     # uncomment next line to do SIP NAT pinging 
     ## setbflag(FLB_NATSIPPING);
    }
    if (!save("location"))
     sl_reply_error();
   
  #!ifdef WITH_ASTERISK
    route(REGFWD);
  #!endif
   
    exit;
   }
  }
   
  # USER location service
  route[LOCATION] {
   
  #!ifdef WITH_SPEEDIAL
   # search for short dialing - 2-digit extension
   if($rU=~"^[0-9][0-9]$")
    if(sd_lookup("speed_dial"))
     route(SIPOUT);
  #!endif
   
  #!ifdef WITH_ALIASDB
   # search in DB-based aliases
   if(alias_db_lookup("dbaliases"))
    route(SIPOUT);
  #!endif
   
  #!ifdef WITH_ASTERISK
   if(is_method("INVITE") &amp;&amp; (!route(FROMASTERISK))) {
    # if new call from out there - send to Asterisk
    # - non-INVITE request are routed directly by Kamailio
    # - traffic from Asterisk is routed also directy by Kamailio
    route(TOASTERISK);
    exit;
   }
  #!endif
   
   $avp(oexten) = $rU;
   if (!lookup("location")) {
    $var(rc) = $rc;
    route(TOVOICEMAIL);
    t_newtran();
    switch ($var(rc)) {
     case -1:
     case -3:
      send_reply("404", "Not Found");
      exit;
     case -2:
      send_reply("405", "Method Not Allowed");
      exit;
    }
   }
   
   # when routing via usrloc, log the missed calls also
   if (is_method("INVITE"))
   {
    setflag(FLT_ACCMISSED);
   }
  }
   
  # Presence server route
  route[PRESENCE] {
   if(!is_method("PUBLISH|SUBSCRIBE"))
    return;
   
  #!ifdef WITH_PRESENCE
   if (!t_newtran())
   {
    sl_reply_error();
    exit;
   };
   
   if(is_method("PUBLISH"))
   {
    handle_publish();
    t_release();
   }
   else
   if( is_method("SUBSCRIBE"))
   {
    handle_subscribe();
    t_release();
   }
   exit;
  #!endif
   
   # if presence enabled, this part will not be executed
   if (is_method("PUBLISH") || $rU==$null)
   {
    sl_send_reply("404", "Not here");
    exit;
   }
   return;
  }
   
  # Authentication route
  route[AUTH] {
  #!ifdef WITH_AUTH
   
  #!ifdef WITH_ASTERISK
   # do not auth traffic from Asterisk - trusted!
   if(route(FROMASTERISK))
    return;
  #!endif
   
  #!ifdef WITH_IPAUTH
   if((!is_method("REGISTER")) &amp;&amp; allow_source_address())
   {
    # source IP allowed
    return;
   }
  #!endif
   
   if (is_method("REGISTER") || from_uri==myself)
   {
    # authenticate requests
  #!ifdef WITH_ASTERISK
    if (!auth_check("$fd", "sipusers", "1")) {
  #!else
    if (!auth_check("$fd", "subscriber", "1")) {
  #!endif
     auth_challenge("$fd", "0");
     exit;
    }
    # user authenticated - remove auth header
    if(!is_method("REGISTER|PUBLISH"))
     consume_credentials();
   }
   # if caller is not local subscriber, then check if it calls
   # a local destination, otherwise deny, not an open relay here
   if (from_uri!=myself &amp;&amp; uri!=myself)
   {
    sl_send_reply("403","Not relaying");
    exit;
   }
   
  #!endif
   return;
  }
   
  # Caller NAT detection route
  route[NATDETECT] {
  #!ifdef WITH_NAT
   force_rport();
   if (nat_uac_test("19")) {
    if (is_method("REGISTER")) {
     fix_nated_register();
    } else {
     fix_nated_contact();
    }
    setflag(FLT_NATS);
   }
  #!endif
   return;
  }
  
  
  route[RTPPROXY] {
          if (is_method("INVITE")){
                  sql_query("ca", "select destination from dispatcher where destination like '%$dd%'","ra");
                  if($dbr(ra=&gt;rows)&gt;0){
                          $avp(duip)=$(du{s.select,-2,:});
                          if (is_ip_rfc1918("$avp(duip)")) {
                                  xlog("L_INFO", "Call is going to private IPv4 Media Server Engage RTPProxy Now\n");
                                 
                                  rtpproxy_manage("rwie");
                          }
  
                  }
                  else if(ds_is_from_list()){
                          if (is_ip_rfc1918("$si")) {
                                  xlog("L_INFO", " Call is coming from a private IPv4 Media Server Engage RTPProxy Now\n");
                                  
                                  rtpproxy_manage("rwei");
  
                          }
                  }else if(!ds_is_from_list()){
                            rtpproxy_manage("rwie");
  
                  }
        }
  
  }
  
  
  # RTPProxy control
  route[NATMANAGE] {
  #!ifdef WITH_NAT
   if (is_request()) {
    if(has_totag()) {
     if(check_route_param("nat=yes")) {
      setbflag(FLB_NATB);
     }
    }
   }
   if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))){
                  return;
          }
                  
   
   
   rtpproxy_manage();
   
   if (is_request()) {
    if (!has_totag()) {
     add_rr_param(";nat=yes");
    }
   }
   if (is_reply()) {
    if(isbflagset(FLB_NATB)) {
     fix_nated_contact();
    }
   }
  #!endif
   return;
  }
   
  # Routing to foreign domains
  route[SIPOUT] {
   if (!uri==myself)
   {
    append_hf("P-hint: outbound\r\n");
    route(RELAY);
   }
  }
   
  # PSTN GW routing
  route[PSTN] {
  #!ifdef WITH_PSTN
   # check if PSTN GW IP is defined
   if (strempty($sel(cfg_get.pstn.gw_ip))) {
    xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
    return;
   }
   
   # route to PSTN dialed numbers starting with '+' or '00'
   #     (international format)
   # - update the condition to match your dialing rules for PSTN routing
   if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
    return;
   
   # only local users allowed to call
   if(from_uri!=myself) {
    sl_send_reply("403", "Not Allowed");
    exit;
   }
   
   $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
   
   route(RELAY);
   exit;
  #!endif
   
   return;
  }
   
  # XMLRPC routing
  #!ifdef WITH_XMLRPC
  route[XMLRPC] {
   # allow XMLRPC from localhost
   if ((method=="POST" || method=="GET")
     &amp;&amp; (src_ip==127.0.0.1)) {
    # close connection only for xmlrpclib user agents (there is a bug in
    # xmlrpclib: it waits for EOF before interpreting the response).
    if ($hdr(User-Agent) =~ "xmlrpclib")
     set_reply_close();
    set_reply_no_connect();
    dispatch_rpc();
    exit;
   }
   send_reply("403", "Forbidden");
   exit;
  }
  #!endif
   
  # route to voicemail server
  route[TOVOICEMAIL] {
  #!ifdef WITH_VOICEMAIL
   if(!is_method("INVITE"))
    return;
   
   # check if VoiceMail server IP is defined
   if (strempty($sel(cfg_get.voicemail.srv_ip))) {
    xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
    return;
   }
   if($avp(oexten)==$null)
    return;
   
   $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
      + ":" + $sel(cfg_get.voicemail.srv_port);
   route(RELAY);
   exit;
  #!endif
   
   return;
  }
   
  # manage outgoing branches
  branch_route[MANAGE_BRANCH] {
   xdbg("new branch [$T_branch_idx] to $ru\n");
   route(NATMANAGE);
  }
   
  # manage incoming replies
  onreply_route[MANAGE_REPLY] {
   xdbg("incoming reply\n");
   if(status=~"[12][0-9][0-9]")
    route(NATMANAGE);
  }
   
  # manage failure routing cases
  failure_route[MANAGE_FAILURE] {
   route(NATMANAGE);
   
   if (t_is_canceled()) {
    exit;
   }
   
  #!ifdef WITH_BLOCK3XX
   # block call redirect based on 3xx replies.
   if (t_check_status("3[0-9][0-9]")) {
    t_reply("404","Not found");
    exit;
   }
  #!endif
   
  #!ifdef WITH_VOICEMAIL
   # serial forking
   # - route to voicemail on busy or no answer (timeout)
   if (t_check_status("486|408")) {
    route(TOVOICEMAIL);
    exit;
   }
  #!endif
  }
   
  #!ifdef WITH_ASTERISK
  # Test if coming from Asterisk
  route[FROMASTERISK] {
     if(ds_is_from_list()){
          
          return 1;
     }
   return -1;
  }
   
  route[TOASTERISK] {
          ds_mark_dst("P");
          if(!ds_select_dst("1", "9")) {
                  sl_send_reply("500", "Service Unavailable");
                  
                  exit;
          }
  
            
  
   route(RELAY);
   exit;
  }
   
   
  # Forward REGISTER to Asterisk
  route[REGFWD] {
   if(!is_method("REGISTER"))
   {
    return;
   }
   $var(rip) = $sel(cfg_get.asterisk.bindip);
   $uac_req(method)="REGISTER";
   $uac_req(ruri)="sip:" + $var(rip) + ":" + $sel(cfg_get.asterisk.bindport);
   $uac_req(furi)="sip:" + $au + "@" + $var(rip);
   $uac_req(turi)="sip:" + $au + "@" + $var(rip);
   $uac_req(hdrs)="Contact: &lt;sip:" + $au + "@"
      + $sel(cfg_get.kamailio.bindip)
      + ":" + $sel(cfg_get.kamailio.bindport) + "&gt;\r\n";
   if($sel(contact.expires) != $null)
    $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $sel(contact.expires) + "\r\n";
   else
    $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $hdr(Expires) + "\r\n";
   uac_req_send();
  }
  #!endif</code></pre>
  </div>
  </div>
  </p>