web-dev-qa-db-fra.com

TCP peut-il fournir plus de 65535 ports?

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é.

De toute évidence, des ports sont utilisés, ce qui n'est pas possible pour ces raisons, alors pensez-y comme un exercice théorique pour essayer de comprendre où TCP serait restrictif en faisant quelque chose comme ça.

53
slm

En regardant la RFC pour TCP: RFC 793 - Transmission Control Protocol , la réponse semble être non car le TCP en-tête est limité à 16- bits pour le champ du port source/destination.

ss #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 contre 128 bits, il n'essaie pas d'améliorer la TCP limitation de paquets de 16 bits pour le port Fait intéressant, le RFC pour IPv6: Protocole Internet, spécification de la version 6 (IPv6) , le champ IP devait être étendu.

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

Tout protocole de 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 #2

Alors, comment pouvez-vous obtenir plus de ports?

Une approche consisterait à empiler des adresses IP supplémentaires en utilisant plus d'interfaces. Si votre système possède plusieurs cartes réseau, cela est plus facile, mais même avec une seule carte réseau, vous pouvez utiliser des interfaces virtuelles (aka. alias ) pour allouer plus d'adresses IP si nécessaire.

REMARQUE: L'utilisation d'alias a été supplantée par iproute2 que vous pouvez utiliser pour empiler les adresses IP sur une seule interface (c'est-à-dire eth0) au lieu.

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

86
slm

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é.

Ensuite, vous avez besoin de:

  • une configuration iptables qui redirige sur le contenu du trafic ou

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

Selon le deuxième élément, vous pouvez concevoir ce service pour gérer plus de 2 ^ 16 "ports" si vous le souhaitez vraiment. Je suis sûr que l'impact sur les performances sera minime par rapport à la charge de 2 ^ 16 + écouteurs en cours d'exécution.

Les démons sous Linux peuvent écouter sur les sockets Unix qui existent dans le système de fichiers, donc votre "service multiplexeur" pourrait maintenir 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 n'importe quel système de fichiers moderne.

6
LawrenceC

Juste parce qu'il n'y a pas de bonne réponse dans laquelle je voulais sonner.

Une façon de le faire serait d'ajouter une option IP qui spécifie l'extension du port. L'option doit être conçue pour tenir dans la partie facultative de l'en-tête IP et serait 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 simplement en ajoutant l'option de toute façon, elles devront être réécrites pour profiter de l'option, quelle que soit la façon dont elle est implémentée, 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 il serait préférable de le faire en utilisant un seul écouteur réutilisable et des 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 en conjonction avec divers autres en-têtes dans la charge utile du paquet IP pour déterminer pour quelle connexion la demande a été émise et agir en conséquence, par exemple si la socket à partir de laquelle le message a été délivré n'est pas la même que l'adresse distante de la socket à laquelle correspond la session, alors on peut autoriser une session à être mise à jour avec la nouvelle socket pour traitement, refuser le message ou une variété d'autres actions selon l'application.

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

La chose clé à retenir lorsque vous autorisez la réutilisation des ports est que vous devez également prendre en compte l'adresse IP source.

2
Jay