web-dev-qa-db-fra.com

Comment sont les sources de ports?

Lorsque je me connecte à https://www.google.co.uk , la modification passe à 216.58.198.228:443. Ensuite, une connexion avec moi s'ouvre sur [Mon adresse IP]: 63998.

Ma question est de savoir comment choisir le port 63998 et s’il est possible de le forcer à être 63999.

26
TheGathron

Comment sont déterminés les ports locaux

Le numéro de port est choisi par le logiciel de mise en oeuvre TCP parmi une série de numéros de port appelés ports éphémères .

Le mécanisme exact de sélection du numéro de port et de la plage à utiliser dépend du système d'exploitation.


Y at-il un moyen de le forcer à être 63999.

Cela peut être fait en modifiant la configuration du logiciel d'implémentation TCP.

Des instructions sur la configuration de la gamme ports éphémères pour divers systèmes d'exploitation sont disponibles à l'adresse Modification de la plage de ports éphémères .

  • Les instructions pour Linux et Windows sont incluses dans la réponse ci-dessous à titre de référence.

Toutefois, il n’est pas judicieux de limiter la plage à un seul port, par exemple 63999.

  • En fait, sous Windows, cela n’est pas possible car:

    La plage minimale de ports pouvant être définie est de 255.


La chaîne du port éphémère

Une connexion TCP/IPv4 se compose de deux points de terminaison et chaque point de terminaison se compose d'une adresse IP et d'un numéro de port. Par conséquent, lorsqu'un utilisateur client se connecte à un ordinateur serveur, une connexion établie peut être considérée comme le 4-Tuple de (IP du serveur, port du serveur, IP du client, port du client).

Habituellement, trois des quatre sont facilement connus - la machine cliente utilise sa propre adresse IP et lors de la connexion à un service distant, l'adresse IP de la machine serveur et son numéro de port de service sont obligatoires.

Ce qui n’est pas immédiatement évident, c’est que lorsqu’une connexion est établie, le côté client de la connexion utilise un numéro de port. À moins qu'un programme client ne demande explicitement un numéro de port spécifique, le numéro de port utilisé est un numéro de port éphémère.

Les ports éphémères sont des ports temporaires attribués par la pile IP d'une machine et sont affectés à cet effet à partir d'une plage de ports désignée. Lorsque la connexion est terminée, le port éphémère est disponible pour une réutilisation, bien que la plupart des piles IP ne réutilisent pas ce numéro de port tant que le pool complet de ports éphémères n'a pas été utilisé.

Ainsi, si le programme client se reconnecte, un numéro de port éphémère différent lui sera attribué pour son côté de la nouvelle connexion.

Source La plage de ports éphémères


Changer la plage du port éphémère

Linux:

Linux vous permet d'afficher et de modifier la plage de ports éphémères en utilisant simplement le fichier /proc/sys/net/ipv4/ip_local_port_range. Par exemple, ceci montre la configuration par défaut sur un système à noyau 2.2:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

Pour changer ceci dans la plage préférée, vous pouvez faire (en tant que superutilisateur):

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

Notez que vous devez le faire à chaque démarrage du système. Veillez donc à ajouter une ligne à un script de démarrage du système tel que /etc/rc.local pour que votre plage soit toujours utilisée.

Notez également que le noyau Linux 2.4 utilisera par défaut la plage comprise entre 32768 et 61000 si la mémoire du noyau disponible est adéquate. Par conséquent, il peut être inutile de modifier cette plage sur les systèmes Linux récents.

Enfin, notez également que vous pourrez peut-être utiliser l'interface sysctl pour modifier les paramètres plutôt que d'utiliser le système de fichiers /proc. Le nom du paramètre sysctl est "net.ipv4.ip_local_port_range". Modifiez le fichier /etc/sysctl.conf si vous le possédez ou demandez à un script de démarrage d'exécuter la commande sysctl manuellement si vous souhaitez modifier ce paramètre à l'aide de sysctl.

Windows Vista/Windows Server 2008 et plus récent:

Depuis Windows Vista et Windows Server 2008, Windows utilise désormais une large plage (49152-65535) par défaut, selon l'article de la Base de connaissances Microsoft 929851 . Ce même article montre également comment vous pouvez modifier la plage si vous le souhaitez, mais la plage par défaut est désormais suffisante pour la plupart des serveurs.

Source Modification de la plage de ports éphémères

Vous pouvez afficher la plage de ports dynamiques sur un ordinateur exécutant Windows Vista ou Windows Server 2008 à l'aide des commandes netsh suivantes:

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

Remarques:

  • La plage est définie séparément pour chaque transport et pour chaque version d'IP.
  • La plage de ports est maintenant vraiment une plage avec un point de départ et un point final.
  • Les clients Microsoft qui déploient des serveurs exécutant Windows Server 2008 peuvent rencontrer des problèmes de communication RPC entre serveurs si des pare-feu sont utilisés sur le réseau interne.
  • Dans ces cas, il est recommandé de reconfigurer les pare-feu pour autoriser le trafic entre les serveurs dans la plage de ports dynamiques comprise entre 49152 et 65535.
  • Cette gamme s’ajoute aux ports bien connus utilisés par les services et les applications.
  • Ou, la plage de ports utilisée par les serveurs peut être modifiée sur chaque serveur.

Vous ajustez cette plage en utilisant la commande netsh, comme suit:

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Cette commande définit la plage de ports dynamiques pour TCP. Le port de départ est le nombre et le nombre total de ports est la plage. Voici des exemples de commandes:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

Ces exemples de commandes définissent la plage de ports dynamiques pour qu'elle commence au port 10000 et se termine au port 10999 (1 000 ports).

Remarques:

  • La plage minimale de ports pouvant être définie est 255.
  • Le port de départ minimal pouvant être défini est 1025.
  • Le port final maximum (basé sur la plage en cours de configuration) ne peut pas dépasser 65535.
  • Pour dupliquer le comportement par défaut de Windows Server 2003, utilisez 1025 comme port de démarrage, puis 3976 comme plage pour TCP et UDP. Cela se traduit par un port de début de 1025 et un port de fin de 5000.

Source Article de la base de connaissances Microsoft 929851 :

Windows XP et plus ancien:

Pour les systèmes d'exploitation Windows plus anciens (Windows XP et versions antérieures), Windows utilise la plage BSD traditionnelle de 1024 à 4999 pour sa plage de ports éphémères. Malheureusement, il semble que vous ne puissiez définir que la limite supérieure de la plage de ports éphémères. Voici des informations extraites de l'article de la Base de connaissances Microsoft 196271 :

  • Démarrez l'Éditeur du Registre (Regedt32.exe).
  • Recherchez la clé suivante dans le registre:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • Dans le menu "Edition", cliquez sur "Ajouter une valeur", puis ajoutez la valeur de registre suivante:

    Nom de la valeur: MaxUserPort Type de données: REG_DWORD Valeur: 65534 (par exemple)

    Plage valide: 5000-65534 (décimal) Par défaut: 0x1388 (5000 décimal)

    Description: ce paramètre contrôle le nombre maximal de ports utilisé lorsqu'une application demande au système tout port utilisateur disponible. Normalement, les ports éphémères (c'est-à-dire de courte durée) sont alloués entre les valeurs de 1024 et 5000 inclus.

  • Quittez l'Éditeur du Registre.

Remarque: Un autre article pertinent de la base de connaissances ( 812873 ) prétend vous autoriser à définir une plage d'exclusion, ce qui peut signifier que vous pouvez exclure les ports 1024-9999 ( par exemple) pour que la plage de ports éphémères soit 10000-65534. Cependant, nous n’avons pas pu le faire fonctionner (en octobre 2004).

Source Modification de la plage de ports éphémères

37
DavidPostill

La réponse de David Postill est parfaitement exacte. Je voudrais juste ajouter quelque chose, en soulignant que changer la plage de ports éphémères dans Linux est si simple, que le PO a une réponse affirmative.

Vous modifiez l'EPR comme suit:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

et vous pouvez sélectionner le port 50000 (à titre d'exemple) avec le script suivant:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
Sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

Une mise en garde ici: puisqu'il y a un seul port dans la plage, une autre application pourrait vous l'arracher entre l'exécution de la troisième et de la quatrième ligne ci-dessus; de plus, même s'il n'y a pas de situation de concurrence critique, vous paralyserez toutes les autres applications jusqu'à ce que vous restauriez un EPR volumineux. C'est pourquoi j'ai restauré la plage d'origine dès que possible.

Ainsi, si le système d’exploitation des PO était Linux, la réponse aurait été que cela pouvait être fait facilement.

Étonnamment, cela n’est pas aussi simple avec les BSD, dont certains n’ont même pas de paramètre de noyau d’exécution pour l’EPR. MacOS X, FreeBSD et OpenBSD nécessitent la modification du fichier /etc/sysctl.conf , mais ils ont des choix différents pour l'EPR.

Indépendamment de ce qui précède et de l'OS, le fait que quelque chose puisse être fait ne signifie pas que devrait être fait: pourquoi sur terre avez-vous besoin de cela? Je ne peux pas penser à un cas d'utilisation unique.

8
MariusMatutiae

Cela vaut la peine d'ajouter que le noyau Linux a aussi

net.ipv4.ip_local_reserved_ports

bouton qui fait quelque chose d’opposé mais qui peut néanmoins s’avérer très utile car vous pouvez ainsi "percer un trou" pour les services qui ouvrent des ports spécifiques dans une plage de ports par ailleurs éphémère.

Brève extrait de la documentation :

Spécifiez les ports réservés aux applications tierces connues. Ces ports ne seront pas utilisés par des affectations de ports automatiques (par exemple, lors de l'appel de connect () ou de bind () avec le numéro de port 0). Le comportement d'allocation de port explicite est inchangé.

Le format utilisé pour les entrées et les sorties est une liste de plages séparées par des virgules (par exemple, "1,2-4,10-10" pour les ports 1, 2, 3, 4 et 10). L'écriture dans le fichier effacera tous les ports précédemment réservés et mettra à jour la liste actuelle avec celle indiquée dans l'entrée.

0
poige