[LINUX] Ich möchte Wake On LAN vollautomatisch ausführen

Dieser Artikel ist der 7. Tagesartikel von KLab Engineer Adventskalender 2019. Ich war spät dran, als ich Probleme beim Debuggen hatte ...

Das Thema systemd, TCP-Proxy und Wake On LAN.

Motivation und Zusammenfassung

Ich bin ein Mac-Benutzer, aber manchmal verwende ich meinen Windows-Computer zu Hause über einen Remotedesktop.

Dieser Windows-Computer wird normalerweise in den Ruhezustand versetzt. Wenn Sie ihn also verwenden möchten, müssen Sie zuerst ein magisches Wake-On-LAN-Paket werfen, um es zu aktivieren [^ 1].

image.png

[^ 1]: Es handelt sich um einen Remotedesktop-Computer, der nicht erreichbar ist, da er normalerweise nicht verwendet wird.

Es ist jedoch nicht ungewöhnlich, die MAC-Adresse eines Windows-Computers oder den Befehl zum Auslösen eines magischen Pakets zu vergessen.

Natürlich sind die Befehle, die ich zuvor verwendet habe, noch in der Historie, so dass ich sie verwalten kann, aber zunächst scheint es mühsam zu sein, jedes Mal magische Pakete manuell zu werfen.

Daher habe ich einen TCP-Proxy mit systemd konfiguriert und einen Mechanismus erstellt, um automatisch ein magisches Paket zu werfen, bevor eine Verbindung zum Proxy hergestellt wird. Ich habe einen Raspberry Pi, der immer in meinem Haus läuft, deshalb habe ich beschlossen, hier einen TCP-Proxy zu betreiben.

image.png

Auf diese Weise müssen Sie keine magischen Pakete mehr auf Ihren Mac werfen und sich bei Windows anmelden, indem Sie einfach das Verbindungsziel auf der GUI des Remotedesktops auswählen.

In diesem Artikel werden die Details dieses Mechanismus vorgestellt. Da es keinen protokollabhängigen Teil gibt, sollte es möglich sein, ihn anders als den Remotedesktop zu verwenden.

Wirf ein magisches Paket von systemd

systemd ist ein leistungsstarkes Service-Management-Programm, das in Linux eingeführt wurde.

Zunächst werde ich den Prozess des Werfens eines magischen Pakets vorstellen. Dies wurde in der Oneshot-Servicevorlage beschrieben.

/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

Eine Dienstvorlage ist ein Mechanismus, der einen Teil des Dienstnamens (Instanzzeichenfolge) in eine variable Zeichenfolge konvertiert und an den Dienst übergibt. Hier wird die MAC-Adresse angegeben und als Instanzzeichenfolge verwendet.

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

Dadurch wird ein magisches Paket an die MAC-Adresse 00: 00: 5e: 00: 53: 01 gesendet.

Werfen Sie magische Pakete, bevor Sie eine Verbindung mit dem TCP-Proxy herstellen

Als nächstes erstellen wir einen TCP-Proxy mit systemd. Dies ist eine 2-Datei-Struktur.

/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

Aktivieren Sie nach der Installation der obigen Datei den automatischen Start.

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

Durch Setzen von "ListenStream =" wird TCP 3389 abgehört und an den Dienst [^ 2] übergeben. Wenn "Akzeptieren = Ja", müssen Sie eine Dienstvorlage mit demselben Namen erstellen.

[^ 2]: Sie können auch ListenDatagram = verwenden, um UDP abzuhören.

/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

Der Dienst, der das zuvor erstellte magische Paket auslöst, ist unter "Erforderlich" angegeben.

Der Hauptprozess ist das Proxying mit Netcat. Für jede Verbindung wird ein Prozess gestartet.

Das einfache Proxying mit Netcat funktionierte jedoch nicht wie erwartet. Da es eine Zeitverzögerung zwischen dem Auslösen eines magischen Pakets und dem Abhören des Remotedesktopservers gibt, müssen Sie eine Weile warten, bevor Sie eine Verbindung herstellen können. Bevor ich eine Verbindung herstellte, habe ich mit ExecStartPre geprüft, ob ich eine TCP-Verbindung herstellen kann, und nachdem ich eine Verbindung herstellen konnte, habe ich einen Proxy erstellt.

Die IP-Adresse und die MAC-Adresse sind nur Beispiele. Ändern Sie sie daher entsprechend, wenn Sie die obigen Einstellungen verwenden.

Versuch es

Als ich es tatsächlich benutzte, war es praktischer als ich erwartet hatte. Ich verwende Raspberry Pi 2 als Proxy, aber es scheint kein Leistungsproblem zu geben (soweit ich experimentiert habe, gab es einen Spielraum bei der CPU-Auslastung und der Netzwerkbandbreite).

Übrigens gibt es in meiner Umgebung eine Zeitverzögerung von ungefähr 30 Sekunden von der Verbindung zum Proxy bis zur Verbindung zum Remotedesktop mit dem schlafenden Windows. Es ist nicht unerträglich, aber ich denke, es ist zu spät, daher kann es einige Verbesserungen geben.

Zusammenfassung

Ich habe einen TCP-Proxy mit systemd erstellt und gezeigt, dass jeder externe Befehl vor seiner Verbindung ausgeführt werden kann. Dieses Mal habe ich ein magisches Wake On LAN-Paket mit einem externen Befehl geworfen, aber es scheint, dass es auch angewendet werden kann, z. B. nach dem Starten einer AWS-Instanz.

Wie auch immer, systemd kann alles ...

Referenz-URL

Recommended Posts

Ich möchte Wake On LAN vollautomatisch ausführen
Ich möchte pyenv + pipenv auch unter Windows machen
Ich möchte ○○ mit Pandas machen
Ich möchte Android-Apps auf Android entwickeln
Ich möchte Dunnetts Test in Python machen
Eine Bibliothek für Datenwissenschaft "Ich möchte das tun" auf dem Jupyter Notebook
Selbst Anfänger möchten sagen "Ich verstehe Python voll und ganz"
Ich möchte ein beliebtes Paket auf PyPi finden
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte OpenJDK 11 mit Ubuntu Linux 18.04 LTS / 18.10 verwenden
Ich möchte automatisch eine Unternehmensgründungs-E-Mail senden
Ich möchte am Ende etwas mit Python machen
Ich möchte SUDOKU lösen
Ich möchte automatisch einen modernen Metal-Bandnamen generieren
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
Ich möchte Interrupts auf dem Raspberry Pi deaktivieren (≒ DI / EI)
Ich möchte meine Abschlussarbeit über IPython Notebook ankündigen
[Django] Ich möchte mich nach einer neuen Registrierung automatisch anmelden
[AWS EC2] Einstellungen, die Sie unter Amazon Linux 2 vornehmen möchten
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
Ich möchte systemd grob verstehen
MacBookPro-Setup Schließlich möchte ich eine Neuinstallation durchführen
Ich möchte wissen, ob Sie Python auf Mac ・ Iroha installieren
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
Ich möchte Google Form jeden Morgen um 5 Uhr automatisch beantworten
Ich möchte Bilder kratzen und trainieren
Ich möchte Yolos Anmerkung kopieren
Ich möchte mit Python debuggen
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Ich möchte Python-Code auf VS-Code nach meinen Wünschen formatieren und überprüfen
Ich möchte Affenpatches nur teilweise sicher mit Python machen
Ich möchte Spyder an die Taskleiste anheften
Ich möchte kühl auf die Konsole ausgeben
Ich möchte in der Einschlussnotation drucken
Ich möchte sie alle zusammen kratzen.
Ich möchte mit dem Reim Teil1 umgehen
Ich möchte wissen, wie LINUX funktioniert!
Ich möchte mit dem Reim part3 umgehen
Ich möchte ein Glas aus Python verwenden
Aktivieren Sie WOL (Wake On LAN) auf Manjaro KDE
Ich möchte Protokolle mit Python analysieren
Ich war auf dotCloud süchtig nach Flask
Ich möchte mit aws mit Python spielen
Ich möchte IPython Qt Console verwenden
Ich möchte ein Automatisierungsprogramm erstellen!
Lassen Sie uns zusammenfassen, was Sie tun möchten.
Ich möchte mit dem Reim part2 umgehen
Ich möchte, dass CAPTCHA HIWAI-Wörter sagt
Ich möchte den Transferstatus der 2020 J League visualisieren. Was soll ich tun?
Ich möchte eine Datei auf tkinter ablegen und ihren Pfad abrufen [Tkinter DnD2]
Ich möchte maschinelles Lernen auch ohne Server durchführen - Time Series Edition -
Ich möchte horizontalen Text in vertikalen Text konvertieren und auf Twitter usw. veröffentlichen.
Ich möchte so etwas wie AutoHotkey mit AutoKey unter Ubuntu (Kali Linux) erreichen.
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte an eine Wiederholung denken können