J'ai défini les deux tcp_tw_recycle / reuse sur 1 dans mon fichier de configuration.
Quelles sont les ramifications de cela?
Si un socket TCP est réutilisé, cela pose-t-il un risque pour la sécurité? c'est-à-dire 2 connexions différentes pouvant potentiellement envoyer des données?
Convient-il aux connexions de courte durée avec peu de chances de reconnexion?
Réponses:
Par défaut, lorsque les deux
tcp_tw_reuse
ettcp_tw_recycle
sont désactivés, le noyau s'assurera que les sockets enTIME_WAIT
état resteront dans cet état assez longtemps - assez longtemps pour être sûr que les paquets appartenant aux connexions futures ne seront pas confondus avec les paquets tardifs de l'ancienne connexion.Lorsque vous activez
tcp_tw_reuse
, les sockets enTIME_WAIT
état peuvent être utilisées avant leur expiration, et le noyau essaiera de s'assurer qu'il n'y a pas de collision concernant les numéros de séquence TCP. Si vous activeztcp_timestamps
(aka PAWS, pour la protection contre les numéros de séquence encapsulés), il s'assurera que ces collisions ne peuvent pas se produire. Cependant, vous devez activer les horodatages TCP aux deux extrémités (du moins, c'est ce que je comprends). Voir la définition de tcp_twsk_unique pour les détails sanglants.Lorsque vous activez
tcp_tw_recycle
, le noyau devient beaucoup plus agressif et fera des hypothèses sur les horodatages utilisés par les hôtes distants. Il suivra le dernier horodatage utilisé par chaque hôte distant ayant une connexion enTIME_WAIT
état) et permettra de réutiliser un socket si l'horodatage a correctement augmenté. Cependant, si l'horodatage utilisé par l'hôte change (c'est-à-dire qu'il se déforme dans le temps), leSYN
paquet sera abandonné en silence et la connexion ne s'établira pas (vous verrez une erreur similaire à "délai d'expiration de connexion"). Si vous voulez plonger dans le code du noyau, la définition de tcp_timewait_state_process pourrait être un bon point de départ.Maintenant, les horodatages ne devraient jamais remonter dans le temps; sauf si:
TIME_WAIT
socket aura probablement expiré, donc ce ne sera pas un problème);TIME_WAIT
connexions resteront un peu, mais d'autres connexions seront probablement suppriméesTCP RST
et cela libérera de l'espace);Dans ce dernier cas, vous pouvez avoir plusieurs hôtes derrière la même adresse IP, et donc, différentes séquences d'horodatages (ou, ces horodateurs sont randomisés à chaque connexion par le pare-feu). Dans ce cas, certains hôtes ne pourront pas se connecter de manière aléatoire, car ils sont mappés sur un port pour lequel le
TIME_WAIT
compartiment du serveur a un horodatage plus récent. C'est pourquoi les documents vous indiquent que «les périphériques NAT ou les équilibreurs de charge peuvent commencer à supprimer des images en raison du paramètre».Certaines personnes recommandent de laisser
tcp_tw_recycle
seul, mais activertcp_tw_reuse
et abaissertcp_timewait_len
. Je plussoie :-)la source
Je viens de me mordre, alors peut-être que quelqu'un pourrait bénéficier de ma douleur et de ma souffrance. Tout d'abord, un lien impliqué avec beaucoup d'informations: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
En particulier:
J'ai utilisé ces fonctionnalités pour réussir à fournir une connectivité haproxy aussi faible que possible des clients à un cluster NDB MySql. C'était dans un cloud privé, et aucune connexion du tout à aucun n'avait de NAT dans le mélange. Le cas d'utilisation avait du sens, abaissant la latence pour les clients de rayon atteignant NDB via haproxy autant que possible. Il l'a fait.
Je l'ai fait à nouveau sur un système haproxy public, équilibrant la charge du trafic Web, sans vraiment étudier l'impact (stupide, non?!) Et découvert après beaucoup de dépannage et de chasse aux fantômes qui:
Du côté client, ils verront des périodes de temps où ils n'obtiennent plus de réponses aux paquets SYN, parfois ici et là, et parfois pendant de longues périodes. Encore une fois, au hasard.
La courte histoire ici, dans mon expérience récente et douloureuse, est de les laisser seuls / désactivés sur les serveurs publics, quel que soit leur rôle!
la source
De 'man 7 tcp' Vous verrez ceci:
Pas beaucoup d'aide là-bas. Cette uestion a également une bonne idée:
/programming/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both
Mais pas d'informations spécifiques sur les raisons pour lesquelles la réutilisation est plus sûre que le recyclage. La réponse de base est que tcp_tw_reuse permettra à un utilisateur d'utiliser le même socket s'il y en a déjà un dans TIME_WAIT avec les mêmes paramètres TCP et dans un état où aucun trafic supplémentaire n'est attendu (je pense que c'est quand un FIN a été envoyé ). tcp_tw_recycle, d'autre part, ne fera que réutiliser les sockets qui sont dans TIME_WAIT avec les mêmes paramètres quel que soit l'état, ce qui peut confondre les pare-feu avec état qui peuvent attendre différents paquets.
tcp_tw_reuse peut être fait de manière sélective dans le code en définissant l'option de socket SO_REUSEADDR, documentée
man 7 socket
comme suit :la source
SO_REUSEADDR
est lié àtcp_tw_reuse
? Pour autant que je sache,SO_REUSEADDR
ne s'applique que lorsque vous le souhaitezbind()
, alors voustcp_tw_reuse
demandera au noyau de réutiliser le port d'une socket locale enTIME_WAIT
état s'il a besoin de créer une nouvelle connexion sortante.