Skip to main content

Kamailio basic setup as proxy for FreeSWITCH

About

Below is two example sample configurations of Kamailio as a SIP proxy to FreeSWITCH.

Simple Setup

192.168.0.101 is the IP of Kamailio

192.168.0.102 is the IP of FreeSWITCH

memdbg=5
memlog=5

log_facility=LOG_LOCAL0

fork=yes
children=4
disable_tcp=yes
listen=udp:192.168.0.101:5060
port=5060
mpath="/usr/lib64/kamailio/modules/"

# ------------------ module loading ----------------------------------
loadmodule "mi_fifo.so"
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"

# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")

# ------------------------- request routing logic -------------------

# main routing logic

route{

/* ********* ROUTINE CHECKS ********************************** */

# filter too old messages
if (!mf_process_maxfwd_header("10")) {
log("LOG: Too many hops\n");
sl_send_reply("483","Too Many Hops");
break;
};

# grant Route routing if route headers present
if (has_totag()) {
if (loose_route()) {
t_relay();
break;
} else {
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
t_relay();
break;
} else {
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}

# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}

# Process initial INVITE
if (method=="INVITE") {
record_route();
} else {
sl_send_reply("404","Not here");
exit;
};

rewritehostport("192.168.0.102:5060");

# forward the request now
if (!t_relay()) {
sl_reply_error();
break;
};
}

Simple setup with database lookup

192.168.0.101 is the IP of Kamailio

192.168.0.102 is the IP of FreeSWITCH box 1

192.168.0.103 is the IP of FreeSWITCH box 2

 memdbg=5
memlog=5

log_facility=LOG_LOCAL0

fork=yes
children=4
disable_tcp=yes
listen=udp:192.168.0.101:5060
port=5060
mpath="/usr/lib64/kamailio/modules/"

# ------------------ module loading ----------------------------------
loadmodule "db_postgres.so"
loadmodule "mi_fifo.so"
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sqlops.so"

# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
modparam("sqlops", "sqlcon", "ca=>postgres://kamailio:kamailio@localhost/kamailio")

# ------------------------- request routing logic -------------------

# main routing logic

route{

/* ********* ROUTINE CHECKS ********************************** */

# filter too old messages
if (!mf_process_maxfwd_header("10")) {
log("LOG: Too many hops\n");
sl_send_reply("483","Too Many Hops");
break;
};

# grant Route routing if route headers present
if (has_totag()) {
if (loose_route()) {
t_relay();
break;
} else {
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
t_relay();
break;
} else {
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}

# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}

$var(hp) = 0;
# Process initial INVITE
if (method=="INVITE") {
record_route();
# only match 10-11 digit numbers and strip '+' if it exists
if (subst_user('/^\+?1?([0-9]{10})$/1\1/')) {
sql_query ("ca", "SELECT accountcode FROM numbers WHERE number = '$rU'", "ra");
$var(hp) = $dbr(ra=>[0,0]);
sql_result_free("ra");

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

if ($var(hp) == 0) {
sl_send_reply("404","Not here");
exit;
} else {
switch ($var(hp)) {
case 1:
rewritehostport("192.168.0.102:5060");
case 2:
rewritehostport("192.168.0.103:5060");
}
}

# forward the request now
if (!t_relay()) {
sl_reply_error();
break;
};
}