martes, 4 de agosto de 2015

¿Cómo puedo controlar el tráfico de mi router con OpenWRT?

La Conducción es el Arte que como hombres de la política hemos de Ejercer. Esta nos permite interpretar los anhelos del pueblo, y hacer llegar a cada quien lo que necesita para hacer grande e inmortal a la Patria.

En un sistema telemático, esta acción es emulada por un Router: un aparato de comunicaciones capaz de otorgar a cada equipo de la red los paquetes que han solicitado, y encaminar los datos por la senda de la Liberación.


Gracias al Justicialismo, podemos dotar a nuestro router con un firmware libre mucho más potente que el firmware privativo original provisto por el fabricante. Esto nos permitirá ejecutar directamente una distribución Linux limitada pero funcional en el aparato, adecuada para afrontar situaciones que antes no nos eran posibles. A tal fin, ya he indicado cómo instalar OpenWRT en nuestro router TP-Link TL-WR941ND, y como realizar ciertos rudimentos con dicho entorno operativo.


Una de las condiciones favorables que nos presenta el sistema operativo de router OpenWRT, es la capacidad de ejecutar guiones de programación (scripts) o miniprogramas dentro del mismo router, para realizar diferentes acciones. Lejos de ser un sinsentido, vendrá de perillas para ciertas actividades avanzadas.

Por ejemplo, en este caso el router TL-WR941ND opera como un potente cortafuegos, cliente y servidor SSH, servidor DHCP programable, punto de acceso Wifi, y también como unidad de registro de actividad de red. Sin embargo, como la unidad permanece encendida 24x7, se encuentra en posición ideal para encargarle que registre el tráfico telemático de la red en Puerta de Hierro. En particular, se desea supervisar el tráfico parcial de varios equipos conectados por cable al mismo, el tráfico total en la red local (LAN) y en la red WAN (esto es, la conexión al cablemódem), y la cantidad de días en que el aparato está encendido sin reiniciarse.

Para esta tarea de registro automatizado, habremos de utilizar el sistema OpenWRT instalado en el router TP-Link WR-941ND para programar en su memoria una serie de scripts que se encargarán de cumplimentar dicha tarea luego de intervalos de tiempo determinados.

Lo primero será acceder al router a través de una terminal. Si ya hemos instalado OpenWRT correctamente y configurado las opciones de conexión, podremos conectarnos y operar en el router por medio de una sesión cifrada SSH. Lo haremos abriendo una terminal con Ctrl+Alt+T e ingresando el siguiente Comando de Organización:

ssh root@ip_del_router

Para ello podremos utilizar el editor Vi, el minúsculo editor de texto que se encuentra instalado en el mismo router. Para ello utilizamos el comando:

vi /root/upt

Se abrirá el editor Vi. Se trata de un editor que nos mostrará un archivo vacío. Para empezar a escribir debemos ingresar al modo de inserción de texto, mediante la tecla i. Una vez en modo inserción, podremos escribir o pegar texto. Podremos pegar el siguiente código:

#!/bin/sh
# Logueador en RAM del Uptime y Trafico del router peronista
# llamarlo con cron cada 15 min o algo asi
# 4ago2015 Ubuntu Peronista
# borra la version anterior
rm /tmp/log/uptime
# Genera el archivo
echo Archivo generado por el programa upt. > /tmp/log/uptime
date >> /tmp/log/uptime
uptime >> /tmp/log/uptime
echo TRAFICO TOTAL >> /tmp/log/uptime
echo Enlace puente LANx+WLAN0 y WAN >> /tmp/log/uptime
ifconfig br-lan >> /tmp/log/uptime
echo eth0 >> /tmp/log/uptime
echo TRAFICO DE LAN COMPLETO >> /tmp/log/uptime
ifconfig eth0 >> /tmp/log/uptime
echo Trafico desglosado por puertos LAN del Router: >> /tmp/log/uptime
ifconfig lan1 >> /tmp/log/uptime
ifconfig lan2 >> /tmp/log/uptime
ifconfig lan3 >> /tmp/log/uptime
ifconfig lan4 >> /tmp/log/uptime
echo TRAFICO AL MODEM - puerto WAN >> /tmp/log/uptime
echo resume datos de salida/entrada del puerto de red exterior. >> /tmp/log/uptime
ifconfig wan >> /tmp/log/uptime
echo TRAFICO AL PUNTO DE ACCESO WIFI - wlan0 >> /tmp/log/uptime
ifconfig wlan0 >> /tmp/log/uptime
echo CESIONES DHCP >> /tmp/log/uptime
cat /tmp/dhcp.leases >> /tmp/log/uptime
# mensaje para mostrar
echo Tiempo de uptime actualizado en el archivo /tmp/log/uptime
echo Viva el Justicialismo!


Luego guardaremos el archivo y salimos del editor. Para hacer esto en el editor Vi, debemos presionar la tecla Esc y a continuación ingresar :wq seguido de Enter.

Debemos darle permiso de ejecución al programa ingresado. Podremos hacerlo simplemente con:

chmod +x /root/upt

Dicho programa será capaz de crear en la memoria RAM del router (mas precisamente, en la carpeta /tmp/log/) un archivo llamado uptime que nos indicará el tiempo que lleva encendido el router, los datos de tráfico desglosados por puerto, wifi, y el puerto WAN (de Internet). También nos indicará qué máquinas tiene asociadas al router.

La finalidad es que este programa se ejecute automáticamente cada 10 minutos, lo que actualizará dicho registro con conteos parciales. El problema es que este archivo se borrará de la memoria toda vez que se apague o se reinicie el router.

Se preguntarán cual es el motivo de esto. Vean señores, notarán que no actualizamos este fichero cada 10 minutos en la memoria EEPROM del router sino en su memoria volátil, la RAM. Esto es así porque la memoria EEPROM, como toda memoria de tipo Flash, puede llegar a sufrir un proceso de deterioro si la estamos grabado (escribiendo) cada 10 minutos sin ton ni son. Por tal motivo crearemos un segundo script llamado uptflash, que no se ejecutará cada diez minutos sino una vez por día, y que simplemente copiará el archivo de registro desde la memoria volátil RAM a la memoria de masa EEPROM Flash. Una vez transferido el archivo, el dato total del día se almacenará de forma imperecedera.

Para poder ingresar este nuevo script, volvemos a usar el editor Vi:

vi /root/uptflash

ingresamos en modo inserción presionando i, y le pegamos el siguiente código:


#!/bin/sh
# Graba el log de uptime de la RAM a la memoria flash
# poner en cron una vez por dia, a las 12am o algo asi
# borra el archivo viejo
rm /root/uptime.log
# copia el archivo de la RAM a la FLASH del router
cp /tmp/log/uptime /root/uptime.log


...luego guardamos y salimos con Esc+:wq. No debemos darle permisos de ejecución al fichero, con el comando:

chmod +x /root/uptflash

Pues bien, para que ambos guiones funcionen de la manera recomendada, debemos hacer que el router los ejecute de forma programada y en intervalos. Para ello usaremos la funcionalidad Cron (el cronómetro) del router. Este nos permite ingresar una serie de acciones que dispararán los guiones.

Nuevamente, usaremos Vi:

vi /etc/crontabs/root

Esto nos permitirá crear un archivo de configuración de los guiones cronometrados. Ingreso en modo inserción mediante la tecla i, y le pegamos el siguiente código:

# Ejecuta este script upt cada 10 min
# para loguear uptime y trafico a la RAM
*/10 * * * * /root/upt
# ejecuta el script uptflash a las 13:01pm
# para copiar el uptime de la RAM a la flash
# una vez por dia:
01 13 * * * /root/uptflash


Esta orden le indica al router que ejecute el script upt, el cual se encarga de reemplazar el archivo bitácora antiguo (si lo hubiese) por uno nuevo cada diez minutos, a toda hora, todos los días de la semana. Finalmente todos los días a las 13:01 horas, ejecutará uptflash, que transferirá la bitácora desde la memoria RAM volátil a la EEPROM estable del router (lo cual nos permitirá conocer nuestro "récord" de tiempo de encendido). Es interesante destacar que esta acción se realiza un minuto después de la otra, para evitar que al realizarse al unísono, el primer log no esté completo.

Ahora bien, para que los registros de bitácora se inicien según esta consigna, es necesario reiniciar el router. Una vez reiniciado, puedo dejarlo encendido todo el tiempo que sea necesario. El reinicio puede hacerse con el comando:

reboot

Para revisar si la orden de acción cronometrada está activa, podremos loguearnos al router e ingresar el siguiente comando:

logread | grep cron

Debería devolvernos dos instancias de Cron. En tanto, si queremos estudiar el registro parcial, podríamos ingresar la orden:

cat /tmp/log/uptime | less
Y si queremos ver el último registro almacenado en la memoria EEPROM no volátil, habremos de ordenar:

cat uptime.log | less

En el caso de requerir supervisar el tráfico en tiempo real, podremos instalar en el router el programa iftop, una potente aplicación pensada precisamente para ello. Lo haremos con:

opkg update
opkg install iftop

Y ejecutaremos el programa con

iftop:

En dicho programa, podremos activar la ayuda presionando h.

2 comentarios:

  1. Funciono todo perfecto. En el script del uptime sesiones esta con C.

    Viva peron carajo

    ResponderEliminar
  2. Estimado mendoza:

    Le agradecemos la devolución. Sin embargo, se tratan de cesiones de direcciones IP a través del servidor DHCP, y no de "sesiones" de servicio.

    De hecho, el servidor DHCP cede direcciones IP, las cuales son asignadas a determinados adaptadores. Podría indicarse también como "direcciones cedidas".

    Atte.

    Juan Perón

    ResponderEliminar