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