Vous avez deux questions principales :
1.
Strictement IPv4 parlant, l'épuisement des ports est-il réellement possible ?
Oui. Prenons, par exemple, un routeur d'équilibrage de charge envoyant toutes les connexions à une adresse IP NAT. Cela est susceptible de se produire lorsque vous avez de nombreux SRC IP
s se connectant au goulot d'étranglement d'un seul DST IP
.
Cela signifie que votre serveur Web pourrait avoir un tas de connexions comme :
[email protected]:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 173.200.1.18:80 10.100.1.100:49923 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.200.1.200:10155 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:14400 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:50652 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.20.1.20:57554 ESTABLISHED 13939/nginx: worker
et c'est parfaitement bien. Cependant, si toutes les "adresses étrangères" étaient identiques, cela peut entraîner un problème (par exemple, "un gros routeur qui exécute un serveur NAT <---> avec une adresse IP").
Si je devais expliquer pourquoi l'épuisement des ports éphémères n'est pas un problème courant, je dirais que c'est parce que chaque port nécessite un service d'écoute et suffisamment de ressources pour répondre - une autre ressource (mémoire, processeur) est normalement un goulot d'étranglement en premier.
Cependant, j'ai personnellement rencontré quelques problèmes d'épuisement des ports lorsque je travaillais dans une société d'équilibrage de charge.
2. Pourquoi un port utilisé peut-il présenter un problème pour un service d'écoute ?
"Ce qui permet l'utilisation de ports éphémères de 1024 à 65535, que si j'ai des services qui se lient sur le port 3306 (mySQL, par exemple), ils échoueront parfois à démarrer car le port est en cours d'utilisation."
Le serveur mySQL ne peut pas se lier à ce port s'il est utilisé - par exemple par localhost:3306 ou sur toutes les interfaces. Par exemple, voir la ligne 0.0.0.0:80 dans le netstat
suivant sortie ?
[email protected]:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 964/php-fpm.conf)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1660/mysqld
tcp 0 0 0.0.0.0:842 0.0.0.0:* LISTEN 1317/inetd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13938/nginx
Cela signifie que le port 80 écoute tous interfaces locales au serveur. Si un autre processus détient le port 80 avant mon nginx
le serveur démarre, nginx
ne pourra pas prendre le contrôle de ce port et échouera probablement sa procédure de démarrage.
Normalement, le port 3306 convient car les services d'écoute ont des ports (ou plages) prédéfinis qui sont demandés à la machine hôte - par ex. ports 80 et 443 pour les serveurs Web.