Comment réserver une liste de ports pour mes applications personnalisées?
Pour être précis, le produit que je crée a beaucoup de processus et beaucoup d'intercommunication entre eux.
Le problème que j'ai, c'est que - de temps en temps - le système d'exploitation vole mes ports. C'est rare, mais ça arrive.
Cela peut être dû au fait qu'une autre application a utilisé ":: bind" sans aucun port spécifié.
Ou parfois mes propres applications volent le port lorsque j'appelle ":: connect" avec un socket non lié. Comme vu sur la page de manuel:
Si le socket n'a pas déjà été lié à une adresse locale, connect () le liera à une adresse qui, à moins que la famille d'adresses du socket ne soit AF_UNIX, est une adresse locale non utilisée.
Ma question est donc la suivante: puis-je réserver les ports dont j'ai besoin pour que le système d'exploitation ne les utilise pas? Cela peut-il être accompli avec / etc / services? Ou existe-t-il une manière différente?
SELinux
en mode Enforcing peut répondre à vos besoins, j'apprends toujours dessus. Alors , juste une supposition, peut - être vous pouvez définir votre propre politiqueSELinux
de réserve ports vôtre, commemy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Si votre application s'exécute partout (pas une application serveur), je crains que vous ne puissiez pas contrôler si elleSELinux
est activée ou désactivée.Réponses:
Techniquement, il n'y a pas de "port réservé".
Dans TCP / UDP, la seule façon de "réserver" un port est en fait
bind()
un socket. Un port lié ne sera pas utilisé par d'autres applications; un port inutilisé est, eh bien, inutilisé afin que d'autres applications soient libres de l'utiliser.Si vous écrivez un logiciel serveur, vous pouvez lier vos sockets à des ports spécifiques dès que vous le souhaitez dans le code d'application. Rendez les numéros de port configurables, ou du moins indiquez-les clairement dans la documentation, afin qu'un administrateur système puisse rapidement identifier les conflits et déplacer les applications en conflit sur des serveurs distincts.
la source
Pour vous assurer que le noyau ne distribuera pas 49000 et 49001 aux clients comme vous souhaitez les utiliser pour vos serveurs sous Linux.
déposez-le
/etc/sysctl.conf
, puis exécutezsysctl -p
.Notez que cela n'a pas été testé.
Les références
la source
/etc/services
?En fait, la réponse ci-dessus n'est pas entièrement exacte. Les sysctls net.inet.ip.portrange.first et net.inet.ip.portrange.last spécifient la plage de ports que le système d'exploitation peut allouer pour des ports aléatoires. Vous devez vous assurer que la plage de ports réservés pour votre application ne tombe pas dans ces variables.
Jetez un œil dans le manuel FreeBSD, section: 12.14. Réglage des limites du noyau . Mais le même principe de base devrait également s'appliquer à Linux.
la source
net.ipv4.ip_local_port_range