Forum: PC Hard- und Software Mehrere Dienste auf einem Server


von Christoph K. (murlicat)


Lesenswert?

Hallo!

Ich habe zu Hause einen Server laufen, auf dem ein Webserver(apache2), 
ein Teamspeakserver und ein Minecraftserver läuft. Diese 3 Dienste sind, 
jeweils auf ihren Standardports, alle per DDNS über sagen wir 
meinserver.ddns.net erreichbar.

Jetzt möchte ich meine gekaufte Domain meinedomain.at nutzen, um mit 
meinedomain.at die Website, mit ts.meinedomain.at den TS und mit 
mc.meinedomain.at den MC Server zu erreichen.

Ich könnte jetzt natürlich alle 3 Domains an meinserver.ddns.net 
weiterleiten. Dann kann ich aber mit jeder (Sub)domain jeden Dienst 
erreichen. Also gebe ich z.B. in Minecraft dann ts.meinedomain.at ein 
komme ich trotzdem hinein. Oder im Browser mit mc.meinedomain.at 
erreiche ich die Internetseite.

Gibt es hier irgendeine Möglichkeit, dass ich mit jeder (Sub)domain 
wirklich nur den jeweiligen Dienst erreiche? Apache hat ja eine 
Funktion, die sich Virtual Host nennt, ich glaube das wäre soetwas. Das 
hilft mir aber nur mit der Website und nicht mit den beiden anderen 
Diensten.

Danke für eure Hilfe,
Christoph

von Jack V. (jackv)


Lesenswert?

Christoph K. schrieb:
> Gibt es hier irgendeine Möglichkeit, dass ich mit jeder (Sub)domain
> wirklich nur den jeweiligen Dienst erreiche? Apache hat ja eine
> Funktion, die sich Virtual Host nennt, ich glaube das wäre soetwas.

Geht, indem du jeden Dienst so konfigurierst, dass er nur auf die 
Anfrage, die über die jeweils gewünschte Subdomain reinkommt, reagiert. 
Anders macht man es mit dem Apachen und den namensbasierten vHosts auch 
nicht – der httpd bekommt erstmal alles, was auf dem Port über das 
Interface reinkommt, und reicht die Anfrage entsprechend des ServerNames 
an den entsprechenden vHost weiter. Wenn keiner passt, wird der 
Default-vHost genommen (sofern nicht anders konfiguriert, selbstredend). 
Sollte™ mit den anderen beiden Diensten auch so gehen – einfach mal ins 
Manual schauen.

von Jan H. (j_hansen)


Lesenswert?

Christoph K. schrieb:
> Gibt es hier irgendeine Möglichkeit, dass ich mit jeder (Sub)domain
> wirklich nur den jeweiligen Dienst erreiche? Apache hat ja eine
> Funktion, die sich Virtual Host nennt, ich glaube das wäre soetwas. Das
> hilft mir aber nur mit der Website und nicht mit den beiden anderen
> Diensten.

Bei HTTP(S) kommt die Domain im Aufruf mit, damit weiß der Apache wohin 
damit. Bei den Protokollen der beiden anderen Dienste ist das vielleicht 
auch so - oder nicht, dann hast du Pech gehabt.

von Christoph K. (murlicat)


Lesenswert?

Danke mal für eure Antworten!

Jan H. schrieb:
> Bei den Protokollen der beiden anderen Dienste ist das vielleicht
> auch so - oder nicht, dann hast du Pech gehabt.

Jack V. schrieb:
> Sollte™ mit den anderen beiden Diensten auch so gehen – einfach mal ins
> Manual schauen.

Wenn ich euch also richtig verstehe, muss das der jeweilige Dienst, also 
Minecraft bzw Teamspeak, unterstützen? Es gibt also unter Linux keinen 
eigenen Dienst der das übernehmen kann?


Und mit SRV Records kann ich hier auch nichts machen? Das habe ich in 
Google manchmal gefunden, glaube aber, dass es für etwas anderes ist, 
hab ich aber leider nicht zu 100% verstanden.

: Bearbeitet durch User
von blub (Gast)


Lesenswert?

Das ist so. Wenn du IPv6 benutzt hast du evtl mehrere Adressen zur 
Auswahl? Aber wer nutzt das schon...

von wurster (Gast)


Lesenswert?

Christoph K. schrieb:
> Wenn ich euch also richtig verstehe, muss das der jeweilige Dienst, also
> Minecraft bzw Teamspeak, unterstützen? Es gibt also unter Linux keinen
> eigenen Dienst der das übernehmen kann?

Du verstehst rudimentärste Sachen nicht und willst einen öffentlichen 
Server betreiben? Vielleicht erstmal ein paar Jahre in Virtualbox mit 
einem LAN spielen.

von Rolf M. (rmagnus)


Lesenswert?

Christoph K. schrieb:
> Wenn ich euch also richtig verstehe, muss das der jeweilige Dienst, also
> Minecraft bzw Teamspeak, unterstützen?

Schon das Protokoll des Dienstes muss es unterstützen.

> Es gibt also unter Linux keinen eigenen Dienst der das übernehmen kann?

Überleg doch, wie Namensauflösung funktioniert. Dann sollte klar sein, 
dass das nicht geht. Dein Server wird ja nicht über den Namen 
kontaktiert. Der Client fragt seinen Nameserver nach der IP-Adresse des 
Rechners mit dem gewünschten Namen.
Dann nutzt er diese IP-Adresse, um deinen Server zu kontaktieren. Der 
verwendete Name ist an der Stelle gar nicht mehr involviert, und somit 
weiß dein Server ihn nicht.
Bei http ist es so, dass nach dem Verbindungsaufbau der Client dem 
Server auf Anwendungsebene über das Protokoll nochmal explizit mitteilt, 
über welchen Namen er zugegriffen hat. Und so erfährt das dein Apache. 
Das gibt's aber nicht bei jedem Protokoll. Außerdem heißt es natürlich, 
dass ein Verbindungsaufbau schon erfolgt sein muss, bevor der Server 
weiß, ob die Anfrage überhaupt über den richtigen Namen durchgeführt 
worden ist. Man kann also auf die Weise keinen Server machen, der auf 
Verbindungsanfragen über den falschen Namen gar nicht erst antwortet.

: Bearbeitet durch User
von Joachim S. (oyo)


Lesenswert?

@Threadstarter:
Vielleicht solltest Du mal erklären, welchen konkreten Vorteil Du Dir 
davon erhoffst, dass bspw. der Teamspeakserver nicht über 
mc.meinedomain.at erreicht werden kann (und anders herum).

von Christoph K. (murlicat)


Lesenswert?

Rolf M. schrieb:
> Überleg doch, wie Namensauflösung funktioniert. Dann sollte klar sein,
> dass das nicht geht. Dein Server wird ja nicht über den Namen
> kontaktiert. Der Client fragt seinen Nameserver nach der IP-Adresse des
> Rechners mit dem gewünschten Namen.
> Dann nutzt er diese IP-Adresse, um deinen Server zu kontaktieren. Der
> verwendete Name ist an der Stelle gar nicht mehr involviert, und somit
> weiß dein Server ihn nicht.
> Bei http ist es so, dass nach dem Verbindungsaufbau der Client dem
> Server auf Anwendungsebene über das Protokoll nochmal explizit mitteilt,
> über welchen Namen er zugegriffen hat. Und so erfährt das dein Apache.
> Das gibt's aber nicht bei jedem Protokoll. Außerdem heißt es natürlich,
> dass ein Verbindungsaufbau schon erfolgt sein muss, bevor der Server
> weiß, ob die Anfrage überhaupt über den richtigen Namen durchgeführt
> worden ist. Man kann also auf die Weise keinen Server machen, der auf
> Verbindungsanfragen über den falschen Namen gar nicht erst antwortet.

Vielen Dank für eine kompetente Aussage die man leicht nachvollziehen 
kann. So lernt man am schnellsten!

Joachim S. schrieb:
> @Threadstarter:
> Vielleicht solltest Du mal erklären, welchen konkreten Vorteil Du Dir
> davon erhoffst, dass bspw. der Teamspeakserver nicht über
> mc.meinedomain.at erreicht werden kann (und anders herum).

Es geht mir neben der eigentlichen Sache (ich finde es einfach die 
"sauberere" Lösung) auch darum Dinge zu lernen und da es bei Apache geht 
wollte ich wissen warum/wie und ob bei anderen Diensten auch

von Echter Programmierer (Gast)


Lesenswert?

blub schrieb:
> Das ist so. Wenn du IPv6 benutzt hast du evtl mehrere Adressen zur
> Auswahl? Aber wer nutzt das schon...

Z.B.:

  - Deutschland: 42,67%
  - Belgien: 52,08%
  - USA: 37,63%
  - Indien: 36,88%
  - Malaysia: 40,05%

Willkommen im Jahr 2019!

von Roland P. (pram)


Lesenswert?

Für eine saubere Lösung bräuchtest du für jeden Dienst eine eigene IP 
und das wird schwierig (zumindest für IPv4)

Es ist ja so, dass alle Hostnames auf die gleiche IP zeigen.
Der Connect erfolgt ja auf IP Ebene und da kann der Server ja nicht fest 
stellen, welcher Name vorher aufgelöst wurde.
Erst das Protokoll (HTTP) überträgt den Host.

Wenn dann noch Verschlüsselung dazu kommt, dann wird das noch schlimmer, 
da zusätzlich über SNI der Name übertragen werden muss.

Das gibt dann vermutlich auch noch lustige Zertifikatswarnungen, wenn z. 
B jemand tc.domain.at im Browser eingibt und der Browser nur ein 
Zertifikat für www.domain.at hat.

Gruß Roland

von Eric (Gast)


Lesenswert?

Sowas macht man mit einem reverse proxy. Du legst mehrere Subdomains an 
die alle auf deine (die gleiche) IP zeigen. (Ex. service1.domain.com, 
service2.domain.com, ...)
Dann legst Du zum Beispiel unter nginx fuer jeden Dienst den Du 
betreiben willst eine eigene Konfigurationsdatei an.
Unter dem directive proxy_pass traegst Du dann localhost:Port ein und 
die Anfrage wird an den entsprechenden Dienst weitergeleitet.

von Joachim S. (oyo)


Lesenswert?

Eric schrieb:
> Sowas macht man mit einem reverse proxy. Du legst mehrere Subdomains an
> die alle auf deine (die gleiche) IP zeigen. (Ex. service1.domain.com,
> service2.domain.com, ...)
> Dann legst Du zum Beispiel unter nginx fuer jeden Dienst den Du
> betreiben willst eine eigene Konfigurationsdatei an.
> Unter dem directive proxy_pass traegst Du dann localhost:Port ein und
> die Anfrage wird an den entsprechenden Dienst weitergeleitet.

Aber das klappt doch eben nur für http(s). Du hast die Problemstellung 
vermutlich nicht richtig gelesen - es geht nicht darum, mehrere 
http-/Webserver für mehrere (Sub)domains auf ein und derselben Maschine 
laufen zu lassen, sondern um unterschiedliche Server-Dienste 
(Teamspeak-Server  Minecraft-Server  http-Server).

> Joachim S. schrieb:
>> @Threadstarter:
>> Vielleicht solltest Du mal erklären, welchen konkreten Vorteil Du Dir
>> davon erhoffst, dass bspw. der Teamspeakserver nicht über
>> mc.meinedomain.at erreicht werden kann (und anders herum).
>
> Es geht mir neben der eigentlichen Sache (ich finde es einfach die
> "sauberere" Lösung) auch darum Dinge zu lernen und da es bei Apache geht
> wollte ich wissen warum/wie und ob bei anderen Diensten auch

Ok, alles klar. Warum das bei IPv4 grundsätzlich nicht möglich ist, 
sofern das Protokoll das nicht explizit ermöglicht, hast Du mittlerweile 
ja verstanden.
Obwohl Dein ursprüngliches Anliegen so also nicht möglich ist, kann es 
im Sinne einer "sauberen" Lösung übrigens trotzdem sinnvoll sein, 
unterschiedliche Subdomains für die unterschiedlichen Dienste anzulegen.

Derzeit wäre bspw. der Minecraft-Server dann zwar trotzdem auch über 
ts.meinedomain.at erreichbar, die verschiedenen Subdomains also im 
Grunde ohne Wirkung. Weil sich das in Zukunft aber ändern könnte - z.B., 
weil Du vielleicht irgendwann einen vServer anmietest und manche (aber 
nicht alle) Dienste auf diesen vServer auslagerst - ist es schon jetzt 
sinnvoll, für die unterschiedlichen Dienste unterschiedliche Subdomains 
anzulegen.
Die derzeit eher wirkungslosen Subdomains wären dann so eine Art 
Zukunftsversprechen, im Sinne von:
"Mein Teamspeak-Server ist immer unter ts.meinedomain.at erreichbar. 
Derzeit ist es zwar auch möglich, ihn bspw. auch über mc.meinedomain.at 
zu erreichen - das könnte sich in der Zukunft aber jederzeit ändern, 
daher ist nur ts.meinedomain.at die richtige Adresse  für den 
Teamspeak-Server"

von Eric (Gast)


Lesenswert?

Joachim S. schrieb:
> Aber das klappt doch eben nur für http(s)

Nein, es klappt auch fuer andere Protokolle. Ich selbst nutze es fuer 
uwsgi.

Einen Minecraft-Server habe ich noch nie aufgesetzt, aber ich vermute 
mal dass man in dem Client (dem  Spiel?) die Portnummer eingeben kann. 
Dann kann man natuerlich auch gleich auf den RevProxy verzichten.

von Joachim S. (oyo)


Lesenswert?

Eric schrieb:
> Joachim S. schrieb:
>> Aber das klappt doch eben nur für http(s)
>
> Nein, es klappt auch fuer andere Protokolle. Ich selbst nutze es fuer
> uwsgi.

Du hast doch davon geschrieben, "unter nginx fuer jeden Dienst den Du 
betreiben willst eine eigene Konfigurationsdatei (anzulegen)". Das geht 
aber doch nur für http(s)?

> Einen Minecraft-Server habe ich noch nie aufgesetzt, aber ich vermute
> mal dass man in dem Client (dem  Spiel?) die Portnummer eingeben kann.
> Dann kann man natuerlich auch gleich auf den RevProxy verzichten.

Ich vermute immer noch, dass Du das Problem falsch verstanden hast. Der 
Threadstarter will, dass der Teamspeak-Server nur unter 
ts.meinedomain.at erreichbar ist, nicht aber unter mc.meinedomain.at - 
obwohl beide DNS-Namen auf genau die gleiche IP-Adresse verweisen.

von Nano (Gast)


Lesenswert?

Eric schrieb:
> Einen Minecraft-Server habe ich noch nie aufgesetzt, aber ich vermute
> mal dass man in dem Client (dem  Spiel?) die Portnummer eingeben kann.

Das ist keine schöne Lösung, weil man dann, bei anderen Portnummern, die 
Nutzer immer zwingt, diese zu ändern oder auch noch anzugeben.
Wenn die Nutzer aber sehr restriktive Firewallregeln haben, dann müssen 
sie für jede Portänderung die Firewall etwas weiter aufmachen, um alle 
möglichen Fälle bzw. Ports, bei der so ein MC Server laufen könnte, 
abzudecken.

Wenn es also irgendwie möglich ist, sollte man beim Defaultport bleiben.
Bei mehreren Servern hinter der gleichen IP geht es natürlich nicht 
anders, als andere Ports zu vergeben, aber wenn das der einzige MC 
Server ist, dann sollte man den default Port so belassen wir er ist.

von Roland P. (pram)


Lesenswert?

Nano schrieb:
> Wenn die Nutzer aber sehr restriktive Firewallregeln haben,

dann befindet sich der User in einem Netzwerk, in dem er eh nicht MC 
spielen darf. ;-)

Eric schrieb:
> Joachim S. schrieb:
>> Aber das klappt doch eben nur für http(s)
>
> Nein, es klappt auch fuer andere Protokolle. Ich selbst nutze es fuer
> uwsgi.

Nginx kann zwar mehr Protokolle, imap, smtp,... oder auch tcp/udp 
forward.
Dennoch muss das Protokoll "virtual host" fähig sein. Woher soll der 
Proxy sonst wissen, ob der Client das UDP Paket an ts1.domain.de oder 
ts2.domain.de geschickt hat, wenn die Info nicht im Datenpaket mit 
enthalten ist.

Das was Christoph vor hat, geht schlichtweg nicht, wenn er nur eine IP 
hat. Muss aber Joachim zustimmen, es jetzt schon so "halbsauber" zu 
machen ist der richtige Weg.

Gruß Roland

von DPA (Gast)


Lesenswert?

Richte dir Let's Encrypt ein, und lasse dir automatisch regelmäßig ein 
neues Wildcard Zertifikat generieren. TLS beinhaltet die Domain 
Information, siehe TLS SNI (Obwohl, nicht jeder Service muss diesen 
zwingend mitliefern). In der Theorie also einfach darauf achten, die TLS 
variante der Protokolle zu nutzen imapS, smtpS, ftpS, httpS, etc. Da 
kann man dann nen Proxy vorschalten, der das richtig zuordnet (nginx 
kann das vermutlich). Einige Services unterstützen auch DNS-SD, und 
damit einen custom port+ip pro Service mit SRV Record 
https://de.wikipedia.org/wiki/SRV_Resource_Record
Ausserhalb mDNS basierter Services ist die Unterstützung/Verbreitung 
aber nicht so gross. (Teamspeak gehört aber zu den Diensten, die dass 
können.)

von Eric (Gast)


Lesenswert?

Joachim S. schrieb:
> Du hast doch davon geschrieben, "unter nginx fuer jeden Dienst den Du
> betreiben willst eine eigene Konfigurationsdatei (anzulegen)". Das geht
> aber doch nur für http(s)?

Ich bin davon ausgegangen, dass man hier ducrch aufruf einer bestimmten 
Subdomain auf einen Service X zugreifen moechte, ohne direkt den Port 
dafuer mit angeben zu muessen.
Genau dass erreicht man durch den RevProxy. Die Subdomain ruft den 
"virtuellen Host" auf, der unter dem directive server_name angegeben 
ist, e.g. minecraft.domain.com
Das directive proxy_pass leitet es dann an den eigentlichen Server 
weiter, e.g. localhost:8000.
Was dass bei einem Spiele-Server dann bringt, weiss ich nicht, aber so 
kann man es machen.


Roland P. schrieb:
> Nginx kann zwar mehr Protokolle, imap, smtp,... oder auch tcp/udp
> forward.
> Dennoch muss das Protokoll "virtual host" fähig sein. Woher soll der
> Proxy sonst wissen, ob der Client das UDP Paket an ts1.domain.de oder
> ts2.domain.de geschickt hat, wenn die Info nicht im Datenpaket mit
> enthalten ist.

Siehe oben.
-> server_name |= proxy_pass

von Eric (Gast)


Lesenswert?

Dieser Minecraft Server scheint ja in der Tat kein Dienst zu sein, der 
ueber ein Webinterface aufgerufen wird.

Das tut mir leid, es war mir nicht bekannt.

Man kann es aber trotzdem realisieren: Durch einen SRV-Record.

Ich gehe mal davon aus, dass die Subdomain schon besteht. Als Beispiel 
nehme ich hier mal minecraft.domain.com.

Im SRV-Record wird dann der Name des Dienstes und der dazugehoerige Port 
angegeben.
Als Protokoll _(Protokoll).minecraft
Als Port der Port des Servers, e.g. 8000

Welches Protokoll dein Server verwendet, weiss ich nicht.
Im Fall von udp lautet der Eintrag dann _udp.minecraft

von DPA (Gast)


Lesenswert?

Im oben verlinkten Wikipediaartiker steht _minecraft._tcp.example.com, 
wäre also _minecraft._tcp.mc.meinedomain.at. , um das Beispiel im 
Eingangspost wieder aufzugreifen.

von Nano (Gast)


Lesenswert?

Roland P. schrieb:
> Nano schrieb:
>> Wenn die Nutzer aber sehr restriktive Firewallregeln haben,
>
> dann befindet sich der User in einem Netzwerk, in dem er eh nicht MC
> spielen darf. ;-)

Ich habe früher einen alten 486er PC zu einem Router umfunktioniert und 
an den das DSL Modem angeschlossen, an den PC kam dann noch ein 
einfacher Hub, so dass die anderen Rechner im Haus sich den 
Internetanschluss teilen konnten.
Die in Linux verfügbare Firewall ipchains und später iptables war 
jedenfalls schon damals sehr mächtig und bezüglich der 
Konfigurierbarkeit besser als das, was man damals als noch teure 
Konsumerkaufrouter bekam.

Meine FW war sehr restriktiv eingestellt, so dass ich ständig 
Anpassungen vornehmen musste, wenn ein externer Spieleserver wieder mal 
einen anderen Port genutzt hat, als das, was für das jeweilige Spiel 
üblich war.
Solange das nur vereinzelte Spieleserver waren, war's kein Problem, die 
wurden dann halt ignoriert, aber manche Ports wurden dann doch öfters 
belegt.

von Christoph K. (murlicat)


Lesenswert?

So, jetzt hab ich mal das grundsätzliche mit "standard"DNS einträgen 
verstanden, dann kommt schon das nächste für mich verwirrende:

Eric schrieb:
> Das tut mir leid, es war mir nicht bekannt.
> Man kann es aber trotzdem realisieren: Durch einen SRV-Record.

SRV-Record ist auch ein Begriff der mir schon untergekommen ist. Ich 
habe das so verstanden: Wenn ein Server (z.B. Minecraft) nicht auf dem 
Standardport läuft, muss ich beim anmelden ja ip:port
bzw domain:port eingeben. Der SRV Record soll nun irgendwie den Port 
ersetzten, so dass die Domain alleine reicht. 2 Fragen: Wie macht der 
SRVRecord das und was würde passieren wenn ich die Domain mit dem Record 
dann in den Browser eintragen würde?

von (prx) A. K. (prx)


Lesenswert?

SRV Records sind nicht für den Server da, sondern für den Client. Da es 
hier um bestehende Protokolle geht, mit bestehenden Clients, bringen 
solche Records nur dann etwas, wenn diese Clients bereits so 
programmiert sind, dass sie nach nach passenden SRV Records fragen. Tun 
sie das nicht, kann man aufhören, sich darüber Gedanken zu machen.

von (prx) A. K. (prx)


Lesenswert?

Christoph K. schrieb:
> Wenn ein Server (z.B. Minecraft) nicht auf dem
> Standardport läuft, muss ich beim anmelden ja ip:port
> bzw domain:port eingeben.

Das ist recht selten die Ausgabe von SRV Records. Üblicherweise ist das 
Teil der Client-Konfiguration.

von Christoph K. (murlicat)


Lesenswert?

A. K. schrieb:
> SRV Records sind nicht für den Server da, sondern für den Client.
> Da es hier um bestehende Protokolle geht, mit bestehenden Clients,
> bringen solche Records nur dann etwas, wenn diese Clients bereits so
> programmiert sind, dass sie nach nach passenden SRV Records fragen. Tun
> sie das nicht, kann man aufhören, sich darüber Gedanken zu machen.

Ok, das sind auch sehr hilfreiche Infos! Danke.

von (prx) A. K. (prx)


Lesenswert?

Joachim S. schrieb:
> Obwohl Dein ursprüngliches Anliegen so also nicht möglich ist, kann es
> im Sinne einer "sauberen" Lösung übrigens trotzdem sinnvoll sein,
> unterschiedliche Subdomains für die unterschiedlichen Dienste anzulegen.

Ganz allgemein empfiehlt es sich, Dienste eines Servers über 
individuelle logische Namen anzusprechen. Also z.B. ein CNAME Record für 
jeden der diversen Dienste, das auf den realen Server verweist. Der 
reale Server hat einen eigenen getrennten Namen als A/AAAA Record, wird 
aber nicht über diesen Namen von Clients der Dienste angesprochen.

Dieses Prinzip erleichtert Upgrades und Umzug von Diensten erheblich, 
weil nur Server und DNS angefasst werden müssen, währen die Clients 
überhaupt nichts davon mitkriegen.

: Bearbeitet durch User
Beitrag #5964459 wurde vom Autor gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.