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.
Softphone Twinkle
Softphone Linphonec
Usuario 1000 llamando a 1001
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
LikeLike