<div dir="ltr"><div>Hi, </div><div><br></div><div>I'm trying to achieve this configuration </div><div><br></div><div>phone --> NAT --> kamailio loadbalancer --> kamailio sip/proxy </div><div><span class="" style="white-space:pre">                                                  </span>            --> kamailio sip/proxy</div><div><span class="" style="white-space:pre">                                                        </span> </div><div>With the attached configuration I can make calls without any problems </div><div>but when the callee hangs up the call does not end only the caller can hang up.</div><div><br></div><div>Btw I'm using tcp for signalling.</div><div><br></div><div>Any ideas?</div><div>Thanks</div><div><br></div><div>#!define FLT_ACC 1</div><div>#!define FLT_ACCMISSED 2</div><div>#!define FLT_ACCFAILED 3</div><div>#!define FLT_NATS 5</div><div><br></div><div>#!define FLB_NATB 6</div><div>#!define FLB_NATSIPPING 7</div><div><br></div><div><br></div><div>mhomed=1</div><div><br></div><div>####### Global Parameters #########</div><div><br></div><div>#!ifdef WITH_DEBUG</div><div>debug=4</div><div>log_stderror=yes</div><div>#!else</div><div>debug=2</div><div>log_stderror=no</div><div>#!endif</div><div><br></div><div>memdbg=5</div><div>memlog=5</div><div><br></div><div>log_facility=LOG_LOCAL0</div><div><br></div><div>fork=yes</div><div>children=4</div><div><br></div><div>tcp_async=yes</div><div>tcp_connection_lifetime=3605</div><div><br></div><div>port=5060</div><div>sip_warning=yes</div><div><br></div><div>####### Modules Section ########</div><div><br></div><div>#!ifdef WITH_SRCPATH</div><div>mpath="modules_k:modules"</div><div>#!else</div><div>mpath="/usr/lib/x86_64-linux-gnu/kamailio/modules/"</div><div>#!endif</div><div><br></div><div>loadmodule "db_mysql.so"</div><div>loadmodule "mi_fifo.so"</div><div>loadmodule "kex.so"</div><div>loadmodule "tm.so"</div><div>loadmodule "tmx.so"</div><div>loadmodule "sl.so"</div><div>loadmodule "rr.so"</div><div>loadmodule "pv.so"</div><div>loadmodule "maxfwd.so"</div><div>loadmodule "textops.so"</div><div>loadmodule "siputils.so"</div><div>loadmodule "xlog.so"</div><div>loadmodule "sanity.so"</div><div>loadmodule "ctl.so"</div><div>loadmodule "mi_rpc.so"</div><div>loadmodule "acc.so"</div><div>loadmodule "usrloc.so"</div><div>loadmodule "registrar.so"</div><div>loadmodule "dispatcher.so"</div><div>loadmodule "nathelper.so"</div><div>loadmodule "rtpproxy.so"</div><div>loadmodule "path.so"</div><div><br></div><div># ----------------- setting module-specific parameters ---------------</div><div><br></div><div><br></div><div># ----- mi_fifo params -----</div><div>modparam("mi_fifo", "fifo_name", "/var/run/kamailio/kamailio_fifo")</div><div><br></div><div># ----- rr params -----</div><div># add value to ;lr param to cope with most of the UAs</div><div>modparam("rr", "enable_full_lr", 1)</div><div># do not append from tag to the RR (no need for this script)</div><div>modparam("rr", "append_fromtag", 1)</div><div>modparam("rr", "enable_double_rr", 0)</div><div><br></div><div><br></div><div># ----- tm params -----</div><div>modparam("tm", "failure_reply_mode", 3)</div><div>modparam("tm", "fr_timer", 3000)</div><div>modparam("tm", "fr_inv_timer", 120000)</div><div><br></div><div># ----- dispatcher params -----</div><div>modparam("dispatcher", "db_url",</div><div><span class="" style="white-space:pre">     </span>"mysql://kamailio:kamailiorw@localhost/kamailio")</div><div>modparam("dispatcher", "table_name", "dispatcher")</div><div>modparam("dispatcher", "flags", 2)</div><div>#modparam("dispatcher", "force_dst", 1)</div><div>modparam("dispatcher", "setid_col", "setid")</div><div>modparam("dispatcher", "destination_col", "destination")</div><div>modparam("dispatcher", "flags_col", "flags")</div><div>modparam("dispatcher", "priority_col", "priority")</div><div>modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")</div><div>modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")</div><div>modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")</div><div><br></div><div><br></div><div>modparam("path", "use_received", 1)</div><div><br></div><div>modparam("registrar", "use_path", 1)</div><div>modparam("registrar", "path_mode", 0)</div><div>modparam("registrar", "path_use_received", 1)</div><div><br></div><div>modparam("nathelper", "natping_interval", 30)</div><div>modparam("nathelper", "ping_nated_only", 1)</div><div>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)</div><div>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>")</div><div><br></div><div># params needed for NAT traversal in other modules</div><div>modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")</div><div>modparam("usrloc", "nat_bflag", FLB_NATB)</div><div><br></div><div>####### Routing Logic ########</div><div><br></div><div><br></div><div># main request routing logic</div><div><br></div><div>request_route {</div><div><span class="" style="white-space:pre">       </span>xlog("L_NOTICE", "*** loose routing enforced before: $rm, $ru, $si, $du\n");</div><div><span class="" style="white-space:pre">   </span># per request initial checks</div><div><span class="" style="white-space:pre">       </span></div><div><span class="" style="white-space:pre">   </span></div><div><span class="" style="white-space:pre">   </span></div><div><span class="" style="white-space:pre">   </span>route(REQINIT);</div><div><span class="" style="white-space:pre">    </span></div><div><span class="" style="white-space:pre">   </span>loose_route();</div><div><span class="" style="white-space:pre">     </span></div><div><span class="" style="white-space:pre">   </span># handle requests within SIP dialogs</div><div><span class="" style="white-space:pre">       </span>route(WITHINDLG);</div><div><br></div><div><span class="" style="white-space:pre"> </span>### only initial requests (no To tag)</div><div><br></div><div><span class="" style="white-space:pre">     </span># CANCEL processing</div><div><span class="" style="white-space:pre">        </span>if (is_method("CANCEL"))</div><div><span class="" style="white-space:pre"> </span>{</div><div><span class="" style="white-space:pre">          </span>if (t_check_trans())</div><div><span class="" style="white-space:pre">                       </span>t_relay();</div><div><span class="" style="white-space:pre">         </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>t_check_trans();</div><div><br></div><div><span class="" style="white-space:pre">  </span># record routing for dialog forming requests (in case they are routed)</div><div><span class="" style="white-space:pre">     </span># - remove preloaded route headers</div><div><span class="" style="white-space:pre"> </span>#remove_hf("Route");</div><div><span class="" style="white-space:pre">     </span>if (is_method("INVITE")){</div><div><span class="" style="white-space:pre">                </span>record_route();</div><div><span class="" style="white-space:pre">    </span>}</div><div><span class="" style="white-space:pre">  </span></div><div><span class="" style="white-space:pre">   </span>if(is_method("REGISTER")){</div><div><span class="" style="white-space:pre">               </span>add_path_received();</div><div><span class="" style="white-space:pre">               </span>fix_nated_register();</div><div><span class="" style="white-space:pre">      </span>}</div><div><span class="" style="white-space:pre">  </span>else{</div><div><span class="" style="white-space:pre">              </span>add_contact_alias();</div><div><span class="" style="white-space:pre">       </span>}</div><div><span class="" style="white-space:pre">  </span></div><div><br></div><div><span class="" style="white-space:pre">  </span># dispatch destinations</div><div><span class="" style="white-space:pre">    </span>route(DISPATCH);</div><div><br></div><div><span class="" style="white-space:pre">  </span>route(RELAY);</div><div>}</div><div><br></div><div><br></div><div>route[RELAY] {</div><div><span class="" style="white-space:pre">       </span>if (!t_relay()) {</div><div><span class="" style="white-space:pre">          </span>sl_reply_error();</div><div><span class="" style="white-space:pre">  </span>}</div><div><span class="" style="white-space:pre">  </span>exit;</div><div>}</div><div><br></div><div># Per SIP request initial checks</div><div>route[REQINIT] {</div><div><span class="" style="white-space:pre">       </span>if (!mf_process_maxfwd_header("10")) {</div><div><span class="" style="white-space:pre">           </span>sl_send_reply("483","Too Many Hops");</div><div><span class="" style="white-space:pre">          </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>if(!sanity_check("1511", "7"))</div><div><span class="" style="white-space:pre"> </span>{</div><div><span class="" style="white-space:pre">          </span>xlog("L_NOTICE", "*** loose routing enforced before: $rm, $ru, $si, $du\n");</div><div><span class="" style="white-space:pre">           </span>xlog("Malformed SIP message from $si:$sp\n");</div><div><span class="" style="white-space:pre">            </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div>}</div><div><br></div><div># Handle requests within SIP dialogs</div><div>route[WITHINDLG] {</div><div><span class="" style="white-space:pre">     </span>if (has_totag()) {</div><div><span class="" style="white-space:pre">         </span># sequential request withing a dialog should</div><div><span class="" style="white-space:pre">               </span># take the path determined by record-routing</div><div><span class="" style="white-space:pre">               </span>if (loose_route()) {</div><div><span class="" style="white-space:pre">                       </span>if (is_method("BYE")) {</div><div><span class="" style="white-space:pre">                          </span>setflag(1); # do accounting ...</div><div><span class="" style="white-space:pre">                            </span>setflag(3); # ... even if the transaction fails</div><div><span class="" style="white-space:pre">                    </span>}<span class="" style="white-space:pre"> </span></div><div><span class="" style="white-space:pre">                   </span>route(RELAY);</div><div><span class="" style="white-space:pre">              </span>} else {</div><div><span class="" style="white-space:pre">                   </span>if (is_method("SUBSCRIBE") && uri == myself) {</div><div><span class="" style="white-space:pre">                           </span># in-dialog subscribe requests</div><div><span class="" style="white-space:pre">                             </span>#route(PRESENCE);</div><div><span class="" style="white-space:pre">                          </span>exit;</div><div><span class="" style="white-space:pre">                      </span>}</div><div><span class="" style="white-space:pre">                  </span>if ( is_method("ACK") ) {</div><div><span class="" style="white-space:pre">                        </span></div><div><span class="" style="white-space:pre">                           </span>if ( t_check_trans() ) {</div><div><span class="" style="white-space:pre">                                   </span># non loose-route, but stateful ACK;</div><div><span class="" style="white-space:pre">                                       </span># must be ACK after a 487 or e.g. 404 from upstream server</div><div><span class="" style="white-space:pre">                                 </span>t_relay();</div><div><span class="" style="white-space:pre">                                 </span>exit;</div><div><span class="" style="white-space:pre">                              </span>} else {</div><div><span class="" style="white-space:pre">                                   </span># ACK without matching transaction ... ignore and discard.</div><div><span class="" style="white-space:pre">                                 </span>exit;</div><div><span class="" style="white-space:pre">                              </span>}</div><div><span class="" style="white-space:pre">                  </span>}</div><div><span class="" style="white-space:pre">                  </span>sl_send_reply("404","Not here");</div><div><span class="" style="white-space:pre">               </span>}</div><div><span class="" style="white-space:pre">          </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div>}</div><div><br></div><div># Dispatch requests</div><div>route[DISPATCH] {</div><div><span class="" style="white-space:pre">       </span># round robin dispatching on gateways group '1'</div><div><span class="" style="white-space:pre">    </span>if(!ds_select_domain("1", "0"))</div><div><span class="" style="white-space:pre">        </span>{</div><div><span class="" style="white-space:pre">          </span>send_reply("404", "No destination");</div><div><span class="" style="white-space:pre">           </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div><span class="" style="white-space:pre">  </span>xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");</div><div><span class="" style="white-space:pre">   </span>t_on_failure("RTF_DISPATCH");</div><div><span class="" style="white-space:pre">    </span>return;</div><div>}</div><div><br></div><div># Sample failure route</div><div>failure_route[RTF_DISPATCH] {</div><div><span class="" style="white-space:pre">  </span>if (t_is_canceled()) {</div><div><span class="" style="white-space:pre">             </span>exit;</div><div><span class="" style="white-space:pre">      </span>}</div><div><span class="" style="white-space:pre">  </span># next DST - only for 500 or local timeout</div><div><span class="" style="white-space:pre"> </span>if (t_check_status("500")</div><div><span class="" style="white-space:pre">                        </span>or (t_branch_timeout() and !t_branch_replied()))</div><div><span class="" style="white-space:pre">   </span>{</div><div><span class="" style="white-space:pre">          </span>if(ds_next_domain())</div><div><span class="" style="white-space:pre">               </span>{</div><div><span class="" style="white-space:pre">                  </span>xlog("L_NOTICE", "going to next dst\n");</div><div><span class="" style="white-space:pre">                       </span>t_on_failure("RTF_DISPATCH");</div><div><span class="" style="white-space:pre">                    </span>route(RELAY);</div><div><span class="" style="white-space:pre">                      </span>exit;</div><div><span class="" style="white-space:pre">              </span>}</div><div><span class="" style="white-space:pre">  </span>}</div><div>}</div><div><br></div><div><br></div></div>