<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
<div><br></div><div>Hello,<br></div><div dir="auto"><br></div><div dir="auto">I need some help in creating a stateless failover balancer for two asterisk servers using kamailio. I followed in the steps of an old project here:  <a href="https://txlab.wordpress.com/tag/xlab1/">https://txlab.wordpress.com/tag/xlab1/</a><br></div><div dir="auto"><br></div><div dir="auto">Kamailio is running in a multihomed host, with public ip facing the internet and private ip facing the asterisk servers.<br></div><div dir="auto"><br></div><div dir="auto">I have partial issues with nat traversal when the external device is also behind nat. All works when the device initates a call/dialog, however when the asterisk server tries to send an "OPTIONS" keep alive to the end device, Kamailio receives the packet from asterisk but tries to send it to the private IP address of the device instead of the public ip:port. Same goes for calls.<br></div><div dir="auto"><br></div><div dir="auto">My kamailio.cfg is below. I am missing something obvious here, but can't find it.<br></div><div dir="auto"><br></div><div dir="auto">Thanks<br></div><div dir="auto"><br></div><div dir="auto">=== CUT====<br></div><div dir="auto">#!KAMAILIO<br></div><div dir="auto"><br></div><div dir="auto">################################################################<br></div><div dir="auto">#<br></div><div dir="auto">#  This is a front-end SIP proxy configuration for the xlab1 project<br></div><div dir="auto">#  See for more details: <a href="https://txlab.wordpress.com/tag/xlab1/">https://txlab.wordpress.com/tag/xlab1/</a><br></div><div dir="auto">#  The configuration requires Kamailio version 3.3.x<br></div><div dir="auto">#<br></div><div dir="auto">#  This work is licensed under a Creative Commons Attribution 3.0 License<br></div><div dir="auto">#  Author: Stanislav Sinyagin <<a href="mailto:ssinaygin@k-open.com">ssinaygin@k-open.com</a>><br></div><div dir="auto">#<br></div><div dir="auto">################################################################<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">#!define WITH_DEBUG<br></div><div dir="auto"><br></div><div dir="auto">####### Defined Values #########<br></div><div dir="auto"><br></div><div dir="auto">#### define DBURL "text:///opt/sipfe/etc/kamailio_db"<br></div><div dir="auto">#!define DBURL "text:///etc/kamailio/kamailio_db"<br></div><div dir="auto"><br></div><div dir="auto">#!define BACKEND_NET4 10.10.10.0/24<br></div><div dir="auto">#!define BACKEND_NET6 2a02:200:8:100::/64<br></div><div dir="auto"><br></div><div dir="auto">####### Global Parameters #########<br></div><div dir="auto"><br></div><div dir="auto">#!ifdef WITH_DEBUG<br></div><div dir="auto">debug=2<br></div><div dir="auto">log_stderror=yes<br></div><div dir="auto">#!else<br></div><div dir="auto">debug=1<br></div><div dir="auto">log_stderror=no<br></div><div dir="auto">#!endif<br></div><div dir="auto"><br></div><div dir="auto">memdbg=5<br></div><div dir="auto">memlog=5<br></div><div dir="auto"><br></div><div dir="auto">log_facility=LOG_LOCAL0<br></div><div dir="auto"><br></div><div dir="auto">fork=yes<br></div><div dir="auto">children=2<br></div><div dir="auto"><br></div><div dir="auto">auto_aliases=no<br></div><div dir="auto"><br></div><div dir="auto">#listen=udp:195.x.x.78:5060<br></div><div dir="auto"># to avoid simple attacks, use unconventional port<br></div><div dir="auto">#port=5060<br></div><div dir="auto"><br></div><div dir="auto"># this makes it listen on all ipv6 addresses<br></div><div dir="auto">auto_bind_ipv6=0<br></div><div dir="auto">dns_try_ipv6=no<br></div><div dir="auto"><br></div><div dir="auto"># let kamailio choose the right source IP address<br></div><div dir="auto">mhomed=3<br></div><div dir="auto"><br></div><div dir="auto"># life time of TCP connection when there is no traffic<br></div><div dir="auto"># - a bit higher than registration expires to cope with UA behind NAT<br></div><div dir="auto">tcp_connection_lifetime=3605<br></div><div dir="auto"><br></div><div dir="auto">## Hardening<br></div><div dir="auto">sip_warning=0<br></div><div dir="auto">server_signature=no<br></div><div dir="auto">user_agent_header="User-Agent: Kamailio Failover Balancer"<br></div><div dir="auto"><br></div><div dir="auto">####### Modules Section ########<br></div><div dir="auto"><br></div><div dir="auto">## NOTE:<br></div><div dir="auto">## mpath="/opt/sipfe/lib64/kamailio/modules_k/:/opt/sipfe/lib64/kamailio/modules/"<br></div><div dir="auto"><br></div><div dir="auto">loadmodule "db_text.so"<br></div><div dir="auto">loadmodule "jsonrpcs.so"<br></div><div dir="auto"><br></div><div dir="auto">#loadmodule "mi_fifo.so"<br></div><div dir="auto">loadmodule "tm.so"<br></div><div dir="auto">loadmodule "kex.so"<br></div><div dir="auto">loadmodule "sl.so"<br></div><div dir="auto">loadmodule "rr.so"<br></div><div dir="auto">loadmodule "pv.so"<br></div><div dir="auto">loadmodule "maxfwd.so"<br></div><div dir="auto">loadmodule "textops.so"<br></div><div dir="auto">loadmodule "siputils.so"<br></div><div dir="auto">loadmodule "xlog.so"<br></div><div dir="auto">loadmodule "sanity.so"<br></div><div dir="auto">loadmodule "ctl.so"<br></div><div dir="auto">loadmodule "cfg_rpc.so"<br></div><div dir="auto">#loadmodule "mi_rpc.so"<br></div><div dir="auto"><br></div><div dir="auto">loadmodule "path.so"<br></div><div dir="auto">loadmodule "domain.so"<br></div><div dir="auto">loadmodule "dispatcher.so"<br></div><div dir="auto">loadmodule "nathelper.so"<br></div><div dir="auto">loadmodule "rtpproxy.so"<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">#!ifdef WITH_DEBUG<br></div><div dir="auto">loadmodule "debugger.so"<br></div><div dir="auto">#!endif<br></div><div dir="auto"><br></div><div dir="auto"># ----------------- setting module-specific parameters ---------------<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">#modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"># add value to ;lr param to cope with most of the UAs<br></div><div dir="auto">modparam("rr", "enable_full_lr", 1)<br></div><div dir="auto"># do not append from tag to the RR (no need for this script)<br></div><div dir="auto">modparam("rr", "append_fromtag", 0)<br></div><div dir="auto"><br></div><div dir="auto">modparam("nathelper", "received_avp", "$avp(RECEIVED)")<br></div><div dir="auto">modparam("nathelper", "nortpproxy_str", "a=sdpmangled:yes\r\n")<br></div><div dir="auto"><br></div><div dir="auto">modparam("path", "use_received", 1)<br></div><div dir="auto"><br></div><div dir="auto">modparam("domain", "db_url", DBURL)<br></div><div dir="auto"><br></div><div dir="auto">modparam("dispatcher", "db_url", DBURL)<br></div><div dir="auto">modparam("dispatcher", "table_name", "dispatcher")<br></div><div dir="auto"><br></div><div dir="auto">modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:22222")<br></div><div dir="auto">#modparam("rtpproxy", "rtpproxy_sock", "unix:/var/run/rtpproxy/rtpproxy.sock")<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">#!ifdef WITH_DEBUG<br></div><div dir="auto"># ----- debugger params -----<br></div><div dir="auto">modparam("debugger", "cfgtrace", 1)<br></div><div dir="auto">#!endif<br></div><div dir="auto"><br></div><div dir="auto">####### Routing Logic ########<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">route {<br></div><div dir="auto">    if (!sanity_check()) {<br></div><div dir="auto">        exit;<br></div><div dir="auto">    }<br></div><div dir="auto"><br></div><div dir="auto">    if ( !mf_process_maxfwd_header("10") )<br></div><div dir="auto">    {<br></div><div dir="auto">        sl_send_reply("483","To Many Hops");<br></div><div dir="auto">        xlog("L_NOTICE", "$si $rm $ru -- too many hops\n");<br></div><div dir="auto">        exit;<br></div><div dir="auto">    }<br></div><div dir="auto"><br></div><div dir="auto">    if (af==INET)<br></div><div dir="auto">    {<br></div><div dir="auto">        force_rport();<br></div><div dir="auto"><br></div><div dir="auto">        if (src_ip != BACKEND_NET4)<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP request packet client->backend<br></div><div dir="auto"><br></div><div dir="auto">            if( !loose_route() )<br></div><div dir="auto">            {<br></div><div dir="auto">                if (!lookup_domain("$td", "dattr_")) {<br></div><div dir="auto">                    xlog("L_ERR", "$si $rm $ru -- domain \"$td\" is not " +<br></div><div dir="auto">                        "found in domain table\n");<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto"><br></div><div dir="auto">                if (!defined $avp(dattr_routeset))<br></div><div dir="auto">                {<br></div><div dir="auto">                    xlog("L_ERR",<br></div><div dir="auto">                        "$si $rm $ru -- attribute \"routeset\" is " +<br></div><div dir="auto">                        "undefined for domain $td\n");<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto"><br></div><div dir="auto">                if( !ds_select_dst(4000 + $avp(dattr_routeset), "1") )<br></div><div dir="auto">                {<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto">            }<br></div><div dir="auto"><br></div><div dir="auto">            if (nat_uac_test("19")) {<br></div><div dir="auto">                xlog("L_INFO", "Routing NAT in-dialog $rm from $fu to $du\n");<br></div><div dir="auto">                if (method=="REGISTER") {<br></div><div dir="auto">                    fix_nated_register();<br></div><div dir="auto">                } else {<br></div><div dir="auto">                    fix_nated_contact();<br></div><div dir="auto">                }<br></div><div dir="auto">            }<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">            add_path_received();<br></div><div dir="auto">            #rtpproxy_manage("cwei");<br></div><div dir="auto">            rtpproxy_manage("cw");<br></div><div dir="auto">            record_route();<br></div><div dir="auto">        }<br></div><div dir="auto">        else<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP request packet backend->client<br></div><div dir="auto"><br></div><div dir="auto">            # Invites from backend contain Route field and it should be used<br></div><div dir="auto">            # to reach the registered client<br></div><div dir="auto">            loose_route();<br></div><div dir="auto">            #rtpproxy_manage("cwie");<br></div><div dir="auto">            rtpproxy_manage("cw");<br></div><div dir="auto">            record_route();<br></div><div dir="auto">        }<br></div><div dir="auto">    }<br></div><div dir="auto">    else<br></div><div dir="auto">    {<br></div><div dir="auto">        # IPv6: no NAT traversal, just pure routing<br></div><div dir="auto"><br></div><div dir="auto">        if (src_ip != BACKEND_NET6)<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP request packet client->backend<br></div><div dir="auto"><br></div><div dir="auto">            if( !loose_route() )<br></div><div dir="auto">            {<br></div><div dir="auto">                if (!lookup_domain("$td", "dattr_")) {<br></div><div dir="auto">                    xlog("L_ERR", "$si $rm $ru -- domain \"$td\" is not " +<br></div><div dir="auto">                        "found in domain table\n");<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto"><br></div><div dir="auto">                if (!defined $avp(dattr_routeset))<br></div><div dir="auto">                {<br></div><div dir="auto">                    xlog("L_ERR",<br></div><div dir="auto">                        "$si $rm $ru -- attribute \"routeset\" is " +<br></div><div dir="auto">                        "undefined for domain $td\n");<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto"><br></div><div dir="auto">                if( !ds_select_dst(6000 + $avp(dattr_routeset), "1") )<br></div><div dir="auto">                {<br></div><div dir="auto">                    drop();<br></div><div dir="auto">                }<br></div><div dir="auto">            }<br></div><div dir="auto"><br></div><div dir="auto">            add_path_received();<br></div><div dir="auto">            record_route();<br></div><div dir="auto">        }<br></div><div dir="auto">        else<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP request packet backend->client<br></div><div dir="auto"><br></div><div dir="auto">            record_route();<br></div><div dir="auto">        }<br></div><div dir="auto">    }<br></div><div dir="auto"><br></div><div dir="auto">    forward();<br></div><div dir="auto">}<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">onreply_route {<br></div><div dir="auto"><br></div><div dir="auto">    if (af==INET)<br></div><div dir="auto">    {<br></div><div dir="auto">        if(src_ip != BACKEND_NET4)<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP reply packet client->backend<br></div><div dir="auto"><br></div><div dir="auto">            #rtpproxy_manage("cwie");<br></div><div dir="auto">            rtpproxy_manage("cw");<br></div><div dir="auto">            fix_nated_contact();<br></div><div dir="auto">        }<br></div><div dir="auto">        else<br></div><div dir="auto">        {<br></div><div dir="auto">            # SIP reply packet backend->client<br></div><div dir="auto"><br></div><div dir="auto">            #rtpproxy_manage("cwei");<br></div><div dir="auto">            rtpproxy_manage("cw");<br></div><div dir="auto">        }<br></div><div dir="auto">    }<br></div><div dir="auto"><br></div><div dir="auto">    return(1);<br></div><div dir="auto">}<br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"># Local Variables:<br></div><div dir="auto"># mode: sh<br></div><div dir="auto"># sh-indent-after-if: 0<br></div><div dir="auto"># indent-tabs-mode: nil<br></div><div dir="auto"># tab-width: 4<br></div><div dir="auto"># End:<br></div><div dir="auto">====CUT=====<br></div>  </body>
</html>