Reverse-Proxy für Gameserver

tsit239

Cadet 2nd Year
Registriert
März 2024
Beiträge
25
Hallo zusammen,

folgendes Szenario:

  • Ich habe einen Server mit der externen IP 1.2.3.4 der von außen über Port 25001 und 25002 erreichbar ist
  • Auf diesem laufen über Docker zwei Gameserver-Container (Port 25001 und 25002)
  • Das Spiel hat einen Standardport 27321. Die Ports 25001 und 25002 würden der Host-Port und 27321 der Container-Port sein
  • Ich habe die Domäne example.com mit den beiden A-Records server-01.example.com in A 1.2.3.4 und server-02.example.com in A 1.2.3.4
Nun möchte ich, dass Anfragen an server-01.example.com an 1.2.3.4:25001 gehen und Anfragen an server-02.example.com an 1.2.3.4:25002 gehen.

Für HTTP-Anfragen lässt sich da ja ganz einfach mit einem Reverse Proxy (z.B. Nginx Proxy Manager) realisieren, aber wie mache ich das mit nicht HTTP-Anfragen? Es gibt beim Nginx Proxy Manager zwar Stream, aber dort kann man nur sämtliche Anfragen an einen Port weiterleiten, nicht welche an bestimmte Domains.

Vielen Dank schonmal!
 
Moment hier stand Mist.

Edit: Du hast zB ein Spiel, nehmen wir Minecraft und davon zwei Instanzen, die nach Außen über 25001 und 25002 erreichbar sind.
Und jetzt willst du mit server1.example.com und server2.example.com auf den jeweiligen Spielesever zugreifen. Das geht m.E. leider nicht mit Subdomains in deinem Fall. Du müsstest im Spielclient die URL example.com:25001 und example.com:25002 angeben. Vielleicht ist aber mein Horizont da auch zu beschränkt. Bei Minecraft kann man aber zB eine Portangabe machen. Das wäre Voraussetzung dafür, dass dein Konstrukt funktioniert.

Edit2: Ich erinnere mich dunkel, dass Traefik auch UDP Traffic durch die Gegend proxyen kann. Glaub in Verbindung mit deinen Containerlösungen wäre das evt. deine Problemlösung.
 
Zuletzt bearbeitet:
tsit239 schrieb:
Das Spiel hat einen Standardport 27321. Die Ports 25001 und 25002 würden der Host-Port
Wie weiß der Spieleclient, dass er auf 25001 anfragen soll?
Wenn der Game Port 27321 ist, dann schickt das game die Anfrage auch an 27321 raus.
Oder kannst du explizit den Port angeben?
Und falls du das kannst, warum passt du nicht den Port im Container ebenfalls an?

Einen Reverse Proxy nimmst du ja nur zum einen wegen dem Zertifikat und natürlich weil Websurfende deine Ports nicht kennen, so dass von außen betrachtet alles auf Port 443 läuft.
 
Ein HTTP-Reverse-Proxy funktioniert nur, weil im Request die Domain mitgeschickt wird, die der Client kontaktieren möchte. Deine Spiele werden ziemlich sicher ein eigenes Protokoll verwenden, sodass der Proxy keine Ahnung hat, an welchen Server der Request gehen soll.

Von daher wirst du nicht darum herumkommen, den Port beim Verbinden mit anzugeben. Dann ist es auch Wurst, welche Domain du verwendest.

Alternativ kannst du IPv6 verwenden, da kann dann jeder Rechner seine eigene Domain erhalten.
 
  • Gefällt mir
Reaktionen: Nilson, liggy und Helge01
Ich habe gerade ein ähnliches Szenario, nutze aber normal nginx dafür.

Zunächst sei gesagt, falls da noch SSL implementiert werden soll, wirds recht schnell, recht komplex.

Ich offeriere zwei Dienste über zwei verschiedene Subdomains, auf EINEN Reverse Proxy zu zwei lokalen VMs/ Hosts.

Beide Dienste sind von außen über :80/:443 erreichbar, der Reverse Proxy erkennt die Zieldomain und leitet an den im server {} Block backend_server weiter.

z.B.

nextcloud.meinedomain.de:443 (Port muss nicht angegeben werden)

UND

ftp.meinedomain.de:80

Bei mir sind es Nextcloud und Plex, Nextcloud hört default auf 80/443, Plex hört auf 32400.

d.h. ich leite am Reverse Proxy den Traffic für

nextcloud.meinedomain.de an z.B. 10.20.30.1:433 weiter

Und

plex.meinedomain.de an z.B.
10.20.30.2:32400

HTTP ist da relativ simpel... aber mit HTTPS wird es schnell komplex, Plex klappt bei mir derweil, Nextcloud scheitert an der Requestweiterleitung von Reverse Proxy zu Host.
Ergänzung ()

nd jetzt willst du mit server1.example.com und server2.example.com auf den jeweiligen Spielesever zugreifen. Das geht m.E. leider nicht mit Subdomains in deinem Fall.

Was bedeutet: "In deinem Fall"?

Wenn beide Server auf unterschiedlichen lokalen Hosts laufen, können beide Server auf dem gleichen Port von Außen und auf dem gleichen Port lokal laufen, sind dann verschiedene Sockets und kann in Nginx angelegt werden.

Selbst Load Balancing ist möglich.
Eine normale Domain, z.B. doom.spieleserver.de zu entweder lokalem Host1 oder lokalem Host2.
 
Zuletzt bearbeitet:
Vielleicht gar nicht das was du suchst und erreichen möchtest, aber einige Spiele und Anwendungen erlauben die Verwendung von "SRV-Records". Diese Einträge kannst du bei deinem DNS Anbieter hinterlegen und wenn die Anwendung dies unterstützt (Beispielhaft Teamspeak oder Minecraft) könntest du

game1.example.com auf deine IP mit Port 25001 und
game2.example.com auf deine IP mit Port 25002 verweisen lassen.

Hier mal ein beispiel wie ein SRV Eintrag für Teamspeak konfiguriert werden könnte:
https://www.nexteamspeak.de/srv-record-tsdns.html
 
  • Gefällt mir
Reaktionen: Marco01_809, Der Lord, Physikbuddha und 2 andere
Es gibt noch die Möglichkeit im DNS einen SRV-Record zu hinterlegen. Darin enthalten ist auch eine Portnummer. Hier wird beispielsweise erklärt wie das bei no-ip für einen Minecraft-Server funktionieren würde. (auch auf Deutsch von einem anderen Hoster)

Allerdings muss die Client-Anwendung auch aktiv den SRV-Record per DNS auslesen damit das funktioniert. Tut sie das nicht, weiß sie nix davon und man muss dem Client zwingend den Port mitgeben.
 
  • Gefällt mir
Reaktionen: DEADBEEF, carsti_nator, Nilson und 3 andere
tsit239 schrieb:
Nun möchte ich, dass Anfragen an server-01.example.com an 1.2.3.4:25001 gehen und Anfragen an server-02.example.com an 1.2.3.4:25002 gehen.
Jeht so nich mit nur einer IPv4. Einzige was geht, ist Portforwarding, aber dann muss der Port bei der Verbindung mit angegeben werden:

1. server-01.example.com:25001
2. server-01.example.com:25002

2 unterschiedliche Hostnamen brauchst dann natürlich nicht mehr.
 
Ja, aber wir wissen ja nicht, um was für einen Dienst es sich handelt. Solang da keine weiteren Informationen vom Client mitgeliefert (aufgerufener FQDN, Port) bzw. abgerufen werden (SRV-Record), ist sowas mit nur einer einzigen IPv4 nicht möglich.
 
  • Gefällt mir
Reaktionen: _anonymous0815_
@_anonymous0815_
Ja aber kannst du denn einem Nginx nicht Browser-fähigen Traffic zu futtern geben? Das ist mein Problem. Wie oben geschrieben, ich habe auch meinen Beitrag korrigiert. Du beziehst dich noch auf „Hier stand Mist“. 😋

Einen RP hab ich auch daheim, alleine um die Lästigen Portangaben bei den Services loszuwerden und die SSL Verschlüsselung an einem Ort zu machen ist das echt lässig. Ich kam nur noch nie auf die Idee Gameserver darüber zu betreiben, da A) der Traffic nicht verschlüsselt ist und B) das in der Regel UDP ist. Ich glaube mein RP könnte das gar nicht.

@tsit239

Ich würde wirklich bei Traefik mal schauen. Sonst halt im Spielclient die Ports angeben. Ich verstehe, dass es dein Ziel ist diese loszuwerden aber nicht HTTP-Traffic ist kompliziert.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: _anonymous0815_
Mich wundert eh, dass das Spiel keine Portangabe im Client zulassen soll. Also "damals", als man noch jung und mutig war, haben wir auch CS-, Half-Life- oder Quake3-Server gehostet und nach außen bereitgestellt. Bei den Spielen konnte man problemlos den Port mit angeben. Warum soll das bei dem Spiel hier nicht gehen?^^
 
  • Gefällt mir
Reaktionen: axl foli
qiller schrieb:
Mich wundert eh, dass das Spiel keine Portangabe im Client zulassen soll.
Da @tsit239 uns noch nicht verraten hat um welches Spiel es sich überhaupt handelt, wissen wir ja gar nicht ob das im Client nicht möglich ist. Vielleicht geht's ja nur darum, es "einfacher" handhaben zu können, ohne explizite Porteingabe. Im Prinzip wohl genau das, was NGINX für mehrere Webserver bereits tut.
 
Zurück
Oben