Proxy von TCP nach Hostname

8

Ich habe mehrere TCP-Ports für Spieleserver auf meinem einzelnen Hostcomputer. Ziel ist es, dass Benutzer eine Verbindung zu server1.domain.net herstellen können und ihre Anweisungen auf dieser Subdomain basieren. Mein erster Instinkt schrieb Folgendes, aber dann wurde mir klar, dass der TCP-Verkehr keinen Header zum Lesen haben wird. Verwenden von HAProxy 1.5.8. Ich habe versucht, dasselbe mit mehreren Backends, use_backend und vollständigen ACL-Zeilen zu tun, habe aber (verständlicherweise) das gleiche Ergebnis erzielt.

listen game-listener
  bind x.x.x.x:22222
  mode  tcp
  use-server  server1 if { hdr(host) -i server1.domain.net }
  use-server  server2 if { hdr(host) -i server2.domain.net }
  server server1 localhost:22201 check
  server server2 localhost:22202 check

Gibt es eine Prüfung wie hdr (Host), die ich für TCP-Verbindungen verwenden kann? Oder mache ich es richtig und das Spiel spielt einfach nicht gut?

Vielen Dank!

shaun m
quelle
Dies ist nicht einmal möglich, es sei denn, das Proxy-Protokoll unterstützt dies und die meisten nicht.
Michael Hampton
1
Sind sich diese Spiele SRVbewusst? Dies würde die Möglichkeit eröffnen, das Problem in DNS zu lösen, sodass kein Proxy mehr erforderlich ist.
Håkan Lindqvist
Daran hatte ich nicht gedacht. Dies sind Minecraft-Server und einige schnelle Googler haben diesen Beitrag aufgetaucht, was eine gute Antwort zu sein scheint: serverfault.com/questions/474225/… Danke! Wenn Sie Ihrem Kommentar eine Antwort geben, werde ich ihn akzeptieren.
Shaun m

Antworten:

4

Als Alternative zum Proxy (wo dies vom Anwendungsprotokoll abhängt, wenn dies anhand von Hostnamen möglich ist) möchten Sie möglicherweise überprüfen, ob die Client-Software dies SRVweiß. In diesem Fall sollten Sie dies nur in DNS einrichten können.

Ein SRVDatensatz hat das folgende Format:

_Service._Proto.Name TTL Class SRV Priority Weight Port Target


In Ihrem speziellen Beispiel, in dem Sie mehrere Instanzen von Minecraft erwähnt haben, sollte es möglich sein, dies basierend auf SRVDatensätzen zu tun, und die Datensätze könnten ungefähr so ​​aussehen:

_minecraft._tcp.foo.example.com. 86400 IN SRV 0 5 25565 server1.example.com.
_minecraft._tcp.bar.example.com. 86400 IN SRV 0 5 25566 server1.example.com.
Håkan Lindqvist
quelle
4

Das Versenden von Verbindungen zu verschiedenen Backends in Abhängigkeit vom Hostnamen, mit dem der Client verbunden ist, ist auf der TCP-Ebene nicht möglich.

Sie müssen entweder separate IP-Adressen für jeden Hostnamen verwenden oder das Proxy auf Anwendungsebene mit protokollspezifischem Code implementieren, um den Hostnamen zu erkennen.

Ein solcher Proxy ist für bestimmte Protokolle möglich, für andere jedoch nicht. Die Protokolle, von denen ich genug weiß, reichen von einfach bis unmöglich:

  • HTTP ist einfach zu unterstützen. Alle HTTP / 1.1-Clients und die meisten HTTP / 1.0-Clients senden einen Host-Header, bevor sie eine Antwort vom Server erwarten. Clients ohne Host-Header sind wahrscheinlich schon lange nicht mehr verfügbar, da viele Websites heutzutage ohne diesen nicht mehr funktionieren.
  • HTTPS kann für alle Clients mit SNI-Unterstützung unterstützt werden. SNI wurde viel jünger als HTTP / 1.1 standardisiert. Es gibt immer noch einige Clients ohne SNI-Unterstützung.
  • DNS ist zwar zu unterstützen, aber etwas knifflig. In den meisten Fällen betreiben Sie Ihren autorisierenden DNS-Server nur direkt an einer öffentlichen IP-Adresse, anstatt einen Proxy zu erstellen.
  • SMTP ist zwar zu unterstützen, aber auch schwierig. Ein Proxy für SMTP würde wahrscheinlich eher wie ein SMTP-Relay als wie ein Proxy aussehen.
  • SSH ist unmöglich zu unterstützen. Das Konzept der Hostnamen existiert im Protokoll einfach nicht. Der Client verwendet möglicherweise DNS, um die IP-Adresse des Servers aufzulösen, und ordnet möglicherweise gespeicherte Hostschlüssel ihren Hostnamen zu. Dies ist jedoch ein Implementierungsdetail auf der Clientseite. Dies wäre für den Proxy nicht sichtbar und kann daher nicht zum Versenden von Verbindungen verwendet werden. Darüber hinaus werden keine nützlichen Informationen im Klartext gesendet, und selbst die wenigen Informationen, die zu Beginn des SSH-Protokolls im Klartext gesendet werden, werden später im Protokoll authentifiziert. Wenn Sie also einen Teil davon falsch verstehen, wird die Kommunikation unterbrochen. Was dies noch unmöglicher macht, ist die Tatsache, dass der Client nicht einmal ein Byte Nutzlast sendet, bis der Server ein Banner an den Client zurückgesendet hat.

Mir ist kein anderes Protokoll mit einem Hostnamen bekannt, das für solche Zwecke verwendet werden könnte. Ich vermute also, dass die meisten Protokolle, die nicht in der obigen Liste aufgeführt sind, nicht durch den Hostnamen ersetzt werden können.

Kasperd
quelle
... eine Problemumgehung für SSH ist das Einrichten eines einzelnen Bastionsservers an einem bestimmten Port für SSH. Von dort ist es eine einfache TCP-Weiterleitung für diesen Port. Sobald Sie drinnen sind, haben Sie vollen Zugriff auf die Maschinen, die Ihr Bastionsserver erreichen kann. SSH'ception '... "Wir müssen tiefer gehen!"
BradChesney79