miércoles, 8 de marzo de 2017

Construye tu propio DDNS rudimentario en Ubuntu Linux



He hecho esto como un paso más en la automatización de la radio escolar.
La realidad es que me conecto remotamente al PC que tenemos en el estudio para poderle subir el volumen y programar un apagado cuando empieza al recreo del centro, de tal forma que suene por la megafonía la radio.


Esta conexión remota la hago vía VNC, pero para ello es necesario conocer la IP del PC de la radio. El problema está cuando esa IP cambia, que ya no puedo hacer una conexión remota.

Conexión al PC por su nombre [descartado]
Ten en cuenta que el PC de la radio tiene Meduxa, que es una distro basada en Ubuntu, así que la conexión por nombre no es trivial, ya que a veces lo hago desde el mi PC (Elementary OS), otras veces desde el móvil (Android), otras desde el PC del departamento (Windows 10), otras desde el PC de un aula (Windows 7),... La conexión por nombres entre sistemas diferentes (Windows, Linux, Android,...) no es trivial, así que la he descartado.

IP estática al PC de la radio [descartado]
Tampoco puedo usar una IP estática ya que el ordenador de la radio se conecta a la red Medusa y no tengo permisos para modificar las políticas de asignación de IPs de modo que tampoco puedo evitar que la IP que ponga no esté ya en uso ni que se vaya a asignar a ningún otro PC.

DynDNS [descartado]
Otra posible solución podría haber sido vía DynDNS o cualquier otro servicio online de DDNS. También he descartado esta opción porque el PC de la radio es Linux y porque es un ordenador muy viejo, con unos recursos muy limitados.

¿Cómo lo he resuelto?
Lo que he hecho es programar una tarea que me envía todos los días un correo con la IP del PC de la radio, así, si ha cambiado, ya tengo en mi móvil o en mi propio PC la nueva IP.

Lo primero que he hecho es crear un script que he llamado reportIP.sh que consulta la IP de la máquina, vuelca el resultado a un fichero que he llamado myIP.txt y luego automáticamente con sendmail me envía ese fichero adjunto en un correo electrónico.

Éste es el aspecto de reportIP.sh:

Aspecto del archivo /home/moises/scripts/reportIP.sh


#!/bin/sh
SHELL=/bin/bash
# /sbin/ifconfig | grep "Direc. inet:" > /home/moises/scripts/myIP.txt
/sbin/ifconfig > /home/moises/scripts/myIP.txt
sendemail -f mi_correo@gmail.com -t mi_correo@gmail.com -s smtp.gmail.com:587 -u "reportIP" -m "IP Address" -a /home/moises/scripts/myIP.txt -v -xu mi_correo@gmail.com -xp mi_clave -o tls=yes
Contenido del archivo /home/moises/scripts/reportIP.sh



A continuación, en crontab, programo dos tareas, que se ejecutará una todos los días a las 10:00am y la otra a las 4:00pm. Aquí te muestro el aspecto de mi archivo crontab:

Aspecto de mi crontab



# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
0 10 * * * /home/moises/scripts/reportIP.sh
0 16 * * * /home/moises/scripts/reportIP.sh
Contenido de mi crontab



Empiezan a llegar los correos...




Y en su interior me llega adjunta la dirección IP del PC de la radio



Cómo enviar un correo desde la consola de Linux:
http://blog.desdelinux.net/enviar-emails-por-consola-con-sendmail/

Programar una tarea con crontab:
http://systemadmin.es/2010/03/como-programar-tareas-con-el-cron