TCP peut-il fournir plus de 65535 ports?

50

Est-il possible de configurer un système Linux pour qu'il fournisse plus de 65 535 ports? L'intention serait d'avoir plus de 65 000 démons à l'écoute sur un système donné.

Il est clair que des ports sont utilisés, ce qui n’est pas possible pour ces raisons. Considérez-le comme un exercice théorique pour tenter de comprendre en quoi TCP pourrait être restrictif.

slm
la source
11
Quelle est la motivation pour cette question? Pourquoi voulez-vous avoir autant de démons à l'écoute?
Warren Young
1
En outre, vous aurez du mal à démarrer autant de processus. (Je suppose que vous voulez dire un processus par démon.)
Warren Young
13
Bien que rien ne vous empêche formellement de porter 65 pantalons à la fois, ce serait idiot d'essayer. Si vous pouvez me montrer une machine capable de traiter efficacement 10 000 ports TCP simultanément, alors cela pourrait être une question abstraite intéressante.
MSW
13
La nature de ce Q est tout à fait théorique, aucune autre finalité que celle de comprendre les limites de TCP et du nombre de ports.
slm
1
Le problème est que vous l’avez formulé d’une manière qui le relie à diverses questions pratiques concernant l’espace RAM requis par les processus de plus de 64 000 démons. Toute machine dont vous disposerez probablement maintenant ou au cours de la prochaine décennie sera à court de RAM avant que vous n'atteigniez le nombre maximal d'auditeurs. Si vous reformulez la question pour ne parler que des écouteurs TCP , en laissant tout le discours sur les démons complètement, le problème disparaîtra. Vous pouvez par exemple amortir l’espace de pile en affectant un millier de sockets à chaque démon géré par événement à thread unique.
Warren Young

Réponses:

84

En examinant le RFC pour TCP: RFC 793 - Protocole de contrôle de transmission , la réponse semble non, car un en-tête TCP est limité à 16 bits pour le champ du port source / destination.

    SS n ° 1

IPv6 améliore-t-il les choses?

Non. Même si IPv6 nous donnera un espace d'adressage IP beaucoup plus grand, 32 bits par rapport à 128 bits, il ne tente en aucun cas d'améliorer la limitation de 16 bits des paquets TCP pour les numéros de port. Il est intéressant de noter que la spécification RFC pour IPv6: protocole Internet, version 6 (IPv6) , devait élargir le champ IP.

Lorsque TCP s'exécute sur IPv6, la méthode utilisée pour calculer la somme de contrôle est modifiée, conformément à la norme RFC 2460 :

Tout transport ou autre protocole de couche supérieure qui inclut les adresses de l'en-tête IP dans son calcul de somme de contrôle doit être modifié pour être utilisé sur IPv6, afin d'inclure les adresses IPv6 à 128 bits au lieu des adresses IPv4 à 32 bits.

                 SS n ° 2

Alors, comment pouvez-vous obtenir plus de ports?

Une approche serait d'empiler des adresses IP supplémentaires en utilisant plus d'interfaces. Si votre système dispose de plusieurs cartes réseau c'est plus facile, mais même avec une seule carte réseau, on peut utiliser des interfaces virtuelles (aka. Des alias ) pour allouer davantage IP si nécessaire.

REMARQUE: l' utilisation d'alias a été supplantée, iproute2ce qui permet d'empiler des adresses IP sur une seule interface (c'est-à-dire eth0).

Exemple

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Source: iproute2: La vie après ifconfig

Références

slm
la source
3
Il ne serait pas possible de sélectionner parmi plus de 65 536 démons utilisant uniquement le port de destination, mais si l'un d'entre eux disposait d'une mémoire et d'une bande passante illimitées, il pourrait avoir plus de 32 000 connexions avec chaque adresse TCP distincte sur chaque port entrant.
Supercat
7

Est-il possible de configurer un système Linux pour qu'il fournisse plus de 65 535 ports?

Nan.

L'intention serait d'avoir plus de 65 000 démons à l'écoute sur un système donné.

Alors vous avez besoin de:

  • une iptablesconfiguration qui redirige sur le contenu du trafic ou

  • un "service broker" ou un "service multiplexeur" qui acceptera les connexions entrantes sur un seul port et l'acheminera vers le démon approprié "derrière lui". Si vous souhaitez que les protocoles standard soient transmis sans modification, vous devrez peut-être implémenter une reconnaissance / reconnaissance de protocole dans ce service multiplexeur, de la même manière qu'un pare-feu IDS ou un pare-feu de couche 7 serait anaylze; tout à fait possible avec la grande majorité des protocoles.

Pour le second élément, vous pouvez concevoir ce service pour gérer plus de 2 ^ 16 "ports" si vous le souhaitez vraiment. Je suis certain que l'impact sur les performances sera minime comparé à la charge de 2 ^ 16 auditeurs en cours d'exécution.

Les démons sous Linux peuvent écouter des sockets Unix qui existent dans le système de fichiers. Votre "service multiplexeur" peut donc conserver un mappage interne du port externe <-> socket Unix interne. Vous rencontrerez probablement une limite de processus du noyau (processus de 32 Ko?) Avant de manquer d’inodes sur tout système de fichiers moderne.

LawrenceC
la source
J'ai rétrogradé cela parce que vous dites que ce n'est pas possible, puis expliquez ensuite comment le faire en utilisant plusieurs adresses IP et un équilibrage de charge, bien que ce soit très compliqué.
suprjami
2
Plus de 64K ports sur un seul système est impossible. Plus de 64 000 auditeurs sont probablement possibles, mais vous devez avoir des écouteurs proxy ou frontaux qui «divisent» les connexions entrantes en écouteurs véritables «backend». Vous pouvez faire quelque chose de fou comme un NAT interne pour plusieurs adresses IP internes, par exemple.
LawrenceC
2
Faux. Les gens ont réussi à obtenir un demi-million de connexions simultanées sur un seul système. Oui, plusieurs adresses IP et équilibreurs de charge (pas nécessairement sur le même système) sont requis, mais un seul système peut ouvrir plus de 64 000 ports et même plus de 64 000 écouteurs s'il est correctement configuré.
suprjami
2

Juste parce qu'il n'y a pas de bonne réponse, je voulais ajouter quelque chose.

Une façon de procéder consiste à ajouter une option IP spécifiant l’extension du port. L'option doit être conçue pour s'inscrire dans la partie facultative de l'en-tête IP et être ignorée par des sauts inconnus.

Vous utiliseriez cette option et ses informations pour étendre la source, la destination ou les deux numéros de port.

Les limitations ne fonctionneront pas automatiquement dans les logiciels existants en ajoutant simplement l'option; elles devront être réécrites pour tirer parti de l'option, quelle que soit la manière dont elle est mise en œuvre. Les logiciels et les pare-feu existants ignoreront le paquet ou le traiteront comme d'habitude. en utilisant la valeur dans les champs de port source et de destination.

En bref, ce n’est pas facile à faire et serait préférable d’utiliser un seul auditeur réutilisable et les données contenues dans la charge utile du paquet.

Vous pouvez également autoriser plus facilement la réutilisation des ports dans le logiciel, ce qui peut aider à surmonter cette limitation en réutilisant les ports du serveur pour plusieurs connexions client.

Rtsp, par exemple, peut utiliser l'en-tête SessionId conjointement avec divers autres en-têtes dans la charge utile du paquet IP pour déterminer la connexion pour laquelle la demande a été émise et agir en conséquence, par exemple si le socket à partir duquel le message a été envoyé est différent de celui du socket. l’adresse distante à laquelle correspond la session, on peut alors autoriser la mise à jour d’une session avec le nouveau socket pour le traitement, nier le message ou effectuer diverses autres actions en fonction de l’application.

Un serveur HTTP peut également faire cela ou tout autre type de serveur.

Lorsque vous autorisez la réutilisation des ports, il est essentiel de garder à l'esprit l'adresse IP source.

Geai
la source
-2

Oui, vous pouvez !

Cela a déjà été fait auparavant, par exemple le serveur de cryptage Edgehill, qui compte plus de 25 000 000 démons fonctionnant en ligne.

Bullrun
la source
9
Pensez à étendre votre réponse pour inclure des indications sur la manière dont le PO pourrait y parvenir, ainsi que sur la documentation à l’appui de votre réponse ou des explications connexes.
HalosGhost
Pouvez-vous fournir des références à cette déclaration? Une recherche rapide me fait croire que quoi que ce soit, il est distribué sur de nombreuses machines.
Thomas Guyot-Sionnest