Elastix hack: Usar los Cisco SPA5XX con el endpoint configurator de Elastix

19 Jul

En numerosas ocasiones he usado el Endpoint Configurator de Elastix para facilitar la configuración de múltiples teléfonos de manera rápida y sencilla. Sin embargo, recientemente que empecé a ocupar los teléfonos Cisco SPA502G y SPA504G me topé con que Elastix no los reconoce (o al menos, no directamente), así que no podía usar el configurador automático con ellos.

Los teléfonos de la serie SPA provienen de Linksys, el fabricante de equipo de red para SoHo que Cisco adquirió, pero estos a su vez provienen de Sipura, que es un fabricante que pocos conocen y que hace mucho tiempo, Linksys compró. La configuración entre los diferentes modelos no ha cambiado mucho a pesar de los años, así que un Cisco SPA504G se configura prácticamente igual que un Linksys SPA942, y esos SI son detectados por el configurador de Elastix.

Entonces… ¿Cómo hacemos para que Elastix detecte estos nuevos modelos?

Una forma muy sencilla es engañando al configurador, haciéndolo creer que se tratan de SPA942. Para hacerlo, solo tenemos que agregar las MACs de Cisco dentro del archivo /var/www/db/endpoint.db (el cual viene en formato de sqlite). El código sería el siguiente:

sqlite3 /var/www/db/endpoint.db
sqlite> INSERT INTO "mac" VALUES(45, 4, 'C8:9C:1D', 'Cisco - SPA504G');
sqlite> INSERT INTO "mac" VALUES(46, 4, 'E0:5F:B9', 'Cisco - SPA504G');
sqlite> .quit

Estas 2 series de MACs, la E0:5F:B9 y la C8:9C:1D son las que por experiencia he encontrado que estos nuevos teléfonos tienen. ¿Qué quieren decir los otros campos?

  • El ’45’ es el número de la fila. Por default vienen otros 44 registros en la tabla mac, pero podemos reemplazarlos por cualquier otro número (como 100 o 101)
  • El ‘4’ es el que le dice a Elastix que el teléfono encontrado es un Linksys
  • El ‘E0:5F:B9’ o ‘C8:9C:1D’ corresponde al inicio de la MAC del teléfono. Mismos modelos suelen tener el mismo comienzo de MAC
  • El último campo es solo una descripción de lo que se está agregando. Esto no se usa, es solo para que los humanos entendamos de que se trata la fila.

Tras hacer el cambio, podemos re-ejecutar el endpoint y obtendremos algo como esto:

Esto nos indica que nuestros teléfonos ya fueron reconocidos, así que podemos aplicar la configuración de la extensión para configurar nuestros nuevos teléfonos.

¡Suerte!

¡De último momento! Nueva fecha express de cursos del 27 al 30 de julio

18 Jul

Dada la alta demanda que tuvimos para nuestros cursos del 4 al 7 de agosto (y para la cual ya tenemos cupo lleno), decidimos abrir una segunda fecha intensiva:

  • México, DF. 27 al 30 de julio

Además de la fecha en Monterrey que ya teníamos programada:

  • Monterrey, NL. 10 al 13 de agosto

El cierre de nuestra fecha de julio es esta semana, el próximo viernes 22/julio. Para más información puedes consultar la página de nuestros cursos o bien, envíamos un mensaje a través de nuestro formulario de contacto.

Actualización de nuestro servidor

17 Jul

Desde alrededor de las 18:00hrs del sábado 16/julio hasta este momento he estado haciendo tareas de migración en el servidor que hospeda a esta página. Por tal motivo, es problable que algún URL arroje algún error pues todavía hay detalles que me falta afinar.

Si alguien detecta que algo no esta funcionando como debiera, por favor hágamelo saber en los comentarios.

Saludos,

Resetear/recuperar la contraseña de root de MySQL

11 Jul

Este post realmente no tiene que ver con Asterisk, pero resolviendo una consulta que me hicieron, consideré que podría ser útil para aquel que se ha visto en la necesidad de acceder a una BD de MySQL de la cual no se tiene la contraseña de root.

Los pasos a seguir son bastante sencillos (hay que ejecutar los comandos con permisos de root de Linux):

  1. Detenemos el servicio de MySQL
    [codesyntax lang=»bash»]

    /etc/init.d/mysql stop

    [/codesyntax]

  2. Iniciamos MySQL pero en modo sin privilegios
    [codesyntax lang=»bash»]mysqld_safe –skip-grant-tables &[/codesyntax]
  3. Hacemos un login a MySQL sin password
    [codesyntax lang=»bash»]mysql -u root[/codesyntax]
  4. Cambia el password (este query se ejecuta desde adentro de MySQL, al cual accedimos ya porque arrancamos sin contraseña).
    [codesyntax lang=»sql»]UPDATE mysql.user set Password = PASSWORD(‘tunuevopass‘) WHERE User=’root’;[/codesyntax]
  5. Salimos de SQL
    [codesyntax lang=»sql»]exit;[/codesyntax]
  6. Detenemos la sesión corriendo de MySQL
    [codesyntax lang=»bash»]mysqladmin shutdown[/codesyntax]
  7. Reiniciamos el servicio de MySQL
    [codesyntax lang=»bash»]/etc/init.d/mysql restart[/codesyntax]

Al re-arrancar, ya debemos poder acceder a nuestro servicio MySQL con la nueva contraseña que definimos.

¡Suerte!

Protege tu Asterisk de ataques usando fail2ban

7 Jul

En ocasiones anteriores he hecho la mención de fail2ban, una herramienta escrita en Python que analiza logs del sistema y responde en caso de que ciertas condiciones se cumplan, por ejemplo, 5 intentos de contraseña SSH equivocada en un periodo de 10 minutos. Dada la proliferación de ataques a equipos Asterisk para tratar de hacer llamadas de larga distancia, tiene sentido que ocupemos esta herramienta para protegernos de los amantes de lo ajeno.

Ahora bien, ¿cómo configuramos esta herramienta para que nos evite los cargos de miles de dólares en llamadas fantasmas?

Primero, lo instalamos. En Debian podemos usar el mundialmente reconocido apt-get:

apt-get install fail2ban

O, si tenemos Centos, primero asegurémonos de que tengamos EPEL (un repositorio que nos da acceso a mucho software útil) y luego instalamos fail2ban:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm 
yum -y install fail2ban

Fail2Ban se configura en 2 partes básicas:

  • /etc/fail2ban/jail.conf – Define que logs monitorear y que hacer en caso de que una regla se cumpla
  • /etc/fail2ban/filter.d/<filtro> – Definimos las reglas de coincidencia para analizar los logs

Editemos el archivo jail.conf y agreguemos esto hasta abajo:

[asterisk-iptables]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=udp, port=5060]
sendmail-whois[name=ASTERISK, dest=micorreo@algunmail.com, sender=fail2ban@example.org]
logpath  = /var/log/asterisk/full
maxretry = 5
findtime = 600
bantime = 10800

Lo que estamos especificando es lo siguiente:

  • La regla (jail) se llama asterisk-iptables
  • El filtro a usar debe existir en /etc/fail2ban/filter.d/asterisk.conf
  • Cuando se active la regla, usaremos la acción iptables-allports, la cual bloquea a nivel de iptables. Nosotros le estamos indicando que cierre el acceso al puerto UDP 5060, y luego que haga uso de la acción sendmail-whois, la cual me enviaria a mi correo electrónico la notificación del bloqueo, además de enviarme información de whois de la IP que se bloqueó.
  • El archivo log a monitorear es el /var/log/asterisk/full (ojo, dependiendo de tu sistema, el log puede ser diferente, ajústalo acorde)
  • Se permiten un máximo de 5 fallos en 10 minutos antes de activar la protección. Es decir, se permiten un máximo de maxretry intentos en findtime segundos
  • Al activarse el bloqueo, se hará por 3 horas o bien, 10800 segundos (bantime)

En esta liga encuentras el manual oficial para el jail.conf.

Ya definido el jail, necesitamos crear el filtro que atrapará los ataques. Esto se define (de acuerdo a lo que especificamos arriba) en el /etc/fail2ban/filter.d/asterisk.conf (los valores con # son comentarios, solo se dejan por referencia)

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf

[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>S+)
# Values:  TEXT
#

failregex = Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Wrong password
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - No matching peer found
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Device does not match ACL
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Username/auth name mismatch
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Peer is not supposed to register
       NOTICE.* <HOST> failed to authenticate as '.*'$
       NOTICE.* .*: No registration for peer '.*' (from <HOST>)
       NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
       VERBOSE.* logger.c: -- .*IP/<HOST>-.* Playing 'ss-noservice' (language '.*')

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Se observa que estamos tratando de atrapar a los siguientes:

  • Usuarios que ingresan su contraeña SIP incorrectamente
  • Usuarios que intentan usar un usuario SIP que no existe
  • Usuarios que no cumplen con los parámetros permit y deny del sip.conf
  • Usuarios que su auth username no coincide con su username
  • Usuarios que tratan de registrarse con perfiles que son fijos (es decir, que no tienen host=dynamic)
  • Usuarios que no cumplen con los criterios de autenticación
  • Usuarios que marcan hacia números que no existen (esto es común en Elastix/FreePBX cuando deshabilitamos recibir llamdas anónimas)

En esta liga encontramos el manual de los filtros de fail2ban.

Finalmente, solo nos queda activar el servicio. En Debian ya quedó instalado automáticamente, solo tenemos que arrancarlo:

/etc/init.d/fail2ban start

En CentOS, tenemos que habilitar el autoarranque para que inicie al arrancar el equipo:

chkconfig --add fail2ban
chkconfig fail2ban on
/etc/init.d/fail2ban start

Fail2ban es un excelente apoyo contra ataques que dejan registros en logs y no solo nos sirve para Asterisk, también para SMTP, SSH, HTTP o cualquier otra cosa que queramos monitorear. Esto, en conjunción con buenas prácticas de seguridad para Asterisk, nos darán un sistema más confiable y menos propenso a sufrir daños por parte de atacantes.

¡Suerte!

 

Mantente actualizado con los cambios en Asterisk

7 Jul

Si alguno de ustedes es como yo, muy probablemente les guste batallar con los betas. Suelo ser de aquellos que en cuanto sale una nueva versión corro a adoptarla, no importándome los problemas de estabilidad o soporte extra que esto conlleva. Sin embargo, hay algunos casos en los que definitivamente no es posible sacrificar la confiabilidad de un sistema, aunque esto nos traiga nuevas funcionalidades.

En sus inicios yo literalmente brinqué de Asterisk 1.0 a 1.2 sin pensarlo, lo mismo 1.2 a 1.4, y esto es hablando en entornos en producción (mala idea, yo sé, afortunadamente funcionó bien), pero cuando quise hacer lo mismo para 1.6 me paré en seco: mis sistemas se caían sin razón aparente, muchas cosas cambiaron, el AgentCallbackLogin dejó de existir y en general fue una experiencia poco placentera, al grado que decidí quedarme con 1.4 (y hasta la fecha) lo he seguido haciendo.

Con la reciente noticia de que Asterisk 1.4 alcanzó su último maintenance release, el momento de hacer el cambio es ahora. Muchos colegas en la materia opinarán que la 1.6 nunca acabó de ser lo que se esperaba. Yo digo a mis alumnos en los cursos (bajo opinión personal) que Asterisk 1.6 fue el Windows Vista de Digium: para cuando ya se corrigieron la mayor parte de los detalles que tenía, salió Asterisk 1.8, así que el salto sería directo, de 1.4 a 1.8, sin pasos intermedios. Opino yo: ¿para que hacer 2 migraciones cuando se puede hacer una sola?

Cuando nos queremos actualizar, leer los changelogs desde 1.4 a 1.8 puede resultar abrumador: simplemente son demasiados cambios para darnos cuenta de que tanto es lo que tenemos que mover en nuestros planes de llamadas y nuevos campos de configuraciones. Afortunadamente, existe la página de Asterisk Up-to-speed.

En este sitio están concentrados todos los cambios entre versiones 1.4 –> 1.6.0 –> 1.6.1 –> 1.6.2 –> 1.8, de manera que resulta mucho más fácil darle una leida para ver que tanto cambio conforme a lo que usamos, así como aprender cuales son las nuevas funcionalidades  sin tener que repasar todo el manual de aplicaciones. Es una referencia literaria bastante buena y fácil de usar y se las recomiendo a todos aquellos que como yo, estuvieron muy cómodos con la versión 1.4 y decidieron evitar en lo más posible el salto entre versiones.

Recuerden que no hay día que no llegue ni plazo que no se cumple. Si no lo han hecho, conviene que vayan invirtiendo tiempo en planear sus migraciones. Mejor pensarlo bien cuando hay tiempo, y no cuando se tenga la presión de hacer una nueva instalación.

¡Suerte!

Como convertir archivos de sonido y musica en espera para Asterisk

6 Jul

Muchas veces me han pregunado si Asterisk soporta MP3 como música en espera: la respuesta es si y no. Debo decir que si porque en efecto, con el módulo format_mp3 se pueden reproducir MP3, pero debo decir no porque solamente se soportan los de bitrate constante (y hoy en día, prácticamente todos son de bitrate variable, o VBR), además de que el consumo de CPU causado por el transcoding realmente puede afectar al sistema.

Entonces, ¿cómo podemos hacer para convertir nuestra colección favorita de audio MP3 a wav, gsm, ulaw o cualquier otro de los formatos que Asterisk soporte? El mecanismo es más sencillo de lo que se cree, siempre y cuando se tengan los conocimientos mínimos de Linux para hacerlo.

  1. Si tu música origen es MP3, necesitas instalar SoX con soporte para MP3. Aquí un tutorial (en inglés) de como hacerlo. Si tienes Debian, es tan sencillo como usar:
    [codesyntax lang=»bash»]

    apt-get install sox libsox-fmt-mp3

    [/codesyntax]
    Si tu música ya está en un formato que Asterisk soporta (ej. wav mono a 16-bit 8khz), brinca al paso 3

  2. Ya con el soporte para MP3, necesitas convertir tus MP3 a un formato inicial que Asterisk pueda usar. Te recomiendo que si usas Asterisk 1.8+, los conviertas a wav de 16khz. Para todo lo demás, usa wav de 8khz. Estos son los comandos que usarías (dentro de la carpeta donde están tus MP3):
    [codesyntax lang=»bash»]

    # Para Asterisk 1.8+
    for i in `ls *.mp3`
    do sox $i -r 16000 -c 1 -s -w `echo $i|cut -d. -f1`.wav
    rename 's/.wav/.wav16/' *.wav
    done
    # Para Asterisk menor a 1.8
    for i in `ls *.mp3`
    do sox $i -r 8000 -c 1 -s -w `echo $i|cut -d. -f1`.wav
    done

    [/codesyntax]

  3. Dependiendo de la versión que hayas usado, ahora debes tener una carpeta con archivos .wav o .wav16 (Asterisk 1.8 soporta wavs en wideband que se escuchan mucho mejor si tu teléfono soporta codecs HD, como el g722). Lo que necesitas hacer es convertir estos archivos wav al formato que tu quieres (ejemplo: gsm). Para este paso, te recomiendo hagas un script que te facilite la labor. Por ejemplo: convierte.sh
    [codesyntax lang=»bash» tab_width=»3″ title=»convierte.sh»]

    #!/bin/bash
    for i in `find $1 -name "*.$2"`
    do
       j=`echo $i | cut -d . -f 1`
       asterisk -rx "file convert $j.$2 $j.$3"
    done

    [/codesyntax]

  4. No te olvides de darle permisos de ejecución al script con chmod 755 convierte.sh
  5. El último paso es el más sencillo: invocar al recien creado script. Puedes ejecutarlo de la siguiente manera:
    [codesyntax lang=»bash»]

    ./convierte.sh /var/lib/asterisk/moh wav gsm

    [/codesyntax]

Lo argumentos que el script recibe son:

  1. La carpeta donde se encuentran tus archivos (en formato wav)
  2. El formato de los archivos iniciales (los que sox te entregó)
  3. El formato de los archivos finales (gsm, ulaw, g722, ilbc, etc)

El resultado es que tendrás una carpeta con varios archivos (los originales MP3, los intermedios wav y los finales en el codec que escojas). Puedes convertir a cuantos codecs quieras siempre y cuando Asterisk los soporte.

Estos pasos también son válidos si tienes tus archivos de audio en un codec (en la carpeta /var/lib/asterisk/sounds) y quieres convertirlo a otro codec completamente diferente.

¡Suerte!