hits counter
Este sitio web utiliza cookies para obtener estadísticas de navegación. Si sigue adelante, consideraremos que acepta su uso. Acepto | Más información

Utilidades:



Varias terminales en una sola pantalla

Cuando trabajamos en la terminal, con la línea de comandos, es muy útil tener la posibilidad de usar varias terminales al mismo tiempo. Esto podemos hacerlo de varias formas: por ejemplo, abriendo varias sesiones de SSH. Pero hay una forma mejor y más práctica: instalar la utilidad tmux, que es lo que se denomina un multiplexor de terminales. Con ella podemos dividir la pantalla de nuestra terminal en varias terminales más pequeñas, crear nuevas pantallas (o ventanas) que contengan, a su vez, varias terminales y saltar de una a otra con una simple combinación de teclas.

Así pues, vamos a instalar esta utilidad:

sudo apt install tmux

Una vez terminada la instalación, ya tenemos tmux listo para usar. Lo lanzamos:

tmux

y lo usamos empleando la combinación de teclas Ctrl+b seguida de otra tecla. He aquí las más comunes:

Ctrl+b %  ->  divide en horizontal 
Ctrl+b "  ->  divide en vertical  
Ctrl+b o  ->  cambia de una a otra  
Ctrl+b flechas  ->  cambia a la terminal donde apunte la flecha  
Ctrl+b x  ->  cierra una terminal [abajo, izquierda, aparece (y/n)]
Ctrl+b c  ->  crea una nueva ventana
Ctrl+b p  ->  vuelve a la ventana anterior
Ctrl+b n  ->  pasa a la ventana siguiente
Ctrl+b &  ->  cierra ventana actual [abajo, izquierda, aparece (y/n)]

Este es el resultado de dividir una pantalla en cuatro terminales:




Poner el disco duro en suspensión

Si conectamos un disco duro externo a la Raspberry, tal y como explicamos más arriba, a no ser que la caja posea un mecanismo para poner el HD en estado de suspensión pasado un cierto tiempo, lo normal es que el disco permanezca continuamente en movimiento, incluso cuando no se está haciendo uso de él, lo que supone un gasto de energía innecesario. Para evitar esto, podemos instalar una utilidad que se encargue de llevar a cabo este proceso.


hdparm

Este servicio es el más fácil de instalar y usar, pero tiene el inconveniente de que no todos los discos duros funcionan con él, especialmente los que se conectan por USB, como es el caso de la Raspberry, ya que esta placa carece de puerto SATA. Lo mejor es probar y ver si funciona con nuestro HD. De no ser así, entonces usaremos hd-idle, cuya instalación se explica más adelante.

Lo instalaremos de la forma habitual:

sudo apt install hdparm

hdparm posee una larga lista de parámetros que se pueden utilizar. Podemos verlos todos aquí. Según se observa, el parámetro -S es el que establece el tiempo de espera antes de poner la unidad en suspensión (standby o spindown). Al usarlo, a continuación debemos añadir un valor numérico que determinará cuál será el tiempo de espera (durante el que no hay actividad del disco) antes de ponerlo en suspensión para ahorrar energía. Seguido de este número vendrá el nombre de la unidad de disco a la que queremos que se aplique (que podemos averiguar previamente con el comando sudo fdisk -l). Por ejemplo:

sudo hdparm -S 60 /dev/sda

La codificación del valor de tiempo de espera es bastante peculiar. El valor 0 significa que el tiempo de espera está deshabilitado y, por consiguiente, el dispositivo no entrará automáticamente en standby. Los valores del 1 al 240 especifican múltiplos de 5 segundos, produciendo tiempos de espera de entre 5 segundos y 20 minutos. Los valores del 241 al 251 indican unidades con intervalos de 30 minutos, cuyos tiempos de espera van desde los 30 minutos a las 5,5 horas. El resto de valores son especiales. Todos ellos podemos verlos en este listado.

Para no tener que escribir el comando anterior cada vez que arranquemos nuestra Raspberry, lo mejor es ponerlo en el fichero de configuración de hdparm para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/hdparm.conf

y, al final del mismo, escribimos lo siguiente:

/dev/sda {
    spindown_time = 120
}

Como vemos, la sintaxis es diferente a cuando lo usamos directamente desde la línea de comandos. Aquí no se usa el parámetro -S, sino spindown_time, que en este ejemplo le hemos asignado un valor de 120, lo que equivale a 10 minutos de espera (120x5=600 segundos, que son 10 minutos).

Haciendo lo anterior, el spindown debería iniciarse correctamente transcurrido el tiempo indicado. Sin embargo, en algunos discos es necesario, además, activar (descomentándola) esta opción:

apm = 255

Por último, reiniciaremos el sistema para que se active el servicio y comprobar que funciona correctamente:

sudo reboot

Otros parámetros de hdparm

Con el parámetro -C podemos comprobar el estado de la unidad:

sudo hdparm -C /dev/sda

Obtendremos estas respuestas según esté el disco activo o en suspensión:

drive state is: active/idle
drive state is: standby

Para forzar el estado de suspensión, usaremos -y:

sudo hdparm -y /dev/sda

Lo que nos devolverá esta respuesta:

issuing standby command

Una lista completa de todos los parámetros puede obtenerse con

sudo hdparm -h

NOTA: Puede que estos parámetros (o alguno de ellos) no funcionen bien en determinados modelos de discos y obtengamos el mensaje drive state is: unknown junto a algún otro mensaje de error (por ejemplo, SG_IO: bad/missing sense data), pero esto no significa forzosamente que el servicio no esté realizando de forma correcta su función, que es la de poner el disco en suspensión una vez transcurrido el tiempo estipulado.


hd-idle

Si la aplicación anterior no funcionara, entonces la desinstalamos (sudo apt purge hdparm) y probamos con hd-idle, que suele ser más adecuada para los discos USB. El proceso lo haremos en varios pasos, instalando primero algunas herramientas que son necesarias:

sudo apt install build-essential fakeroot debhelper -y

Después descargamos la última versión de hd-idle (que podemos conocer en este enlace):

wget http://sourceforge.net/projects/hd-idle/files/hd-idle-1.05.tgz

Y por último descomprimimos el fichero e instalamos el paquete:

tar -xvf hd-idle-1.05.tgz && cd hd-idle
dpkg-buildpackage -rfakeroot
sudo dpkg -i ../hd-idle_*.deb

Ya podemos poner en suspensión el disco duro con el comando que mostramos a continuación, al final del cual se indica el nombre de nuestra unidad de disco (lo que es posible averiguar previamente escribiendo sudo fdisk -l):

sudo hd-idle -t sda

Para no tener que escribir el comando anterior cada vez que arranquemos la Raspberry, lo mejor es ponerlo en el fichero de configuración de hd-idle para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/default/hd-idle

y modificamos las líneas que se muestran a continuación, indicando en la segunda el tiempo que ha de transcurrir (en segundos) hasta que el HD entre en standby:

START_HD_IDLE=true
. . . . . .
. . . . . .
HD_IDLE_OPTS="-i 300 -l /var/log/hd-idle.log"

Si tuviéramos conectados varios discos, habría que modificar la segunda línea de manera que indique al principio el tiempo por defecto y luego el de cada unidad:

HD_IDLE_OPTS="-i 300 -a sda -i 600 -a sdb -i 1200"

Ya podemos reiniciar el servicio:

sudo service hd-idle restart

o bien el sistema para comprobar que funciona correctamente tras el reinicio:

sudo reboot



Certificado SSL de Let's Encrypt

Puesto que cada vez es más necesario dotar de un acceso seguro a cualquier sitio web, vamos a convertir nuestro servidor Apache o Nginx en un servidor web seguro que use el protocolo HTTPS. Para ello necesitaremos añadir un certificado SSL de una Autoridad de Certificación. Normalmente este certificado se incluye en la compra del dominio. Pero si vamos a usar un DNS dinámico (DDNS), como No-ip, por ejemplo, no dispondremos de él. Afortunadamente, Let's Encrypt nos proporciona de forma gratuita dicho certificado.

Antes de nada, lo primero que haremos será abrir los puertos 80 y 443 TCP en el router y redirigirlos a la IP local de la Raspberry. Si usamos un cortafuegos, también tendremos que abrirlos en él.


Obtención del certificado

Este proceso lo vamos a realizar en tres pasos:

1.) Instalamos Cerbot, el cliente de Let's Encrypt que nos permitirá automatizar la emisión e instalación de certificados, además del paquete que se encarga de automatizar esta tarea en el servidor web.

  1. Si usamos Apache:
    sudo apt install certbot python-certbot-apache
  2. En el caso de Nginx:
    sudo apt install certbot python-certbot-nginx

2.) Y ahora es cuando vamos a obtener el certificado.

  1. Para Apache usaremos este comando (sustituyendo midominio.com por el nuestro):
    sudo certbot --apache -d midominio.com
  2. Para Nginx el comando es similar:
    sudo certbot --nginx -d midominio.com

Durante el proceso de instalación del certificado se nos pedirá un email. Este correo electrónico es para la recuperación de claves y recibir notificaciones, por lo que es importante que sea un email válido, ya que se utilizará además para avisarnos en el caso de que se produzca un error durante el proceso de renovación automática del certificado. Luego tenderemos que aceptar los términos del servicio y si queremos compartir nuestro email (Y/N). Finalmente se nos preguntará si deseamos o no redireccionar todas las peticiones (tanto las HTTP como las HTTPS) al protocolo HTTPS (No redirect/Redirect).

3.) Ya sólo falta reiniciar el servidor.

  1. Si es Apache:
    sudo service apache2 restart
  2. En el caso de Nginx:
    sudo service nginx restart

Renovar el certificado

El certificado proporcionado por Let's Encrypt sólo es válido durante 90 días, por lo que es necesaria su renovación periódica. Podemos simular la renovación y comprobar que funciona correctamente mediante este comando:

sudo certbot renew --dry-run

Aunque la auténtica renovación se hace con

sudo certbot renew

En principio no hay que preocuparse por la renovación: el paquete que instalamos antes se encarga de mantener nuestro certificado actualizado, ya que al instalar dicho el paquete, se instala también un timer de systemd que se ejecuta dos veces al día.

No obstante, si nuestra distribución no usa systemd o el timer no funciona correctamente por algún motivo, siempre es posible automatizar la tarea de renovar el certificado recurriendo a cron. Para ello editamos su fichero de configuración:

crontab -e

y al final del mismo añadimos una línea para que se ejecute la autorenovación, por ejemplo, todos los viernes a las 3 de la madrugada:

0 3 * * 5 sudo /usr/bin/certbot renew --quiet

Guardamos los cambios y reiniciamos cron:

sudo service cron restart

Por otro lado, podemos verificar el estado de nuestro certificado SSL en esta página:

https://www.ssllabs.com/ssltest/analyze.html

Copia de seguridad del certificado

En caso de que en un futuro se dañe el directorio /etc/letsencrypt, que es donde se encuentra el certificado, podemos hacer copia de seguridad del mismo y restaurarlo después. En primer lugar hacemos la copia:

sudo tar zcvf letsencrypt_backup_$(date +'%Y-%m-%d_%H%M').tar.gz /etc/letsencrypt

Posteriormente, en el momento en que lo necesitemos, procederemos a su restauración. La haremos en dos pasos.

1.) Primero ejecutamos este comando para restaurar los archivos:

sudo tar zxvf letsencrypt_backup_XXXX-XX-XX_XXXX.tar.gz -C /

Sustituiremos, naturalmente, las XXXX-XX-XX_XXXX por los números correspondientes del fichero que contiene la copia de seguridad.

2.) En segundo lugar, restablecemos el certificado.

  1. En el caso de Apache:
    sudo certbot --apache
  2. Y para Nginx haremos lo propio:
    sudo certbot --nginx



Cron: el programador de tareas de Linux

Cron es un demonio (daemon) que funciona en segundo plano y ejecuta tareas automáticamente en un tiempo especificado por el usuario. Dichas tareas o trabajos (jobs), definidas generalmente en forma de scripts, se indican en un fichero de texto llamado crontab. Cada usuario del sistema posee su propio fichero crontab.

Veamos su funcionamiento mediante un ejemplo. Vamos a crear un script para que Raspberry Pi OS se actualice automáticamente cada cierto tiempo. Para ello, en el directorio del usuario (/home/pi) creamos un fichero llamado update.sh:

nano update.sh

Dentro del mismo escribimos lo siguiente:

#!/bin/bash
sudo apt update
sudo apt upgrade -y

Lo guardamos y a continuación le damos permisos de ejecución:

chmod u+x update.sh

Ahora lo añadimos como una nueva tarea de cron mediante la edición del fichero crontab:

crontab -e

Justo al final del fichero de texto que nos ha aparecido incluimos una línea para ejecutar nuestro script:

# m h dom mon dow       command
0 10 * * * /home/pi/update.sh > /dev/null 2>&1

NOTA: La parte final de la línea (> /dev/null 2>&1) se añade para que la ejecución del script no muestre ninguna salida por pantalla.

Una vez guardado el fichero, reiniciamos cron:

sudo service cron restart

Ahora tendremos una tarea que se ejecutará todos los días a las 10 de la mañana. Y para entender el funcionamiento de los 5 elementos (0 10 * * *) que hemos incluido al comienzo de esa línea, es preciso observar este esquema:

Podemos ver que, de izquierda a derecha, el significado de cada uno de esos 5 elementos es el siguiente:

min: minuto
hou: hora
dom: día del mes
mon: mes
dow: día de la semana

Podríamos cambiar la hora o los días en que queremos que se actualice el sistema operativo; para ello realizaremos las modificaciones oportunas, como en los siguientes ejemplos:

30 9 * * * /home/pi/update.sh > /dev/null 2>&1

Así, en lugar se ejecutarse todos los días a las 10, lo haría a la 9 horas y 30 minutos.

0 13 * * 5 /home/pi/update.sh > /dev/null 2>&1

Ahora la ejecución se llevaría a cabo todos los viernes (día 5 de la semana) a las 13 horas.

45 23 28 * * /home/pi/update.sh > /dev/null 2>&1

Con la línea anterior, se ejecutaría el día 28 de cada mes a las 23 horas y 45 minutos.

0 22 * * 1 /home/pi/update.sh > /dev/null 2>&1

En este último caso el sistema se actualizará los lunes (día 1 de la semana) a las 10 de la noche.


Intervalos de tiempo

Para indicar intervalos de tiempo se utilizan 3 caracteres especiales:

la coma		(,)   	separa una lista
el guión	(-)	indica un rango 
la barra	(/) 	cada cierto tiempo

Veamos algunos ejemplos:

0 10,15,19 * * * /home/pi/update.sh > /dev/null 2>&1

El script se ejecutará a las 10, a las 15 y a las 19 horas todos los días.

0 22 * * 1-5 /home/pi/update.sh > /dev/null 2>&1

Ahora lo hará a las 10 de la noche de lunes a viernes (días 1 al 5 de la semana).

0 */4 1,15 * * /home/pi/update.sh > /dev/null 2>&1

Se ejecutará cada 4 horas los días 1 y 15 de cada mes.

*/45 * * * * /home/pi/update.sh > /dev/null 2>&1

En este caso, la ejecución será cada 45 minutos.

0 9-23/2 * * 1,3,5 /home/pi/update.sh > /dev/null 2>&1

Por último, lo hará cada 2 horas (entre las 9 y las 23 horas) los lunes, miércoles y viernes.


Comandos específicos

  1. @reboot: se ejecuta en cada inicio del sistema.
  2. @yearly: se ejecuta una vez al año (0 0 1 1 *).
  3. @monthly: se ejecuta una vez al mes (0 0 1 * *).
  4. @weekly: se ejecuta una vez a la semana (0 0 * * 0).
  5. @daily: se ejecuta una vez al día (0 0 * * *).
  6. @hourly: se ejecuta una vez a la hora (0 * * * *).



Gestor de ficheros Midnight Commander

Quienes utilizaron hace varias décadas el sistema operatino MS-DOS muy probablemente tenían instalado el famoso Norton Commander, una utilidad con la que era posible obviar la línea de comandos para usar en su lugar una pantalla dividida en dos partes que representaba el árbol de directorios. La aplicación permitía realizar las tareas más comunes con ficheros y carpetas (crear, copiar, mover, borrar, editar, renombrar,...) sin tener que aprenderse la lista de comandos, usando en su lugar un menú de opciones, las teclas de función, el tabulador, las flechas e incluso el ratón. Incluía además un editor de texto propio.

La gran popularidad de esta utilidad hizo que surgiera pronto una versión para el sistema operativo Linux. Por razones de copyright se le cambió el nombre a Midnight Commander y así, las siglas que se utilizaban para referirse al Norton, pasaron de NC a MC. Y de esta última forma es como se instala en la Raspberry Pi:

sudo apt install mc

La arrancamos con la misma abreviatura con la que la hemos instalado (mc para usarlo como usuario o sudo mc para acceder como administrador) y este será su aspecto:

Podemos cambiar a cualquiera de las dos partes en que se divide la pantalla con la tecla del tabulador o pinchando con el ratón. En el menú Opciones se nos ofrece la posibilidad de configurar una gran cantidad de detalles de esta práctica y veterana aplicación.



Instalar Docker y utilizar contenedores

Docker es una herramienta de virtualización muy ligera que permite correr aplicaciones y servicios utilizando contenedores. La virtualización basada en contenedores tiene una gran ventaja con respecto a los sistemas tradicionales como VMWare o Virtualbox: en los contenedores no se crea un sistema huésped completo, sino que las aplicaciones se encapsulan en módulos que comparten el mismo kérnel del sistema anfitrión y se ejecutan como procesos aislados en el espacio de usuario. Esto supone un gran ahorro de recursos: memoria, espacio de disco y uso de CPU. El hecho de que sea tan ligera implica que no requiere de un hardware potente, lo que la hace muy adecuada para su uso en una placa como la Raspberry Pi. Los contenedores son, además, sistemas autocontenidos que ya disponen de todo lo necesario (código, librerías, dependencias y ficheros de configuración) para poder funcionar en cualquier equipo.

Los creadores de esta plataforma mantienen un repositorio público en la nube, llamado Docker Hub, que contiene una enorme cantidad de imágenes de muchas de las aplicaciones y servicios más utilizados por usuarios y empresas de todo el mundo, ordenadas por categorías, sistemas operativos y arquitecturas (entre las que se encuentra ARM). Cualquiera puede crearse una cuenta (gratuita o de pago) e incluir su propio repositorio particular, haciéndolo público o privado.


Instalar Docker

Lo primero que haremos será actualizar la lista de paquetes de Raspberry Pi OS:

sudo apt update

A continuación ejecutamos el script que llevará a cabo la instalación:

sudo curl -sSL https://get.docker.com | sh

Para poder utilizarlo con el usuario habitual del sistema, añadimos éste al grupo de Docker:

sudo usermod -aG docker pi

y reiniciamos el equipo:

sudo reboot

Con el fin de comprobar que Docker está funcionando correctamente, ejecutamos un primer contenedor hecho ex profeso para esta finalidad: uno muy básico que simplemente muestra el típico "Hello World". Para ello usaremos esta orden:

docker run hello-world

Como podemos ver, la imagen del contenedor se busca primero localmente, y si no se encuentra (como es el caso), se descarga del repositorio Docker Hub. Después se ejecuta el contenedor, que muestra el mensaje Hello from Docker!, y a continuación es cuando se nos indica que la instalación se ha realizado correctamente.

Con los siguientes comandos conoceremos la versión de Docker que tenemos instalada y también otra información extendida (su directorio raíz, kérnel, arquitectura de la CPU, sistema operativo,...), respectivamente:

docker -v
docker info

Instalar Docker Compose

Ahora vamos a instalar Docker Compose, que es una extensión que nos permite gestionar varios contenedores a la vez, además de poder configurar de una forma más sencilla cómo se comunican entre ellos.

Primero instalamos el gestor de paquetes pip:

sudo apt install libffi-dev libssl-dev -y
sudo apt install python3-pip -y

Y luego instalamos la aplicación:

sudo pip3 install docker-compose

Para comprobar que todo ha ido bien, ejecutamos este comando para que nos muestre la versión:

docker-compose --version

Actualizar y desinstalar

Ambas herramienta se actualizan, respectivamente, mediante estos comandos:

sudo apt update && sudo apt upgrade
pip3 install --upgrade docker-compose

Para desinstalarlas, en el caso de Docker:

sudo apt remove --purge docker-ce
sudo rm -rf /var/lib/docker

Y en el caso de Docker Compose:

sudo pip3 uninstall docker-compose

Imágenes

Ya dijimos al principio que existe un gran repositorio donde se encuentran todas las imágenes disponibles para Docker, llamado Docker Hub. De aquí es de donde se descargan las imágenes que vamos a usar en nuestro sistema.

Podemos conocer la lista de comandos disponibles para trabajar con imágenes escribiendo esto:

docker image --help

Los más usados seguramente serán los siguientes:

docker image ls                                       Muestra la lista de imágenes
docker image rm nombre | ID                  Borra una imagen
docker image pull nombre                       Descarga una imagen del repositorio
docker image prune                                 Borra todas las imágenes

Los tres primeros comandos anteriores pueden abreviarse:

docker images
docker rmi nombre | ID
docker pull nombre

Hemos de tener en cuenta que no se puede borrar una imagen si ya existe un contenedor de la misma. Es necesario borrar previamente el contenedor, ya que este no es más que una imagen que se ha lanzado y se encuentra en ejecución.

Parar borrar una imagen podemos usar su nombre o bien su ID. En este último caso no es necesario teclearlo completo (sólo los primeros caracteres, siempre que no existan varios IDs que comiencen por los mismos caracteres). Así, si tenemos dos imágenes cuyos IDs son 6567cb064a414 y 639db11237ab2, respectivamente, para eliminar la primera basta con teclear docker rmi 65.


Contenedores

Como dijimos antes, un contenedor no es más que una imagen que se encuentra en ejecución realizando una tarea. Ello implica que para poder lanzar un contenedor, previamente ha de descargarse la imagen correspondiente: primero se comprueba si esta ya existe en la máquina local, y si no es así, se descarga automáticamente del repositorio.

Al igual que con las imágenes, podemos conocer la lista de comandos disponibles para trabajar con contenedores tecleando esto:

docker container --help

Los más usados en un principio son los siguientes:

docker run nombre                              Arranca un contenedor
docker run -d nombre                         Arranca un contenedor en segundo plano
docker run --name wp wordpress       Lo arranca asignándole un nombre (wp)
docker run -it ubuntu bash                  Arranca un nuevo contenedor y ejecuta comandos
docker exec -it nombre | ID bash        Ejecuta comandos en un contenedor ya arrancado
docker container rename nombre | ID nuevo_nombre               Renombra el contenedor
docker ps -a                                         Muestrra la lista de contenedores
docker stop nombre | ID                      Detiene un contendor
docker start nombre | ID                      Inicia un contendor parado
docker restart nombre | ID                   Reinicia (stop/start) un contendor
docker rm nombre | ID                         Borra un contendor (debe estar parado)
docker pause nombre | ID                    Pausa un contendor
docker unpause nombre | ID                Reinicia un contendor pausado
docker container prune                        Borra todos los contenedores

Como en el caso de las imágenes, para referirse a un contenedor por su ID, no hace falta escribirlo entero (sólo el/los primer/os caracteres, siempre que no existan varios IDs que comiencen por los mismos).




Crear un punto de acceso Tor

Vamos a convertir la Raspberry en un AP (Access Point) o punto de acceso Wifi con la finalidad de acceder a Internet por medio de la red Tor, de modo que todos los dispositivos que se conectan a este AP, sin tener que tocar ni configurar nada en ellos, se enruten automáticamente a través de Tor. Esto resulta mucho más práctico y cómodo que hacerlo mediante un servidor proxy.

Cuando utilizamos Tor, nuestra ubicación o nuestra dirección IP quedan ocultas y enmascaradas, lo que impide el rastreo de las actividades que llevamos a cabo mientras navegamos por Internet. Pero hemos de saber que su uso conlleva una ralentización en la velocidad de navegación y transmisión de datos debido a su peculiar forma de funcionamiento: es el precio que hemos de pagar por la seguridad y el anonimato que nos proporciona.


requisitos previos

El primer requisito es usar Raspberry Pi OS Lite. Una vez instalada esta versión concreta del SO (para quien lo necesite, aquí se muestra cómo hacerlo), entramos por SSH utilizando, de momento, la IP local que nos asigne el servidor DHCP de nuestro router. Más adelante (ya veremos el motivo de no hacerlo ahora) le asignaremos una IP estática.

Una vez instalado, lo primero que haremos será actualizar el sistema:

sudo apt update
sudo apt upgrade -y

Luego reiniciamos:

sudo reboot

Por último, dado que vamos a crear un punto de acceso Wifi, accedemos a la configuración del sistema:

sudo raspi-config

y entramos en el apartado 4 Localisation Options. Aquí seleccionamos I4 Change WLAN Country y elegimos nuestro país (ES Spain en nuestro caso).


Crear el punto de acceso (AP)

Para ahorrarnos el complejo proceso de instalación y configuración del punto de acceso, vamos a usar un script que haga todo el trabajo de forma automática. Podemos saber más sobre el mismo pinchando en la siguiente imagen:

Lo ejecutaremos tecleando este comando:

curl -sL https://install.raspap.com | bash

Una vez finalizado el proceso y reinicializado el sistema, nos aparecerá una nueva red Wifi con el SSID raspi-webgui. Este es el punto de acceso al que hemos de conectarnos. Para ello usaremos la contraseña ChangeMe. Este AP crea una subred en un rango de direcciones que van desde la 10.3.141.50 hasta la 10.3.141.255, que son las que se les asignarán por DHCP a los clientes que se conecten.

Desde el navegador de nuestro PC podemos entrar en la interfaz web del punto de acceso a través de la dirección 10.3.141.1 para realizar algunos cambios en su configuración. Se nos pedirá un nombre de usuario (admin) y una contraseña (secret). En el menú de la izquierda, pinchamos en Hotspot y en la pestaña Basic comprobamos que esté selecionado el Interface: wlan0; luego podemos cambiar el nombre del SSID por otro distinto (por ejemplo, RPi-Tor); debajo seleccionamos Wireless Mode: 802.11n - 2.4 GHz y en Channel se puede cambiar el canal si el que aparece ya lo estamos usando en otro emisor Wifi de nuestra LAN. Guardamos los cambios pinchando en el botón Save settings.

Luego, en la pestaña Security nos aseguramos de que esté seleccionado Encryption Type: CCMP y en PSK cambiamos la contraseña de conexión al AP que viene por defecto (ChangeMe) por otra más robusta y compleja. Volvemos a guardar los cambios y pasamos a la pestaña Advanced, donde vamos a seleccionar el país que nos corresponda (Country Code: Spain en nuestro caso). Guardamos los cambios de nuevo y ahora no debemos olvidar hacer clic en el botón Restart hotspot. Cuando se reinicie, nos conectamos de nuevo al punto de acceso, volvemos a entrar en la interfaz web, vamos al menú izquierdo y pinchamos en Authentication para cambiar la contraseña de acceso por defecto (secret) por otra menos obvia. Ya sólo nos queda guardar los cambios por última vez haciendo clic en Save settings.


Cambios en iptables

Hecho todo lo anterior, ya tenemos la Raspberry convertida en un punto de acceso Wifi y correctamente configurada. Pero ahora nos proponemos ir un paso más allá y hacer que todas las conexiones a la misma se realicen a través de Tor, con el fin de conseguir seguridad y anonimato en nuestras comunicaciones. Para ello, lo primero que haremoss será borrar todas las reglas de iptables del sistema:

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Podemos comprobar su eliminación con el siguiente comando:

sudo iptables -t nat -L

A continuación crearemos nuevas reglas, comprobaremos que se han escrito correctamente y finalmente las guardaremos:

sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 53
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9040
sudo iptables -t nat -L
sudo iptables-save | sudo tee /etc/iptables/rules.v4

Instalar Tor

Vamos a realizar la instalación de Tor:

sudo apt install tor

Editamos su fichero de configuración:

sudo nano /etc/tor/torrc

Y al final del mismo añadimos las siguientes líneas:

Log notice file /var/log/tor/notices.log
VirtualAddrNetwork 10.192.0.0/10
AutomapHostsSuffixes .onion,.exit
AutomapHostsOnResolve 1
TransPort 10.3.141.1:9040
DNSPort 10.3.141.1:53

Creamos el fichero de log indicado antes y le damos los permisos correspondientes:

sudo touch /var/log/tor/notices.log
sudo chown debian-tor /var/log/tor/notices.log
sudo chmod 644 /var/log/tor/notices.log

Arrancamos el servicio y comprobamos que esté activo:

sudo service tor start
sudo service tor status

Hacemos que se ejecute durante el arranque del sistema:

sudo update-rc.d tor enable

Y por último, reiniciamos:

sudo reboot

Seguramente nos encontraremos con el problema de que el servicio no se inicia correctamente durante el arranque de la Raspberry, por lo que el punto de acceso Wifi no tendrá conexión a Internet. Para solucionarlo tendremos que reiniciarlo de nuevo: escribimos sudo service tor stop, esperamos unos segundos y volvemos a iniciarlo con sudo service tor start. Dado que este proceso es bastante tedioso si lo hacemos manualmente, lo mejor es automatizarlo: creamos un script con las instrucciones necesarias y lo ejecutamos en cada reinicio por medio de cron. Lo haremos de esta forma:

  1. 1.- En /home/pi creamos un fichero de script llamado tor.sh con este contenido:
    #!/bin/bash
    sleep 10
    sudo service tor stop
    sleep 10
    sudo service tor start
  2. 2.- Le damos permiso de ejecución:
    chmod u+x tor.sh
  3. 3.- Editamos el fichero de configuración de cron:
    crontab -e
    y, al final del mismo, añadimos una línea para que se ejecute el script cada vez que se ponga en marcha o se reinicie la Raspberry:
    @reboot /home/pi/tor.sh > /dev/null 2>&1

A partir de ahora, tras cada arranque, damos tiempo a que se inicie correctamente el servicio y ya podremos conectarnos al punto de acceso Tor desde cualquier cliente. Para asegurarnos de que estamos utilizando de verdad la red Tor, sólo tenemos que pinchar en este enlace.


Asignarle a la RPi una IP estática

Hasta ahora hemos entrado en la Raspberry Pi por SSH mediante la IP dinámica asignada por el servidor DHCP del router. Esto ha sido así porque el script que usamos antes para crear el punto de acceso borra el contenido y luego realiza cambios en el fichero donde se configura la IP local. Pero una vez que el script ha hecho su labor, ya podemos asignar una IP estática a la interfaz de red eth0, tal y como se explica aquí.

Por último, añadir que, después de haber instalado Tor, si deseamos entrar en la interfaz web del AP, ya no podremos hacerlo como lo hicimos al principio (a través de la IP 10.3.141.1), sino que deberemos entrar usando la IP que acabamos de asignar a la RasPi.




Configurar un nodo Tor

En el apartado anterior (y en otro en el que mostramos cómo instalar un servidor proxy) hemos venido usando la red Tor en beneficio propio con el fin de preservar nuestra privacidad. Pero también podemos ser nosotros los que ofrezcamos este servicio a los demás convirtiendo la Raspberry Pi en un nodo o router Tor (también llamado Tor relay), de manera que pase a formar parte de esta red y sean otros usuarios los que se beneficien de nuestros recursos para operar en Internet de forma anónima. Se trata, pues, de contribuir de una forma activa a que cualquier persona pueda acceder a Internet y evitar que se monitorice constantemente su actividad, tanto por parte de los gobiernos como de las grandes compañías que ofrecen servicios en la red y trafican con los datos obtenidos.

El proyecto Tor intenta proporcionar una solución al problema de la privacidad consiguiendo que sea imposible (o, al menos, muy difícil) rastrear el origen de una dirección IP. Esto se logra haciendo rebotar la conexión a través de una cadena de relays aleatorios, que consta de al menos un nodo de entrada, un nodo de retransmisión y un nodo de salida:

  1. 1.- Nodo de entrada: el nodo de entrada sólo conoce la dirección IP del usuario de Tor y la dirección IP del nodo de retransmisión, pero no el destino final de la solicitud.
  2. 2.- Nodo intermedio o de retransmisión: el nodo de retransmisión sólo conoce la dirección IP del nodo de entrada y la dirección IP del nodo de salida, y no conoce ni el origen ni el destino final.
  3. 3.- Nodo de salida: el nodo de salida sólo conoce la dirección IP del nodo de retransmisión y el destino final de la solicitud; es el único nodo que descifra el tráfico antes de enviarlo a su destino final. Debido a que el tráfico sale a través de este nodo, su dirección IP es la que se interpreta como el origen del tráfico en lugar de la dirección IP real del usuario de Tor.

Como se muestra en la figura, los nodos de entrada y retransmisión (guard & middle relays), también llamados non-exit relays, que son los que vamos a configurar nosotros, desempeñan un papel crucial en este intercambio porque crean una barrera criptográfica entre el origen de la solicitud y el destino de la misma. En los nodos de salida se rompe esta barrera, pero incluso en el caso de que alguno estuviera controlado por un "observador" que intenta robar los datos, no podrá conocer el origen de la solicitud sin controlar toda la cadena previa de retransmisiones Tor.

Los nodos de salida son más complejos de configurar y mantener, requieren un mayor ancho de banda y además están más expuestos, por lo que suelen ser ejecutados por operadores pertenecientes a diversas instituciones, universidades u organizaciones de defensa de la privacidad.

En cuanto a los primeros, que son los que nos atañen, para que un nodo funcione como entrada o guard relay debe ser estable (a ser posible, permanecer activo 24/7) y además ha de ser rápido (estar por encima de los 2 MB/s de velocidad), de lo contrario funcionará como un middle relay, es decir, un nodo intermedio o de retransmisión.

Por último, conviene saber que, al contrario que otras placas, la Raspberry Pi no dispone de aceleración AES-NI por hardware para el cifrado de datos, lo que implica que ha de hacerse por software y ello conlleva una cierta ralentización en el flujo del tráfico que pasa por nuestro nodo.


Instalar y configurar Tor

Antes de empezar con la instalación, debemos asignarle a la Raspberry una IP estática, tal y como se indica en este apartado.

Ya podemos instalar Tor:

sudo apt install tor

Editamos su fichero de configuración:

sudo nano /etc/tor/torrc

y al final del mismo añadimos las siguientes líneas:

SocksPort 0
Log notice file /var/log/tor/notices.log
RunAsDaemon 1
DataDirectory /var/lib/tor
ControlPort 9051
CookieAuthentication 1
ORPort 9001
DirPort 9030
ExitPolicy reject *:*
RelayBandwidthRate 4 MB
RelayBandwidthBurst 8 MB
Nickname mi_nick
ContactInfo mi_email
DisableDebuggerAttachment 0

Tenemos que sustituir mi_nick por el apodo que queramos utilizar en la red y mi_email por una dirección de correo válida, pues en ella vamos a recibir una alerta del servicio "Tor Weather" si nuestro nodo se desconecta durante más de 48 horas o si algo no funciona bien.

También podemos cambiar, si lo deseamos, el ancho de banda que vamos a asignar a nuestro relay en la red, lo que se corresponde con los valores RelayBandwidthRate y RelayBandwidthBurst, aumentándolos (8 MB/16 MB, por ejemplo) si nuestra línea posee una buena velocidad y calidad de transmisión.

Por último, los puertos indicados en el fichero (9001 TCP y 9030 TCP) hemos de abrirlos en el router y redirigirlos a la IP local de la Raspberry. También los abriremos en el cortafuegos, si lo tenemos instalado.

A continuación reiniciamos Tor para que los cambios tengan efecto:

sudo service tor restart

Si todo ha ido bien, podemos mirar el contenido del fichero de log:

cat /var/log/tor/notices.log

y comprobar que haya una línea como la siguiente:

... [notice] You are running a new relay. Thanks for helping the Tor network!...

Una vez pasadas varias horas, es posible saber con seguridad si nuestro relay está activo y obtener más información sobre el mismo buscando en Relay Search. La búsqueda podemos hacerla por nuestro apodo, dirección IP, fingerprint, etc.

Por último, añadir que en el directorio /var/lib/tor se almacenan algunos datos importantes de nuestro nodo, entre ellos la clave privada que se usa para cifrar los paquetes de datos.


Control gráfico

Para comprobar la actividad de nuestro nodo Tor, podemos instalar un sistema de control gráfico para ARM:

sudo apt install tor-arm

Limpiamos la consola escribiendo clear y lo ejecutamos con este comando:

sudo -u debian-tor nyx

Hay una serie de teclas que podemos usar: m para desplegar el menú de opciones, p para pausar la gráfica o q (dos veces) para salir.


Nodos bridge

Aparte de los nodos de entrada, de retransmisión y de salida, existe además un tipo especial llamado bridge (puente). El diseño de la red Tor implica que la dirección IP de sus nodos es pública. Por ello, una de las formas en que los gobiernos o los ISP pueden combatir el uso de Tor es bloqueando la lista de direcciones IP de estos nodos públicos. Sin embargo, los bridge son nodos de la red que no figuran en el directorio público de Tor, lo que dificulta enormemente que los ISP o los gobiernos puedan bloquearlos.

Para los usuarios de Tor, recurrir a este tipo especial de nodos es útil si se encuentran bajo regímenes opresivos o para aquellas personas que quieren una capa adicional de seguridad porque les preocupa que alguien reconozca que están conectados a una dirección IP pública de retransmisión Tor.

Para nosotros, configurar un bridge relay es una excelente opción si estamos ejecutando un nodo Tor desde nuestra red doméstica, disponemos de una única IP pública y no tenemos una línea con una gran cantidad de ancho de banda para donar (aunque se recomienda ceder al menos 1 MB/s de este ancho de banda).

Si queremos realizar la configuración de nuestro nodo Tor en modo bridge, el proceso diferirá un poco con respecto al que explicamos antes. Los pasos se indican a continuación.

  1. 1.- Instalamos Tor:
    sudo apt install tor
  2. 2.- Después hay que instalar tambien este otro paquete:
    sudo apt install obfs4proxy
  3. 3.- Seguidamente editamos el fichero de configuración de Tor:
    sudo nano /etc/tor/torrc
    Pero en este caso el contenido que incluiremos será algo diferente:
    SocksPort 0
    BridgeRelay 1
    ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
    ServerTransportListenAddr obfs4 0.0.0.0:8042
    ORPort 9833
    ExtOrPort auto
    Log notice file /var/log/tor/notices.log
    DataDirectory /var/lib/tor
    ExitPolicy reject *:*
    RelayBandwidthRate 2 MB
    RelayBandwidthBurst 4 MB
    ControlPort 9051
    Nickname mi_nick
    ContactInfo mi_email
    DisableDebuggerAttachment 0
    No hay que olvidar sustituir mi_nick y mi_email por el apodo y el correo que queramos usar.
  4. 4.- Ya sólo nos resta reiniciar el servicio:
    sudo service tor restart

Lo demás es idéntico a lo expuesto antes, incluyendo la instalación del control gráfico. Únicamente recordar que, como es obvio, los nuevos puertos indicados en el fichero anterior (el 9833 TCP y el 8042 TCP, que podemos cambiar por otros si lo deseamos) tendremos que abrirlos en el router y redireccionalos a la IP local de la Raspberry. También los abriremos en el cortafuegos, en el caso de que lo tengamos instalado.