Quand Linux conntrack n'est plus votre ami

Quand Linux conntrack n'est plus votre ami

La traçabilitĂ© des connexions (“conntrack”) est une fonctionnalitĂ© clĂ© de la pile rĂ©seau du noyau Linux. Elle permet au noyau de suivre toutes les connexions ou flux rĂ©seau logiques et d'identifier ainsi tous les paquets qui composent chaque flux, permettant leur traitement sĂ©quentiel ensemble.

Conntrack est une fonctionnalité importante du noyau, utilisée dans plusieurs cas d'utilisation fondamentaux :

  • NAT s'appuie sur les informations de conntrack pour traiter de maniĂšre cohĂ©rente tous les paquets d'un mĂȘme flux. Par exemple, lorsque un pod accĂšde Ă  un service Kubernetes, le rĂ©partiteur de charge kube-proxy utilise NAT pour rediriger le trafic vers un pod spĂ©cifique dans le cluster. Conntrack enregistre que pour une connexion donnĂ©e, tous les paquets destinĂ©s Ă  l'IP du service doivent ĂȘtre envoyĂ©s au mĂȘme pod, et que les paquets renvoyĂ©s par le pod backend doivent ĂȘtre redirigĂ©s par NAT vers le pod d'oĂč la requĂȘte est venue.
  • Les pare-feu avec suivi d'Ă©tat, tels que Calico, s'appuient sur les informations de conntrack pour ajouter le trafic “retour” Ă  la liste blanche. Cela vous permet d'Ă©crire une politique rĂ©seau qui dit : « autoriser mon pod Ă  se connecter Ă  n'importe quelle adresse IP distante » sans avoir Ă  rĂ©diger une politique pour autoriser explicitement le trafic de retour. (Sans cela, vous auriez dĂ» ajouter une rĂšgle beaucoup moins sĂ©curisĂ©e comme « autoriser les paquets Ă  mon pod depuis n'importe quelle IP ».)

De plus, conntrack améliore généralement les performances du systÚme (réduisant la consommation de temps processeur et le temps de latence des paquets), car seul le premier paquet d'un flux doit passer par l'intégralité du traitement de la pile réseau pour déterminer ce qu'il faut en faire. Voir le post «
Comparaison des modes kube-proxy» pour voir un exemple de son fonctionnement.Cependant, conntrack a ses limites


Alors, oĂč tout a-t-il mal tournĂ© ?

La table conntrack a une taille maximale configurable, et si elle est pleine, les connexions commencent gĂ©nĂ©ralement Ă  ĂȘtre rejetĂ©es ou interrompues. Pour la plupart des applications, il y a gĂ©nĂ©ralement suffisamment d'espace libre dans la table, et cela ne devient jamais un problĂšme. Cependant, il existe quelques scĂ©narios oĂč il vaut la peine de rĂ©flĂ©chir Ă  l'utilisation de la table conntrack :

La table conntrack a une taille maximale configurable, et lorsque celle-ci est pleine, les connexions commencent gĂ©nĂ©ralement Ă  ĂȘtre refusĂ©es ou interrompues. Pour la gestion du trafic de la plupart des applications, il y a gĂ©nĂ©ralement suffisamment d'espace libre dans la table, et cela ne devient jamais un problĂšme. Cependant, il existe plusieurs scĂ©narios oĂč il serait judicieux de considĂ©rer l'utilisation de la table conntrack :

  • Le cas le plus Ă©vident est lorsque votre serveur gĂšre un nombre extrĂȘmement Ă©levĂ© de connexions actives simultanĂ©es. Par exemple, si votre table conntrack est configurĂ©e pour 128k enregistrements, mais que vous avez plus de 128k connexions simultanĂ©es, vous serez sĂ»rement confrontĂ© Ă  un problĂšme !
  • Un cas un peu moins Ă©vident : si votre serveur gĂšre un trĂšs grand nombre de connexions par seconde. MĂȘme si les connexions sont temporaires, elles continuent d'ĂȘtre suivies par Linux pendant un certain temps (par dĂ©faut 120s). Par exemple, si votre table conntrack est configurĂ©e pour 128k enregistrements et que vous essayez de traiter 1100 connexions par seconde, elles dĂ©passeront la taille de la table conntrack, mĂȘme si les connexions sont de trĂšs courte durĂ©e (128k / 120s = 1092 connexions / s).

Il existe plusieurs types d'applications de niche qui relĂšvent de ces catĂ©gories. De plus, si vous avez de nombreux attaquants, le remplissage de la table conntrack de votre serveur avec un grand nombre de connexions semi-ouvertes peut ĂȘtre utilisĂ© dans le cadre d'une attaque par dĂ©ni de service (DoS). Dans les deux cas, conntrack peut devenir un goulot d'Ă©tranglement dans votre systĂšme. Dans certains cas, ajuster les paramĂštres de la table conntrack peut suffire Ă  rĂ©pondre Ă  vos besoins — en augmentant la taille ou en rĂ©duisant les dĂ©lais de conntrack (mais si vous le faites mal, vous rencontrerez de grandes difficultĂ©s). Dans d'autres cas, il sera nĂ©cessaire de contourner conntrack pour le trafic agressif.

Un exemple concret

Prenons un exemple : un grand fournisseur SaaS avec lequel nous avons travaillé avait plusieurs serveurs memcached sur des hÎtes (pas des machines virtuelles), chacun gérant plus de 50 000 connexions temporaires par seconde.

Ils ont expérimenté avec la configuration de conntrack, augmentant les tailles de tables et réduisant le temps de suivi, mais la configuration était instable, la consommation de RAM a considérablement augmenté, ce qui était un problÚme (de l'ordre de plusieurs Go !), et les connexions étaient si brÚves que conntrack ne réalisait pas son gain habituel en performance (réduction de la consommation CPU ou des latences de paquets).

En alternative, ils se sont tournés vers Calico. Les politiques réseau de Calico permettent de ne pas utiliser conntrack pour certains types de trafic (en utilisant l'option doNotTrack pour les politiques). Cela leur a donné le niveau de performance nécessaire, ainsi qu'un niveau supplémentaire de sécurité fourni par Calico.

Que faudra-t-il faire pour contourner conntrack ?

  • Les politiques rĂ©seau do-not-track doivent gĂ©nĂ©ralement ĂȘtre symĂ©triques. Dans le cas d'un fournisseur SaaS : leurs applications fonctionnaient Ă  l'intĂ©rieur d'une zone protĂ©gĂ©e et, de ce fait, grĂące Ă  la politique rĂ©seau, ils pouvaient mettre sur liste blanche le trafic d'autres applications spĂ©cifiques autorisĂ©es Ă  accĂ©der Ă  memcached.
  • La politique do-not-track ne prend pas en compte la direction de la connexion. Ainsi, en cas de piratage d'un serveur memcached, on pourrait thĂ©oriquement essayer de se connecter Ă  n'importe quel client memcached, Ă  condition d'utiliser le bon port source. Cependant, si vous avez correctement dĂ©fini la politique rĂ©seau pour vos clients memcached, ces tentatives de connexion seront tout de mĂȘme rejetĂ©es du cĂŽtĂ© client.
  • La politique do-not-track s'applique Ă  chaque paquet, contrairement aux politiques normales qui ne s'appliquent qu'au premier paquet du flux. Cela peut augmenter la consommation de ressources CPU pour un paquet, car la politique doit ĂȘtre appliquĂ©e Ă  chaque paquet. Mais pour des connexions de courte durĂ©e, cette dĂ©pense est compensĂ©e par la rĂ©duction des ressources nĂ©cessaires pour traiter conntrack. Par exemple, dans le cas d'un fournisseur SaaS, le nombre de paquets pour chaque connexion Ă©tait trĂšs faible, donc la consommation supplĂ©mentaire de ressources CPU lors de l'application des politiques Ă  chaque paquet Ă©tait justifiĂ©e.

Passons aux tests

Nous avons effectuĂ© le test sur un pod avec un serveur memcached et plusieurs pods clients memcached, exĂ©cutĂ©s sur des nƓuds distants, afin de pouvoir gĂ©nĂ©rer un trĂšs grand nombre de connexions par seconde. Le serveur avec le pod du serveur memcached avait 8 cƓurs et 512k entrĂ©es dans la table conntrack (taille de table standard configurĂ©e pour l'hĂŽte).
Nous avons mesuré la différence de performance entre : sans politique réseau ; avec une politique Calico normale ; et avec la politique Calico do-not-track.

Pour le premier test, nous avons fixé le nombre de connexions à 4 000 par seconde, afin de pouvoir nous concentrer sur la différence de consommation CPU. Il n'y avait pas de différences notables entre l'absence de politique et la politique normale, mais la politique do-not-track a augmenté la consommation CPU d'environ 20 % :

Quand Linux conntrack n'est plus votre ami

Lors du deuxiÚme test, nous avons lancé autant de connexions que nos clients pouvaient générer et avons mesuré le nombre maximum de connexions par seconde que notre serveur memcached pouvait gérer. Comme prévu, dans le cas de 'sans politiques' et de 'politique normale', les deux ont atteint la limite conntrack de plus de 4 000 connexions par seconde (512k / 120s = 4 369 connexions/s). Avec la politique do-not-track, nos clients ont envoyé 60 000 connexions par seconde sans aucun problÚme. Nous sommes convaincus que nous pourrions augmenter ce chiffre en connectant un plus grand nombre de clients, mais nous estimons que ces chiffres sont déjà suffisants pour illustrer le message de cet article !

Quand Linux conntrack n'est plus votre ami

Conclusion

Conntrack est une fonctionnalitĂ© essentielle du noyau. Il remplit parfaitement son rĂŽle. Souvent, il est utilisĂ© par des composants clĂ©s du systĂšme. Cependant, dans certaines situations spĂ©cifiques, la surcharge due Ă  conntrack l'emporte sur les avantages normaux qu'il apporte. Dans ce scĂ©nario, les politiques rĂ©seau Calico peuvent ĂȘtre utilisĂ©es pour dĂ©sactiver sĂ©lectivement l'utilisation de conntrack tout en amĂ©liorant le niveau de sĂ©curitĂ© rĂ©seau. Pour tout le reste du trafic, conntrack reste votre alliĂ© !

Lisez aussi d'autres articles sur notre blog :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster