Solución para disponer de un sistema de encendido y apagado remoto de equipos.

Arrancar y detener equipos en remoto

En algunas situaciones puede resultar interesante poder encender un PC en remoto, tanto desde la propia LAN del equipo, como desde otra red e incluso desde Internet.

Desde la propia LAN es sencillo utilizando las herramientas de Wake-On-LAN disponibles en los diversos sistemas operativos, pero desde otra LAN (Otro dominio de broadcast) puede ser más complejo.

Además hay que tener en consideración que el equipo a encender debe permitir tanto desde la BIOS como desde el sistema operativo, las operaciones de WoL. Desde la BIOS es obvio, dado que estando apagado, debe mantener activa la tarjeta de red para detectar el Magic Packet, que produce el encendido del equipo.

En el proyecto se incluye un ejemplo de como proteger una aplicación que a priori no tiene control de acceso, incluyendo cifrado y control de usuarios mediante Nginx, así como un ejemplo de como crear una sencilla API usando Python que nos permite lanzar comandos a equipos remotos.

Prerequisitos

Para poder montar la solución completamente operativa necesitamos ciertos conocimientos y servicios.

  • Disponer de un nombre de dominio apuntando a nuestra IP pública. Si pretendemos que esta solución sea accesible desde Internet y con un certificado SSL de Let's Encrypt, nuestra IP pública debe ser apuntada desde un nombre DNS (FQDN) válido. Esta IP puede ser dinámica, pero el nombre deberá ser actualizado a dicha IP. Hay servicios gratuitos para este tipo de necesidades.

  • La propuesta puede alterarse con los conocimientos adecuados, pero lo que proponemos requiere de un router y acceso al mismo para poder crear las rutas NAT necesarias, es decir encaminar las peticiones a determinados puertos, hacia determinadas IPs internas y puertos.

  • Necesitas un par de equipos. La idea es disponer de un equipo de bajo consumo, que podría ser una raspberry, y un equipo con mejores prestaciones que será activado solo en caso de necesidad.

  • Para no extenderme no detallaré como usar GIT, DOCKER o Docker-compose. Estas aplicaciones las necesitarás instalar en el equipo pasarela.

Preparar el equipo para ser encendido con WoL

BIOS

Acceder a la BIOS y localizar la opción que permite habilitar el Wake-On-LAN o WoL. Cada BIOS es un mundo, pero dado que tienen opciones muy limitadas, no debería ser muy complejo localizar el menú y la opción para activarlo.

Sistema operativo

También es necesario que el sistema operativo sea preparado para que realice un apagado apropiado.

Obviaré las instrucciones para Windows, ya que como usa ventanas y checkboxes para todo es "muy fácil". Suerte.

En un equipo linux debemos tener en consideración como se gestionan las interfaces de red. Las opciones que se me ocurren son: NetworkManager, si estás empleando una distribución de tipo Desktop o Netplan, si estás empleando una distribución de tipo Server.

Instalaremos la aplicación ethtool. Con esta aplicación podemos verificar si está operativo el WoL en nuestro sistema (Mi tarjeta de red tiene el identificados enp3s0, en cada sistema puede variar): sudo ethtool enp3s0 | grep Wake

Si está inactivo aparecerán las líneas:

        Supports Wake-on: pumbg
        Wake-on: d

Lo que debemos verificar es si aparece la g o aparece la letra d, ya que en el segundo caso estará inactiva.

Vemaos las soluciones para cada caso.

a) NetworkManager

Es sencillo verificar esta opción, basta con ejecutar systemctl status NetworkManager. Si aparece activo, se está empleando esta solución para la gestión de la red. Lo más sencillo es usar el entorno gráfico, pero no he encontrado las opciones para su configuración en entorno gráfico.

Para activarlo usamos el siguiente comando: sudo ethtool -s enp3s0 wol g

Si está activo aparecerán las líneas:

        Supports Wake-on: pumbg
        Wake-on: g

b) /etc/network/interfaces

Si tenemos presente el mencionado fichero, en éste se determina la configuración de los interfaces de red. Para asegurar que en el arranque se se activa el WoL debemos incluir la línea up ethtool -s eth0 wol g en la configuración del interfaz.

c) Netplan

Si empleamos Netplan, debemos configurar el sistema a través del fichero /etc/netplan/xxxxxxx.yml. Cada implementación tendrá un nombre diferente. Como primer paso averiguamos la MAC ADDRESS de nuestra tarjeta con ifconfig enp3s11 | grep ether. Usaremos la mac para incluirla en el fichero de netplan con un aspecto similar al siguiente:

network:
  ethernets:
    enp3s11:
      match:
        macaddress: 50:e5:49:b3:fc:97
      dhcp4: true
      wakeonlan: true
  version: 2

Preparada la configuración basta con ejecutar los comandos de generar y aplicar:

sudo netplan generate
sudo netplan apply

Pasarela de arranque y parada

Ahora toca preparar la pasarela de arranque y parada para la red, configurar el router de entrada, para encaminar los puertos y la aplicación que correrá nuestro servidor.

alt:Esquema_del_Sistema

Configurar el router

La idea de esta propuesta es permitir que desde Internet sea posible acceder a un equipo de bajo consumo, que he llamado pasarela, que encaminará el tráfico de peticiones de encendido y apagado de otros equipos. Además, la propuesta contempla que en el denominado servidor dispongamos de una aplicación que pretendemos sea accesible desde Internet (servidor de ficheros, claves, juegos, etc).

Para ello debemos de configurar el router, en el apartado de NAT o Servidores virtuales, port tiggers o como se llame en cada solución.

  1. Encaminaremos el puerto 80 y el puerto 443 hacia el equipo de bajo consumo. Usamos los puertos estándar ya que la pasarela nos permitirá dirigir las peticiones a otras aplicaciones o servicios usando autenticación por usuarios, y cifrado SSL. Debemos usar los puertos estándar ya que es necesario el puerto 80 para la correcta verificación que realizará Let's Encrypt y el puerto 443, dado que muchas redes bloquean el acceso a puertos no estándares. Emplear puertos no estándar es una protección cutre e inútil.

  2. Encaminaremos el puerto 8888 (esto es un ejemplo) al puerto 8888 (p.e.) y la IP de nuestro denominado servidor. En este podemos levantar un servicio en dicho puerto para la aplicación (espero que sobre docker 😄 ) que pretendemos tener accesible en determinados momentos. En la propia aplicación debemos implementar las medidas de seguridad adecudas (cifrado, autenticación, autorización y registros)

Los servicios o aplicaciones encaminadas a la pasarela por el puerto 443 las podemos proteger tanto con el cifrado SSL como por el uso de usuario y contraseña a través de la solución de Nginx Proxy Manager. Este es el caso de las APIs que publicaremos para en encender y apagar.

Configurar la pasarela

Para configurar la pasarela vamos a emplear varios contenedores:

  • NPM: Nginx Proxy Manager nos permitirá obtener el certificado SSL para nuestra IP pública, de forma que podremos usar cifrado SSL en las comunicaciones y con un certificado válido. Además nos permite establecer diferentes rutas hacia diferentes servicios. También lo utilizaremos como sistema de autenticación de usuarios para acceso a los servicios publicados en cada ruta.

  • wolweb: Es una solución creada y publicada en el repositorio: https://github.com/sameerdhoot/wolweb. Está basada en GO y tiene una variación mínima que fue necesaria dado que el contenedor del repositorio original no estaba funcionando.

  • API: Es un contenedor muy simple que emplea python para crear una API muy sencilla que nos permitirá el apagado remoto.

Cada uno de los contenedores se puede emplear independientemente, por eso mantendré separados los mismos en diferentes ficheros docker-compose.yml. La solución de apagado (contendor API) se podría emplear para el encendido, pero me ha parecido muy interesante la solución wolweb y por eso la he incluido.

A) NPM

Una vez levantado el contenedor podremos acceder al servicio en el puerto configurado en el fichero docker-compose.yml. Para ponerlo en marcha ejecutamos docker-compose up -d desde el directorio npm.

Los pasos que os recomiendo seguir es:

  1. Crear un certificado SSL de Let's Encrypt en el menu SSL Certificates.

  2. Crear una lista de acceso con los usuarios que podrán usar las llamadas API. Os recomiendo permitir todas las direcciones IP, ya que esta ACL es para controlar usuarios y no IPs de origen.

  3. Crear el Proxy Host. El truco está en crear Custom Locations, no nos importa demasiado el encaminamiento por defecto. Pero ojo a donde lo apuntáis, que será accesible públicamente.

  4. En las localizaciones pondremos la ruta de /wolweb/wake, la encaminamos a la IP de nuestra pasarela con la misma ruta añadida tras la IP. El puerto destino en este caso es el 8089, determinado por el contenedor wolweb.

  5. Debemos personalizar la configuración de la Custom Location pinchando en la rueda dentada para incluir el control de acceso con las siguientes líneas. MUY IMPORTANTE: el número tras la ruta data/access debe coincidir con el número que os proporciona vuestra lista de acceso creada en el paso 2. El fichero de la ACL está visible bajo el directorio /npm/.datos/npm/access

auth_basic "Authorization required";
auth_basic_user_file /data/access/2;
proxy_set_header Authorization "";
deny all;
satisfy any;
  1. No os olvidéis de seleccionar la pestaña SSL para seleccionar el certificado creado en el paso 1 y marcar la opción Force SSL

  2. Repetimos los pasos 4 y 5 para la localización wolweb/sleep. En esta ocasión apuntamos a la IP de nuestra pasarela y el puerto conficurado en el docker-compose del contenedor api

B) wolweb

Es una aplicación obtenida del repositorio https://github.com/sameerdhoot/wolweb donde he incluido las siguientes líneas en el fichero Dockerfile.

# Error "cannot find main module"
RUN go mod init wolweb &&\
    go mod tidy

Para poner en marcha este contenedor requiere primero crear la imagen y despúes ponerla en marcha, pero la magia de docker-compose se encarga de ello con el comando docker-compose up -d desde el directorio wolweb

Esta aplicación es muy interesante y os permite incorporar nuevos equipos desde su interfaz. Desde la misma LAN podéis acceder usando la IP de la pasarela y el puerto 8089, en la ruta /wolweb

C) api

Esta es un contenedor muy simple con una API creada con el módulo FastAPI de Python. Dado que está el código Python y su simplicidad, veréis que podéis crear de forma sencilla APIs para otras acciones. Incluso para reemplazar el contenedor wolweb.

Es importante que tengáis en cuenta que en el directorio api/.ssh/known_hosts debéis incluir las líneas adecuadas de vuestro fichero $HOME\.ssh\known_hosts. Estas líneas se crean al acceder por primera vez a un host remoto usando ssh. Aunque es posible copiar el fichero entero no lo recomiendo por motivos de seguridad. También podéis obtener las líneas a incluir mediante el comando ssh-keyscan \

Como este servicio accede por SSH a vuestro equipo para apagarlo, es necesario incluir los datos del usuario y password para el acceso. Además he detectado que es necesario que este usuario esté incluido en el fichero /etc/sudoers de manera que no requiera password para elevar los privilegios. Se puede realizar con la siguiente línea:

usuario     ALL=(ALL) NOPASSWD:ALL

Referencias

https://help.ubuntu.com/community/WakeOnLan

https://help.ubuntu.com/community/NetworkManager

https://ubuntuforums.org/showthread.php?t=2394211

https://github.com/sameerdhoot/wolweb

Similar Resources

Bot para o discord escrito em Golang durante o workshop ministrado na Codecon 2021

Codecon Bot Bot para o discord escrito em Golang durante o workshop ministrado na Codecon 2021 Primeiramente no arquivo main.go coloque o TOKEN do bot

Oct 4, 2021

Ejemplo de un k8s custom controller para un CRD nuevo

Clonado de kubernetes/sample-controller Para pruebas de un CRD nuevo This repository implements a simple controller for watching Foo resources as defi

Nov 3, 2021

Apis para la administracion de notifiaciones, utilizando servicios como AWS SNS y AWS SQS

notificacion_api Servicio para envío de notificaciónes por difusión en AWS SNS Especificaciones Técnicas Tecnologías Implementadas y Versiones Golang

Jan 7, 2022

Empleando interfaces para inyectar capas o dependencias

go-interfaces Trabajar con Interfaces facilita la inyeccion de capas, y tambien el testing de cada capa. Para desarrollar con este mecanismo es necesa

Dec 1, 2021

Tutorial para Go

Plain-go-tutorial Tutorial para Go. Descarga antes de nada los siguientes componentes para la formación. https://code.visualstudio.com/ https://go.dev

Nov 28, 2021

Projeto de biomecânica para tentar avaliar photoelasticidade

Projeto de biomecânica para tentar avaliar photoelasticidade

Alunos Carlos Manuel de Jesus Puentes Valdes 11812591 O que esse programa faz? A partir de uma região da imagem, vão ser buscadas regiões vizinhas de

Dec 1, 2021

e-distribucion (Endesa) API para la lectura remota de contadores inteligentes

e-Distribucion API Go API to read Endesa energy meters info. Ported from Python to Go using https://github.com/trocotronic/edistribucion. You'll need

Dec 4, 2021

Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gateway, Lambda, DynamoDB, DynamoDB Streams

Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gateway, Lambda, DynamoDB, DynamoDB Streams

Prueba de concepto: Boletia, una aplicación para venta de boletos, basada en microservicios event-driven. Desarrollada sobre AWS Serverless: Api Gatew

May 7, 2022

Repositório para macetar o Gin com requests.

macetada/gin Repositório para macetar o Gin com requests. Subindo o server docker build -t gin . docker run --rm -p 8082:80 gin ou: docker pull ghcr.i

Dec 10, 2021

API REST para saber en base a un punto (lat, long), la sucursal más cercana al mismo.

location API REST para saber en base a un punto (lat, long), la sucursal más cercana al mismo. Construido con 🛠 Golang - Lenguaje de programación. SQ

Oct 3, 2022

📚 API para o projeto final de LP2

📚 API - Sistema de Biblioteca Online API para o trabalho de LP2 Entitys check all entity in https://excalidraw.com/#json=FzJIjkvNyN_CnS_v9FcY0,aVEP5R

Jan 11, 2022

Micro-serviço em Golang para processar pagamentos de um Gateway.

Micro-serviço em Golang para processar pagamentos de um Gateway.

Go Payment Processor Projeto Este repositório contém um micro-serviço em Golang que faz parte de um conjunto de serviços necessário para o projeto do

Dec 13, 2021

Proyecto para comprobación y migración de base de datos con versionado modular

rfcheckbd El objetivo de este proyecto es poder realizar migraciones y comprobaciones de bases de datos sin tener que depender de proyectos externos c

Dec 27, 2021

repo de teste para executar á pipeline do rancher

pipeline-example-go This is a sample golang project to demonstrate the integration with rancher pipeline. Building go build -o ./bin/hello-server Runn

Dec 19, 2021

API desarrollada en Go (Golang) para modificar precios en una tienda eCommerce (Shopify)

API desarrollada en Go (Golang) para modificar precios en una tienda eCommerce (Shopify)

Go eCommerce API API para modificar precios de productos en una tienda eCommerce de Shopify. Instrucciones Ingresar a la tienda eCommerce. Seleccionar

Oct 1, 2021

Una aplicación para agendar escrita en Go.

Go tutorial Getting started # Initialize go module go mod init module-path in go, all things must be inside a package. So, in the first line we must

Dec 31, 2021

Repositório destinado para acompanhar meu aprendizado na linguagem Go, desde o básico "Hello, World!" até a elaboração de um projeto ainda não definido. 🙂

go-basics Repositório destinado para acompanhar meu aprendizado na linguagem Go, desde o básico "Hello, World!" até a elaboração de um projeto ainda n

Jan 7, 2022

Requser - Aplicação responsável por solicitar ao concierge, listas de permissões, inclusão de permissão, exclusão de permissão para o ambiente.

requser ⚠ Atenção ⚠ 🛠 Esta área está em desenvolvimento 🛠 Aplicação responsável por solicitar ao https://github.com/Pinablink/concierge, listas de p

Dec 31, 2021

Goemail - Libreria sencilla y completa para el envio de correos con golang (go)

SENDING EMAIL - GoEmail Install librery go get github.com/Leonardo-Antonio/goemail Use Configuración y envío del mensaje (html template) func main ()

Dec 31, 2021
Code for the website / Código para o site

Site crdpa.net Code for the new website This is the frontend and backend code for my new website. It is for my use only. If you want to use it, you ar

May 11, 2022
API con información de servicios del sistema de transporte público metropolitano de Santiago (Red y Metro)

APIs de Transporte Público en Santiago Saldo Bip! Permite obtener el saldo de una tarjeta Bip!, consultándolo en el sitio de RedBip!. Ejemplo: https:/

Nov 28, 2022
Desenvolvendo um sistema de Planejamento Financeiro com Golang

dio-expert-session-finance Pré Desenvolvimento Vamos criar um projeto no Github chamado dio-expert-session-finance Depois voltamos aqui para configura

Nov 7, 2021
Sistema de pagamentos desenvolvido a partir de microserviços

Sistema de Pagamentos FC Desenvolvido durante a Imersão Full Stack && Full Cycle. Neste projeto, é implementado uma solução para um sistema de pagamen

Dec 15, 2021
Desenvolvendo-Sistema-Planejamento-Financeiro-GoLang - Developing a Financial Planning System with Golang

dio-expert-session-finance Pré Desenvolvimento Vamos criar um projeto no Github

Jan 27, 2022
Repositório para a aula sobre integração do containerd com Golang
Repositório para a aula sobre integração do containerd com Golang

Integrando containers nativamente usando Golang Este é o código finalizado da aplicação Já pensou em uma alternativa ao Docker? Que tal manipular cont

May 4, 2021
Laboratorios y guías en español para aprender Docker de manera práctica

Docker Labs Laboratorios y guías en español para aprender Docker de manera práctica. Iniciando Clona el repositorio Navega a través de la carpeta de l

Jun 21, 2022
Teste prático para vaga de back-end Python / Go na Stone.

Stone_GitHub_API_Golang Teste prático para vaga de back-end Python / Go na Stone. Nota 1: Utilizar a branch Release Nota 2: É necessário adicionar o T

Jun 26, 2021
Simples exemplo de CRUD para armazenar em memoria os dados vindo do JSON.

API Growth Este repositório foi criado para colocarmos projetos em diversas linguagens com intúito totalmente didático para colaborar com a comunidade

Dec 14, 2022
Ambiente com Docker de "live-reload" para aplicações Go

Ambiente Go Um ambiente de "live reload", onde as alterações no código são observadas e re-executadas automaticamente, com Docker e Docker Compose. O

Jun 17, 2022