1

I have three virtual servers running Ubuntu 14.04. On one server I installed Kamailio and on the others Asterisk. I want that the Kamailio server works as a load balancer and forwards the incoming calls to the asterisk servers (round robin).

I want to test it first with one asterisk server and if that works, I can add more for more performance.

I added my SIP provider credentials like this:

kamctl add test testpasswd

Then I added the asterisk server to the dispatcher table like this:

INSERT INTO dispatcher (setid,destination,flags,priority,attrs,description) VALUES (1,"sip:10.1.1.3:5060",0,0,"","Asteriskl-I");

I changed the sip.conf file on my asterisk server that it connects to my kamailio server and that seems to work.

My kamailio.cfg file looks like this:

#!KAMAILIO
#
# sample config file for dispatcher module
# - load balancing of VoIP calls with round robin
# - no TPC listening
# - don't dispatch REGISTER and presence requests
#
# Kamailio (OpenSER) SIP Server v3.2
#     - web: http://www.kamailio.org
#     - git: http://sip-router.org
#
# Direct your questions about this file to: sr-users@lists.sip-router.org
#
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
# for an explanation of possible statements, functions and parameters.
#
# Several features can be enabled using '#!define WITH_FEATURE' directives:
#
# *** To run in debug mode:
#     - define WITH_DEBUG
#

####### Global Parameters #########

#!define WITH_DEBUG

#!ifdef WITH_DEBUG
debug=4
log_stderror=yes
#!else
debug=2
log_stderror=no
#!endif

memdbg=5
memlog=5

log_facility=LOG_LOCAL0

fork=yes
children=4

/* comment the next line to enable TCP */
disable_tcp=yes

/* uncomment the next line to disable the auto discovery of local aliases
   based on revers DNS on IPs (default on) */
auto_aliases=no

/* add local domain aliases */
# alias="mysipserver.com"

port=5060

/* uncomment and configure the following line if you want Kamailio to
   bind on a specific interface/port/proto (default bind on all available) */
# listen=udp:127.0.0.1:5060

sip_warning=no

####### Modules Section ########

#set module path
mpath="/usr/local/lib64/kamailio/modules/"

# loadmodule "db_mysql.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 "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
# loadmodule "ctl.so"
loadmodule "mi_rpc.so"
loadmodule "acc.so"
loadmodule "dispatcher.so"


# ----------------- setting module-specific parameters ---------------


# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")


# ----- 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)
modparam("rr", "append_fromtag", 0)


# ----- acc params -----
modparam("acc", "log_flag", 1)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_extra",
        "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd;src_ip=$si")

# ----- tm params -----
modparam("tm", "fr_timer", 2000)
modparam("tm", "fr_inv_timer", 40000)

# ----- dispatcher params -----
# modparam("dispatcher", "db_url",
#       "mysql://kamailio:123456@localhost/kamailio")
modparam("dispatcher", "table_name", "dispatcher")
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)")

####### Routing Logic ########


# main request routing logic

route {

        # per request initial checks
        route(REQINIT);

        # 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();

        # 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();
        #if (is_method("INVITE"))
        #{
        #       ds_select_domain("1","4");
        #       #sl_send_reply("300","Redirect");
        #       #t_relay();
        #       exit;
        #}

        # account only INVITEs
        if (is_method("INVITE"))
        {
                setflag(1); # do accounting
        }

        # 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
        route(DISPATCH);

        route(RELAY);
}


route[RELAY] {
        if (!t_relay()) {
                sl_reply_error();
        }
        exit;
}

# Per SIP request initial checks
route[REQINIT] {
        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(1); # do accounting ...
                                setflag(3); # ... even if the transaction fails
                        }
                        route(RELAY);
                } else {
                        if (is_method("SUBSCRIBE") && uri == myself) {
                                # in-dialog subscribe requests
                                route(PRESENCE);
                                exit;
                        }
                        if ( is_method("ACK") ) {
                                if ( t_check_trans() ) {
                                        # non loose-route, but stateful ACK;
                                        # must be 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"))
                return;
        #sl_send_reply("404", "No registrar");
        #t_relay();
        if(!ds_select_dst("1", "4"))
        {
                sl_send_reply("404", "No registrar");
                exit;
        }
        forward();

        exit;
}

# Presence server route
route[PRESENCE] {
        if(!is_method("PUBLISH|SUBSCRIBE"))
                return;

        sl_send_reply("404", "Not here");
        exit;
}

# Dispatch requests
route[DISPATCH] {
        # round robin dispatching on gateways group '1'
        if(!ds_select_dst("1", "4"))
        {
                send_reply("404", "No destination");
                exit;
        }
        xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");
        t_on_failure("RTF_DISPATCH");
        return;
}

# 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;
                }
        }
}

If I connect my asterisk box directly to my SIP provider it works perfectly. But if I connect it to the kamailio server and the kamailio server to the SIP provider it doesn't.

I googled for hours and tried a lot of things and I really have no idea what I could try next... If anyone could help me I would be very happy!

Thank you very much and best regards

simplex
  • 11
  • 1
  • 3
  • What exactly problem you have? Default dispatcher config supplied with kamailio work ok, unless you want add to it nat and other features(which require very special knowledge set). Why you google for hours? You just need do sip debug(using tcpdump or something) and ensure your config is correct. – arheops Sep 05 '16 at 16:47
  • So you have firewall,no? – arheops Sep 06 '16 at 16:03

1 Answers1

1

I added my SIP provider credentials like this:

kamctl add test testpasswd - This is wrong.

Check following link for detailed info how you should set-up SIP trunk on Kamailio, which are using username/password authentication:

http://lists.sip-router.org/pipermail/sr-users/2015-September/090001.html

os11k
  • 1,210
  • 2
  • 13
  • 26
  • Hello os11k, thank you very much for your answer! I tried to configure it with this authentication. My kamailio.cfg now looks like this: http://pastebin.com/H6R8mZ0g It compiles, but when I call the number, it still doesn't work. Any idea? – simplex Sep 06 '16 at 08:12
  • I tried this with the uac module, but i can't get it to work. I have these Informations: SIP Provider: Username Password Domain How should my kamailio.cfg look like? I tried like 10 different variations with the uac module.. Or how can I register my kamailio server to my SIP provider? – simplex Sep 07 '16 at 12:49
  • Check this: http://www.kamailio.org/docs/modules/4.4.x/modules/uac.html#idp23591108 It says that you need to add record to uacreg table – os11k Sep 08 '16 at 18:35