J'ai fait autant de recherches que possible sur ce sujet sans creuser tout de suite dans la source du noyau. Il semble y avoir une grande quantité d'informations de désinformation / incorrectes sur le sujet, donc j'espère que cela répond à la question pour moi et pour les autres une fois pour toutes.
Strictement parlant IPv4, l'épuisement des ports est-il réellement possible? Laissez-moi expliquer:
- Apparemment, 65535 ports sont disponibles. 0 n'est pas disponible.
- J'ai lu que l'épuisement du port nécessite que le tuple (src ip, src port, dst ip, dst port) soit unique.
- Pour être clair et en supposant que je peux utiliser 100% des ports éphémères via le paramètre sysctl net.ipv4.ip_local_port_range
Et voici la question: est-ce ainsi que cela fonctionne?
- Je pourrais avoir 65k connexions de 127.0.0.1:(x) à 127.0.0.1:80
- Je pourrais avoir 65 000 connexions de 127.0.0.1:(x) à 127.0.0.1:555
- Fondamentalement, encore une fois, la question est (srcip, srcport, dstip, dstport) doit être unique, n'est-ce pas?
- Je n'ai pas pu ouvrir plus de 65 000 connexions de l' IP "A" à l'IP "B", le port "N"
- De même, une seule adresse IP ne peut pas ouvrir plus de 65 000 connexions à mon serveur Web à xxxx: 80, mais je pourrais prendre en charge beaucoup plus de 65 000 dans la mesure où elles proviennent d' IP sources différentes ?
Enfin, je suis un peu confus au sujet des ports éphémères (sortants) et des ports entrants qui écoutent. Je me rends compte qu'une fois la connexion établie, chaque côté de la connexion est un pair et égal, mais avant cela:
Par exemple, si en effet le tuple (srcip, srcport, dstip, dstport) doit être unique, pourquoi est-ce si j'active, par exemple
net.ipv4.ip_local_port_range = 1024 65535
Ce qui permet d'utiliser des 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 car le port est en cours d'utilisation.
Est-ce lié au fait que: (Et c'est une déclaration que je demande à valider):
- (srcip, srcport, dstip, dstport) doivent être uniques pour chaque connexion avec la plage de ports 1-65535 (sans prêter attention à l'utilisation par le système d'exploitation des ports éphémères)
- Cependant, pour qu'un socket se lie, il peut être vu comme (srcip, srcport, *, *). Ou une autre façon de le dire, l'IP ne doit-elle pas utiliser ce port pour quelque raison que ce soit?
Je peux vérifier le comportement ci-dessus, c'est-à-dire que j'utilise la ligne sysctl exacte ci-dessus, et à cause de cela, j'ai déplacé mySQL vers un port inférieur à 1024 car il échouerait de manière occasionnelle et très aléatoire car en supposant que le système d'exploitation utilisait ce port (3306) pour un port éphémère.
la source
Réponses:
Vous avez ici deux questions principales:
1.
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 plusieurs
SRC IP
connexions au goulot d'étranglement d'un seulDST IP
.Cela signifie que votre serveur Web pourrait avoir un tas de connexions comme:
et c'est parfaitement bien. Cependant, si toutes les «adresses étrangères» étaient les mêmes, cela peut provoquer un problème (par exemple, «gros routeur qui exécute le serveur NAT <---> avec une adresse IP»).
Si je devais postuler pourquoi l'épuisement des ports éphémères n'est pas un problème commun, 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, cpu) est normalement un goulot d'étranglement en premier.
Cependant, j'ai personnellement rencontré quelques problèmes d'épuisement de port 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?
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 la
netstat
sortie suivante ?Cela signifie que le port 80 écoute sur toutes les interfaces locales au serveur. Si un autre processus détient le port 80 avant le
nginx
démarrage de mon serveur,nginx
il ne pourra pas prendre le contrôle de ce port et échouera probablement sa procédure de démarrage.Normalement, le port 3306 est correct car les services d'écoute ont des ports (ou plages) prédéfinis qui sont demandés à la machine hôte - par exemple les ports 80 et 443 pour les serveurs Web.
la source
a: oui, si votre port local est 1-65535, le nombre de connexions est 65k-1 (un port est en écoute)
a: Une seule adresse IP ne peut pas ouvrir plus de 65 000 connexions à mon serveur Web à xxxx: 80, car srcip, srcport, dstip, dstport est unique. oui, vous pourriez supporter bien plus de 65k, si soruce ip est différent
la source