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!
tcp
haproxy
access-control-list
gameserver
shaun m
quelle
quelle
SRV
bewusst? Dies würde die Möglichkeit eröffnen, das Problem in DNS zu lösen, sodass kein Proxy mehr erforderlich ist.Antworten:
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
SRV
weiß. In diesem Fall sollten Sie dies nur in DNS einrichten können.Ein
SRV
Datensatz hat das folgende Format:In Ihrem speziellen Beispiel, in dem Sie mehrere Instanzen von Minecraft erwähnt haben, sollte es möglich sein, dies basierend auf
SRV
Datensätzen zu tun, und die Datensätze könnten ungefähr so aussehen:quelle
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:
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.
quelle