Le port tcp source Debian Stretch est * toujours * pair

9

Lors du débogage d'un comportement étrange avec un équilibreur de charge Azure, j'ai remarqué que ma pile TCP Debian Stretch locale établissait uniquement des connexions TCP avec un port pair. Je ne démarre pas une seule négociation TCP avec un port source impair. Est-ce prévu?

Olivier Dauby
la source

Réponses:

12

C'est pour réduire les conflits entre connect()et bind()(apparu dans Linux 4.2; Jessie a 3.16 et Stretch a 4.9):

commit 07f4c90062f8fc7c8c26f8f95324cbe8fa3145a5
Auteur: Eric Dumazet 
Date: dim.24 mai 14:49:35 2015 -0700

    tcp / dccp: essayez de ne pas épuiser ip_local_port_range dans connect ()

    Un problème de longue date sur les serveurs occupés est le minuscule port TCP disponible
    plage (/ proc / sys / net / ipv4 / ip_local_port_range) et la valeur par défaut
    allocation séquentielle des ports source dans l'appel système connect ().

    Si un hôte a beaucoup de sessions TCP actives, les chances sont
    très élevé que tous les ports sont utilisés par au moins un flux,
    et les tentatives de liaison (0) suivantes échouent ou doivent analyser une grande partie de
    espace pour trouver un emplacement.

    Dans ce patch, j'ai changé le point de départ dans __inet_hash_connect ()
    de sorte que nous essayons de favoriser les ports pairs [1], en laissant les ports impairs pour bind ()
    utilisateurs.

    Nous effectuons toujours une recherche séquentielle, il n'y a donc aucune garantie, mais
    si les cibles connect () sont très différentes, le résultat final est que nous quittons
    plus de ports disponibles pour bind (), et nous les répartissons sur toute la plage,
    réduction du temps pour connect () et bind () pour trouver un emplacement.

    Cette stratégie ne fonctionne bien que si / proc / sys / net / ipv4 / ip_local_port_range
    est pair, c'est-à-dire si les valeurs de début / fin ont une parité différente.

    Par conséquent, par défaut / proc / sys / net / ipv4 / ip_local_port_range a été remplacé par
    32768 - 60999 (au lieu de 32768 - 61000)

    Il n'y a aucun changement sur les aspects de sécurité ici, seulement un mauvais hachage
    les régimes pourraient éventuellement être touchés par ce changement.

    [1]: La propriété impair / pair dépend de la parité des valeurs ip_local_port_range

Vous pouvez également souhaiter voir la validation de suivi 1580ab63fc9a03593072cc5656167a75c4f1d173 .

Ferenc Wágner
la source