Freeswitch + Kamailio

Esta noche vamos a instalar freeswitch y vincularlo con kamailio.

Empezamos pues con la instalación de freeswitch, la gente de freeswitch nos facilitan el trabajo dándonos en su página web un script para que no nos olvidemos de ningún paso :) pero como nos gusta tener control de todo vamos a hacer la instalación compilando los sources.

Vamos a instalar algunas dependencias

# apt-get install autoconf automake devscripts gawk g++ git-core libjpeg-dev libncurses5-dev libtool make python-dev gawk pkg-config libtiff5-dev libperl-dev libgdbm-dev libdb-dev gettext libssl-dev libcurl4-openssl-dev libpcre3-dev libspeex-dev libspeexdsp-dev libsqlite3-dev libedit-dev libldns-dev libpq-dev libtool-bin

Nos vamos al directorio /usr/src, descargamos el código (añadiendo “-b v1.4” después de clone indicamos que queremos descargar la versión estable) y ejecutamos el script bootstrap.sh (con la opción -i abre varios procesos para agilizar la compilación)

# cd /usr/src
# git clone -b v1.4 https://freeswitch.org/stash/scm/fs/freeswitch.git
# cd /usr/src/freeswitch
# ./bootstrap.sh -j

Si queremos añadir o eliminar modulos de la compilación, modificamos modules.conf y añadimos # o sacamos # dependiendo de si queremos activar o desactivar el módulo.

# vi modules.conf

Y empezamos la instalación

# ./configure --enable-core-pgsql-support
# make && make install

Instalamos los sonidos

# make cd-sounds-install cd-moh-install

Definimos los permisos del usuario que va a ejecutar freeswitch

# cd /usr/local
# adduser --disabled-password  --quiet --system --home /usr/local/freeswitch --gecos "FreeSWITCH Voice Platform" --ingroup daemon freeswitch
# chown -R freeswitch:daemon /usr/local/freeswitch/
# chmod -R ug=rwX,o= /usr/local/freeswitch/
# chmod -R u=rwx,g=rx /usr/local/freeswitch/bin/*

Iniciamos por primera vez freeswitch

# cd /usr/local/freeswitch/bin
# ./freeswitch

Esto arranca Freeswitch y saca algunos mensajes a la pantalla, permitiéndote ver la secuencia de arranque y si hay algún mensaje de error. Esto es interesante hacerlo la primera vez para poder ver si todos los módulos se están iniciando correctamente al mismo momento de ver que tenemos a nuestra disposición mucha información. Una vez estén los módulos y todo cargado, nos va a salir un promt similar a éste:

freeswitch@domain>

Donde domain es el nombre de la maquina o dirección donde está funcionando Freeswitch.
Para ver los comandos que podemos ejecutar escribimos ‘help’, para ver el estado de Freeswitch ejecutamos ‘sofia status’. ‘shutdown’ para salir.

Si queremos arrancar freeswitch en background ejecutamos

# ./freeswitch -ncwait

Freeswitch va a estar funcionando hasta que termines la sesión. Usa fs_cli para interactuar con el servicio.

Arrancar freeswitch al iniciar el sistema
Modificamos el fichero de inicio y alrededor de la línea 20 modificamos las líneas para que queden como éstas:

# vi /usr/src/freeswitch/debian/freeswitch-sysvinit.freeswitch.init
DAEMON=/usr/local/freeswitch/bin/freeswitch
CONFDIR=/usr/local/freeswitch/conf
GROUP=daemon

Y preparamos el entorno:

# mkdir /var/lib/freeswitch
# chown freeswitch:daemon /var/lib/freeswitch
# chmod -R ug=rwX,o= /var/lib/freeswitch
# cp /usr/src/freeswitch/debian/freeswitch-sysvinit.freeswitch.default /etc/default/freeswitch
# cp /usr/src/freeswitch/debian/freeswitch-sysvinit.freeswitch.init  /etc/init.d/freeswitch
# chmod +x /etc/init.d/freeswitch
# chown freeswitch:daemon /etc/init.d/freeswitch
# update-rc.d freeswitch defaults

Et voilà! :) podemos reiniciar el sistema para verificar que está todo correcto.

Ahora empezamos pues con kamailio

Instalación de kamailio

Instalamos algunas dependencias

# apt-get install gcc flex bison libmysqlclient-dev make libxml2-dev libssl-dev

Vamos a /usr/src y nos descargamos los sources de kamailio y los descomprimimos.

# cd /usr/src
# wget http://www.kamailio.org/pub/kamailio/latest/src/kamailio-4.2.1_src.tar.gz
# tar xvzf kamailio-4.2.1_src.tar.gz && cd kamailio-4.2.1

Ahora vamos a generar los ficheros de configuración necesarios para la instalación

# make cfg

Ahora modificamos el fichero modules.lst y añadimos los modulos a instalar en la sección “include_modules”, en nuestro caso vamos a usar MySQL, así que vamos a activar “include_modules=db_mysql” (otra forma de hacerlo es ejecutar en el make los módulos a activar “make include_modules=”db_mysql” cfg”) y ahora ya podemos seguir con la instalación.

# make install

Kamailio viene con 4 binarios

Kamailio - Kamailio SIP server
kamdbctl - script to create and manage the Databases
kamctl - script to manage and control Kamailio SIP server
kamcmd - CLI - command line tool to interface with Kamailio SIP server

Y el fichero de configuración que se encuentra en:

/usr/local/etc/Kamailio/Kamailio.cfg

Ahora vamos a instalar el servidor mysql

# apt-get install mysql-server

Y modificamos el fichero /usr/local/etc/Kamailio/kamctlrc y modificamos el tipo de base de datos que vamos a usar:

# vi /usr/local/etc/kamailio/kamctlrc
DBENGINE=MySQL

Ejecutamos kamdbctl para generar las tablas y usuarios por defecto.

# /usr/local/sbin/kamdbctl create

El script añadirá 2 usuarios a la base de datos

Kamailio – (with default password ‘Kamailiorw’) – user which has full access rights to ‘Kamailio’ database
Kamailioro – (with default password ‘Kamailioro’) – user which has read-only access rights to ‘Kamailio’ database

Ahora vamos a preparar kamailio para que se arranque al iniciar el sistema como servicio

# cp /usr/src/kamailio-4.2.1/pkg/kamailio/deb/precise/kamailio.init /etc/init.d/kamailio
# cp /usr/src/kamailio-4.2.1/pkg/kamailio/deb/precise/kamailio.default /etc/default/kamailio
# chmod 755 /etc/init.d/kamailio 

Modificamos el fichero del daemon y cambiamos estas dos líneas

# vi /etc/init.d/kamailio
DAEMON=/usr/local/sbin/kamailio
CFGFILE=/usr/local/etc/kamailio/kamailio.cfg

Creamos el directorio del pid y le asignamos los permisos del usuario que va a ejecutar kamailio

# mkdir -p /var/run/kamailio
# adduser --quiet --system --group --disabled-password 
      --shell /bin/false --gecos "kamailio" 
      --home /var/run/kamailio kamailio
# chown kamailio:kamailio /var/run/kamailio

Configurar kamailio
Todas la configuraciones de kamailio se hacen en un mismo fichero (/usr/local/etc/kamailio/kamailio.cfg).

Ahora tenemos que habilitar los módulos y los features necesarios, por esto añadimos estas líneas en el fichero kamailio.cfg

# /usr/local/etc/kamailio/kamailio.cfg
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_FREESWITCH

Tenemos que indicar en qué IP y puerto se encuentra freeswitch

#!ifdef WITH_FREESWITCH
freeswitch.bindip = "109.69.8.30" desc "FreeSWITCH IP Address"
freeswitch.bindport = "5090" desc "FreeSWITCH Port"
#!endif

Ahora tenemos que ir a la sección “request_route”, esta es la parte que se encarga de hacer funcionar toda la parte del enrutamiento. Aquí vamos a añadir 2 logicas para el relay freeswitch. Antes de la sección “request_route” podemos ver la definición para las opciones del routing. Después de esto tenemos que añadir nuestras nuevas definiciones de enrutamiento.

        # freeswitch
        route[FSDISPATCH] {
                # dial number selection
                route(FSRELAY);
                exit;
        }

        route[FSRELAY] {
                $du = "sip:" + $sel(cfg_get.freeswitch.bindip) + ":" + $sel(cfg_get.freeswitch.bindport);
                if($var(newbranch)==1)
                {
                        append_branch();
                        $var(newbranch) = 0;
                }
                route(RELAY);
                exit;
        }

By default, all the routes mentioned in the “request_route” will be executed line by line. There is a default route called ”Location”, which splits the user part from the request URI and verifies if the user exists in the location table. But when we dial an outside number/user, this location check will fail, so i’m going to add a condition which checks if the user in the request URI contains a number with a length 9-15 will be relayed to the FreeSwitch. Again this is just a simple condition, we can create a more complex condition, like check the domain part, if the domain part contains a domain which doesnot belong to our Domain list, we can either decline the request, or we can relay to FreeSwitch or we can make DNS query and we can make Kamailio to process the request to that domain’s Proxy server. Like this we can define our own conditions in the config file, and Kamailio will execute it line by line.

I’m going to add my check condition on the ”LOCATION” route definition.

route[LOCATION] {

    #!ifdef WITH_SPEEDDIAL
        # search for short dialing - 2-digit extension
        if($rU=~"^[0-9][0-9]$")
                if(sd_lookup("speed_dial"))
                        route(SIPOUT);
    #!endif
        if($rU=~"^[0-9]{9,15}$")        # checking for numbers in the Request URI
                route(FSDISPATCH);
    #!ifdef WITH_ALIASDB
        # search in DB-based aliases
        if(alias_db_lookup("dbaliases"))
                route(SIPOUT);
    #!endif
        $avp(oexten) = $rU;
        if (!lookup("location")) {
                xlog("L_INFO", "CALL $rm $ci lookup heren");
                xlog("L_INFO", "$fU@$fd - Lookup contact location for $rmn");
                xlog("L_INFO", "rc is $var(rc)");
                switch ($rc) {
                        case -1:
                        case -3:
                                xlog("L_ERR", "$fU@$fd - No contact foundn");
                                send_reply("404", "Not Found here");
                                exit;
                        case -2:
                                send_reply("405", "Method Not Allowed");
                                exit;
                }
        }

        # when routing via usrloc, log the missed calls also
        if (is_method("INVITE"))
        {
                setflag(FLT_ACCMISSED);
        }
        xlog("L_INFO", "CALL $rm $ci relayn");
        xlog("L_INFO", "$fU@$fd - Relaying $rmn");
        route(RELAY);
        exit;
}

So now all the calls coming with numbers of length 9-15 in the Request URI will be relayed to the FreeSwitch, and FreeSwitch will process the call based on the DialPlan configured in the FreeSwitch. Since i’m going to use IP authentication, i need to whitelist the Kamailio ip in “acl_conf.xml” file in the FreeSwitch autload conf directory, so that FreeSwitch will accept the invites from Kamailio. Again i’m not defining any Voicemail options here. If we have a Voice mail server, then we can create another route option and when the caller doesn’t pick the call we can route the call to the Voice Mail server.
For example the below condition will route the failures to FreeSwitch Voice Mailbox.

if(is_method("INVITE"))
        {
            # in case of failure - re-route to FreeSWITCH VoiceMail
            t_on_failure("FAIL_FSVBOX");        # where FSVBOX is a route definition
        }

Kamailio has a lot of modules which really comes in handy. For example we can use LDAP module to use LDAP as a backend. There is a PRESENCE module which helps us to setup an Instant Messaging server using Kamailio. I’ll be writing a blog on how to use Kamailio as an IM server soon. One of the main advantage of Kamailio over OpenSIP is the WebSocket support. This just a basic configuration, but we can design much complex system using Kamailio. We can even remove the default route logics, and we can use our own routing logics. Kamailio doesnot depend on default routing logics, it blindly reads the route and executes it for each incoming connections.

Fuente: Instalación freeswitch
Fuente: Instalación y configuración kamailio

3 Comments

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.