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.
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].
[^ 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.
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.
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.
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.
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.
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 ...
Recommended Posts