En este tutorial explicaremos como montar desde cero una cabina
telefonica de bajo coste para hacer llamadas gratuitas a telefonos
fijos de mas de 40 paises utilizando Asterisk y un proveedor de
telefonia SIP. Se explicara el aspecto tecnico, de hardware y software de montar la cabina.
Todo lo que utilizamos es facil de conseguir, excepto el adaptador ATA, aunque para utilizar Asterisk no lo necesitamos, solo se requiere si se quiere conectar a telefonos analogicos. Tambien podremos configurarlo con un telefono IP si tenemos, o bien conectarse con un softphone, es decir, un telefono por software: el Ekiga sin ir mas lejos. Con el tiempo veremos que la versatilidad del Asterisk es tal que se puede conectar de muchas formas, de hecho de las centralitas PBX es la que soporta mas protocolos y canales: desde lineas analogicas hasta clientes/servidores SIP, H323.b, IAX2, adaptadores ATA, placas FXS/FXO, e incluso hay un proyecto para que pueda anunciarse como un BTS (antena GSM --- moviles!!).
Para la instalación de las cabinas que tenemos en el Patio hemos utilizado:
- Ordenador: AMD Duron a 900 Mhz con 386 Mb de RAM.
- Software: Asterisk 1.4 o 1.6
- Software cliente: Softphone. Puede ser Ekiga o Twinkle.
- Hardware: Adaptador ATA, Linksys SPA3102.
- Proveedor de telefonia SIP: VoIPBuster.
- Cable telefonico RJ11
- Telefono
¿Que es Asterisk?
Asterisk es una aplicación de software libre (bajo licencia GPL) que proporciona funcionalidades de una central telefónica (PBX). Como cualquier PBX, se puede conectar un número determinado de teléfonos para hacer llamadas entre sí e incluso conectar a un proveedor de VoIP o bien a una RDSI tanto básicos como primarios. Fuente: Wikipedia
¿Como se instala?
Lo instalaremos en Debian, una distribucion GNU/Linux. Para empezar actualizaremos los repositorios al listado mas reciente de paquetes e instalaremos las actualizaciones pendientes.
# apt-get update # apt-get dist-upgrade
Podremos ver mas informacion de la instalacion de Asterisk sobre Debian en el siguiente link.
A traves de los repositorios:
La forma mas facil y rapida de instalarlo, es con el siguiente comando:
# sudo aptitude install asterisk
Con el codigo fuente:
Ahora instalaremos las dependencias, junto con las herramientas necesarias para compilar y las fuentes del kernel.
# apt-get -y install build-essential libncurses5-dev libcurl3-dev libvorbis-dev libspeex-dev unixodbc unixodbc-dev libiksemel-dev linux-headers-`uname -r
Vamos al directorio de las fuentes.
# cd /usr/src
Descargamos y descomprimimos las fuentes del Asterisk junto con el modulo Zaptel necesario para que funcione:
# wget http://downloads.digium.com/pub/asterisk/asterisk-1.45.1.tar.gz # wget http://downloads.digium.com/pub/zaptel/zaptel-1.45.1.tar.gz # tar xvzf asterisk-1.4.5.1.tar.gz # tar xvzf zaptel-1.4.5.1.tar
Vamos al directorio de zaptel:
# cd zaptel-1.4.
Configuramos, compilamos e instalamos el modulo.
# ./configure && make && make inst
Por ultimo lo cargamos con el comando modprobe.
# modprobe ztdumm
Podemos comprobar que se cargo sin problemas con:
# lsmod | grep ztdumm
Si vemos que funciona hay que agregarlo al inicio del sistema poniendolo en el fichero /etc/modules.
# echo “ztdummy” >> /etc/module
Ahora vamos a compilar el Asterisk. Para esto vamos a su directorio y lanzamos los mismos comandos que antes:
# cd /usr/src/asterisk-1.4.5.1 # ./configure && make && make install
Es recomendable instalar los ejemplos para tener algo sobre lo que trabajar:
# make samples # make config
Fuentes:
- ElCanibal.com: Mi nuevo proyecto; Asterisk en Debian Etch
- Blog de Pedro: Asterisk en Debian Etch
Iniciar / Parar Asterisk
Para inciar el Asterisk como demonio basta hacerlo con el siguiente comando:
# /etc/init.d/asterisk start
Luego para pararlo:
# /etc/init.d/asterisk stop
Por ultimo, para reiniciarlo:
# /etc/init.d/asterisk restart
En caso de que queramos iniciarlo solo por un tiempo determinado y no todo el tiempo, debemos iniciarlo con el comando:
# /usr/sbin/asterisk -vvvvc
Con esto iniciaremos la aplicacion e ingresaremos a la consola, [*CLI>]. Puedes ver como manejarte en ella en la seccion "Consola y Logs".
En caso de que lo hayamos iniciado como demonio, para conectarnos a la consola deberemos hacerlo con el mismo comando pero la opcion -r en vez de -c:
# /usr/sbin/asterisk -vvvvr
Si queremos que inicie cada vez que arranque el ordenador tendremos que modificar el siguiente fichero:
# nano /etc/default/asterisk RUNASTERISK=yes
¿Y como se configura esto?
Una vez que tengamos todo instalado podremos ojear los ficheros de configuracion de ejemplo que nos instalamos en los ultimos pasos.
# less /etc/asterisk/sip.conf # less /etc/asterisk/extension.conf
Estos ficheros son los que mas veremos en este tutorial. En sip.conf configuraremos los clientes, peers o amigos (en jerga asteriskiana) que tendremos y en extensions.conf nuestro DialPlan. Este es nuestro plan de llamadas: que hara cuando reciba una llamada a tal extension, o que hara cuando un usuario intente llamar a alguna otra.
Los otros ficheros que hay en la carpeta /etc/asterisk son para todas las otras funcionalidades que nos ofrece. Esta es la principal ventaja de Asterisk frente a las otras centralitas (PBX), que desde el principio y modificando solo alguna linea de los ficheros podremos tener funcionalidades impresionantes, como salas de conferencias (meetme.conf), buzon de voz (voicemail.conf) y conexion con diferentes tipos de protocolos VoIP como SIP (en el sip.conf) e IAX2 (iax.conf) .
Vamos a ponernos a manos a la obra, para esto haremos una copia de seguridad de los ficheros que ya tenemos.
# mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.old # mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old
SIP.CONF
Como ya dijimos, en este se configuran los diferentes usuarios, clientes y peers. Aqui es donde puede diferir mas nuestra configuracion. Todos los ficheros de configuracion de Asterisk comienzan con la etiqueta [general], con las opciones globales y luego cada etiqueta servira para cada uno de los clientes. Estos pueden ser desde clientes SIP de software aka softphone (como el Ekiga o el Twinkle para GNU/Linux), un telefono SIP fisico, un adaptador ATA o un proveedor de telefonia SIP. Si tenemos una tarjeta PCI FXS o FXO haremos las configuraciones en zapata.conf.
En nuestro caso el hardware con el que contamos es un adaptador ATA Linksys SPA302, Este se configura en la etiqueta [patio]. Tambien lo conectamos a un proveedor de telefonia SIP llamado VoIPBuster, en la etiqueta [voipbuster] (si conoces uno con mejores precios dimelo a isaac.hacksimov@patiomaravillas.net ;D) y creamos un usuario preparado para conectarlo por softphone (tanto con twinkle como con ekiga) en la etiqueta [isaac].
[general] context=default useragent= disallow=all allow=gsm allow=alaw allow=ulaw language=es srvlookup=yes tos_sip = cs3 tos_audio = ef tos_video = af41 allowguest = yes
register => isaac.hacksimov:CONTRASENA@sip1.voipbuster.com:5060
[patio] type=friend host=dynamic username=patio secret=CONTRASENA callerid="Patio Maravillas" context=patio qualify=yes [voipbuster] type=peer host=sip1.voipbuster.com username=isaac.hacksimov fromuser=isaac.hacksimov secret=CONTRASENA context=voipbuster insecure=port,invite qualify=yes canreinvite=no
[isaac] type=friend host=dynamic username=isaac secret=CONTRASENA callerid="Dr. Isaac Hacksimov" context=patio mailbox=3000@default qualify=yes
Vamos paso por paso:
[general] context=default useragent= disallow=all allow=gsm allow=alaw allow=ulaw language=es srvlookup=yes tos_sip = cs3 tos_audio = ef tos_video = af41 allowguest = yes
register => isaac.hacksimov:CONTRASENA@sip1.voipbuster.com:5060
Aqui le estamos diciendo el contexto en el que se encuentra esta etiqueta (esto lo volveremos a ver en el extensions.conf), tambien que tipo de codecs estamos permitiendo (gsm, alaw, ulaw) y el idioma (espaniol, mas tarde instalaremos los sonidos),
La linea de register tiene los mismos datos que en la etiqueta [voipbuster]. Es necesario en algunos proveedores.
[patio] type=friend host=IPDELCACHARRO username=patio secret=CONTRASENA callerid="Patio Maravillas" context=patio qualify=yes
Aqui le tendremos que poner la IP del adaptador, junto con el nombre y la contraseña. Otro dato importante es el contexto, en este caso es "patio".
[voipbuster] type=peer host=sip1.voipbuster.com username=isaac.hacksimov fromuser=isaac.hacksimov secret=CONTRASENA context=voipbuster insecure=port,invite qualify=yes canreinvite=no
En esta etiqueta lo importante es el host, que es la URL que nos da nuestro proveedor cuando nos registramos. Elegimos VoIPBuster por permitirnos hacer llamadas gratuitas a los siguientes paises por un plazo de 120 dias pagando 10 euros:
| Andorra Australia Austria Bélgica Canadá Checa, República |
Chile Chipre Dinamarka España Estonia Eu Estados Unidos (+mobile) Finlandia |
Francia Guam Hong - Kong (+mobile) Hungria Irlanda Islandia Israel |
Italia Japón Luxemburgo Malasia Mónaco Noruega |
Nueva Zelanda Países Bajos Panamá Portugal Puerto Rico (+mobile) |
Rusia [moscow] Rusia [st Petersburg] Singapur Sudcorea Suiza Taiwan |
Cual es el problema con VoIPBuster? Van cambiando el listado de paises sin avisar, por lo que es posible que nos quiten algo de credito
Si conoces uno mejor, dimelo a isaac.hacksimov@patiomaravillas.net.
Por ultimo configuramos otro usuario mas. Lo unico que difiere con los anteriores es el host, que es dinamico, esto es decir que puede tener cualquier IP:
[isaac] type=friend host=dynamic username=isaac secret=CONTRASENA callerid="Dr. Isaac Hacksimov" context=patio qualify=yes
EXTENSIONS.CONF
[general] static=yes writeprotect=yes
[globals] CABINA=SIP/patio VOIPBUSTER=SIP/voipbuster ISAAC=SIP/isaac
[default]
[patio] include => default include => nacionales include => echo include => monkeys
[isaac] include => default include => nacionales include => echo include => monkeys
[nacionales]
exten => _9ZXXXXXXX,1,Dial(${voipbuster}/0034${EXTEN},60,r)
exten => _9ZXXXXXXX,n,Hangup
[echo]
exten => 600,1,Playback(demo-echotest)
exten => 600,n,Echo
exten => 600,n,Playback(demo-echodone)
exten => 600,n,Hangup
[monkeys]
exten => 666,1,Answer()
exten => 666,n,Wait(2)
exten => 666,n,Playback(tt-monkeysintro)
exten => 666,n,Playback(tt-somethingwrong)
exten => 666,n,Wait(2)
exten => 666,n,Playback(tt-monkeys)
exten => 666,n,Hangup
Como decia Jack el Destripador, vamos por partes:
[general] static=yes writeprotect=yes
[globals] CABINA=SIP/patio VOIPBUSTER=SIP/voipbuster ISAAC=SIP/isaac
El contexto general, donde pondremos las opciones que valen para todo el fichero. En general lo protegemos y en globals ponemos las variables. Se escribe teniendo en cuenta los usuarios que creamos en el fichero sip.conf. Creamos 3 variables: una para el adaptador ATA (usuario y contexto patio en el fichero sip.conf, variable CABINA), otra para voipbuster y la ultima para el usuario que se conectara por softphones, isaac.
[default] [patio] include => default include => nacionales include => echo include => monkeys
[isaac] include => default include => nacionales include => echo include => monkeys
Estos son los contextos de los usuarios que realizaran las llamadas, patio e isaac. El proveedor SIP, obviamente, no realizara llamadas, sino que enrutaremos las llamadas hacia el. El include sencillamente significa que estamos incluyendo esos contextos (default, nacionales, echo y monkeys),
[nacionales]
exten => _9ZXXXXXXX,1,Dial(${VOIPBUSTER}/0034${EXTEN},60,tr)
exten => _9ZXXXXXXX,n,Hangup
Esta es la sintaxis que utilizaremos para definir que hacer cuando se realiza un llamado. Por ejemplo, aqui estamos definiendo que cuando se marque un telefono que comienza con 9 y el siguiente numero sea mayor a 0 (Z) y los siguientes 7 numeros sean mayores o iguales a 0 (XXXXXXX), primero (1) marque al numero que configuramos anteriormente como perteneciente a voipbuster el numero que se ha marcado ($EXTEN) añadiendole el codigo internacional del pais, España en este caso (0034). Tambien le decimos que llame durante 60 segundos y que permita la transferencia y no escuche el tono de marcado (tr). Luego le decimos que cuando termine con esto, cuelgue. Y todo esto en 2 lineas!!
Como vemos, en principio puede parecer complicado, pero cuando hagamos mas extensiones podremos ver que a traves de el DialPlan se puede sacar mucho jugo al Asterisk, permitiendonos hacer muchisimas cosas y divertirnos un monton ;), por ejemplo:
[echo] exten => 600,1,Playback(demo-echotest) exten => 600,n,Echo exten => 600,n,Playback(demo-echodone) exten => 600,n,Hangup
Aqui le decimos que para el contexto [echo], es la extension 600. Primero reproducira (Playback) un sonido que dice que hara una prueba de eco con demo-echotest, que se encuentra en /var/lib/asterisk/sounds/ o donde lo hayamos instalado. Importante, no es necesario poner el formato del audio, Asterisk decidira cual es el mejor en cada caso. Luego llama al programa que hace la prueba de eco en si, y manda a reproducir otro sonido diciendo que termino la prueba de eco. Por ultimo cuelga. Con respecto a la sintaxis, esto mismo podriamos haberlo escrito asi:
[echo] exten => 600,1,Playback(demo-echotest) exten => 600,2,Echo exten => 600,3,Playback(demo-echodone) exten => 600,4,Hangup
Pero en este caso cuando querramos cambiarlo habra que renumerar todo, por lo que es preferible usar la "n" para llamar a la siguiente accion.
[monkeys] exten => 666,1,Answer() exten => 666,n,Wait(2) exten => 666,n,Playback(tt-monkeysintro) exten => 666,n,Playback(tt-somethingwrong) exten => 666,n,Wait(2) exten => 666,n,Playback(tt-monkeys) exten => 666,n,Hangup
Este es nuestro pequeño huevo de pascua. Aqui le decimos que atienda, que espere por 2 segundos, que reproduzca unos sonidos (la "introduccion a los monos" y "algo va muy mal"), espere 2 segundos mas, reproduzca otro sonido ("monos" !!!!) y por ultimo cuelgue.
El unico contexto que falta poner en esta configuracion es [internacionales]. Al ser una configuracion tan larga y que tanta gente le puede dar uso decidimos liberarlo en una wiki dedicada al mundo VoIP: voip-info.org. El link donde pueden ver las extensiones actualizadas para hacer llamadas a telefonos fijos (landlines/fixed lines) esta aqui: LINKVOIPINFOINTERNACIONALES
Todo eso se agregaria en el extensions.conf y tambien como includes del usuario al que queremos habilitar las llamadas internacionales.
Configuracion del cliente Softphone
Veremos como conectarnos con dos clientes de software: Ekiga y Twinkle.
EKIGA
Por defecto muchas distribuciones GNU/Linux ya vienen instaladas con un cliente SIP, el Ekiga. En Ubuntu, este se encuentra en Aplicaciones -> Internet -> Softphone Ekiga,
EkigaCrearemos una cuenta con lo que hemos puesto en sip.conf, junto con la IP del servidor. En caso de tener que conectarse desde internet deberan abrirse los
puertos necesarios y poner la IP publica o el dominio que tengamos
asociado a esta.
Nombre de la cuenta: isaac Protocolo: SIP Registrador: 192.168.10.1 Usuario: isaac Contraseña: CONTRASENA
TWINKLE
Conectarse a traves de Twinkle es muy sencillo, solo hace falta instalarlo. Para Ubuntu/Debian basta con
# sudo aptitude install twinkle
Aparecera en Aplicaciones -> Internet -> Twinkle. Lo abriremos y crearemos un perfil nuevo utilizando la configuracion que hemos puesto en el fichero sip.conf. El Domain debe ser la IP donde esta nuestro servidor.
Siguiendo el ejemplo asi seria nuestra configuracion:
Twinkle
Your name: isaac User name: isaac Domain: 192.168.10.1 Realm: isaac Authentication name: isaac Password: CONTRASENA
Luego deberemos ver lo siguiente en el log del Twinkle:
isaac, registration succeeded (expires = 3600 seconds)
Esto significa que ya estamos conectados :D
Configuracion del adaptador ATA
- En un navegador ingresamos la IP del adaptador.
- Nos dira "spa user" y nos pedira usuario y contraseña. Pondremos usuario "user" y sin contraseña. Entraremos una pagina que nos muestra información de la configuración actual.
- Vamos a la seccion de Administracion, en "Admin login". Nos pedira nuevamente usuario y contraseña ("admin user"). Esta vez ponemos como usuario "admin" y sin contraseña.
- Ya aqui nos pondemos a configurarlo:
- En Voice -> System podremos cambiar la contraseña de acceso (User Password:). Dandole a "Advanced" podremos tambien cambiar la contraseña del usuario Admin (Admin Password:)
- En Router -> Wan Setup le pondremos una IP estatica dentro de nuestro rango de red. Aqui podremos tambien configurarlo como router ("PPPoE Settings")
- En Voice -> Line 1 configuraremos nuestra linea para hacer llamadas. Tendremos que poner como minimo los siguientes paramentros:
Line enable: yes
SIP Port: 5060
Proxy: IPDELASTERISK
Register: yes
Display name: patio
Configurar adapatador ATA 3102 - 1
Password: CONTRASENA
Auth ID: patio
User ID: patio
Use Auth ID: patio
Preferred Codec: G711a
Use Pref codec only: no
Esto en el Asterisk lo configuramos de la siguiente forma: [patio] type=friend host=IPDELCACHARRO username=patio secret=CONTRASENA callerid="Patio Maravillas" context=patio qualify=yes
- En Voice -> PSTN Line configuraremos nuestra linea PSTN para hacer y recibir llamadas.
Line Enable: yes
SIP Port: 5061
Configurar adapatador ATA 3102 - 2
Proxy: IPDELASTERISK
Register: yes
Display Name: pstn
Password: CONTRASENA
Auth ID: pstn
User ID: pstn
Use Auth ID: no
Preferred Codec: G711a
Use Pref Codec Only: no
[pstn-spa3k] type=peer auth=md5 host=IPDELCACHARRO port=5061 secret=CONTRASENA username=pstn fromuser=pstn dtmfmode=rfc2833 context=incoming-pstn insecure=very
Consola y Logs
Pronto veremos que la consola de Asterisk es completamente intuitiva y todo un aliado para resolver problemas.Para conectarnos a la consola depende de como hayamos iniciado Asterisk. Primero comprobamos si esta corriendo con el comando
# ps auxf | grep asterisk
En caso de que no lo veamos deberemos conectarnos con el siguiente comando:
# /usr/sbin/asterisk -vvvvcPor otro lado, si lo iniciamos como demonio, para conectarnos a la consola deberemos hacerlo con el mismo comando pero la opcion -r en vez de -c:
# /usr/sbin/asterisk -vvvvr
Si hay alguna duda sobre este punto, puedes leer la seccion "Iniciar/Parar Asterisk"
Una vez dentro de la consola deberas ver lo siguiente: [Nota: CLI significa Command Line Interface, Interfaz de Linea de Comandos]
*CLI>
Para empezar, cuando un usuario se conecte o se realize una llamada lo veremos ahi, por ejemplo cuando el usuario Isaac se conecto a traves del Twinkle aparecio lo siguiente:
-- Registered SIP 'isaac' at 192.168.10.135 port 5060 expires 3600 -- Saved useragent "Twinkle/1.2" for peer isaac [Apr 5 20:01:20] NOTICE[8449]: chan_sip.c:12669 handle_response_peerpoke: Peer 'isaac' is now Reachable. (25ms / 2000ms)
Y cuando se desconecto:
Unregistered SIP 'isaac'
Cuando se conecto con Ekiga:
-- Registered SIP 'isaac' at 192.168.10.135 port 5061 expires 3600 -- Saved useragent "Ekiga/2.0.12" for peer isaac [Apr 5 20:10:27] NOTICE[8449]: chan_sip.c:12669 handle_response_peerpoke: Peer 'isaac' is now Reachable. (32ms / 2000ms)
Cuando realizo un llamado al 666 [monkeys], vemos el DialPlan ejecutandose en tiempo real:
-- Executing [666@patio:1] Answer("SIP/isaac-089832b8", "") in new stack
-- Executing [666@patio:2] Wait("SIP/isaac-089832b8", "2") in new stack
-- Executing [666@patio:3] Playback("SIP/isaac-089832b8", "tt-monkeysintro") in new stack
-- <SIP/isaac-089832b8> Playing 'tt-monkeysintro' (language 'es')
-- Executing [666@patio:4] Playback("SIP/isaac-089832b8", "tt-somethingwrong") in new stack
-- <SIP/isaac-089832b8> Playing 'tt-somethingwrong' (language 'es')
-- Executing [666@patio:5] Wait("SIP/isaac-089832b8", "2") in new stack
== Spawn extension (patio, 666, 5) exited non-zero on 'SIP/isaac-089832b8'
(No termino con todo porque el usuario colgo antes)
Tambien podemos ver en que estado se encuentra nuestro proveedor:
*CLI> [Apr 5 20:18:36] NOTICE[28025]: chan_sip.c:12669 handle_response_peerpoke: Peer 'voipbuster' is now Reachable. (90ms / 2000ms)
Aparte de mostrarnos la informacion en tiempo real, tambien podremos pedirle informacion y cambiar la configuracion. Para aprender a movernos en ella nuestro gran aliado sera la tecla TAB (tabulador). Con esta completaremos y veremos que opciones nos da cada comando, por ejemplo si escribimos "sip show" y pulsamos TAB, veremos:
*CLI> sip show channel channels domains history inuse objects peer peers registry settings subscriptions user users
Lo que intuitivamente nos permite ver diferentes datos:
*CLI> sip show users Username Secret Accountcode Def.Context ACL NAT isaac CONTRASENA patio No RFC3581 patio CONTRASENA patio No RFC3581
CLI> sip show registry Host Username Refresh State Reg.Time sip1.voipbuster.com:5060 isaac.hacksi 105 Registered Sun, 05 Apr 2009 20:18:36
*CLI> sip show peers Name/username Host Dyn Nat ACL Port Status isaac/isaac 192.168.10.135 D 5061 OK (4 ms) voipbuster/isaac.hacksimo 194.221.62.198 5060 OK (90 ms) patio/patio (Unspecified) D 0 UNKNOWN 3 sip peers [Monitored: 2 online, 1 offline Unmonitored: 0 online, 0 offline]
Tambien podemos probar el DialPlan, por ejemplo con el comando "console dial 666".
*CLI> console dial 666 No such extension '666' in context 'default'
En este caso no funcionara porque no tenemos ninguna extension configurada en el contexto default, pero para hacer pruebas es recomendable ponerlas ahi (basta con ponerlas como include). Lo bueno de esto es que si el servidor tiene altavoces y microfono podremos probarlo sin necesidad de nada mas.
Hacia el infinito y mas alla:
Algo que queda por ver y resulta muy entretenido es configurar el fichero voicemail.conf y el meetme.conf, y poner los sonidos en Español.
Puedes ver mas informacion del Asterisk en las siguientes paginas:
Una de las mejores paginas para leer documentacion es la wiki VoIP-Info. Aqui encontraremos documentacion detallada de muchos ficheros de configuracion y proveedores, asi como tambien conectar distintos dispositivos y aplicaciones al Asterisk.
Por supuesto, si te interesa ampliar tus conocimientos en este mundo de la telefonia IP libre, lo recomendable es leer el libro Asterisk: The Future of Telephony con licencia CC-by-sa,


