Épuisement du port réseau Linux

10

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.

AB Carroll
la source
J'ai mis à jour ma réponse avec plus d'informations. N'hésitez pas à répondre à toute question.
89c3b1b8-b1ae-11e6-b842-48d705

Réponses:

8

Vous avez ici deux questions principales:

1.

Strictement parlant IPv4, 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 plusieurs SRC IPconnexions au goulot d'étranglement d'un seul DST IP.

Cela signifie que votre serveur Web pourrait avoir un tas de connexions comme:

root@buglab:~# 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 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?

"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 parce que 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 la netstatsortie suivante ?

root@buglab:~# 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 sur toutes les interfaces locales au serveur. Si un autre processus détient le port 80 avant le nginxdémarrage de mon serveur, nginxil 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.

89c3b1b8-b1ae-11e6-b842-48d705
la source
0

Je pourrais avoir 65k connexions de 127.0.0.1:(x) à 127.0.0.1:80 Je pourrais avoir 65k connexions de 127.0.0.1:(x) à 127.0.0.1:555

a: oui, si votre port local est 1-65535, le nombre de connexions est 65k-1 (un port est en écoute)

Fondamentalement, encore une fois, la question est (srcip, srcport, dstip, dstport) doit être unique, n'est-ce pas? un: oui

Je ne pouvais pas ouvrir plus de 65 000 connexions de l'IP «A» à l'IP «B», le port «N». De même, une seule IP ne pouvait pas ouvrir plus de 65 000 connexions à mon serveur Web à xxxx: 80, mais je pouvais prendre en charge beaucoup plus plus de 65k dans la mesure où ils proviennent de différentes sources IP?

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

wow qing
la source