Routen Sie SSH-Verkehr basierend auf der Domäne mit HAProxy

4652
Constantin Jacob

Ich baue gerade mein eigenes kleines Cluster zu Hause auf und versuche, SSH-Routing (Load Balancing) mit HAProxy zu erreichen. Ich habe herausgefunden, wie man HTTP-Verkehr weiterleitet, aber ich habe Schwierigkeiten mit SSH. Ich weiß nicht genug über das TCP-Protokoll, um sofort zu wissen, wonach ich suchen muss, damit ich feststellen kann, wie Verbindungen nach etwas wie einem Host abgefragt werden (nicht sicher, ob sich das überhaupt irgendwo in der Verbindung befindet) oder einfach alles, was identifiziert werden kann in welchen Server ich SSH will.

In der Dokumentation wird immer wieder von SSH-Verkehr gesprochen, daher könnte etwas fehlen, was ich vermisst habe. Ich möchte nicht verschiedene Ports verwenden und mit anderen Ports hin und her routen, da sie möglicherweise nicht standardmäßig sind und daher in öffentlichen Netzwerken oder anderen Dingen blockiert sind, die mich einschränken würden.

Mein aktuelles Setup sieht so aus:

Anforderung an meine Domänen (oder IP) -> Router -> NAT-Weiterleitung abhängig vom Port -> HAProxy-Überwachung an diesem Port -> sollte jetzt den Datenverkehr identifizieren, der für einen bestimmten Server und Proxy-Verkehr für diesen Server bestimmt ist.

Edit: Da Cha0s aufgeräumt ist, ist dies mit SSH (oder ähnlichem) einfach nicht möglich.

Wenn Sie sich für eine andere Methode interessieren, gibt Svens Antwort einen guten Einblick, wenn Sie etwas ähnliches tun, aber unterschiedliche Subdomains in verschiedene öffentliche statische IPs auflösen

2
Warum möchten Sie den SSH-Verkehr routen und warum HA zu diesem Zweck? 030 vor 8 Jahren 0
Denn ich habe mehrere Maschinen (mac mini macht E-Mail n Sachen Himbeer-Pi 2 mit Gitlab) hinter der gleichen IP. Es ist eine statische IP-Adresse, für die ich bezahle, aber es gibt keine Möglichkeit für mich, eine zweite zu erhalten. Ich bin durch mögliche IPs eingeschränkt Constantin Jacob vor 8 Jahren 0

2 Antworten auf die Frage

2
Sven

Ich glaube, Sie mischen die Bedingungen.

Lastausgleich bedeutet normalerweise, dass Sie sich mit einem Host ( example.com) verbinden und der Load Balancer alle Verbindungen an einen oder mehrere Backend-Hosts verteilen lässt, normalerweise ohne dass der Benutzer die Kontrolle über den tatsächlichen Host hat, zu dem Sie eine Verbindung herstellen. Dies kann für SSH auf verschiedene Weise leicht durchgeführt werden.

Einige Protokolle, wie beispielsweise HTTP mit dem HostHeader, können dem Load Balancer mehr Informationen geben, um zu entscheiden, zu welchen Back-End-Servern die Verbindung geleitet werden soll (z. B. example.comwird zu aund zu b, während example.orgzu cund weitergeleitet wird d).

SSH hat kein solches Feld und kann daher nicht mit einem Lastausgleich und nur einer IP-Adresse ausgeführt werden. Dies macht eine LB für diese Aufgabe ungeeignet.

In der Regel wird dies dadurch gelöst, dass ein Host als SSH-Proxy / Gateway / Jump-Host verwendet wird und Ihre SSH-Clients angewiesen werden, ihn als solche zu verwenden. Wenn Sie OpenSSH verwenden, geben Sie Folgendes in Ihre Kunden ein~/.ssh/config

Host *.internal.lan ProxyCommand ssh -q -A -x proxy.example.com -W %h:%p 

Wenn Sie nun eine Verbindung zu den in der HostZeile aufgeführten Namen herstellen, stellt Ihr SSH-Client zunächst eine Verbindung her proxy.example.com(die auf Ihre öffentliche IP-Adresse verweisen muss) und verwendet sie als Gateway, um an den eigentlichen Computer weiterzuleiten (verwenden Sie die NAT-Port-Weiterleitung an Port 22) Ihres aktuellen Proxy-Rechners (falls zutreffend). Beachten Sie, dass proxy.example.comdas Problem behoben werden kann *.internal.lan. Richten Sie entweder einen DNS-Server ein oder verwenden Sie den internen, von Ihrem Router angebotenen, um dies zu erreichen.

Danach stellen Sie von einem externen Netzwerk aus eine Verbindung zu nas.internal.lanIhrem NAS (oder raspi.internal.lanusw.) her, und von Ihrem lokalen Netzwerk aus nutzen Sie einfach nasoder raspi(so ist die Verbindung direkt und nicht über das Gateway).

Eine andere Möglichkeit, angesichts der Tatsache, dass Sie NAT verwenden:

Erstellen Sie Portweiterleitungen in Ihrem NAT-Router, z. B.

Port 2210 -> internal host1, port 22 Port 2211 -> internal host2, port 22 

und fügen Sie dann Folgendes in Ihre Kunden ein ~/.ssh/config:

Host host1.example.com  Port 2210  Host host2.example.com  Port 2211 

host1/2.example.comStellen Sie sicher, dass beide auf Ihre externe IP-Adresse verweisen.

Dann können Sie einfach über SSH eine Verbindung herstellen host1.example.com und OpenSSH stellt eine Verbindung mit Port 2210 her, der vom NAT-Gateway an Ihren internen Host1 weitergeleitet wird.

Beide Methoden funktionieren in Ihrem Szenario.

Danke für die Antwort. Wenn Sie sich meinen letzten Kommentar unter meiner Frage ansehen, werden Sie sehen, warum dies für mich nicht möglich ist. Ich werde Ihre Antwort trotzdem bestätigen, da sie gute Informationen liefert. Constantin Jacob vor 8 Jahren 0
Das ist nicht wahr. Ich habe ein ähnliches Setup und es funktioniert einwandfrei. Sven vor 8 Jahren 0
Wenn jedoch all diese Subdomains und Hosts auf dieselbe öffentliche IP-Adresse aufgelöst werden, habe ich immer noch das Problem, dass ich den Datenverkehr nur für Ports identifizieren kann, die ich aus Gründen, die ich bereits angegeben habe, nicht verwenden möchte (Standardports verwenden möchten usw.). ..) Constantin Jacob vor 8 Jahren 0
Ich habe Ihnen gezeigt, wie Sie dieses Problem umgehen können. Es ist einfach zu handhaben und ich verwende es ständig, um hunderte von Computern zu verbinden, sowohl bei der Arbeit als auch zu Hause. Wenn Sie darauf bestehen, dass es wie bei HTTP funktioniert, haben Sie kein Glück. Sven vor 8 Jahren 0
Ja, aber Ihre erste Option besteht darin, mehrere IP-Adressen für die Öffentlichkeit zu haben. So zum Beispiel mehrere VPS mit eigener IP. Und Ihre zweite Möglichkeit ist NAT und Portweiterleitung vorzuschlagen, die ich nicht verwenden möchte, weil einige seltsame Ports blockiert werden (z. B. bei meiner Arbeit). Daher gibt es keine Möglichkeit für mich zu erreichen. Constantin Jacob vor 8 Jahren 0
Glauben Sie mir, das funktioniert mit nur einer IP-Adresse. Ich benutze es täglich. Sven vor 8 Jahren 0
Okay. Ich war mir nur nicht sicher, ob wir beide Punkte vermissen. Ich werde heute Abend dein Setup ausprobieren Constantin Jacob vor 8 Jahren 1
Das hat tatsächlich funktioniert. Ich verstehe jetzt, dass Sie darüber gesprochen haben. Lesen Sie den ProxyCommand. Constantin Jacob vor 8 Jahren 0
Ich werde versuchen, meine Antwort so zu bearbeiten, dass die Leute Ihre Antwort betrachten und versuchen, sie zu verstehen. Es war (für mich) etwas schwierig, Ihre Antwort zuerst zu durchdringen. Danke, dass Sie an Ihrer Meinung festgehalten haben und mich dazu bringen, es zu versuchen! : D Constantin Jacob vor 8 Jahren 0
0
Cha0s

AFAIK können Sie dies auf der Domain nicht tun. HTTP kann so funktionieren, da es einen speziellen HostHeader hat, den die Browser (in diesem Fall Reverse-Proxies) verstehen und auf dieser Grundlage Entscheidungen treffen können.

Bei anderen TCP-Protokollen kenne ich nichts Ähnliches. Auf keinen Fall auf SSH.

SSH-Routing (Load-Balancing) ist also definitiv unmöglich? Constantin Jacob vor 8 Jahren 0