Je veux faire Wake On LAN de manière entièrement automatique

Cet article est l'article du 7ème jour du Calendrier de l'Avent KLab Engineer 2019. J'étais en retard quand j'avais des problèmes de débogage ...

Le sujet de systemd, proxy TCP et Wake On LAN.

Motivation et synopsis

Je suis un utilisateur Mac, mais j'utilise parfois ma machine Windows à la maison via un bureau distant.

Cette machine Windows est généralement mise en veille, donc si vous voulez l'utiliser, vous devez d'abord lancer un paquet magique Wake On LAN pour la réveiller [^ 1].

image.png

[^ 1]: Il s'agit d'une machine dédiée au bureau distant et hors de portée car elle n'est normalement pas utilisée.

Cependant, il n'est pas rare d'oublier l'adresse MAC d'une machine Windows ou d'oublier la commande de lancer un paquet magique en premier lieu.

Bien sûr, les commandes que j'ai utilisées auparavant sont toujours dans l'historique, donc je peux les gérer, mais en premier lieu, il semble difficile de lancer manuellement des paquets magiques à chaque fois.

Par conséquent, j'ai configuré un proxy TCP avec systemd et créé un mécanisme pour lancer automatiquement un paquet magique avant de me connecter au proxy. J'ai un Raspberry Pi qui fonctionne toujours chez moi, j'ai donc décidé d'exploiter un proxy TCP ici.

image.png

Cela élimine le besoin de lancer un paquet magique sur votre Mac et vous pouvez vous connecter à Windows simplement en sélectionnant la destination de connexion à partir de l'interface graphique du bureau distant.

Cet article présentera les détails de ce mécanisme. Puisqu'il n'y a pas de partie dépendant du protocole, il devrait être possible de l'utiliser autre que le bureau à distance.

Lancez un paquet magique de systemd

systemd est un programme de gestion de services haute performance adopté dans Linux récent.

Tout d'abord, je vais vous présenter le processus de lancement d'un paquet magique. Cela a été décrit dans le modèle de service OneShot.

/etc/systemd/system/[email protected]


[Unit]
Description = Sending Wake on LAN packet (oneshot)
After = network-online.target
Wants = network-online.target

[Service]
Type = oneshot
ExecStart = /usr/sbin/etherwake %i

Un modèle de service est un mécanisme qui convertit une partie du nom du service (chaîne de caractères d'instance) en une chaîne de caractères variable et la transmet au service. Ici, l'adresse MAC est spécifiée et utilisée comme chaîne de caractères d'instance.

$ sudo systemctl start wol@00:00:5e:00:53:01.service

Cela enverra un paquet magique à l'adresse MAC 00: 00: 5e: 00: 53: 01.

Lancez des paquets magiques avant de vous connecter avec le proxy TCP

Ensuite, nous allons créer un proxy TCP avec systemd. Il s'agit d'une structure à 2 fichiers.

/etc/systemd/system/rdp-proxy.socket


[Unit]
Description = Socket for RDP (Remote Desktop Protocol) proxy

[Socket]
ListenStream = 0.0.0.0:3389
Accept = yes

[Install]
WantedBy = sockets.target

Après avoir installé le fichier ci-dessus, activez le démarrage automatique.

$ sudo systemctl enable rdp-proxy.socket
$ sudo systemctl start rdp-proxy.socket

En définissant ListenStream =, il écoute sur TCP 3389 et le transmet au service [^ 2]. De plus, si ʻAccepter = yes`, vous devez créer un modèle de service avec le même nom.

[^ 2]: Vous pouvez également utiliser ListenDatagram = pour écouter sur UDP.

/etc/systemd/system/[email protected]


[Unit]
Description = Server for RDP (Remote Desktop Protocol) Proxy
Requires = wol@00:00:5e:00:53:01.service
After = network-online.target wol@00:00:5e:00:53:01.service
Wants = network-online.target

[Service]
Type = simple
ExecStartPre = /usr/bin/timeout 60 /bin/sh -c 'until /bin/nc -w 5 -z 192.0.2.1 3389; do sleep 1; done'
ExecStart = /bin/nc -q 10 192.0.2.1 3389
StandardInput = socket
StandardOutput = socket
StandardError = journal

Le service qui lance le paquet magique créé précédemment est spécifié dans Requiert.

Le processus principal est le proxy à l'aide de netcat. Un processus sera lancé pour chaque connexion.

Cependant, le simple proxy avec netcat ne fonctionnait pas comme prévu. Comme il y a un décalage entre le lancement d'un paquet magique et le passage du serveur de bureau distant à un état d'écoute, vous devez attendre un moment avant de pouvoir vous connecter. Par conséquent, avant de me connecter, j'ai utilisé ʻExecStartPre` pour vérifier si la connexion TCP était possible, et j'ai créé un proxy après qu'il soit devenu possible de se connecter.

L'adresse IP et l'adresse MAC sont fournies à titre d'exemple uniquement, alors changez-les si nécessaire lorsque vous utilisez les paramètres ci-dessus.

Essaye le

Quand je l'ai utilisé, c'était plus pratique que ce à quoi je m'attendais. J'utilise Raspberry Pi 2 comme proxy, mais il ne semble y avoir aucun problème de performances (car j'avais une marge dans la charge du processeur et la bande passante réseau dans la mesure où j'ai expérimenté).

À propos, dans mon environnement, il y a un délai d'environ 30 secondes entre la connexion au proxy et la connexion au bureau distant au Windows en veille. Ce n'est pas insupportable, mais je pense qu'il est trop tard, alors il peut y avoir des améliorations.

Résumé

J'ai créé un proxy TCP avec systemd et montré que toute commande externe peut être exécutée avant sa connexion. Cette fois, j'ai lancé un paquet magique Wake On LAN avec une commande externe, mais il semble qu'il puisse également être appliqué, comme la connexion après le lancement d'une instance AWS.

Quoi qu'il en soit, systemd peut tout faire ...

URL de référence

Recommended Posts

Je veux faire Wake On LAN de manière entièrement automatique
Je veux faire pyenv + pipenv même sous Windows
Je veux faire ○○ avec les Pandas
Je souhaite développer des applications Android sur Android
Je veux faire le test de Dunnett en Python
Une bibliothèque pour la science des données "Je veux faire ça" sur le bloc-notes Jupyter
Même les débutants veulent dire "Je comprends parfaitement Python"
Je veux trouver un package populaire sur PyPi
Je veux bien comprendre les bases de Bokeh
Je veux AWS Lambda avec Python sur Mac!
Je souhaite utiliser OpenJDK 11 avec Ubuntu Linux 18.04 LTS / 18.10
Je souhaite envoyer automatiquement un e-mail de création d'entreprise
Je veux faire quelque chose avec Python à la fin
Je veux résoudre SUDOKU
Je veux générer automatiquement un nom de groupe de metal moderne
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Je souhaite désactiver les interruptions sur le Raspberry Pi (≒ DI / EI)
Je souhaite annoncer ma thèse de fin d'études sur IPython Notebook
[Django] Je souhaite me connecter automatiquement après une nouvelle inscription
[AWS EC2] Paramètres que vous souhaitez effectuer sur Amazon Linux 2
Je veux trouver automatiquement des pièces de haute qualité à partir des vidéos que j'ai tournées
Je veux comprendre à peu près systemd
Configuration MacBookPro Après tout, je veux faire une installation propre
Je veux savoir si vous installez Python sur Mac ・ Iroha
Je souhaite rechercher le texte intégral avec elasticsearch + python
Je souhaite répondre automatiquement au formulaire Google à 17 heures tous les matins
Je veux gratter des images et les former
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
Je veux tweeter Twitter avec Python, mais j'y suis accro
Je veux formater et vérifier le code Python à mon goût sur VS Code
Je veux faire un patch monkey seulement en partie en toute sécurité avec Python
Je veux épingler Spyder à la barre des tâches
Je veux sortir froidement sur la console
Je veux imprimer dans la notation d'inclusion
Je veux les gratter tous ensemble.
Je veux gérer la rime part1
Je veux savoir comment fonctionne LINUX!
Je veux gérer la rime part3
Je veux utiliser jar de python
Activer WOL (Wake On LAN) sur Manjaro KDE
Je veux analyser les journaux avec Python
J'étais accro à Flask sur dotCloud
Je veux jouer avec aws avec python
Je souhaite utiliser la console IPython Qt
Je veux faire un programme d'automatisation!
Résumons ce que vous voulez faire.
Je veux gérer la rime part2
Je veux que CAPTCHA dise des mots HIWAI
Je souhaite visualiser l'état des transferts de la J League 2020, que dois-je faire?
Je veux déposer un fichier sur tkinter et obtenir son chemin [Tkinter DnD2]
Je veux faire du machine learning même sans serveur - Time Series Edition -
Je souhaite convertir du texte horizontal en texte vertical et le publier sur Twitter, etc.
Je veux réaliser quelque chose comme AutoHotkey avec AutoKey sur Ubuntu (Kali Linux)
Je veux faire de matplotlib un thème sombre
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je veux pouvoir penser à la récurrence