Gonzalo Marcote | Open source, open mind

Blog personal sobre GNU/Linux, programación, virtualización y vozip

HA Asterisk – Alta disponibilidad Asterisk (II). Asterisk + Redfone

leave a comment

El siguiente paso es independiente de Hearbeat y Drbd. Heartbeat + Drbd lo puedes usar para un servidor apache, mysql, host virtualizado que aloje varias VM’s, etc. Yo en mi caso he hecho HA en Asterisk para el Call Center en el que trabajo.
De forma que si cae el servidor, pase el control al otro nodo y desde el Call Center se puedan seguir haciendo llamadas, perdiendo tan solo 5 segundos de servicio (mas o menos). Es decir un Call Center a prueba de Bombas!.

Así que siguiendo con la configuración del anterior post, en este vamos a explicar como adaptar asterisk a este entorno y finalmente como configurar el redfone.

Lo único que hay que tener en cuenta es que después de instalar asterisk en ambos servidores hay que ‘mover’ los dirs de asterisk a la partición conjunta y crear enlaces.

Es decir, instalamos normalmente dahdi (ya podemos instalar la 2.3.0 que trae soporte TDMoE para el redfone), libpri y asterisk.

Una vez instalado tenemos que poner los dirs mas importantes de la instalación en el dir de la répicla del Drbd ‘/mnt/local/replica/asterisk’:
# cd /mnt/local/replica/asterisk
# cp -r /etc/asterisk etc_asterisk
# cp -r /var/lib/asterisk var_lib_asterisk
# cp -r /usr/lib/asterisk usr_lib_asterisk
# cp -r /var/spool/asterisk var_spool_asterisk
# cp -r /var/log/asterisk var_log_asterisk

Y creamos enlaces a esos dirs:
# ln -s /mnt/local/replica/asterisk/etc_asterisk/ /etc/asterisk
# ln -s /mnt/local/replica/asterisk/var_lib_asterisk /var/lib/asterisk
# ln -s /mnt/local/replica/asterisk/usr_lib_asterisk /usr/lib/asterisk
# ln -s /mnt/local/replica/asterisk/var_spool_asterisk /var/spool/asterisk
# ln -s /mnt/local/replica/asterisk/var_log_asterisk /var/log/asterisk

Ahora podemos ir a asterisk2 e instalar nuevamente dahdi, asterisk y libpri borrar los dirs y crear los enlaces.
En este caso serán enlaces rotos, hasta el momento en que se le pase el control.


Redfone

Ahora ya podemos proseguir con la instalación del redfone.
Redfone es un gateway que a través de un interfaz de red (protocolo TDMoE) nos proporciona conectividad T1/E1.
En el caso de que un servidor asterisk se caiga, el tráfico lo redirige al otro asterisk y le da el control de los E1/T1. Proveyendo así de redundancia y alta disponibilidad.
Al ser un dispositivo externo, nos olvidamos de tarjetas PCI y sus problemas (conflicto de IRQ’s, andar abriendo el servidor…).
El Redfone funciona en modo activo-pasivo (no pueden salir dos asterisk a la vez por los primarios).
También disponen de cancelador de eco. Para mas info consultar la página de redfone


Instalación física

Para conectar el Redfone a cada servidor asterisk, lo conectamos con un cable de red cruzado directamente y evitar así utilizar un switch entre la red de datos y la conexión TDMoE que une el Asterisk y el foneBridge2, ya que la cantidad de tráfico entre estos es tan grande y constante que suelen volver loco a los switches normales, y además, conviertes al switch en un punto de fallo innecesario.

Por lo cual necesita su propio interfaz de red que configuraremos en cada uno de los servidores.
Los FB del redfone son las IP’s: FB1=192.168.1.254 y FB2=192.168.1.253 por lo cual configuraremos el interfaz de red de ambos servidores con una ip en rango 1.X. Por ejemplo la 192.168.1.200 para los dos:
auto ethX
iface ethX inet static
address 192.168.1.200
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255

El cable de red para el T1/E1 es un cable de red cruzado o un RJ48.


Instalación

1- Instalamos las dependencias necesarias:
aptitude install openssh-server
aptitude install build-essential
aptitude install linux-headers-2.6.24-19-server
aptitude install libnet1 libnet1-dev
aptitude install libpcap0.8 libpcap0.8-dev
aptitude install libargtable2-0 libargtable2-dev
aptitude install libncurses5-dev
aptitude install libnewt-dev

2- Descargamos libfb (fonulator library) y fonulator (the fonebridge configuration utility):
# cd /usr/src
# wget http://support.red-fone.com/downloads/fonulator/libfb-2.0.0.tar.gz
# wget http://support.red-fone.com/downloads/fonulator/fonulator-2.0.1.tar.gz

Instalamos fonulator library:
# tar xzvf libfb-2.0.0.tar.gz
# cd libfb-2.0.0/
# make clean
# ./configure
# make
# make install
# cd ..

Si instala bien saldrá algo como:
Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

Instalamos Fonebdridge utility:
# tar xzvf fonulator-2.0.0.tar.gz
# cd fonulator-2.0.0
# ./configure
# make
# make install
# cd ..

Para confirmar que se ha instalado correctamente:
# fonulator -V
fonulator 2.0.0
Copyright (C) 2007 Redfone Communications, LLC.
Build Number: 36

Descargamos e instalamos dahdi en su version 2.3.0 o superior ya que ya trae incluido de serie el soporte TDMoE para los redfone.

Instalamos todos los demás componentes de asterisk con normalidad (ver mas arriba para adaptar la instalación al Drbd).


Configuración y provisionamiento del redfone

Mi configuración será para dos primarios E1 con crc4. Como siempre deberías adaptarlo a tu configuración o consultar la página de soporte de redfone.

Nos descargamos en /etc el archivo redfone.conf y procedemos a editarlo tanto en Asterisk1 como en Asterisk2. Debemos definir ambos spans aunque solo tengamos un solo primario conectado:
# cd /etc/
# wget http://support.red-fone.com/downloads/fonulator/redfone.conf

En asterisk1 ponemos:
globals]
fb=192.168.1.254
port=1
server=DIRECCION-MAC-DE-LA-TARJETA-ETHX-DE-ASTERISK1-CONECTADA-AL-REDFONE
priorities=0,1,2,3

# E1 primario
[span1]
framing=ccs
encoding=hdb3
crc4

# E1 secundario
[span2]
framing=ccs
encoding=hdb3
crc4

En asterisk2 ponemos:
[globals]
fb=192.168.1.253
port=1
server=DIRECCION-MAC-DE-LA-TARJETA-ETHX-DE-ASTERISK2-CONECTADA-AL-REDFONE
priorities=0,1,2,3

# E1 primario
[span1]
framing=ccs
encoding=hdb3
crc4

# E1 secundario
[span2]
framing=ccs
encoding=hdb3
crc4

Ahora debemos provisionar (configurar) los parámetros del redfone.
Desde asterisk1 ejecutamos:
# fonulator -v /etc/redfone.conf
Detecting foneBRIDGE
Found a foneBRIDGE with 2 spans on 1 transceivers.
DSP Status: Available
Stopping foneBRIDGE TDMoE transmission
Detecting current foneBRIDGE link configuration
Stopping foneBRIDGE TDMoE transmission
WPLL Enabled
Starting foneBRIDGE TDMoE transmission
foneBRIDGE reconfigured!

A continuación editamos el archivo /etc/dahdi/system.conf tanto en Asterisk1 como en Asterisk2. Si tenemos un redfone de dos primarios, debemos configurar los 2 dynamic spans aunque solo tengamos conectado un solo primario.
En el /etc/dahdi/system.conf de asterisk1 ponemos:
dynamic=ethmf,eth1/00:XX:C2:XX:D6:2A/0,31,0
dynamic=ethmf,eth1/00:XX:C2:XX:D6:2A/1,31,1
#
bchan=1-15,17-31
dchan=16
bchan=32-46,48-62
dchan=47
#
# NOTE: Most E1 use alaw codec and this must be specified.
alaw=1-62
#
loadzone = es
defaultzone = es

Esto significa que nuestro asterisk1 se comunica con su interfaz de red eth4 con el FB1 del redfone cuya Mac address es: 00:XX:C2:XX:D6:2A

En el asterisk2 en el /etc/dahdi/system.conf ponemos:
dynamic=ethmf,eth1/00:XX:C2:XX:D6:2B/0,31,0
dynamic=ethmf,eth1/00:XX:C2:XX:D6:2B/1,31,1
#
bchan=1-15,17-31
dchan=16
bchan=32-46,48-62
dchan=47
#
# NOTE: Most E1 use alaw codec and this must be specified.
alaw=1-62
#
loadzone = es
defaultzone = es

Que significa que cuando fonulator levante el redfone aqui, el asterisk2 se comunicará desde su interfaz de red eth3 con el FB2 cuya Mac address es: 00:XX:C2:XX:D6:2B.

NOTA
Este es uno de los motivos por los que el dir /etc/dahdi no puede estar en Drbd, porque estos archivos necesitan ser diferentes

A continuación nos toca configurar el archivo /etc/asterisk/chan_dahdi.conf lo cual es igual que siempre y dependerá de tu config. El mío es:
[channels]
group=1
language=es
musiconhold=default
pridialplan=unknown
prilocaldialplan=unknown
;internationalprefix=00
usecallerid=yes
hidecallerid=no
restrictcid=no
usecallingpres=yes
callerid=asreceived
callwaiting=yes
threewaycalling=yes
transfer=yes
immediate=no
;resetinterval=never
echocancel=yes
;echocancel=256
echocancelwhenbridged=no
;echocancelwhenbridged=yes
echotraining=no
;echotraining=yes
priindication=outofband
callgroup=1
pickupgroup=1
txgain=0.0
rxgain=7.0
switchtype=euroisdn
context=incoming-loquesea
signalling=pri_cpe
channel => 1-15
channel => 17-31

Cargamos los módulos dahdi_dynamic y dahdi_dynamic_ethmf con modprobe y comprobamos con dahdi_tool que ha reconocido el Redfone:
# modprobe -a dahdi_dynamic_ethmf
# dahdi_cfg -vvv
# dahdi_tool

Y comprobamos que los primarios están levantados y en ‘Ok’.


Script fonulator

Este tema es especifico para la instalación con Heartbeat.
Si se cae asterisk1, se tiene que ejecutar fonulator desde asterisk2 para configurarlo para su mac address y hacerse con el control.
Los servicios que se deben ejecutar cuando haya un failover, se especifican en el archivo /etc/ha.d/haresources en ambos asterisk:
asterisk1 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/local/replica::ext4 IPaddr::192.168.3.111/24/eth0 fonulator asterisk sendmail

Son scrits de inicio que debe haber en /etc/init.d. asterisk es el script de inicio de asterisk en si, sendmail es un script hecho por mi para que me envíe un mail si alguna vez hay un ‘failover’ y fonulator es un Scrip para que provisione el redfone con el otro servidor cuando haya un ‘failover’.

Aquí está el script adaptado para Debian, ubuntu y derivadas (Muchas gracias a Mark de Redfone por su aportación ;) ):
#!/bin/bash
#
# fonulator Starts and Stops the Redfone fonulator utility
#
# chkconfig: - 60 50
# description: Utility for configuring the Redfone fonebridge
#
# processname: fonulator
# config: /etc/redfone.conf

# Source function library.
#. /etc/rc.d/init.d/functions

# Source networking configuration.
#. /etc/sysconfig/network

# Check that networking is up.
#[ ${NETWORKING} = "no" ] && exit 0

[ -x /usr/local/bin/fonulator ] || exit 0

RETVAL=0
prog="fonulator"

start() {
# Start daemons.

if [ -d /etc/ ] ; then
for i in `ls /etc/redfone.conf`; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
/usr/local/bin/fonulator $i &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
#success $"$prog $site"
}
echo
done
else
RETVAL=1
fi
return $RETVAL
}

stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac

exit $RETVAL

Lo ponemos en /etc/init.d y le damos permisos de ejecución.


Solucionando el orden de arranque de los servicios y posibles kernels panics

Si por algún motivo al apagar el equipo nos da uin kernel panic, esto sucede porque está intentando apagar la red cuando dahdi aún está en uso. Por lo cual parece que hay que apagar Dahdi antes de apagar la red.
Es decir el orden de apagado debería de ser, primero asterisk, luego dahdi y por último la red
Por favor, si esto no es exactamente así agradecería que me lo comentaseis. A mi me ha funcionado.

Por lo tanto he puesto el apagado en este orden:
K03asterisk -> ../init.d/asterisk
K05heartbeat -> ../init.d/heartbeat
K08drbd -> ../init.d/drbd
K70dahdi -> ../init.d/dahdi
S35networking -> ../init.d/networking

La forma de hacerlo en Debian/Ubuntu es la siguiente.
Primero borramos dahdi:
# update-rc.d -f dahdi remove

Luego lo ponemos en la nueva posición:
# update-rc.d dahdi defaults 15 70
Adding system startup for /etc/init.d/dahdi ...
/etc/rc0.d/K70dahdi -> ../init.d/dahdi
/etc/rc1.d/K70dahdi -> ../init.d/dahdi
/etc/rc6.d/K70dahdi -> ../init.d/dahdi
/etc/rc2.d/S15dahdi -> ../init.d/dahdi
/etc/rc3.d/S15dahdi -> ../init.d/dahdi
/etc/rc4.d/S15dahdi -> ../init.d/dahdi
/etc/rc5.d/S15dahdi -> ../init.d/dahdi

Nótese que lo hace solo para el rc0.d rc1.d y rc6.d que son los encargados del halt y el reboot.
Comprobamos también que el orden de apagado de la red vaya de último.

Si nos descargamos las versiones de dahdi desde redfone que traen soporte TDMoE (anteriores a la 2.3.0), hay que sustituir el script de inicio de dahdi por uno que provee redfone. Este script permite que NO se cargue el módulo dahdi_dummy, ya que puede dar problemas con el timming, asi que es importante sustituirlo.
Me gustaría saber si esto es necesario con el dahdi oficial que ya trae soporte TDMoE (>=2.3.0).
Yo no lo he sustituido y no he tenido ningún problema con el módulo dahdi_dummy, pero estaría bien poder confirmar que las nuevas versiones de dahdi ya traen adaptado este script.

Si queremos sustituirlo haremos:
# wget http://support.red-fone.com/downloads/dahdi/dahdi
# chmod +x dahdi
# cp dahdi /etc/init.d/

PD:
Por cierto estas instrucciones me han funcionado a mi y se ofrecen sin ningún tipo de garantía.
Siento no permitir comentarios, en parte porque siempre me olvido de contestarlos y porque entiendo que si has llegado hasta aquí y estás intentando instalar algo así tendrás los recursos necesarios para solucionarlo por tu cuenta y no tener que investigar yo sobre como solucionarlo… espero que no suene muy borde ;)
Si necesites adaptar ciertas cosas e investigar mas sobre el asunto, estaría bien leer las siguientes fuentes en las que me basé.

Fuentes:
http://support.red-fone.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=13
y
http://support.red-fone.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=8
y
http://www.sinologic.net/blog/2010-01/probamos-el-fonebridge2-single-port-e1-t1/
y
http://www.sinologic.net/blog/2010-05/mini-tutorial-sobre-configuracion-de-equipos-redfone/

Written by Gonzalo

Julio 20th, 2010 at 1:58 pm

Posted in asterisk,ubuntu,voip