paulph
Anmeldungsdatum: 8. März 2013
Beiträge: 22
|
Hallo zusammen,
ich möchte eine Anwendung (Docker-Container mit einem MineCraft-Server) auf meinem laufenden Server erst dann starten, wenn ein bestimmter Port (25565) angepingt wird. Hat jemand einen Tipp für mich, wie ich das mit einem (Bash-)Script realisieren könnte? Vielen Dank im Voraus für Eure Anregungen
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
paulph schrieb: ich möchte eine Anwendung (Docker-Container mit einem MineCraft-Server) auf meinem laufenden Server erst dann starten, wenn ein bestimmter Port (25565) angepingt wird. Hat jemand einen Tipp für mich, wie ich das mit einem (Bash-)Script realisieren könnte?
Das geht mit socat. EDIT: Z. B.:
socat -v -u -T 1 UDP4-LISTEN:25565,fork EXEC:/<Pfad>/<zum>/<Script> sudo nping -c 1 --udp -g 3456 -p 25565 <IP-Adresse>
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
lubux schrieb:
Das geht mit socat.
Gibt's da nicht auch was von Ratiopharm Systemd? Weiß allerdings nicht, ob das gut mit Docker zusammen spielt. (Warum überhaupt Docker für Minecraft?)
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
rklm schrieb: Gibt's da nicht auch was von Ratiopharm Systemd?
Ob es mit/von systemd etwas gibt weiß ich nicht, aber man könnte socat mit einem Script und einer service-unit starten bzw. lauschen lassen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
lubux schrieb: rklm schrieb: Gibt's da nicht auch was von Ratiopharm Systemd?
Ob es mit/von systemd etwas gibt weiß ich nicht, aber man könnte socat mit einem Script und einer service-unit starten bzw. lauschen lassen.
Ich meinte eher dieses Feature, dass systemd auf dem Netzwerkport lauscht und erst beim ersten Connect den Dienst startet und die Verbindung durchreicht. Ich glaube allerdings, dass Dienste dafür geändert bzw. vorbereitet sein müssen. Im Detail kenne ich mich da leider auch nicht aus. Und Docker in den Mix zu schmeißen macht es sicherlich auch nicht einfacher.
|
paulph
(Themenstarter)
Anmeldungsdatum: 8. März 2013
Beiträge: 22
|
Hallo, vielen Dank für Eure schnelle Hilfe, die Variante von lubux funktioniert, ich konnte sie auf meinem System nachvollziehen. Zum Thema Docker konnte ich mit dem Stichwort systemd folgendes finden: https://blog.developer.atlassian.com/docker-systemd-socket-activation/ Dazu habe ich noch nichts getestet, ich will es nur mit Euch teilen. Nochmal vielen Dank!
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5349
|
rklm schrieb: lubux schrieb:
Das geht mit socat.
Gibt's da nicht auch was von Ratiopharm Systemd?
Ja, das sind die systemd sockets. Ich werfe auch noch xinetd ins Rennen
|
paulph
(Themenstarter)
Anmeldungsdatum: 8. März 2013
Beiträge: 22
|
Hallo zusammen,
dank der oben beschriebenen Lösung "hört" der Server den Port 25565 ab und bei einem anpingen/anfrage wird ein Script ausgeführt → super! Wenn dieses Script jedoch ein Programm aufruft, das den angepingten Port benutzen will, bekomme ich die Fehlermeldung "address already in use". Die socat-Parameter "reuseaddr" oder "reuseport" haben das Problem auch nicht gelöst. Habt Ihr eine Idee? Vielen Dank im Voraus
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
paulph schrieb: dank der oben beschriebenen Lösung "hört" der Server den Port 25565 ab und bei einem anpingen/anfrage wird ein Script ausgeführt → super! Wenn dieses Script jedoch ein Programm aufruft, das den angepingten Port benutzen will, bekomme ich die Fehlermeldung "address already in use". Die socat-Parameter "reuseaddr" oder "reuseport" haben das Problem auch nicht gelöst. Habt Ihr eine Idee?
Naja, Du musst socat ja nicht auf dem Port lauschen lassen, der vom Server benutzt werden soll. Dann nimm z. B. für socat den Port 25566 und mach den Ping auf diesen Port 25566.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
lubux schrieb: paulph schrieb:
Wenn dieses Script jedoch ein Programm aufruft, das den angepingten Port benutzen will, bekomme ich die Fehlermeldung "address already in use". Die socat-Parameter "reuseaddr" oder "reuseport" haben das Problem auch nicht gelöst. Habt Ihr eine Idee?
Naja, Du musst socat ja nicht auf dem Port lauschen lassen, der vom Server benutzt werden soll. Dann nimm z. B. für socat den Port 25566 und mach den Ping auf diesen Port 25566.
Das ist aber eigentlich nicht das, was man will, weil dann ja der Client geändert werden muss. Systemd Sockets funktionieren ja auch anders. Aber natürlich funktioniert das nur, wenn beide Seiten - systemd und der Dienst - zusammenarbeiten und der Socket vom Frontend (systemd, socat) an den Dienst übergeben wird.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
rklm schrieb: Das ist aber eigentlich nicht das, was man will, weil dann ja der Client geändert werden muss.
Doch, es ist genau das was der TE im Titel des Threads und in seinem 1. Beitrag beschrieben hat:
Script ausführen, wenn ein bestimmter Port angepingt wird
... und es bietet zusätzliche Sicherheit, weil die Ping-Verbindung und die Client-Verbindung unabhängig und getrennt sind. Zusätzlich ist der source-Port beim UDP-Ping statisch und somit dem Server bekannt bzw. kann mit iptables (oder gleichwertig) geschützt werden. D. h., das Script kann nicht versehentlich durch einen "feindlichen" Portscan aus dem Internet, gestartet werden.
|
paulph
(Themenstarter)
Anmeldungsdatum: 8. März 2013
Beiträge: 22
|
Hallo zusammen,
vielen Dank für die Diskussion. Vielleicht ist es jetzt an der Zeit, dass ich den Hintergrund meiner Frage kurz erläutere: Ich betreibe zu Hause einen eigenen Server unter Linux, der hauptsächlich als File-Server dient, daneben laufen einige Anwendungen (Nextcloud, UPnP-Server etc.). Für unseren Sohn und seine Freunde läuft in einem Docker-Container ein MineCraft-Server am Port 25565. Der Idle-Betrieb dieses Docker-Containers erhöht die durchschnittliche CPU-Last um ca. 15%. Meine Idee war nun, dass zwar Docker läuft, der Container aber nicht. Erst wenn unser Sohn sich aus unserem LAN am MineCraft-Server (=Docker-Container am Port 25565) anmelden will, wird der Container gestartet.
Aus diese Grund möchte ich den Port 25565 mit socat "abfragen" und anschließen den Container auf dem gleichen Port betreiben.
Ich habe auch schon überlegt, ob das Script, das von socat angestossen wird, nicht zuerst den socat Prozess stoppt, somit den Port freigibt und dann wird erst der Container gestartet. Soviel zu den Beweggründen. Vielleicht hilft diese Info ja, die Diskussion einwenig zu lenken. Nochmal vielen Dank für Eure Bemühungen, ich bin sehr gespannt, mehr zu lernen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
lubux schrieb: rklm schrieb: Das ist aber eigentlich nicht das, was man will, weil dann ja der Client geändert werden muss.
Doch, es ist genau das was der TE im Titel des Threads und in seinem 1. Beitrag beschrieben hat:
Script ausführen, wenn ein bestimmter Port angepingt wird
Ja, das ist nicht ganz eindeutig. Es geht ja aber implizit aus diesem Beitrag hervor, und er hat es mittlerweile auch explizit beschrieben:
Für unseren Sohn und seine Freunde läuft in einem Docker-Container ein MineCraft-Server am Port 25565. [...] Erst wenn unser Sohn sich aus unserem LAN am MineCraft-Server (=Docker-Container am Port 25565) anmelden will, wird der Container gestartet.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
paulph schrieb: Aus diese Grund möchte ich den Port 25565 mit socat "abfragen" und anschließen den Container auf dem gleichen Port betreiben.
Ich habe auch schon überlegt, ob das Script, das von socat angestossen wird, nicht zuerst den socat Prozess stoppt, somit den Port freigibt und dann wird erst der Container gestartet.
Das verstehe ich nicht. Was genau meinst Du mit "den Port 25565 mit socat "abfragen""? socat soll doch nur ein Script ausführen/starten und keinen Port abfragen. socat lauscht permanent (oder temporär) auf einem freien Port. Warum muss bei dir socat auf dem Port 25565 lauschen, wenn dieser Port doch später von einem Server benutzt werden soll? Von 1025 bis 65535 gibt es doch noch genug Ports, die von socat benutzt werden können.
|
paulph
(Themenstarter)
Anmeldungsdatum: 8. März 2013
Beiträge: 22
|
Hallo,
der Grund, warum ich unbedingt für beide Prozesse (lauschen von socat und starten/laufen des Containers) den gleichen Port verwenden möchte, liegt in der gewünschten Bedienbarkeit. Wenn unser Sohn auf seinem Rechner MineCraft startet, kann er zwischen einen Single-Player-Modus (lokal) und einem Multi-Player-Modus (Server) wählen. Entscheidet er sich für den Multiplayer-Modus bekommt er eine Übersicht mit den von ihm gespeicherten Servern angezeigt. In diesem Moment werden alle Server dieser Liste anhand der hinterlegten IP-Adressen über den Port 25565 angepingt. Und genau hier will ich ansetzten. Mit diesem Ping will ich den Container / Server starten. Dann bekommt er die erreichbaren (=gestarteten bzw. laufenden) Server angezeigt und kann sich auf einen über den Port 25565 einloggen.
|