Cliente de SMS + Modem 3G sobre contenedor OpenVZ = SMS to Mail

En este manual veremos como preparar un contenedor VZ en un entorno Proxmox para la utilización de un dongle/Modem 3G (en este caso un K3770 de Huawei) para recibir SMS dentro del contenedor VZ, y a la misma vez reenviarlos vía Email.

Me encuentro que dispongo de muchos servicios de verificación de identidad mediante código por SMS asociados a una SIM antigua y muchos de estos servicios no me permiten modificar el numero asociado, me he visto obligado a seguir conservando el antiguo numero, para facilitarme la tarea he realizado este manual que me envié por Email los SMS.

He visto varios manuales de como realizarlo sobre una raspberry, pero actualmente dispongo de un HP MicroServer trabajando sobre la plataforma Proxmox, mi idea era poder realizar esto sobre un contenedor VZ (para no tener que depender de mas equipos).

enviar sms 3g vz

 

Lo primero que necesitamos es dar de alta un contenedor VZ utilizando la template debian-7.0-standard_7.0-2_i386.tar.gz 256MB de RAM, 5GB y 1 Core sera suficiente (recordemos activar que la maquina se inicie en el boot para cuando reiniciemos la maquina física).

Maquina física

Antes de pasar al contenedor VZ debemos realizar una pequeña preparación en la maquina física Proxmox, necesitaremos tener el paquete del usbswitch instalado para que la maquina nos reconozca el USB 3G en modo modem/phone y no en MassStorage, procedemos a conectar el Modem 3G a la maquina física y realizamos un:

lsusb

Vemos que nos indica que detecta el Modem 3G, pero en modo unidad de almacenamiento

Huawei Technologies Co., Ltd. K3770 Mass Storage

Para solucionar esto debemos instalar el paquete usb mode switch

apt-get install usb-modeswitch

Una vez instalado desconectamos el Modem 3G y lo volvemos a conectar, volvemos a realizar un:

lsusb

Podemos observar que ahora nos indica que lo detecta en modo Modem

Huawei Technologies Co., Ltd. K3770 3G Modem

El ultimo paso a realizar es mapear los puertos COM que utiliza el Modem 3G hacia el contenedor VZ, revisamos el nombre de los puertos

dmesg | grep tty

usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3

Normalmente con el ttyUSB0 es suficiente (dado que el Modem 3G utiliza varios puertos para distintos servicios) pero nosotros los mapearemos todos, para realizar esto de forma manual el comando a realizar seria el siguiente

vzctl set 112 --devnodes ttyUSB0:rw --save
vzctl set 112 --devnodes ttyUSB1:rw --save
vzctl set 112 --devnodes ttyUSB2:rw --save
vzctl set 112 --devnodes ttyUSB3:rw --save

Donde 112 es el numero de container, este paso no queda de forma permanente en el fichero de configuración del contenedor, (solo almacena el ultimo comando) de forma que si queremos que se habilite de forma automática al iniciar el contenedor tendremos que aplicarlo en el fichero .conf del contenedor VZ.

nano /etc/vz/conf/112.conf

Recordando que 112 es el numero de container, añadimos las siguientes lineas al final del fichero y guardamos (si disponíamos de alguna similar la sobrescribimos)

DEVNODES="ttyUSB0:rw "
DEVNODES="ttyUSB1:rw "
DEVNODES="ttyUSB2:rw "
DEVNODES="ttyUSB3:rw "

Ya disponemos de la configuración adecuada en la maquina física para delegar la utilización del Modem 3G en el container VZ.

Contenedor VZ

Iniciamos el contenedor VZ, lo primero a realizar es actualizar los repositorios y los paquetes

aptitude update
aptitude upgrade

Procedemos a instalar los paquetes de Gammu que seran los encargados de comunicarse con el Modem 3G

aptitude install Gammu Gammu-smsd

Una vez instalado Gammu vamos a habilitar los permisos de los puertos COM en el contenedor, para ello lo que recomiendo es editar el rc.local para parar Gammu al iniciar, otorgar los permisos correctos a los puertos y volver a iniciar Gammu.

nano /etc/rc.local

Añadimos lo siguiente antes del exit 0

/etc/init.d/gammu-smsd stop
chmod a+rw /dev/ttyUSB*
/etc/init.d/gammu-smsd start

Vamos a la configuración de Gammu, editamos el fichero gammu-smsdrc para añadir la información de los puertos y habilitar el log en syslog.

nano /etc/gammu-smsdrc

Y lo dejamos con la siguiente información:

[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port (null) (null)
connection = at

[gammu1]
device = /dev/ttyUSB1
name = Phone on USB serial port (null) (null)
connection = at

[gammu2]
device = /dev/ttyUSB3
name = Phone on USB serial port (null) (null)
connection = at

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 1
RunOnReceive = /etc/enviarSMSMail.sh #Envio del SMS a Email
# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

Procedemos a crear el script de envió de los SMS a Email, este script le hemos dicho a Gammu que ejecute al recibir un SMS, se encuentra en /etc

nano /etc/enviarSMSMail.sh

Y añadimos lo siguiente: (hay que tener en cuenta que nuestro contenedor VZ disponga de las herramientas necesarias para enviar Email, podeis consultar el anterior post para configurarlo como relay de Gmail)

cd /var/spool/gammu/inbox && cat $(ls -t | head -n 1) | mail -s "SMS Recibido" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

Assignamos permisos de ejecución:

chmod +x /etc/enviarSMSMail.sh

Ya disponemos del contenedor VZ preparado para recibir SMS vía Gammu y enviarlos por Email con el script que hemos creado, procedemos a apagar el contenedor VZ y volverlo a encender, revisamos los logs para verificar si hay algún error en Gammu y aprovechamos para mandarnos un SMS de prueba para verificar que funciona de forma correcta

Podeis utilizar http://www.afreesms.com/freesms/ para realizar un envio de SMS de prueba.

tail -f /var/log/syslog

Vemos que inicia de forma correcta

Nov  1 17:32:40 gsm gammu-smsd[2312]: mode: Send=1, Receive=1
Nov  1 17:32:40 gsm gammu-smsd[2312]: deliveryreport = no
Nov  1 17:32:40 gsm gammu-smsd[2312]: phoneid =
Nov  1 17:32:40 gsm gammu-smsd[2312]: Inbox is "/var/spool/gammu/inbox/" with format "standard"
Nov  1 17:32:40 gsm gammu-smsd[2312]: Outbox is "/var/spool/gammu/outbox/" with format "detail" and transmission format "7bit"
Nov  1 17:32:40 gsm gammu-smsd[2312]: Sent SMS moved to "/var/spool/gammu/sent/"
Nov  1 17:32:40 gsm gammu-smsd[2312]: SMS with errors moved to "/var/spool/gammu/error/"
Nov  1 17:32:40 gsm gammu-smsd[2313]: Created POSIX RW shared memory at 0xb770c000
Nov  1 17:32:40 gsm gammu-smsd[2313]: Starting phone communication...
Nov  1 17:32:40 gsm kernel: ioctl32(gammu-smsd:625172): Unknown cmd fd(4) cmd(00005309){t:'S';sz:0} arg(00000000) on /dev/ttyUSB0

Despues de unos segundos vemos que nos entra el SMS y Gammu lanza el script para reenviarlo por Email con éxito

Nov  1 17:36:43 gsm gammu-smsd[2313]: Received message from: +16264616576
Nov  1 17:36:43 gsm gammu-smsd[2313]: Read 1 messages
Nov  1 17:36:43 gsm gammu-smsd[2313]: Received IN20151101_173639_00_+16264616576_00.txt
Nov  1 17:36:43 gsm gammu-smsd[2578]: Starting run on receive: /etc/enviarSMSMail.sh IN20151101_173639_00_+16264616576_00.txt
Nov  1 17:36:43 gsm gammu-smsd[2313]: Process finished successfully
Nov  1 17:36:43 gsm postfix/pickup[2261]: 26C94908683: uid=104 from=<gammu>
Nov  1 17:36:43 gsm postfix/cleanup[2588]: 26C94908683: message-id=<Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;
Nov  1 17:36:43 gsm postfix/qmgr[2262]: 26C94908683: from=<Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;, size=333, nrcpt=1 (queue active)
Nov  1 17:36:45 gsm postfix/smtp[2590]: 26C94908683: to=<cmos486Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;, relay=smtp.gmail.com[173.194.67.109]:587, delay=2.2, delays=0.02/0.04/1.4/0.73, dsn=2.0.0, status=sent (250 2.0.0 OK 1446395805 bo7sm17670094wjb.46 - gsmtp)
Nov  1 17:36:45 gsm postfix/qmgr[2262]: 26C94908683: removed

Si por alguna razón no nos llega el Email con el SMS podemos verificar si ha llegado en el log y verificar que ha quedado guardado en /var/spool/gammu/inbox/

Relay Postfix utilizando GMail

Mas de una vez nos encontramos con que disponemos de alguna maquina que nos tiene que notificar vía email, pero no disponemos de ningún servidor de correo instalado en ella dado que muchas veces no es necesario, lo ideal en estos casos es utilizar un relay hacia un servidor / proveedor de correo electrónico para que este realice la entrega de los correos, en este caso utilizaremos Postfix con GMail sobre una Debian Jessie.

Primero de todo instalamos todos los paquetes necesarios en el caso que no dispongamos de ellos.

apt-get install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules nano

Una vez disponemos de todos los paquetes instalados vamos a realizar la configuración del relay hacia GMail.

Editamos el fichero /etc/postfix/main.cf

nano /etc/postfix/main.cf

Y añadimos el siguiente código después del relayhost = (este lo dejamos comentado)

#relayhost =
###
# sets gmail as relay
relayhost = [smtp.gmail.com]:587
#  use tls
smtp_use_tls=yes
# use sasl when authenticating to foreign SMTP servers
smtp_sasl_auth_enable = yes
# path to password map file
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# list of CAs to trust when verifying server certificate
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# eliminates default security options which are imcompatible with gmail
smtp_sasl_security_options =
###

Seguidamente creamos el fichero /etc/postfix/sasl_passwd y añadimos las credenciales

nano /etc/postfix/sasl_passwd

[smtp.gmail.com]:587  Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:password

Asignamos correctamente los permisos al fichero y recargamos la configuración de Postfix

postmap /etc/postfix/sasl_passwd
/etc/init.d/postfix restart

Ya lo tenemos todo correctamente configurado, solo nos queda realizar una prueba de correo para verificar si nos llega

echo "Test mail from postfix" | mail -s "Test Postfix" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

Si por alguna razón no recibimos el correo de prueba podemos verificar el log por si nos indicase algún tipo de error.

tail -f /var/log/mail.info