ASTERISK y la E1 MFC/R2 en México (R2 Modificada de Telmex)

Estuve peleándome un buen rato con las E1 de Telmex, que aqui en Mexico les dicen E1 R2 Modificada, pero en el resto del mundo les llaman MFC/R2. Todos los posts en internet decian que en México eran super difíciles de configurar en las Tarjetas Digium.

Escribí este post para evitar que otros caigan en los mismos errores y evitar dolores de cabeza. Sigue leyendo y veras como activar un E1 R2 Modificada (MFC/R2) en México usando lineas de Telmex.

Algo de señalización primero

No soy un experto, pero lo que leí me dejó lo siguiente. El protocolo MFC/R2 es un protocolo _peer to peer_, es decir, no hay cliente y servidor, los dos dispositivos se comunican con simple señalizacion de 4 bits CAS (Channel Associated Signaling), los bits suelen llamarseles ABCD. Estos bits representan el estado de la linea, de una manera similar a la telefonía analoga. Cada bit significa algo, pero los bits C y D son raramente usados (solo en algunos paises asiáticos), el valor mas comun para ellos es 01. La tabla de estados de los bits ABCD es la siguiente:

--------------+-------+---------+- Estado Enviar Regresar --------------+-------+---------+- Idle/Released: 1001 1001 Seized 0001 1001 Seize Ack 0001 1101 Answered 0001 0101 ClearBack 0001 1101 ClearFwd 1001 0101 ClearFwd 1001 1101 Blocked 1001 1101

Lo que debe pasar es que la tarjeta debe regresar el modo blocked en todos lo canales siempre que no se este usando, es decir, si Asterisk esta apagado. Pero cuando Asterisk enciende debe desbloquear y poner en Idle los canales para esperar llamadas. Ambos extremos del enlace deben estar desbloqueados para que se puedan comunicar.

En caso de que Telmex no tenga activa tu conexión veras mensajes de Far end Blocked en los logs de inicio de Asterisk. Eso es porque Asterisk desbloqueó tu lado del enlace pero el otro lado esta aún bloqueado.

Algunas personas confunden la señalizacion MFC/R2 con la señalización que se hace entre aparatos telefónicos como el de tu casa y PBX, esto es incorrecto. La señalización MFC/R2 se da entre switches, que son los lados de un enlace E1. Para nuestros fines, esta señalización se da entre Asterisk y el lado remoto de la E1, que es distinta a la señalización que se da entre un Asterisk con tarjetas FXS y un aparato telefónico.

Tu Oficina | | Telmex | | [telefono]----[Asterisk]===MFC/R2===[switch] / | | [telefono]+ | |

Cuando se va a realizar una llamada ambos lados del enlace deben estar Idle o no se puede lograr un enlace.

Unicall

La cadena de comunicaciones de Zaptel usualmente funciona asi:

PSTN - zaptel card - zaptel driver - libpri - chan-zap - asterisk

pero con MFC/R2 usa una nueva libreria de abstracción llamada libunicall, que provee de una nueva interfaz unificada de manejo de llamadas (unified call handling interface, unicall). Y funciona de una manera ligeramente distinta.

PSTN - zaptel card - zaptel driver - libmfcr2 - libunicall - chan-unicall - asterisk

Zaptel para una E1 MFC/R2 (R2 Modificada)

Instala los drivers de zaptel, que se instalan igual que siempre, si lo bajamos del CVS usamos:

# cd /usr/src # export CVSROOT=:pserver:anoncvs@cvs.digium.com:/usr/cvsroot # cvs login - the password is anoncvs. # cvs checkout -r v1-0 zaptel libpri asterisk

Luego compilamos zaptel y libpri:

# cd zaptel # make clean; make install # cd ../libpri # make clean; make install

Configuramos /etc/zaptel.conf para MFC/R2 para que ponga los canales en el modo apropiado, es decir, ponemos los bits ABCD del CAS en modo blocked

# MFC/R2 normalmente no usa CRC4 span=1,1,0,cas,hdb3 cas=1-15:1101 dchan=16 cas=17-31:1101 loadzone=us defaultzone=us

Si lees mas arriba la tabla de valores, 1101 es “Regresar: Blocked”, es decir, cuando Telmex le intenta conmunicarse con tus canales, la tarjeta le devuelve “Blocked”, y Telmex se da cuenta de que la tarjeta no esta en uso por Asterisk. Simplemente la tarjeta esta conectada pero no esta en disposicion de recibir llamadas.

Antes de proseguir checa que si ejecutas ztcfg -vv veras:

bash# ztcfg -v Zaptel Configuration ====================== SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1) 31 channels configured.

Instalando las librerias

Necesitas instalar las librerias spandsp, libsupertone, libmfcr2 y libunicall de ftp.soft-switch.org, pero resulta que ese sitio esta el 50% del tiempo prendido y el 50% apagado, si no puedes acceder a ese sitio tengo un mirror aqui. Bajas spandsp, libsupertone, libmfcr2 y libunicall, descomprimes y compilas.

SpanDSP,

# tar -zxvf spandsp-0.0.2pre18.tar.gz # cd spandsp-0.0.2/ # ./configure # make # make install

por defecto instala las librerias en /usr/local/lib, checa que tu /etc/ld.so.conf tenga este directorio en la lista. Si no lo tiene agregalo y ejecuta _ldconfig_

Se hace lo mismo para libsupertone, libunicall y libmfcr2 (descomprime, ./configure, make y make install). La cosa es que libmfcr2 ademas instala modulos en /usr/local/lib/unicall/protocols que se cargan dinamicamente por libunicall. Libunicall siempre busca sus modulos ahi.

Si quieres probar tu E1 MFC/R2 puedes checar Voip-Info.org en la seccion Testing your MFC/R2 signalling installation, en realidad no es necesario y es una lata. Mejor vamos directo a Asterisk.

Asterisk y los canales Unicall en MFC/R2

Baja chan_unicall.c, unicall.conf.sample y channels_makefile.patch de ftp.soft-switch.org (Recuerda que tengo un mirror aqui)

Luego copiamos al lugar donde bajamos el source del Asterisk, dentro del subdirectorio channels el chan_unicall.c y el channels_makefile.patch.

# cp chan_unicall.c channels_makefile.patch /usr/src/asterisk/channels

y parchas,

#cd /usr/src/asterisk/channels
#patch < channels_makefile.patch

luego compilas el Asterisk.

# cd /usr/src/asterisk/ # ./configure # make # make install # make samples # make config < ---- para clones Redhat

si checas dentro de /usr/src/asterisk/channels veras un archivo chan_unicall.so, si no aparece entonces algo salio mal. No te preocupes a mi me toco editar el makefile de la siguiente manera, te muestro los numeros de linea:

23 CHANNEL_LIBS=chan_modem.so chan_sip.so 24 chan_modem_aopen.so 25 chan_modem_bestdata.so chan_modem_i4l.so 26 chan_agent.so chan_mgcp.so chan_iax2.so 27 chan_local.so chan_skinny.so chan_unicall.so 28

En la linea 27 agregue: chan_unicall.so. Recompilé asterisk, lo instalé, y quedo todo bien.

Luego copia unicall.conf.sample a /etc/asterisk, lo renombras a unicall.conf y lo editas para que este acorde a tu configuracion. Por ejemplo, el mio es:

[channels] usecallerid=yes hidecallerid=no callwaitingcallerid=yes threewaycalling=yes transfer=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes echotraining=yes rxgain=0.0 txgain=0.0 group=1 callgroup=1 pickupgroup=1 immediate=no musiconhold=default protocolclass=mfcr2 protocolvariant=mx,10,1 protocolend=cpe group = 1 context= e1-incoming channel => 1-10 ;channel => 17-31 ;skip time slot 16

Como dije antes, MFC/R2 es peer-to-peer asi que la linea _protocolend=cpe_ es ignorada. Tengo asignadas 10 lineas de telmex solamente. La linea _protocolvariant_ es importante para esto. Su sintaxis es:

protocolvariant=pais,digitos-ANI,digitos-DNI

El pais es alguno de los siguientes:

Argentina "ar" Bahrain "bh" Bolivia "bo" Brazil "br" Chile "cl" China "cn" Colombia landlines "co-land" Colombia cellular "co-cell" Czech "cz" Honduras "hn" India "in" Indonesia "id" Korea "kr" Malaysia "my" Mexico "mx" Panama "pa" Philipinnes "ph" Singapore "sg" Thailand "th"

Los Digitos ANI y DNI aun no los comprendo bien, en unos dias le preguntaré a un experto en telefonía convencional a ver que me dice y lo pego aqui. Pero lo que actualmente tengo es 10 digitos marcados para marcar mi numero y 1 digito que varía al final, es decir. Mis lineas son 443305257x, x es alguno de {0,1,2,3,4,5,6,8,9}. O sea que tengo lineas desde 4433052570 al 79.

Probando Asterisk con E1 MFC/R2 (R2 Modificada) de Telmex

Arrancamos Asterisk y entramos a la consola:

# asterisk -vvvvvvvvvvvvvvv& # asterisk -R

Al arrancar debe darte muchos mensajes

Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Far end unblocked -- Unicall/1 far unblocked Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Local end unblocked -- Unicall/1 local unblocked Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/2 event Far end unblocked -- Unicall/2 far unblocked

uno para cada linea que tengas, nota el Local end unblocked y el Far end unblocked. Si no aparece nada algo o si aparece Far end blocked o algo similar checa que Telmex te haya desbloqueado la linea, llámales y gritales hasta que te arreglen la conexion :-P.

Otra forma de probar es llamarte a ti mismo, usa tu celular y llama a una linea de la E1. Deben aparecer mensajes del tipo:

Aug 10 03:18:48 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Detected Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Offered Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2920 handle_uc_event: CRN 32769 - Offered on channel 0 (ANI: , DNIS: 0) Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Accepted (...) Aug 10 03:18:54 WARNING[2564]: chan_unicall.c:1347 unicall_hangup: Hangup: channel: 1 index = 0, normal = 24, callwait = -1, thirdcall = -1 Aug 10 03:18:54 WARNING[2564]: chan_unicall.c:962 update_conf: Updated conferencing on 1, with 0 conference users Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Drop call Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:3246 handle_uc_event: CRN 32769 - Doing a Release Call -- Hungup 'UniCall/1-1' Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Release call Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:3260 handle_uc_event: CRN 32769 - Call released -- Unicall/1 released Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:1042 unicall_disable_ec: disabled echo cancellation on channel 1

Antes de continuar checa que tengas esos mensajes en el log y que Telmex tenga activa tu conexion E1.

¿Aun no funciona?

Si Telmex te dice que tiene activa tu linea y tienes todo configurado bien, como dice arriba, te recomiendo reiniciar tu maquina, eso me paso a mi y creeme que es un dolor de cabeza. Reinicia e intenta de nuevo. Es algo extraño pero a mi me funciono.

Puedes checar el estado de las lineas usando _UC show channels_ a mi me aparece:

Asterisk*CLI> UC show channels Channel Extension Context Status Language MusicOnHold 1 0 e1-incoming Idle default 2 e1-incoming Idle default 3 e1-incoming Idle default 4 e1-incoming Idle default 5 e1-incoming Idle default 6 e1-incoming Idle default 7 e1-incoming Idle default 8 e1-incoming Idle default 9 e1-incoming Idle default 10 e1-incoming Idle default

Si notas los canales estan en _Idle_, eso es lo correcto. Si no puedes usar el comando _UC_ significa que tu modulo chan_unicall no se ha cargado, regresa, compilalo y verifica que este en el lugar adecuado, normalmente esta en /usr/lib/asterisk/modules/chan_unicall.so.

Configurando las extensiones

Ya que tienes la tarjeta con sus canales funcionando es hora de configurar las extensiones. Como se ve en _UC show channels_ en unicall.conf configuramos para que las llamadas entrantes _caigan_ en el contexto _e1-incoming_. Es cosa de editar extensions.conf y colocar la definicion de ese contexto con algun manejador apropiado. En el mio esta asi:

[e1-incoming] exten => _.,1,Ringing exten => _.,2,Answer exten => _.,3,VoicemailMain exten => _.,4,Hangup

Y cuando marco alguna de las extensiones me manda al Voicemail, entonces escucho el clasico mensaje “Comedian mail, login”. Felicitaciones ya puedes recibir llamadas en tu E1 MFC/R2 (R2 Modificada). Configurar extensiones y demás esta fuera del alcance de este articulo, pero es muy fácil.

Ahora para hacer llamadas es igual que usar Dial(Zap/g1….) pero usas Dial(Unicall/g1…).

Configurar un hotspot con portal captivo CHILLISPOT en DEBIAN.

Para configurar este hotspot he decidido usar chillispot por su sencillez en la instalación y por lo pocos requisitos de software y configuración de la red.

Si disponemos de un Access Point y queremos que los clientes que accedan a él sean recibidos por una Web de presentación en la que ofrezcamos los servicios de nuestro NODO o información variada, podemos utilizar este software sin mayor problema, si necesitamos mas opciones podemos optar por alguno mas completo como nocat.

Cualquier petición http es redirigida por el firewall contra un script que presenta una Web de bienvenida y toda la información que queramos.

Una de las principales opciones de este software es el acceso a la red.

Se le puede configurar para permitir libre acceso a ciertos servicios y a ciertas ips. Así como no permitir accesos no deseados a otras ips.  De esta forma, podemos dejar libre acceso a desconocidos a la Web de nuestro grupo  o al servidor local pero no al resto de servicios (internet, ftp, etc.) El sistema controla en todo momento los accesos y presenta una pantalla con el estado del cliente logeado o no logeado.

Chillispot se encuentra en chillispot.org es open source y se mantiene bajo licencia GPL.

Tal y como informa en su Web, es un portal captivo para control de accesos wireless a una red LAN. Soportando WPA. Tiene binarios creados para Redhat, Febora, Debian y OpenWRT (AP). Su configuración es sencilla y permite la instalación de todo el sistema sin problemas en un mismo equipo.

A continuación explicare su instalación sobre una maquina con Debian .Para mas info,la web oficial donde aparece la documentación completa y detallada. ……….

REQUISITOS

Tal y como aparece en su Web principal, estos son los requisitos:
# Internet connection
# Wireless LAN access point
# ChilliSpot software for your PC
# Radius Server

# Web server

La conexión a Internet la vamos a limitar solo para nosotros, los propietarios del nodo y demás familia. Por lo tanto, vamos captar los equipos que acceden a nuestro NODO y presentarles una Web informativa.

– Necesitamos un S.O. Linux, en este caso, se ha instalado sobre Debian GNU/LINUX.

– Un servidor radius, en este caso, sobre freeradius, tal y como aparece en al documentación (es GPL y aparece en las sources debian)

– Un servidor web. Claramente APACHE. Necesita soporte para SSL para autenticación con el servidor radius. Podemos bien instalar el modulo ssl al apache o instalar el apache-ssl. (haremos lo segundo)

– Un punto de acceso wireless. (en este caso, el nodo funciona con un DLINK900AP+ a la intemperie)

En este caso, todos los servidores se encuentran sobre la misma maquina, pudiendo estar separados (seria lo mejor por temas de seguridad, pero no le pidamos peras al olmo )

CONFIGURACIÓN DEL OS

Deberemos tener un Debian instalado. (mas info)
descargamos el .deb de chillispot en la siguiente dirección http://www.chillispot.org/download.html –(el .deb).

Ejecutamos “apt-get install freeradius apache-ssl” configurando el apache con la configuración mínima contestando todo lo bien que queramos a las preguntas necesarias para las ssl (lugar, nombre, mail….) que aparecerán posteriormente en la info del certificado al acceder al nodo.

Instalamos también el chillispot con “dpkg -i chillispot_VERSION.deb” los archivos de chillispot se van a localizar en /etc/chilli.conf y en /usr/share/doc/chillispot/

Después copiamos hotspotlogin.cgi a nuestro sitio de cgi, /usr/lib/cgi.bin/

Podemos también editar el firewall.iptables a nuestro gusto con reglas propias (en este caso no lo tocaremos). Lo que si debemos hacer es procurar que las reglas de firewall.iptables se carguen al arranque

editamos el /etc/network/options con ip_forward=yes
reiniciamos la red con “/etc/init.d/networking restart”

y de esta parte, una cosa importante, tener configurado en el kernel el soporte para tun/tap para levantar la interface tun0 en este caso. p-t-p.

Tal como aparece en la configuración realizaremos lo siguiente:

mkdir /dev/net
mknod /dev/net/tun c 10 200 para crear el dispositivo

y ahora: añadir la siguiente linea a /etc/modules.conf  “alias char-major-10-200 tun”

luego “depmod -a ” para actualizar cambios.

Ahora, ya tenemos configurado el equipo.

FREERADIUS

Vamos a modificar la configuración del freeradius en /etc/freeradius/ :
modificamos clients.conf y cambiamos la clave de secret= …123 por una propia como por ejemplo “linuxpower”:)(no está de mas aunque sea en local)

Modificamos users para añadir los usuarios, para no dar muchas vueltas, copiemos y modifiquemos el usuario que sugiere chillispot , el usuario steve. En el pondremos nuestro propio nombre de usuario, quedando algo asi como :

clipse Auth-Type := Local, User-Password == “atitelovoyadecir”
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address = 172.16.3.33,
Framed-IP-Netmask = 255.255.255.0,
Framed-Routing = Broadcast-Listen,
Framed-Filter-Id = “std.ppp”,
Framed-MTU = 1500,
Framed-Compression = Van-Jacobsen-TCP-IP

Como se puede observar, basta con modificar user y password, para mas usuarios, copiamos lo mismo y cambiamos la IP-address

CHILLISPOT

Debemos modificar también el archivo /usr/lib/cgi-bin/hotspotlogin.cgi para personalizarlo, observaremos partes de código como las siguientes :
if (!($ENV{HTTPS} =~ /^on$/)) { print “Content-type: text/htmlnn meta http-equiv=””Pragma”” content=””no-cache””>
h1 style=”” center=””>Acceso a hotspot erroneo. , pirate zaragatas /h1> p>
NO ACEPTA ACCESOS NO AUTORIZADOS. NODO SANTOÑA/p> center> Se debe usar encriptación. /center> “; exit(0); }

Es html puro, así que podemos modificarlo a nuestro gusto con la Web que queramos, bien pegándolo en este archivo o incluyéndolo desde otro archivo, en este caso, que es poco, lo dejamos

Ahora, lo que nos queda, editar /etc/chilli.conf para que case con la clave que hemos cambiado en el servidor radius, este archivo se encuentra en el apartado de la configuración del servidor radius “radiussecret ” donde pondremos la clave del freeradius “radiussecret linuxpower”, reiniciamos /etc/init.d/freeradius restart (debemos estar atentos a los mensaje igual hace falta añadirle un -x para reiniciarlo)
/etc/init.d/chilli restart
y el apache también

(en mi caso)

/etc/init.d/apache2 restart

Si asociamos cualquier cliente al AP y le decimos que obtenga la ip automáticamente mediante dhcp, las peticiones a cualquier web nos llevarían a la Web de presentación que hemos metido en hotspotlogin.cgi (hotspotlogin almacena varias webs y solo una es la de presentación, el resto es para mensajes de error y aceptación) por defecto, las dns serán las configuradas en el servidor. Y una de las cosas que tiene de bueno (que tambien lo tiene el resto de portales captivos como el nocat ) es el poder dejar acceso a ciertas paginas sin necesidad de estar logeado, para el resto de cosas, se puede editar la configuración del firewall.iptables.

Si modificamos /etc/chilli.conf , al final del archivo :
TAG: uamallowed
# Comma separated list of domain names, IP addresses or network segments
# the client can access without first authenticating.
# Normally you do not need to uncomment this tag.
#uamallowed www.chillispot.org,10.11.12.0/24 uamallowed www.postech.com.mx,www.jpdiaz.com

Dejamos acceso libre a estas Web. Y dejaríamos a grandes rasgos configurado el sistema para cualquier petición.

FINALIZANDO

Uno de los grandes problemas del wifi, es la seguridad. Este sistema solo nos cubre de accesos no deseados, no de ser escaneados ni evitar el snifing. Tampoco de un man-in-the-middle y que nos vuelvan locos y consigan los passwords (aunque el login y pass de acceso si viaja encriptado). Deberemos entonces estar revisando periódicamente el certificado por si aparecen nuevos certificados de alguien que quiera entrar o controlar el portal. Para asegurarlo mejor, se podría configurar un proxy seguro con un squid y ssl de forma que todas las peticiones al web estén encriptadas y procurar utilizar puertos seguros para el resto… pero eso es para otro post.