Cómo redirigir puertos localmente con SSH

Uno de los muchos usos que tiene SSH es el de redirigir puertos, una característica que te permite crear un túnel entre tu cliente SSH y el servidor al que te estés conectando, para que el tráfico que entre por uno de los extremos se reenvíe desde el otro, y a la vez el tráfico que reciba tu servidor te lo traiga a ti.

Entre los usos que tiene esto: podrías usar tu servidor como intermediario al hacer una conexión de red. Imagina que hay otro servidor en internet que tiene un firewall configurado para que sólo se pueda entrar desde la IP de tu servidor (o incluso, imagina que tienes un servicio en tu servidor que sólo se puede acceder desde localhost). Aunque localmente desde tu ordenador no vas a poder conectarte a él, si montas una redirección de puertos al conectarte a tu servidor, podrías usarlo de intermediario y entonces conectarte a ese servicio.

Continuar leyendo «Cómo redirigir puertos localmente con SSH«

Guía rápida sobre cron

Cron es una herramienta que te permite ejecutar comandos de forma programada. Mientras el agente de cron esté corriendo, podrás especificar cosas como pedir que un script o comando se ejecute periódicamente, cada 15 minutos, cada minuto, cada hora, cada noche, cada domingo, cada sábado a las 14:37 horas, cada día 5 de mes a las 02:51 horas… En fin, que podrás hacerlo de forma muy flexible.

Para poder modificar las tareas programadas, puedes modificar el crontab, que es la tabla de tareas periódicas. En esta guía te quiero contar cómo modificar esta tabla y el formato de lo que debes poner en el archivo.

Introducción al crontab

Para cambiar la configuración de tu agenda puedes usar el comando crontab -e desde la línea de comandos. Si ejecutas este comando, se abrirá el editor de textos por defecto que tengas configurado en tu sistema, con un archivo que puede que esté vacío o que ya contenga cosas.

Dentro de este archivo, puedes meter tres tipos de línea:

  • Líneas en blanco.
  • Líneas que comienzan con un #. Se denominan comentarios, y si no sabes de programación, te vienen bien para anotar cosas. El ordenador las va a ignorar, así que ahí es donde puedes dejar explicaciones o cualquier otro dato que quieras conservar para que puedas volver a leerlo más tarde con calma.
  • Líneas que contienen una tarea programada que quieres que cron ejecute.

Vamos a lo gordo porque realmente el formato puede resultar un poco confuso. Cada línea contiene un comando a ejecutar y el calendario que quieres que tenga.

Calendarios

El calendario especifica cuándo quieres que se repita la tarea. Por ejemplo, los jueves a las 15:30 o cada día 1 a las 02:00 AM. Para especificar el calendario, tienes que poner cinco números separados por espacios al principio de la línea. Estos cinco números siguen el siguiente formato:

minuto   hora   dia-del-mes   mes   dia-de-la-semana

Los rangos de los números son los esperables. Como minuto puedes poner un número comprendido entre 0 y 59; como hora uno entre 0 y 23. El día del mes se comprende entre 1 y 31, sabiendo que hay meses con menos días. El mes también está entre 1 y 12. Ahora bien, para el día de la semana, puedes usar un número de 1 a 7, donde 1 es lunes, 2 es martes… y así hasta 7, que es domingo; o bien puedes especificar también un 0 para el domingo, usando por lo tanto un número entre 0 y 6. Tal vez si administras sistemas esto te suene porque muchos sistemas usan esta notación igualmente, dejando el 0 para el domingo y el 6 para sábado.

Además de un número, puedes poner un asterisco (*) cuando quieras indicar que te da lo mismo lo que valga el campo. Por ejemplo, si quieres ejecutar una tarea todos los días, podrías usar asteriscos para los campos dia-del-mes, mes y dia-de-la-semana, para indicar que lo único que te importa es la hora, pero la fecha vale cualquiera. Por ejemplo, aquí van algunos calendarios:

  • 30 18 * * *: ejecutaría una tarea todos los días a las 18:30. (Me da igual el día del mes, o el mes, o el día de la semana).
  • 0 2 1 * *: ejecutará una tarea cada día 1 a las 2 de la mañana. (Sea el mes que sea).
  • 0 6 * * 1: ejecutará una tarea cada lunes a las 6 de la mañana, sea el día que sea.

Otra cosa que puedes hacer es pedirle que se ejecute cada N minutos, o cada N horas, o cada N días. Para ello le pones un asterisco (*), seguido de una barra y de cada cuánto tiempo quieres que se repita. Por ejemplo, si quieres ejecutar una tarea cada 5 minutos, puedes usar */5 * * * *, que la ejecuta sea el día que sea o la hora que sea, cada 5 minutos.

Por último, también voy a indicarte que puedes usar directamente números separados por comas para tener una mayor precisión. Así que si quieres ejecutar una tarea a las 8 de la mañana el día 1 de enero, abril, julio y octubre puedes usar la secuencia 0 8 1 1,4,7,10 *.

Establecer un calendario es una tarea que puede resultar a veces complicada de depurar, así que te voy a mencionar este enlace para que puedas simular un calendario y traducir la explicación a humano: https://crontab.run/es.

Comandos

Finalmente, luego del calendario vendría el comando que quieras que se ejecute. Aquí, ten en cuenta que es bastante probable que se ignoren las variables de entorno que hayas podido declarar en tu terminal, así como otros directorios que hayas metido al PATH, que generalmente y salvo que lo reconfigures, sólo contendrá /usr/bin y /bin. Por lo tanto, mi consejo es que en cualquier caso uses rutas absolutas para cualquier comando que vayas a ejecutar y así evitar problemas.

Por ejemplo, la siguiente regla de cron ejecutaría el script /home/danirod/scripts/send_analytics.sh cada mañana a las 7:00:

0 7 * * * /home/danirod/scripts/send_analytics.sh > /home/danirod/scripts/log

Observa que puedo poner caracteres como > o 2> para enviar la salida del comando que esté ejecutando a un archivo. Esto es aceptado y es una forma excelente de poder luego ver qué ha pasado, sobre todo en caso de error, así que no pierdas de vista la ocasión de ponerlo y guardar el log en alguna parte para poder detectar errores si compruebas que las tareas programadas no se están ejecutando bien. Solo recuerda, de nuevo, que debes usar rutas absolutas, porque si no el archivo se podría guardar en ubicaciones inesperadas.

Permisos

Como consideraciones finales, ten en cuenta que cada usuario del sistema tiene su propio crontab, para especificar su propia agenda. Los comandos se lanzan siempre bajo el usuario al que le pertenece el crontab.

Eso significa que si ejecutas crontab -e con tu perfil, los comandos correrán en tu nombre y por lo tanto tendrán los permisos que tenga tu cuenta. La cuenta root tiene su propio crontab, que puedes modificar como sudo crontab -e (o cambiando antes a root si no tienes sudo), con el que podrás hacer cualquier cosa, aunque mi consejo es que no lo emplees salvo que necesites hacer tareas restringidas (por ejemplo, reiniciar el servidor web cada noche a golpe de comando de systemctl).

Cómo instalar Docker en Debian 11 Bullseye

Docker es un software bastante popular presente hoy en día en muchos procesos de desarrollo de software y despliegue. Veamos cómo obtenerlo en workstations o servidores que ejecuten Debian 11.

Docker es un software bastante popular presente hoy en día en muchos procesos de desarrollo de software y despliegue. Su capacidad para ejecutar aplicaciones de forma aislada mediante contenedores lo ha convertido en un software vital en muchos servidores que, en los últimos años, han empezado a desplegar aplicaciones de forma «dockerizada» para ahorrarse el esfuerzo que supone instalar sobre el propio servidor todo el software necesario para ejecutar la aplicación.

También, gracias a la nube pública, hoy en día resulta habitual utilizar servicios donde en vez de administrar un servidor, tu proveedor cloud lo administra por ti y te ofrece directamente una forma de configurar y ejecutar contenedores de Docker desde su interfaz de usuario. A veces incluso como parte de un cluster de Kubernetes.

Instalar Docker en Debian 11 Bullseye

Si has pensado ingenuamente que podrías instalar Docker en Debian 11 usando apt install docker y has visto que no obtenías el resultado esperado, ya puedes ir pensando en desinstalar. Este paquete poco tiene que ver con el Docker que estás pensando.

Docker tiene una forma de «presentarse» bastante peculiar, por lo que antes de continuar tal vez sea conveniente contar las diferencias entre las distintas piezas de software que se hacen llamar «Docker».

  • Por un lado, Docker Engine es la parte principal del sistema de Docker. Contiene un demonio (dockerd) y una serie de aplicaciones de control (como el comando docker), y es lo que permite crear y ejecutar contenedores para lanzar aplicaciones de forma aislada, apoyándose en el sistema cgroups que forma parte del kernel Linux.
  • Por otro lado, Docker Desktop es un producto que cada vez más está siendo más promocionado por Docker Inc, la empresa que está detrás de Docker, que agrega una interfaz de usuario para controlar el Docker Engine y que facilita el proceso de instalación. Hay que entender que Docker Desktop no es de código abierto y que es un producto que al usarlo corporativamente en empresas más grandes podría ser de pago y requerir una licencia si no se cumplen los requisitos para tener acceso gratuito.

Si bien Docker Desktop hasta hace un tiempo era un producto exclusivo para los sistemas operativos Windows y MacOS, donde de todos modos es necesaria una máquina virtual que ejecute el kernel Linux para poder hacer uso del engine de Docker, ahora existe Docker Desktop para Linux, sujeto a los mismos términos de uso que sus hermanos para Windows y MacOS. Es por esta razón que en este post va a ser descartado como opción, y se va a hablar únicamente de Docker Engine.

Instalar Docker Engine desde los repositorios centrales de Debian

Debian 11 porta una versión de Docker Engine en sus repositorios principales, bullseye/main. Esta tal vez no sea la última versión de Docker disponible, pero es una versión relativamente reciente (la 20.11), que puede ser útil si no haces uso de las funciones más modernas de Docker.

Una de las ventajas de usar la versión de Docker Engine que hay en bullseye/main es que tu instalación de Docker tendrá más estabilidad, debido a que la política de actualizaciones de Debian congela las versiones de los paquetes y sólo proporciona correcciones de errores o de problemas de seguridad, así que puedes tener claro que tu instalación de Docker seguirá funcionando exactamente igual sin sorpresas todo el tiempo que Debian 11 continúe recibiendo soporte.

En cuanto a las desventajas: precisamente, que no vas a poder hacer uso de las funciones más recientes, que tal vez sólo estén disponibles en la versión de Docker Engine que distribuye Docker por su cuenta.

Para instalar Docker Engine desde los repositorios de Debian todo lo que tienes que hacer es ejecutar en una terminal con los permisos correspondientes

sudo apt install docker.io

El proceso de instalación incluye también la configuración de los demonios y de un grupo llamado docker. Si quieres poder utilizar Docker sin tener que escribir sudo, vas a tener que meter tu cuenta local habitual dentro del grupo docker, por ejemplo:

sudo /usr/sbin/usermod -aG docker [[tu usuario]]

Tratemos ahora de hacer una prueba para confirmar si se ha instalado bien o mal. Lanzamos un contenedor de la imagen hello-world, que es una imagen que se puede usar para depurar la instalación de Docker.

Resultado de ejecutar hello-world dentro de Docker

Si lejos de ver un mensaje de error, vemos que se ejecuta algo como lo logrado en la imagen, es que lo hemos hecho correctamente y que ya lo tenemos listo para utilizar. ¡Congratulaciones!

Instalar Docker Engine desde los repositorios de Docker

Si en su lugar nos interesase optar por una versión más reciente del engine, podemos agregar el repositorio oficial de Docker a nuestro sistema APT, e instalar Docker a través de ahí. Las instrucciones las tienes en su documentación oficial, pero consistirá en dar los siguientes pasos.

Primero instalaremos las dependencias necesarias para poder dar de alta la clave GPG que firma los paquetes que distribuye Docker en su repositorio oficial para Debian:

sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

Después, utilizaremos el siguiente comando para descargar e instalar la clave GPG de Docker:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Para a continuación dar de alta el repositorio en el sistema.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Finalmente, actualizaremos los paquetes de nuevo, e instalaremos Docker Engine:

sudo apt update 
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Por último, validaremos de forma parecida a lo dicho en la sección anterior, que podemos ejecutar un contenedor de la imagen hello-world sin errores, y opcionalmente introduciremos a nuestro usuario principal en el grupo docker si pretendemos invocar comandos de Docker sin utilizar sudo.