<div>Hi, all.</div><div><br></div><div>My goal is to building scalable multi-domain(tenant) telephone system using Opensips with multiple asterisk servers that can be multi-domain.</div><div>But I ran into a problem during the progress.</div>
<div><br></div><div>Structure of the system for test is</div><div>Opensips(10.10.10.10) ------ Asterisk A(20.02.0.20), Asterisk B(30.30.30.30)</div><div><br></div><div>My Opensips modules(auth_db, usrloc, uri) are enabled "use_domain".</div>
<div>Below are flows for test.</div><div><br></div><div>Flow 1. Registrar</div><div>a : User A (<a href="mailto:1000@foo.com">1000@foo.com</a>) -----register-----> OpenSIPS => 200 OK.</div><div>b : User B (<a href="mailto:2000@bar.com">2000@bar.com</a>) -----register-----> OpenSIPS => 200 OK.</div>
<div><br></div><div>Flow 2. User A(<a href="mailto:1000@foo.com">1000@foo.com</a>) call User B(<a href="mailto:2000@bar.com">2000@bar.com</a>)</div><div>a : User A -----INVITE-----> OpenSIPS (via load_balancer) -----INVITE-----> Asterisk A</div>
<div>b : Asterisk A -----Dial(SIP/${EXTEN}@OPENSIPS)-----> OpenSIPS => lookup("location) FAILED about <a href="mailto:2000@10.10.10.10">2000@10.10.10.10</a></div><div><br></div><div>If "usrloc.so" dont't use domain it works good. but otherwise it fails.</div>
<div>I think the problem occurred because the lookup() find contact using "userid@domain".</div><div><br></div><div>How can I fix this? I will append content of opensips.cfg below.</div><div><br></div><div>Would really appreciate it if you can help.</div>
<div>Thanks in advance.</div><div><br></div><div>-Kook Maeng</div><div><br></div><div><br></div><div>----- opensip.cfg -----</div><div><br></div><div>####### Global Parameters #########</div><div><br></div><div>alias="14.63.222.202"</div>
<div>advertised_address="14.63.222.202"</div><div><br></div><div>#debug=3</div><div>#log_stderror=no</div><div>log_facility=LOG_LOCAL0</div><div><br></div><div>fork=yes</div><div>children=4</div><div><br></div><div>
port=5060</div><div>#listen=udp:211.62.253.136</div><div><br></div><div><br></div><div>####### Modules Section ########</div><div><br></div><div>#set module path</div><div>mpath="/usr/lib/opensips/modules/"</div>
<div><br></div><div>loadmodule "db_mysql.so"</div><div>loadmodule "signaling.so"</div><div>loadmodule "sl.so"</div><div>loadmodule "tm.so"</div><div>loadmodule "rr.so"</div>
<div>loadmodule "maxfwd.so"</div><div>loadmodule "usrloc.so"</div><div>loadmodule "registrar.so"</div><div>loadmodule "textops.so"</div><div>loadmodule "mi_fifo.so"</div><div>
loadmodule "uri.so"</div><div>loadmodule "acc.so"</div><div>loadmodule "auth.so"</div><div>loadmodule "auth_db.so"</div><div>loadmodule "alias_db.so"</div><div>loadmodule "domain.so"</div>
<div>loadmodule "permissions.so"</div><div>loadmodule "dialog.so"</div><div>loadmodule "load_balancer.so"</div><div>loadmodule "nathelper.so"</div><div>loadmodule "sipmsgops.so"</div>
<div>loadmodule "group.so"</div><div><br></div><div># ----------------- setting module-specific parameters ---------------</div><div><br></div><div># ----- mi_fifo params -----</div><div>modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")</div>
<div><br></div><div># ----- rr params -----</div><div>modparam("rr", "append_fromtag", 0)</div><div><br></div><div># ----- registrar params -----</div><div>modparam("registrar", "max_expires", 60)</div>
<div>modparam("registrar", "min_expires", 60)</div><div><br></div><div># ----- usrloc params -----</div><div>modparam("usrloc", "db_mode", 2)</div><div>modparam("usrloc", "db_url",</div>
<div> "mysql://opensips:opensipsrw@localhost/opensips")</div><div>modparam("usrloc", "nat_bflag", 6)</div><div>modparam("usrloc", "use_domain", 1)</div><div>modparam("usrloc", "timer_interval", 30)</div>
<div><br></div><div># ----- uri params -----</div><div>modparam("uri", "use_uri_table", 0)</div><div>modparam("uri", "use_domain", 1)</div><div><br></div><div># ----- acc params -----</div>
<div>modparam("acc", "early_media", 1)</div><div>modparam("acc", "report_cancels", 1)</div><div>modparam("acc", "detect_direction", 0)</div><div>modparam("acc", "failed_transaction_flag", 3)</div>
<div>modparam("acc", "log_flag", 1)</div><div>modparam("acc", "log_missed_flag", 2)</div><div>modparam("acc", "db_flag", 1)</div><div>modparam("acc", "db_missed_flag", 2)</div>
<div><br></div><div># ----- auth_db params -----</div><div>modparam("auth_db", "calculate_ha1", 0)</div><div>#modparam("auth_db", "password_column", "password")</div><div>
modparam("auth_db", "db_url",</div><div> "mysql://opensips:opensipsrw@localhost/opensips")</div><div>modparam("auth_db", "load_credentials", "")</div><div>
modparam("auth_db", "use_domain", 1)</div><div><br></div><div># ----- alias_db params -----</div><div>modparam("alias_db", "db_url",</div><div> "mysql://opensips:opensipsrw@localhost/opensips")</div>
<div><br></div><div># ----- domain params -----</div><div>modparam("domain", "db_url",</div><div> "mysql://opensips:opensipsrw@localhost/opensips")</div><div>modparam("domain", "db_mode", 1) # Use caching</div>
<div><br></div><div># ----- multi-module params -----</div><div><br></div><div># ----- dialog params -----</div><div>modparam("dialog", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")</div>
<div>modparam("dialog", "db_mode", 1)</div><div>#modparam("dialog", "dlg_flag", 4)</div><div><br></div><div># ----- load_balancer params -----</div><div>modparam("load_balancer", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")</div>
<div><br></div><div># ----- nathelper params -----</div><div>modparam("registrar","received_avp", "$avp(i:42)")</div><div>modparam("nathelper","received_avp", "$avp(i:42)")</div>
<div><br></div><div># ----- permissions params -----</div><div>modparam("permissions", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")</div><div><br></div><div># ----- group params -----</div>
<div>modparam("group", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")</div><div>modparam("group", "use_domain", 1)</div><div><br></div><div><br></div><div><br>
</div><div>####### Routing Logic ########</div><div><br></div><div><br></div><div># main request routing logic</div><div><br></div><div>route{</div><div> if (!mf_process_maxfwd_header("10")) {</div><div> sl_send_reply("483","Too Many Hops");</div>
<div> exit;</div><div> }</div><div><br></div><div> #---- NAT Detection ----#</div><div> force_rport();</div><div> #if (nat_uac_test("19")) {</div><div> if (nat_uac_test("23")) {</div>
<div> if (is_method("REGISTER")) {</div><div> fix_nated_register();</div><div> } else {</div><div> fix_nated_contact();</div><div> }</div>
<div> setflag(5);</div><div> }</div><div><br></div><div> if (has_totag()) {</div><div> # sequential request withing a dialog should</div><div> # take the path determined by record-routing</div>
<div> if (loose_route()) {</div><div> if (is_method("BYE")) {</div><div> setflag(1); # do accounting ...</div><div> setflag(3); # ... even if the transaction fails</div>
<div> } else if (is_method("INVITE")) {</div><div> # even if in most of the cases is useless, do RR for</div><div> # re-INVITEs alos, as some buggy clients do change route set</div>
<div> # during the dialog.</div><div><br></div><div> xlog("################## HAS_TOTAG() INVITE => si: $si, sp: $sp ###################\n");</div>
<div> record_route();</div><div> }</div><div> # route it out to whatever destination was set by loose_route()</div><div> # in $du (destination URI).</div>
<div> route(1);</div><div> } else {</div><div> /* uncomment the following lines if you want to enable presence */</div><div> ##if (is_method("SUBSCRIBE") && $rd == "your.server.ip.address") {</div>
<div> ## # in-dialog subscribe requests</div><div> ## route(2);</div><div> ## exit;</div><div> ##}</div><div> if ( is_method("ACK") ) {</div>
<div> if ( t_check_trans() ) {</div><div> # non loose-route, but stateful ACK; must be an ACK after </div><div> # a 487 or e.g. 404 from upstream server</div>
<div> t_relay();</div><div> exit;</div><div> } else {</div><div> # ACK without matching transaction -></div>
<div> # ignore and discard</div><div> exit;</div><div> }</div><div> }</div><div> sl_send_reply("404","Not here");</div>
<div> }</div><div> exit;</div><div> }</div><div><br></div><div> #initial requests</div><div><br></div><div> # CANCEL processing</div><div> if (is_method("CANCEL"))</div>
<div> {</div><div> if (t_check_trans())</div><div> t_relay();</div><div> exit;</div><div> }</div><div><br></div><div> t_check_trans();</div><div><br>
</div><div> # authenticate if from local subscriber (uncomment to enable auth)</div><div> # authenticate all initial non-REGISTER request that pretend to be</div><div> # generated by local subscriber (domain from FROM URI is local)</div>
<div> ##if (!(method=="REGISTER") && from_uri==myself) /*no multidomain version*/</div><div> if (!(method=="REGISTER") && is_from_local()) /*multidomain version*/</div><div>
{</div><div> if (!check_source_address("0")) {</div><div> if (!proxy_authorize("", "subscriber")) {</div><div> proxy_challenge("", "0");</div>
<div> exit;</div><div> }</div><div> if (!db_check_from()) {</div><div> sl_send_reply("403","Forbidden auth ID");</div>
<div> exit;</div><div> }</div><div><br></div><div> consume_credentials();</div><div> # caller authenticated</div><div> #}</div>
<div> }</div><div> }</div><div><br></div><div> # preloaded route checking</div><div> if (loose_route()) {</div><div> xlog("L_ERR", "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");</div>
<div> if (!is_method("ACK"))</div><div> sl_send_reply("403","Preload Route denied");</div><div> exit;</div><div> }</div><div><br></div>
<div> # record routing</div><div> if (!is_method("REGISTER|MESSAGE"))</div><div> record_route();</div><div><br></div><div><br></div><div><br></div><div> # account only INVITEs</div>
<div> if (is_method("INVITE")) {</div><div> # load balancing</div><div> if (!($si =~ "^115.92.199." || $si =~ "^172.27.155.27")) {</div><div> load_balance("2","sip");</div>
<div> if ($retcode<0) {</div><div> sl_send_reply("500","Service full");</div><div> exit;</div><div> }</div>
<div> xlog("Selected destination is: $du\n");</div><div> setflag(1); # do accounting</div><div> #setflag(2);</div><div> route(1);</div>
<div> } else {</div><div> }</div><div> setflag(1); # do accounting</div><div> }</div><div><br></div><div><br></div><div> #if (!uri==myself)</div><div> ## replace with following line if multi-domain support is used</div>
<div> if (!is_uri_host_local())</div><div> {</div><div> append_hf("P-hint: outbound\r\n"); </div><div> # if you have some interdomain connections via TLS</div><div> ##if($rd=="<a href="http://tls_domain1.net">tls_domain1.net</a>") {</div>
<div> ## t_relay("tls:<a href="http://domain1.net">domain1.net</a>");</div><div> ## exit;</div><div> ##} else if($rd=="<a href="http://tls_domain2.net">tls_domain2.net</a>") {</div>
<div> ## t_relay("tls:<a href="http://domain2.net">domain2.net</a>");</div><div> ## exit;</div><div> ##}</div><div> route(1);</div><div> }</div>
<div><br></div><div> # requests for my domain</div><div><br></div><div> ## uncomment this if you want to enable presence server </div><div> ## and comment the next 'if' block</div><div> ## NOTE: uncomment also the definition of route[2] from below</div>
<div> ##if( is_method("PUBLISH|SUBSCRIBE"))</div><div> ## route(2);</div><div><br></div><div> if (is_method("PUBLISH"))</div><div> {</div><div> sl_send_reply("503", "Service Unavailable");</div>
<div> exit;</div><div> }</div><div><br></div><div> if (is_method("REGISTER"))</div><div> {</div><div> # authenticate the REGISTER requests (uncomment to enable auth)</div>
<div> if (!www_authorize("", "subscriber"))</div><div> {</div><div> www_challenge("", "0");</div><div> exit;</div>
<div> }</div><div><br></div><div> if (!db_check_to()) </div><div> {</div><div> sl_send_reply("403","Forbidden auth ID");</div><div> exit;</div>
<div> }</div><div><br></div><div> #-- Request is begind NAT(flag5) save with bflag 6 --#</div><div> if (isflagset(5))</div><div> setbflag(6);</div><div><br>
</div><div> if (!save("location"))</div><div> sl_reply_error();</div><div><br></div><div> exit;</div><div> }</div><div><br></div><div> if ($rU==NULL) {</div>
<div> # request with no Username in RURI</div><div> sl_send_reply("484","Address Incomplete");</div><div> exit;</div><div> }</div><div><br></div><div>
# apply DB based aliases (uncomment to enable)</div><div> alias_db_lookup("dbaliases");</div><div><br></div><div><br></div><div> # do lookup with method filtering</div><div> if (!lookup("location","m")) {</div>
<div><br></div><div> xlog("L_NOTICE","\n######### LOOKUP FAILED($retcode) => [$pr:$fu/$tu/$si:$sp] $du: Processing '$rm' ########## \n\n");</div><div><br></div><div> switch ($retcode) {</div>
<div> case -1:</div><div> case -3:</div><div> t_newtran();</div><div> t_reply("404", "Not Found");</div>
<div> exit;</div><div><br></div><div> #break;</div><div> case -2:</div><div> sl_send_reply("405", "Method Not Allowed");</div>
<div> exit;</div><div> }</div><div> }</div><div><br></div><div> # when routing via usrloc, log the missed calls also</div><div> setflag(2);</div><div><br>
</div><div> route(1);</div><div>}</div><div><br></div><div>route[1] {</div><div> # for INVITEs enable some additional helper routes</div><div> if (subst_uri('/(sip:.*);nat=yes/\1/')) {</div><div>
setbflag(6);</div><div> }</div><div> if (isflagset(5)) {</div><div> search_append('Contact:.*sip:[^>[:cntrl:]]*', ';nat=yes');</div><div> }</div><div>
<br></div><div><br></div><div> # for INVITEs enable some additional helper routes</div><div> if (is_method("INVITE")) {</div><div> t_on_branch("2");</div><div> t_on_reply("2");</div>
<div> t_on_failure("1");</div><div> }</div><div><br></div><div> if (!t_relay()) {</div><div> sl_reply_error();</div><div> };</div><div> exit;</div><div>}</div>
<div><br></div><div>branch_route[2] {</div><div> xlog("new branch at $ru\n");</div><div>}</div><div>onreply_route[2] {</div><div> xlog("incoming reply\n");</div><div> if (isbflagset(6)) {</div>
<div> search_append('Contact:.*sip:[^>[:cntrl:]]*', ';nat=yes');</div><div> append_hf("P-hint: Onreply-route - fixcontact \r\n");</div><div> fix_nated_contact();</div>
<div> }</div><div>}</div><div>failure_route[1] {</div><div> if (t_was_cancelled()) {</div><div> exit;</div><div> }</div><div>}</div>