Reverse SSH für ein Gerät: Loopback-Listener oder geroutetes VPN?
Ein Verwaltungsport für ein Gerät, das nur ausgehend wählen kann. Drei Bedingungen entscheiden, ob ein Reverse-Tunnel reicht oder ein echter gerouteter Pfad nötig ist.
Ihr Gerät sitzt hinter dem NAT eines Anbieters, es kann ausgehende Verbindungen öffnen, und es betreibt einen SSH-Server, den niemand erreichen kann. Die Anfrage, die ankommt, lautet meist "gib ihm ein VPN", was eine Antwort unter mehreren ist. Bevor Sie sie annehmen, entscheiden Sie, ob Sie einen administrativen TCP-Port brauchen oder einen gerouteten Pfad in ein ganzes Subnetz, denn das sind verschiedene Projekte mit unterschiedlicher Exposition.
Ein Reverse-Tunnel beantwortet die schmale Variante gut. Das Gerät wählt sich zu Ihrem Hub ein, bittet den Hub, auf einem Loopback-Port zu lauschen, und leitet diesen Port zurück an seinen eigenen SSH-Dienst. Administratoren erreichen den Listener dann über den Hub, nicht über das öffentliche Internet.
Drei Bedingungen, die die Wahl entscheiden
Schreiben Sie sie vor jeder Konfiguration auf. Sie sind die Grenze zwischen einem begrenzten Verwaltungszugang und einer Netzwerkerweiterung, und sie zu vermischen ist der Weg, auf dem aus einem Tunnel mit fünf Zeilen ein herrenloses flaches Netz wird.
| Condition | Reverse tunnel fits | Something else is needed |
|---|---|---|
| How many services must be reachable? | One, or a small fixed set on loopback | Anything that needs many ports or dynamic discovery |
| Who connects, and how are they authenticated? | Named administrators with their own hub accounts | Third parties, or anything needing per-flow audit you do not control |
| Does the device's own LAN need to be reachable? | No | Yes, so a routed VPN or a managed platform is the honest answer |
Die dritte Zeile ist die, über die gestritten wird. Ein Tunnel zum SSH-Port eines Geräts bringt seine Nachbarn nicht in Ihr Netz, und es sollte nicht durch eine Kette weiterer Weiterleitungen so aussehen, als täte es das. Wenn die Anforderung wirklich das LAN ist, sagen Sie es und entwerfen Sie lieber dieses.
Hub-Seite: ein begrenztes Relay-Konto
Geben Sie jedem Gerät sein eigenes Relay-Konto mit Public-Key-Authentifizierung und ohne interaktive Sitzung. Match Block, der auf dieses Konto beschränkt ist, hält die Erlaubnis klein, und der private Schlüssel bleibt auf dem Gerät, wohin er gehört.
Match User relay-dev-7
AuthenticationMethods publickey
PubkeyAuthentication yes
AllowTcpForwarding remote
PermitListen 127.0.0.1:21022
GatewayPorts no
MaxSessions 0
PermitTTY no
X11Forwarding no
AllowAgentForwarding no
MaxSessions 0 ist die interessante Zeile. Sie verweigert Shell- und Subsystem-Sitzungen und erlaubt dennoch die Weiterleitung, die das Gerät braucht, sodass ein gestohlener Schlüssel nicht in einen interaktiven Login verwandelt werden kann. PermitListen fixiert Adresse und Port des Listeners auf der Hub-Seite, und GatewayPorts no hält ihn auf Loopback, statt ihn für das Netz zu öffnen, in dem der Hub steht.
Testen Sie die effektive Konfiguration vor dem Neuladen und halten Sie währenddessen eine zweite Sitzung offen. Match Block, der versehentlich für alle gilt, oder ein Tippfehler in einem Optionsnamen ist der klassische Weg, sich aus der Kiste auszusperren, die man härtet. Geben Sie die laufende Konfiguration aus und lesen Sie die Optionen zurück, statt der Datei zu vertrauen, die Sie gerade geschrieben haben. Beachten Sie, dass die Optionsunterstützung sich zwischen Builds unterscheidet, sodass eine akzeptierte Zeile in einem neueren Server von einem älteren einfach ignoriert werden kann.
Geräteseite: Weiterleitung, die laut scheitert
Das Gerät öffnet die Verbindung und fordert den Listener an. Die beiden Adressen im -R -Argument bedeuten Unterschiedliches, und sie von links nach rechts zu lesen ist der schnellste Weg, sich zu merken, welche welche ist.
ssh -NT \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-R 127.0.0.1:21022:127.0.0.1:22 \
[email protected]
Das linke Paar ist, wo der Hub lauschen soll. Das rechte Paar ist das, womit das Gerät sich verbindet, wenn eine Anfrage eintrifft, aufgelöst von der Geräteseite aus. Sie zu vertauschen ergibt einen Tunnel, der sauber hochkommt und an die falsche Stelle weiterleitet, was schlimmer als ein Fehlschlag ist.
ExitOnForwardFailure=yes lässt den Befehl beenden, wenn der angeforderte Listener nicht aufgebaut werden kann, sodass eine Neustartschleife Ihnen die Wahrheit sagt, statt eine halb funktionierende Sitzung zu hinterlassen. Es sagt nichts darüber, ob der lokale SSH-Dienst später gesund ist, also kombinieren Sie es mit einem Prozessmanager und einem gelegentlichen echten Verbindungstest.
Ersetzen Sie die Loopback-Listenadresse niemals durch einen Platzhalter, um einen zusätzlichen Sprung zu vermeiden. Diese eine Änderung ist der Unterschied zwischen einem Verwaltungspfad und einem öffentlich erreichbaren Port, und sie passiert meist beim Debuggen und bleibt dann. Wenn ein Kollege den Port über den Hub nicht erreicht, reparieren Sie die Jump-Konfiguration, statt die Bindung zu erweitern. Loopback ist das ganze Sicherheitsargument dieses Designs.
Administratorzugang über den Hub
Ein Administrator mit einem gewöhnlichen Konto auf dem Hub kann darüber zum weitergeleiteten Port springen. Das Relay-Konto wird dafür nicht verwendet, und genau darum geht es, sie getrennt zu halten.
ssh -J [email protected] -o HostKeyAlias=device-7 \
-p 21022 [email protected]
Prüfen Sie den Hostschlüssel des Geräts unter dem gewählten Alias, denn dieser Schlüssel identifiziert das Gerät am Ende der Kette, und der Tunnel ist nur Transport. Der End-to-End-Login authentifiziert weiterhin beide Enden; ein Tunnel, der auf einem gemeinsamen Hub endet, macht ihn nicht von selbst zu einem vertrauenswürdigen Pfad.
Übernehmen Sie den Lebenszyklus
Betreiben Sie den Gerätebefehl unter einem Prozessmanager mit genau einer aktiven Instanz und einer Neustartrichtlinie, die Sie bewusst gewählt haben. Die Keepalive-Optionen erkennen einen toten Partner; sie erwecken keinen Prozess wieder, der beendet wurde.
Schreiben Sie dann das Außerbetriebnahmeverfahren. Jedes Gerät bekommt seinen eigenen Listener und seinen eigenen Schlüssel, also bedeutet Stilllegung, dieses Konto zu widerrufen und diesen Schlüssel zu entfernen, nicht ein flottenweites Geheimnis zu rotieren, das jedes andere Gerät teilt.
Denken Sie schließlich daran, was Loopback Ihnen kauft. Es begrenzt die Netzwerkexposition und tut nichts gegen andere lokale Benutzer auf einem gemeinsamen Hub, also muss die Zugriffsrichtlinie des Hubs selbst weiterhin stimmen. sshd_config-Referenz dokumentiert jede der oben verwendeten Optionen, und es lohnt sich, die Weiterleitungsabschnitte vollständig zu lesen, bevor Sie eine davon erweitern.