Instalando Kamailio

En Kamailio tenemos un gran software, es un SIP proxy, sin embargo es mas complejo de configurar que Asterisk por ejemplo (cabe destacar que tienen diferencias importantes).
A continuación presentaremos de manera rápida como instalar Kamailio 1.5.2 con autenticación MySQL para nuestros usuarios, crear un archivo de configuración base y un pequeño trozo de código para comunicarse con nuestro Asterisk.

Antes que nada necesitamos los siguientes paquetes y dependencias:

aptitude install build-essential gcc bison flex make openssl libmysqlclient15-dev libradiusclient-ng2
libradiusclient-ng-dev mysql-server

Descargamos, descomprimimos y entramos a la ultima versión que en este caso es la 1.5.2.

wget http://www.kamailio.org/pub/kamailio/1.5.2/src/kamailio-1.5.2-notls_src.tar.gz
tar xfz kamailio-1.5.2-notls_src.tar.gz
cd kamailio-1.5.2-notls_src

Necesitamos realizar una modificación en nuestro archivo Makefile para habilitar el modulo de MySQL, en concreto debemos eliminar una parte de la linea 57 (db_mysql).

# if not set on the cmd. line or the env, exclude this modules:
exclude_modules?= jabber cpl-c db_postgres osp db_unixodbc 
        db_oracle xmpp mi_xmlrpc perl snmpstats perlvdb ldap 
        carrierroute h350 db_berkeley seas utils purple

ifeq ($(MODS_MYSQL),)
        exclude_modules+= db_mysql
endif

Quedando de la siguiente manera:

ifeq ($(MODS_MYSQL),)
        exclude_modules+=
endif

Con esto hacemos la indicación de que no queremos que se excluya el modulo de MySQL a la hora de compilar e instalar.

Compilamos todo e instalamos.

make all
make install

La instalación se ira (a menos que indiquemos lo contrario) al directorio “/usr/local/”.

Ahora modificaremos los parámetros para instalar la base de datos para kamailio, se da por entendido que contamos con servidor MySQL ya configurado, y que solo necesitas la contraseña de root.

Editamos el archivo kamctlrc que se encuentra en el directorio “/usr/local/etc/kamailio”, necesitamos ajustar las lineas que se encuentran descomentadas, como el dominio, el tipo de base de datos a usar (en nuestro caso MySQL), y los nombres y contraseñas de los usuarios. De manera predeterminada el archivo viene comentado y la base de datos y los usuarios vienen con openSER, aunque lo podemos ajustar a nuestras preferencias. En mi caso la primera parte del archivo esta de la siguiente manera.

## your SIP domain
 SIP_DOMAIN=localhost

## chrooted directory
# $CHROOT_DIR="/path/to/chrooted/directory"

## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, or DBTEXT, by default none is loaded
# If you want to setup a database with kamdbctl, you must at least specify
# this parameter.
 DBENGINE=MYSQL

## database host
 DBHOST=localhost

## database name (for ORACLE this is TNS name)
 DBNAME=kamailio

# database path used by dbtext or db_berkeley
# DB_PATH="/usr/local/etc/kamailio/dbtext"

## database read/write user
 DBRWUSER=kamailio

## password for database read/write user
 DBRWPW="kamailiorw"

## database read only user
 DBROUSER=kamailioro

## password for database read only user
 DBROPW=kamailioro

## database super user (for ORACLE this is 'scheme-creator' user)
 DBROOTUSER="root"

# user name column
# USERCOL="username"

Crearemos la base de datos y sus tablas con el script kamdbctl que se encuentra en la carpeta scripts de nuestra carpeta principal de instalación.

gabriel@trantor:~/kamailio-1.5.2-notls/scripts$ ./kamdbctl create kamailio
MySQL password for root:
INFO: test server charset
INFO: creating database kamailio ...
INFO: Core Kamailio tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into kamailio ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist htable purple? (y/n): y
INFO: creating extra tables into kamailio ...
INFO: Extra tables succesfully created.

Hasta ahora la instalación esta finalizada, por lo que el siguiente paso es configurar el archivo principal de configuración de Kamailio, “kamailio.cfg” que se encuentra en el directorio “/usr/local/etc/kamailio”. De echo ya existe tal archivo uno de ejemplo que es perfectamente funcional para iniciar el servicio. Sin embargo pondremos lo siguiente:

####### Global Parameters #########
debug=4
log_stderror=yes
fork=yes
children=4
port=5060
listen=udp:192.9.215.24:5060

####### Modules Section ########
#set module path
mpath="/usr/local/lib/kamailio/modules/"

loadmodule "db_mysql.so"
loadmodule "mi_fifo.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri_db.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "acc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"

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

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

# ----- rr params -----
modparam("rr", "enable_full_lr", 1)

# ----- uri_db params -----
/* by default we disable the DB support in the module as we do not need it in this configuration */

modparam("auth_db|uri_db|usrloc", "db_url", "mysql://kamailio:kamailiorw@localhost/kamailio")

# ----- usrloc params -----
/* uncomment the following lines if you want to enable DB persistency for location entries */
modparam("usrloc", "db_mode",   2)

# ----- auth_db params -----
/* uncomment the following lines if you want to enable the DB based authentication */
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")

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

# main request routing logic

route{

	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}

	if (msg:len > max_len) {
  		sl_send_reply("513", "Message Overflow");
  		exit;
	}
# -----------------------------------------------------------------
# Record Route Section
# -----------------------------------------------------------------
	if (method!="REGISTER") {
		record_route();
	};
# -----------------------------------------------------------------
# Loose Route Section
# -----------------------------------------------------------------
	if (loose_route()) {
		route(1);
		exit;
	};
# -----------------------------------------------------------------
# Call Type Processing Section
# -----------------------------------------------------------------
	if (uri!=myself) {
		route(1);
		exit;
	};

	if (method=="ACK") {
		route(1);
		exit;
  	};

	if (method=="INVITE") {
		route(3);
		exit;
	} else if (method=="REGISTER") {
		route(2);
		exit;
  	};

	lookup("aliases");

	if (uri!=myself) {
		route(1);
		exit;
	};

	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		exit;
	};

	route(1);
}

route[1] {
# -----------------------------------------------------------------
# Default Message Handler
# -----------------------------------------------------------------
	if (!t_relay()) {
		sl_reply_error();
	};
}

route[2] {
# -----------------------------------------------------------------
# REGISTER Message Handler
# ----------------------------------------------------------------
	sl_send_reply("100", "Trying");
	if (!www_authorize("","subscriber")) {
		www_challenge("","0");
		exit;
	};

	if (!check_to()) {
		sl_send_reply("401", "Unauthorized");
		exit;
	};

	consume_credentials();
	if (!save("location")) {
		sl_reply_error();
	};
}

route[3] {
# -----------------------------------------------------------------
# INVITE Message Handler
# -----------------------------------------------------------------

	if (!proxy_authorize("","subscriber")) {
		proxy_challenge("","0");
		exit;
	} else if (!check_from()) {
		sl_send_reply("403", "Use From=ID");
		exit;
  	};

	consume_credentials();
	lookup("aliases");

	if (uri!=myself) {
		route(1);
		exit;
	};

	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		exit;
	};

	route(1);
}

Iniciaremos Kamailio en segundo plano, esto se cambia mediante la opción fork=yes|no, y donde dice la IP sustitúyela por una valida para tu uso. Iniciamos Kamailio.

gabriel@trantor:~$ sudo kamctl start

INFO: Starting Kamailio :
INFO: started (pid: 15627)

Agregamos un par de usuarios.

gabriel@trantor:~$ sudo kamctl add 1000 1234
new user '1000' added
gabriel@trantor:~$ sudo kamctl add 1001 1234
new user '1001' added

Registramos estos usuarios con un par de softphones (Twinkle y Linphone) para autenticarnos en el sistema y realizar una llamada de prueba.

kamailiotw1

Softphone Twinkle

kamailiotw4

Softphone Linphonec

kamailiotw3

Usuario 1000 llamando a 1001

One thought on “Instalando Kamailio

  1. Hola,
    muchas gracias por el tutorial. La verdad es que me ha ayudado mucho en la instalación.

    Por otro lado, quería saber si me podías ayudar con una duda que tengo. ¿Que habría que hacer para que al registrar los teléfonos estos no adquieran como parte de host de la URI la IP de Kamailio sino que adquieran el FQDN asociado con esa IP?

    Muchas gracias de antemano

    Like

Leave a Reply to Luis Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: