Wie reserviere ich eine Liste von Ports für meine benutzerdefinierten Anwendungen?
Um genau zu sein, das Produkt, das ich erstelle, hat viele Prozesse und eine Menge Interkommunikation zwischen ihnen.
Das Problem, das ich habe, ist, dass das Betriebssystem von Zeit zu Zeit meine Ports stiehlt. Es ist selten, aber es passiert.
Dies kann daran liegen, dass eine andere Anwendung ":: bind" verwendet hat, ohne dass ein Port angegeben wurde.
Oder manchmal stehlen meine eigenen Anwendungen den Port, wenn ich ":: connect" mit einem ungebundenen Socket aufrufe. Wie aus der Manpage ersichtlich:
Wenn der Socket noch nicht an eine lokale Adresse gebunden wurde, bindet connect () ihn an eine Adresse, die, sofern die Adressfamilie des Sockets nicht AF_UNIX ist, eine nicht verwendete lokale Adresse ist.
Meine Frage ist also, kann ich die benötigten Ports reservieren, damit das Betriebssystem sie nicht verwendet? Kann dies mit / etc / services erreicht werden? Oder gibt es einen anderen Weg?
SELinux
Durchsetzungsmodus Ihre Anforderungen erfüllen kann. Ich lerne immer noch dazu. Also nur eine Vermutung, vielleicht können Sie Ihre eigene Richtlinie definieren, um Ihre PortsSELinux
zu reservieren , wie zmy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Wenn Ihre Anwendung überall ausgeführt wird (keine Serveranwendung), können Sie leider nicht steuern, ob sieSELinux
aktiviert oder deaktiviert ist.Antworten:
Technisch gibt es keinen "reservierten Port".
In TCP / UDP besteht die einzige Möglichkeit, einen Port zu "reservieren", darin, tatsächlich
bind()
einen Socket dafür einzurichten. Ein gebundener Port wird von anderen Anwendungen nicht verwendet. Ein ungenutzter Port ist ungenutzt, so dass andere Anwendungen ihn verwenden können.Wenn Sie Serversoftware schreiben, können Sie Ihre Sockets so früh wie im Anwendungscode gewünscht an bestimmte Ports binden. Machen Sie die Portnummern konfigurierbar oder geben Sie sie zumindest in der Dokumentation deutlich an, damit ein Systemadministrator Konflikte schnell identifizieren und widersprüchliche Anwendungen auf separate Server verschieben kann.
quelle
Um sicherzustellen, dass der Kernel keine 49000 und 49001 an Clients ausgibt, wie Sie sie für Ihre Server unter Linux verwenden möchten.
Lass es rein
/etc/sysctl.conf
und renn dann lossysctl -p
.Beachten Sie, dass dies nicht getestet ist.
Verweise
quelle
/etc/services
?Tatsächlich ist die obige Antwort nicht ganz richtig. Die sysctls net.inet.ip.portrange.first und net.inet.ip.portrange.last geben den Bereich von Ports an, den das Betriebssystem für zufällige Ports zuweisen kann. Sie sollten sicherstellen, dass der Bereich der für Ihre Anwendung reservierten Ports nicht unter diese Variablen fällt.
Werfen Sie einen Blick in das FreeBSD-Handbuch, Abschnitt: 12.14. Optimieren der Kernel-Limits . Dieselbe Grundvoraussetzung sollte jedoch auch für Linux gelten.
quelle
net.ipv4.ip_local_port_range