{"id":41051,"date":"2020-02-05T21:28:58","date_gmt":"2020-02-05T18:28:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/consul-iptables-3"},"modified":"2020-02-05T21:28:58","modified_gmt":"2020-02-05T18:28:58","slug":"consul-iptables-3","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/consul-iptables-3","title":{"rendered":"Consul + iptables = :3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En 2010, l'entreprise <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/wargaming\/\">Wargaming<\/a><\/noindex> disposait de 50 serveurs et d'un mod\u00e8le r\u00e9seau simple : backend, frontend et pare-feu. Le nombre de serveurs a augment\u00e9, le mod\u00e8le s'est complexifi\u00e9 : st\u00e9nages, VLAN isol\u00e9s avec ACL, puis VPN avec VRF, VLAN avec ACL en L2, VRF avec ACL en L3. \u00c7a tourne la t\u00eate ? \u00c7a va devenir plus int\u00e9ressant.<\/p>\n<p>Quand le nombre de serveurs a atteint 16 000, il est devenu impossible de travailler sereinement avec un tel nombre de segments h\u00e9t\u00e9rog\u00e8nes. C'est pourquoi une autre solution a \u00e9t\u00e9 trouv\u00e9e. Un stack Netfilter a \u00e9t\u00e9 utilis\u00e9, auquel Consul a \u00e9t\u00e9 ajout\u00e9 comme source de donn\u00e9es, cr\u00e9ant ainsi un pare-feu distribu\u00e9 rapide. Il a remplac\u00e9 les ACL sur les routeurs et a \u00e9t\u00e9 utilis\u00e9 comme pare-feu externe et interne. Pour g\u00e9rer dynamiquement l'outil, un syst\u00e8me BEFW a \u00e9t\u00e9 d\u00e9velopp\u00e9, appliqu\u00e9 partout : de la gestion de l'acc\u00e8s des utilisateurs au r\u00e9seau de production \u00e0 l'isolation des segments de r\u00e9seau les uns des autres.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/246e74278f413749a676599b5ce986a5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComment tout cela fonctionne et pourquoi vous devriez vous int\u00e9resser \u00e0 ce syst\u00e8me, le <strong>Ivan Agarov<\/strong> (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annmuor\/\" class=\"user_link\">annmuor<\/a><\/noindex>) \u2014 responsable du groupe de s\u00e9curit\u00e9 des infrastructures au sein du d\u00e9partement Maintenance au Centre de d\u00e9veloppement de Minsk de l'entreprise. Ivan est passionn\u00e9 par SELinux, aime Perl et \u00e9crit du code. En tant que responsable du groupe de s\u00e9curit\u00e9, il travaille r\u00e9guli\u00e8rement avec des journaux, des sauvegardes et R&amp;D pour prot\u00e9ger Wargaming contre les hackers et garantir le bon fonctionnement de tous les serveurs de jeu de l'entreprise.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"4zP67uYnsR4\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/4zP67uYnsR4\/hqdefault.jpg\" alt=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2>Contexte historique<\/h2>\n<p>\nAvant de vous expliquer comment nous avons fait cela, laissez-moi vous raconter comment nous en sommes arriv\u00e9s l\u00e0 et pourquoi cela \u00e9tait n\u00e9cessaire. Pour cela, revenons neuf ans en arri\u00e8re : 2010, lorsque World of Tanks venait de sortir. L'entreprise Wargaming avait environ 50 serveurs.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/64e1c2839363dbdf59ba5f11bb13530e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Graphique de la croissance des serveurs de l'entreprise.<\/em><\/p>\n<p>Nous avions un mod\u00e8le r\u00e9seau. Pour l'\u00e9poque, il \u00e9tait optimal.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/c0509324e2a83882a9792ba75612ceea.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Le mod\u00e8le r\u00e9seau en 2010.<\/em><\/p>\n<p>Sur le frontend, il y a des m\u00e9chants qui veulent nous briser, mais il y a un pare-feu. Sur le backend, il n'y a pas de pare-feu, mais il y a 50 serveurs, nous les connaissons tous. Tout fonctionne bien.<\/p>\n<p>En 4 ans, le parc de serveurs a \u00e9t\u00e9 multipli\u00e9 par 100, atteignant 5000. Les premiers r\u00e9seaux isol\u00e9s sont apparus : st\u00e9nages, qui ne peuvent pas acc\u00e9der \u00e0 la production, et o\u00f9 il y avait souvent des \u00e9l\u00e9ments potentiellement dangereux.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/08e1d7670ce1a1346e49d87c67c4be1b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Le mod\u00e8le r\u00e9seau en 2014.<\/em><\/p>\n<p>Par inertie, nous avons continu\u00e9 \u00e0 utiliser les m\u00eames mat\u00e9riels, et tout le travail \u00e9tait effectu\u00e9 sur des VLAN isol\u00e9s : des ACL \u00e9taient \u00e9crites pour ces VLAN, autorisant ou interdisant certaines connexions.<\/p>\n<p>En 2016, le nombre de serveurs a atteint 8000. Wargaming a acquis d'autres studios, et des r\u00e9seaux partenaires suppl\u00e9mentaires sont apparus. Ils semblent \u00eatre les n\u00f4tres, mais ce n'est pas tout \u00e0 fait le cas : pour les partenaires, le VLAN ne fonctionne souvent pas, il faut recourir au VPN avec VRF, et les isolations s'alourdissent. Un m\u00e9lange d'isolations ACL a augment\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/a6580c9551730447e16d7881eb102275.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Le mod\u00e8le r\u00e9seau en 2016.<\/em><\/p>\n<p>D\u00e9but 2018, le parc de machines avait cr\u00fb \u00e0 16 000. Il y avait 6 segments, et nous ne comptions pas les autres, y compris ceux ferm\u00e9s qui contenaient des donn\u00e9es financi\u00e8res. Des r\u00e9seaux de conteneurs (Kubernetes), DevOps, r\u00e9seaux cloud connect\u00e9s par VPN, par exemple depuis des IVC, sont apparus. Il y avait beaucoup de r\u00e8gles \u2014 c'\u00e9tait douloureux.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/ec44e6a60da98daa4bbf2bca2e3b2e1a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Mod\u00e8le r\u00e9seau et m\u00e9thodes d'isolation en 2018.<\/em><\/p>\n<p>Pour l'isolation, nous avons utilis\u00e9 : VLAN avec ACL sur L2, VRF avec ACL sur L3, VPN et bien d'autres choses. Trop de choses.<\/p>\n<h2>Probl\u00e8mes<\/h2>\n<p>\nTout le monde vit avec des ACL et VLAN. Quel est le probl\u00e8me ? Harold, qui cache sa douleur, r\u00e9pondra \u00e0 cette question.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/4df5105af3bce515d80e8e5f3e14c027.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl y avait beaucoup de probl\u00e8mes, mais massifs \u2014 cinq.<\/p>\n<ul>\n<li><strong>Croissance g\u00e9om\u00e9trique des prix pour de nouvelles r\u00e8gles.<\/strong>. Chaque nouvelle r\u00e8gle prenait plus de temps \u00e0 ajouter que la pr\u00e9c\u00e9dente, car il fallait d'abord v\u00e9rifier s'il n'y avait pas d\u00e9j\u00e0 une telle r\u00e8gle.<\/li>\n<li><strong>Pas de pare-feu \u00e0 l'int\u00e9rieur des segments.<\/strong>. Les segments ont \u00e9t\u00e9 quelque peu s\u00e9par\u00e9s les uns des autres, \u00e0 l'int\u00e9rieur, il n'y avait d\u00e9j\u00e0 pas assez de ressources.<\/li>\n<li><strong>Les r\u00e8gles prenaient du temps \u00e0 s'appliquer. <\/strong>\u00c0 la main, un op\u00e9rateur pouvait \u00e9crire une r\u00e8gle locale en une heure. Une r\u00e8gle globale prenait plusieurs jours.<\/li>\n<li><strong>Difficult\u00e9s avec l'audit des r\u00e8gles.<\/strong>. En fait, cela \u00e9tait impossible. Les premi\u00e8res r\u00e8gles ont \u00e9t\u00e9 \u00e9crites en 2010, et la plupart de leurs auteurs ne travaillaient d\u00e9j\u00e0 plus dans l'entreprise.<\/li>\n<li><strong>Niveau de contr\u00f4le faible sur l'infrastructure.<\/strong>. C'est le principal probl\u00e8me \u2014 nous ne savions pas vraiment ce qui se passait.<\/li>\n<\/ul>\n<p>\nVoici \u00e0 quoi ressemblait un ing\u00e9nieur r\u00e9seau en 2018, quand il entendait : \u00ab Il faut encore un peu d'ACL \u00bb.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/8366d3092558ebb15a4ba6d8e5702032.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Solutions<\/h2>\n<p>\nD\u00e9but 2018, il a \u00e9t\u00e9 d\u00e9cid\u00e9 de faire quelque chose \u00e0 ce sujet.<\/p>\n<p><strong>Le prix des int\u00e9grations augmente continuellement. <\/strong>Le point de d\u00e9part \u00e9tait que les grands centres de donn\u00e9es ont cess\u00e9 de prendre en charge des VLAN et ACL isol\u00e9s, car la m\u00e9moire des appareils \u00e9tait \u00e9puis\u00e9e.<\/p>\n<p>Solution : nous avons \u00e9limin\u00e9 le facteur humain et avons automatis\u00e9 au maximum l'octroi d'acc\u00e8s.<\/p>\n<p><strong>Les nouvelles r\u00e8gles mettent longtemps \u00e0 \u00eatre appliqu\u00e9es. <\/strong>Solution : acc\u00e9l\u00e9rer l'application des r\u00e8gles, la rendre distribu\u00e9e et parall\u00e8le. Pour cela, un syst\u00e8me distribu\u00e9 est n\u00e9cessaire, afin que les r\u00e8gles soient d\u00e9livr\u00e9es automatiquement, sans rsync ou SFTP sur mille syst\u00e8mes.<\/p>\n<p><strong>Absence de pare-feu \u00e0 l'int\u00e9rieur des segments. <\/strong>Le pare-feu \u00e0 l'int\u00e9rieur des segments a commenc\u00e9 \u00e0 nous affecter lorsque diff\u00e9rents services sont apparus au sein d'un m\u00eame r\u00e9seau. Solution : utiliser un pare-feu au niveau de l'h\u00f4te \u2014 des pare-feux bas\u00e9s sur l'h\u00f4te. Nous avons pratiquement Linux partout, et iptables est toujours disponible, ce n'est pas un probl\u00e8me.<\/p>\n<p><strong>Difficult\u00e9s avec l'audit des r\u00e8gles.<\/strong> Solution : conserver toutes les r\u00e8gles en un seul endroit pour r\u00e9vision et gestion, afin que nous puissions effectuer des audits.<\/p>\n<p><strong>Niveau de contr\u00f4le faible sur l'infrastructure. <\/strong>Solution : r\u00e9aliser un inventaire de tous les services et des acc\u00e8s entre eux.<\/p>\n<p>C'est un processus plus administratif que technique. Parfois, nous avons 200 \u00e0 300 nouvelles versions par semaine, surtout pendant les promotions et les f\u00eates. Et cela ne concerne qu'une seule \u00e9quipe de nos DevOps. Avec un tel nombre de versions, il est impossible de comprendre quels ports, IP, et int\u00e9grations sont n\u00e9cessaires. C'est pourquoi nous avons besoin de gestionnaires de services sp\u00e9cialement form\u00e9s, qui questionnaient les \u00e9quipes : \u00ab Qu'est-ce que vous avez et pourquoi l'avez-vous mis en place ? \u00bb<\/p>\n<p>Apr\u00e8s tout ce que nous avons lanc\u00e9, l'ing\u00e9nieur r\u00e9seau en 2019 avait d\u00e9j\u00e0 cet aspect.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/ccca25d7f7bb7f70638725addc6d99ed.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Consul<\/h2>\n<p>\nNous avons d\u00e9cid\u00e9 de mettre tout ce que nous avons trouv\u00e9 gr\u00e2ce aux gestionnaires de services dans Consul et d'\u00e9crire les r\u00e8gles iptables \u00e0 partir de l\u00e0.<\/p>\n<p>Comment avons-nous d\u00e9cid\u00e9 de proc\u00e9der ?<\/p>\n<ul>\n<li>Nous rassemblerons tous les services, r\u00e9seaux et utilisateurs.<\/li>\n<li>Nous cr\u00e9erons des r\u00e8gles iptables sur cette base.<\/li>\n<li>Nous automatiserons le contr\u00f4le.<\/li>\n<li>\u2026.<\/li>\n<li>PROFIT.<\/li>\n<\/ul>\n<p>\nConsul n'est pas une API distante, il peut fonctionner sur chaque n\u0153ud et \u00e9crire dans iptables. Il ne reste plus qu'\u00e0 trouver des moyens de contr\u00f4le automatiques qui nettoieront le superflu, et la plupart des probl\u00e8mes seront r\u00e9solus ! Le reste sera peaufin\u00e9 en cours de route.<\/p>\n<h3>Pourquoi Consul ?<\/h3>\n<p>\n<strong>Il a fait ses preuves. <\/strong>Entre 2014 et 2015, nous l'avons utilis\u00e9 comme backend pour Vault, o\u00f9 nous stockons les mots de passe.<\/p>\n<p><strong>Ne perd pas de donn\u00e9es.<\/strong>. Pendant son utilisation, Consul n'a perdu aucune donn\u00e9e lors d'une seule panne. C'est un \u00e9norme avantage pour le syst\u00e8me de gestion du pare-feu.<\/p>\n<p><strong>Les connexions P2P acc\u00e9l\u00e8rent la propagation des changements.<\/strong>. Avec P2P, tous les changements arrivent rapidement, il n'est pas n\u00e9cessaire d'attendre des heures.<\/p>\n<p><strong>API REST pratique.<\/strong> Nous avons \u00e9galement envisag\u00e9 Apache ZooKeeper, mais il n'a pas d'API REST, il faudrait mettre en place des solutions de contournement.<\/p>\n<p><strong>Fonctionne \u00e0 la fois comme un stockage de cl\u00e9s (KV) et comme un annuaire (D\u00e9couverte de services).<\/strong>. On peut stocker des services, des catalogues, des centres de donn\u00e9es. Cela est pratique non seulement pour nous, mais aussi pour les \u00e9quipes voisines, car en construisant un service global, nous pensons \u00e0 grande \u00e9chelle.<\/p>\n<p><strong>\u00c9crit en Go, qui fait partie de la stack Wargaming. <\/strong>Nous aimons ce langage, nous avons de nombreux d\u00e9veloppeurs Go.<\/p>\n<p><strong>Un syst\u00e8me ACL puissant. <\/strong>Avec ACL dans Consul, vous pouvez g\u00e9rer qui peut \u00e9crire quoi. Nous garantissons que les r\u00e8gles de pare-feu ne se chevaucheront plus et que nous n'aurons plus ce genre de probl\u00e8mes.<\/p>\n<p>Mais Consul a aussi des inconv\u00e9nients.<\/p>\n<ul>\n<li><strong>Il ne se scale pas au sein d'un data center, \u00e0 moins d'avoir la version professionnelle. <\/strong>Il se scale uniquement par f\u00e9d\u00e9ration.<\/li>\n<li><strong>Il est tr\u00e8s d\u00e9pendant de la qualit\u00e9 du r\u00e9seau et de la charge des serveurs. <\/strong>Consul ne fonctionnera pas correctement en tant que serveur sur un serveur surcharg\u00e9 si le r\u00e9seau pr\u00e9sente des lags, comme une vitesse irr\u00e9guli\u00e8re. Cela est li\u00e9 aux connexions P2P et aux mod\u00e8les de diffusion des mises \u00e0 jour.<\/li>\n<li><strong>Difficult\u00e9s de surveillance de la disponibilit\u00e9<\/strong>. Dans l'\u00e9tat de Consul, il peut dire que tout va bien, mais en fait, il est d\u00e9j\u00e0 tomb\u00e9.<\/li>\n<\/ul>\n<p>\nNous avons r\u00e9solu la plupart de ces probl\u00e8mes lors de l'utilisation de Consul, c'est pourquoi nous l'avons choisi. L'entreprise envisage une alternative en backend, mais nous avons appris \u00e0 faire face aux probl\u00e8mes et vivons pour l'instant avec Consul.<\/p>\n<h3>Comment fonctionne Consul<\/h3>\n<p>\nDans un data center hypoth\u00e9tique, nous installerons des serveurs \u2014 entre trois et cinq. Un ou deux serveurs ne conviennent pas : ils ne pourront pas organiser un quorum et d\u00e9terminer qui a raison, qui a tort lorsque les donn\u00e9es ne correspondent pas. Plus de cinq n'a pas de sens, les performances en souffriront.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/96153c4e9075b067b34a63ceba5b80f0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes clients se connectent aux serveurs dans n'importe quel ordre : ce sont les m\u00eames agents, mais avec le drapeau <code>server = false<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/0854d1286c18bb5e7c1130c6734154a9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nApr\u00e8s cela, les clients obtiennent une liste de connexions P2P et \u00e9tablissent des relations entre eux.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/2457cb7707c27cc23f6e13415119b91d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c0 l'\u00e9chelle mondiale, nous relions plusieurs data centers. Ils se connectent \u00e9galement en P2P et communiquent.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/3b4ae922eb8d2a6a9a79425e769505d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLorsque nous voulons r\u00e9cup\u00e9rer des donn\u00e9es d'un autre data center, la demande va d'un serveur \u00e0 un autre. Ce sch\u00e9ma est appel\u00e9 <strong>protocole Serf<\/strong>. Le protocole Serf, tout comme Consul, est un d\u00e9veloppement de HashiCorp.<\/p>\n<h3>Quelques faits importants sur Consul<\/h3>\n<p>\nConsul a de la documentation d\u00e9crivant son fonctionnement. Je vais donner seulement quelques faits cl\u00e9s qu'il vaut la peine de conna\u00eetre.<\/p>\n<p><strong>Les serveurs Consul choisissent un ma\u00eetre parmi les votants.<\/strong>Consul choisit un ma\u00eetre parmi la liste des serveurs pour chaque data center, et toutes les demandes vont uniquement \u00e0 lui, peu importe le nombre de serveurs. Le blocage du ma\u00eetre ne conduit pas \u00e0 de nouvelles \u00e9lections. Si aucun ma\u00eetre n'est choisi, les demandes ne sont trait\u00e9es par personne.<\/p>\n<blockquote><p>Vous vouliez une mont\u00e9e en charge horizontale ? D\u00e9sol\u00e9, non.<\/p><\/blockquote>\n<p> La requ\u00eate vers un autre datacenter se fait d'un ma\u00eetre \u00e0 un ma\u00eetre, ind\u00e9pendamment du serveur sur lequel elle est effectu\u00e9e. Le ma\u00eetre s\u00e9lectionn\u00e9 re\u00e7oit 100 % de la charge, \u00e0 l'exception de la charge des requ\u00eates transf\u00e9r\u00e9es. Une copie \u00e0 jour des donn\u00e9es est pr\u00e9sente sur tous les serveurs du datacenter, mais seule une r\u00e9pond.<\/p>\n<blockquote><p>Le seul moyen de se dimensionner est d'activer le mode stale c\u00f4t\u00e9 client.<\/p><\/blockquote>\n<p>En mode stale, il est possible de r\u00e9pondre sans quorum. C'est un mode dans lequel nous renon\u00e7ons \u00e0 la coh\u00e9rence des donn\u00e9es, mais o\u00f9 les lectures sont l\u00e9g\u00e8rement plus rapides que d'habitude, et n'importe quel serveur peut r\u00e9pondre. Naturellement, l'\u00e9criture se fait uniquement via le ma\u00eetre.<\/p>\n<p><strong>Consul ne copie pas les donn\u00e9es entre les datacenters<\/strong>. Lors de la collecte de f\u00e9d\u00e9rations, chaque serveur aura uniquement ses propres donn\u00e9es. Pour d'autres, il se tournera toujours vers quelqu'un d'autre.<\/p>\n<p><strong>L'atatomicit\u00e9 des op\u00e9rations n'est pas garantie en dehors de la transaction<\/strong>. Rappelez-vous que vous n'\u00eates pas le seul \u00e0 pouvoir modifier quelque chose. Si vous voulez faire diff\u00e9remment, effectuez une transaction avec blocage.<\/p>\n<p><strong>Les op\u00e9rations de blocage ne garantissent pas le verrouillage<\/strong>. La requ\u00eate va d'un ma\u00eetre \u00e0 un ma\u00eetre, et non directement, donc il n'y a aucune garantie que le verrouillage fonctionnera lorsque vous en faites un, par exemple dans un autre datacenter.<\/p>\n<p><strong>Les ACL ne garantissent \u00e9galement pas l'acc\u00e8s (dans de nombreux cas)<\/strong>. L\u2019ACL peut ne pas fonctionner, car elle est stock\u00e9e dans un seul datacenter de la f\u00e9d\u00e9ration \u2014 dans le datacenter ACL (DC principal). Si le DC ne vous r\u00e9pond pas, l\u2019ACL ne fonctionnera pas.<\/p>\n<p><strong>Un ma\u00eetre bloqu\u00e9 entra\u00eenera le blocage de toute la f\u00e9d\u00e9ration<\/strong>. Par exemple, dans une f\u00e9d\u00e9ration de 10 datacenters, si l'un a un mauvais r\u00e9seau et qu'un ma\u00eetre tombe, tous ceux qui communiquent avec lui se bloqueront en boucle : la requ\u00eate est envoy\u00e9e, aucune r\u00e9ponse, le thread se bloque. Il est impossible de savoir quand cela se produira, d'un coup dans une heure ou deux, toute la f\u00e9d\u00e9ration tombera. Vous ne pourrez rien y faire.<\/p>\n<p>L'\u00e9tat, le quorum et les \u00e9lections sont trait\u00e9s par un fil s\u00e9par\u00e9. Les r\u00e9\u00e9lections ne se produiront pas, l'\u00e9tat ne montrera rien. Vous pensez que votre Consul est vivant, vous demandez, et rien ne se passe \u2014 aucune r\u00e9ponse. Pendant ce temps, l'\u00e9tat indique que tout va bien.<\/p>\n<p>Nous avons rencontr\u00e9 ce probl\u00e8me et avons d\u00fb reconstruire certaines parties des datacenters pour l'\u00e9viter.<\/p>\n<p><strong>Dans la version entreprise de Consul, certains des d\u00e9fauts mentionn\u00e9s ci-dessus n'existent pas<\/strong>Il contient de nombreuses fonctionnalit\u00e9s utiles : choix des voteurs, distribution, mise \u00e0 l'\u00e9chelle. Il n'y a qu'un seul \u00ab mais \u00bb : le syst\u00e8me de licence pour le syst\u00e8me distribu\u00e9 est tr\u00e8s co\u00fbteux.<\/p>\n<p>Astuces : <code>rm -rf \/var\/lib\/consul<\/code> \u2014 le rem\u00e8de \u00e0 tous les probl\u00e8mes de l'agent. Si quelque chose ne fonctionne pas, supprimez simplement vos donn\u00e9es et rechargez-les \u00e0 partir d'une copie. Il est probable que Consul red\u00e9marre.<\/p>\n<h2>BEFW<\/h2>\n<p>\nParlons maintenant de ce que nous avons ajout\u00e9 \u00e0 Consul.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">BEFW<\/a><\/noindex> \u2014 c'est un acronyme pour <strong>B<\/strong>ack<strong>E<\/strong>nd<strong>F<\/strong>ire<strong>S<\/strong>all. Il fallait bien nommer le produit lors de la cr\u00e9ation du d\u00e9p\u00f4t pour y mettre les premiers commits de test. Ce nom est rest\u00e9.<\/p>\n<h3>Mod\u00e8les de r\u00e8gles<\/h3>\n<p>\nLes r\u00e8gles sont \u00e9crites dans la syntaxe iptables.<\/p>\n<ul>\n<li>-N BEFW<\/li>\n<li>-P INPUT DROP<\/li>\n<li>-A INPUT -m state\u2014state RELATED,ESTABLISHED -j ACCEPT<\/li>\n<li>-A INPUT -i lo -j ACCEPT<\/li>\n<li>-A INPUT -j BEFW<\/li>\n<\/ul>\n<p>\nTout notre trafic passe par la cha\u00eene BEFW, sauf <code>ESTABLISHED<\/code>, <code>RELATED<\/code> et localhost. Le mod\u00e8le peut \u00eatre n'importe quel, c'est juste un exemple.<\/p>\n<p>\u00c0 quoi sert BEFW ?<\/p>\n<h3>Services<\/h3>\n<p>\nNous avons un service, il y a toujours un port, un n\u0153ud sur lequel il fonctionne. Avec notre n\u0153ud, nous pouvons interroger localement l'agent et savoir qu'il y a un service. Nous pouvons \u00e9galement ajouter des \u00e9tiquettes.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/6d8c74db37e2e1eed971cfa6947cc5c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTout service qui est lanc\u00e9 et enregistr\u00e9 dans Consul se convertit en r\u00e8gle iptables. Nous avons SSH \u2014 nous ouvrons le port 22. Le script Bash est simple : curl et iptables, rien de plus.<\/p>\n<h3>Clients<\/h3>\n<p>\nComment ouvrir l'acc\u00e8s de mani\u00e8re s\u00e9lective, et non \u00e0 tout le monde ? En utilisant le nom du service pour stocker des listes d'IP dans le stockage KV.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/11a5af5aad9e848565458f168a1eee64.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPar exemple, nous souhaitons que tous ceux du r\u00e9seau dix puissent acc\u00e9der au service SSH_TCP_22. Nous ajoutons un petit champ TTL ? et maintenant nous avons des autorisations temporaires, par exemple, pour une journ\u00e9e.<\/p>\n<h3>Acc\u00e8s<\/h3>\n<p>\nNous connectons des services et des clients : nous avons un service, pour chacun, un stockage KV est pr\u00eat. Maintenant, nous donnons acc\u00e8s non pas \u00e0 tout le monde, mais de mani\u00e8re s\u00e9lective.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/d1119fbb226595184cac8d9ce7a924e3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Groupes<\/h3>\n<p>\nSi nous \u00e9crivons \u00e0 chaque fois des milliers d'IP pour les acc\u00e8s, nous allons nous fatiguer. Inventons des regroupements \u2014 un sous-ensemble distinct dans la KV. Nous l'appellerons Alias (ou groupes) et y stockerons des groupes selon le m\u00eame principe.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/67c6ab76cc25a3973739bdd44b69cef9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nConnectons : maintenant nous pouvons ouvrir SSH non pas sp\u00e9cifiquement sur P2P, mais sur tout un groupe ou plusieurs groupes. De m\u00eame, il y a un TTL \u2014 nous pouvons ajouter \u00e0 un groupe et retirer temporairement.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/a00b7db5087a96730c2725090f33e2b0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Int\u00e9gration<\/h3>\n<p>\nNotre probl\u00e8me \u2014 le facteur humain et l'automatisation. Pour l'instant, nous l'avons r\u00e9solu comme \u00e7a.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/ce7a0c16543d0624453e6bdada3b8f03.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous travaillons avec Puppet et y transf\u00e9rons tout ce qui concerne le syst\u00e8me (code des applications). Dans puppetdb (un PostgreSQL classique) est stock\u00e9e la liste des services qui y sont lanc\u00e9s, que l'on peut trouver par type de ressource. L\u00e0, on peut aussi voir qui se connecte o\u00f9. Nous avons \u00e9galement un syst\u00e8me de pull request et de merge request pour cela.<\/p>\n<p>Nous avons \u00e9crit befw-sync \u2014 une solution simple qui aide \u00e0 transf\u00e9rer des donn\u00e9es. D'abord, les cookies de synchronisation se connectent \u00e0 puppetdb. L'API HTTP est configur\u00e9e : nous demandons quels services nous avons, ce qu'il faut faire. Ensuite, une requ\u00eate est faite \u00e0 Consul.<\/p>\n<p>Y a-t-il une int\u00e9gration ? Oui : nous avons \u00e9crit des r\u00e8gles, autoris\u00e9 l'acceptation des Pull Requests. Avez-vous besoin d'un port ou d'ajouter un h\u00f4te \u00e0 un groupe ? Pull Request, revue \u2014 plus aucune \u00ab Trouvez 200 autres ACL et essayez d'en faire quelque chose \u00bb.<\/p>\n<h3>Optimisation<\/h3>\n<p>\nUn ping localhost avec une cha\u00eene de r\u00e8gles vide prend 0,075 ms.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/39263844f79c4795af05dc3ecb734394.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAjoutons dans cette cha\u00eene 10 000 adresses iptables. En cons\u00e9quence, le ping augmentera de 5 fois : iptables est compl\u00e8tement lin\u00e9aire, le traitement de chaque adresse prend un certain temps.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/e6c314155c3a34fdf61e40479ecb26c3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour le pare-feu vers lequel nous migrons des milliers d'ACL, nous avons beaucoup de r\u00e8gles, et cela entra\u00eene des d\u00e9lais. C'est mauvais pour les protocoles de jeu.<\/p>\n<p>Mais si nous pla\u00e7ons <strong>10 000 adresses dans ipset<\/strong> le ping m\u00eame diminuera.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/2dd844d9324d057ba9ab098e501a1e51.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe sens est que \u00ab O \u00bb (complexit\u00e9 de l'algorithme) pour ipset est toujours \u00e9gal \u00e0 1, peu importe combien de r\u00e8gles il y a. En revanche, il y a une limitation \u2014 il ne peut pas y avoir plus de 65535 r\u00e8gles. Pour l'instant, nous vivons avec cela : nous pouvons les combiner, les \u00e9tendre, faire deux ipset dans un.<\/p>\n<h3>Stockage<\/h3>\n<p>\nLa suite logique du processus d'it\u00e9rations est le stockage des informations clients pour le service dans ipset.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/126069799d95594be8611237e935189d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons maintenant le m\u00eame SSH, et nous n'\u00e9crivons pas imm\u00e9diatement 100 IP, nous sp\u00e9cifions un nom ipset avec lequel nous devons communiquer, et la prochaine r\u00e8gle <code>DROP<\/code>. On peut reformuler en une r\u00e8gle \u00ab Qui n'est pas ici, est DROP \u00bb, mais c'est plus clair de cette mani\u00e8re.<\/p>\n<p>Nous avons maintenant des r\u00e8gles et des ensembles. La t\u00e2che principale est de cr\u00e9er l'ensemble avant d'\u00e9crire la r\u00e8gle, sinon iptables ne l'enregistrera pas.<\/p>\n<h3>Sch\u00e9ma g\u00e9n\u00e9ral<\/h3>\n<p>\nSous forme de sch\u00e9ma, tout ce que j'ai expliqu\u00e9 ressemble \u00e0 \u00e7a.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/4046e921cb5f466f8af5a6af1fcd151c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous commettons dans Puppet, tout est envoy\u00e9 \u00e0 l'h\u00f4te, les services ici, ipset l\u00e0-bas, et ceux qui ne sont pas inscrits l\u00e0-bas ne sont pas laiss\u00e9s passer.<\/p>\n<h3>Allow &amp; deny<\/h3>\n<p>\nPour sauver rapidement le monde ou d\u00e9connecter quelqu'un rapidement, au d\u00e9but de toutes les cha\u00eenes, nous avons cr\u00e9\u00e9 deux ipset : <code>rules_allow<\/code> et <code>rules_deny<\/code>. Comment cela fonctionne-t-il ?<\/p>\n<p>Par exemple, quelqu'un cr\u00e9e une charge sur notre Web avec des bots. Auparavant, il fallait trouver son IP dans les logs, l'apporter aux ing\u00e9nieurs r\u00e9seaux pour qu'ils trouvent la source du trafic et la bloquent. Maintenant, cela fonctionne diff\u00e9remment.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/6e7f906919536cab2c283ba6ceb0472d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous envoyons dans Consul, attendons 2,5 secondes, et c'est pr\u00eat. Comme Consul distribue rapidement gr\u00e2ce au P2P, cela fonctionne partout, dans n'importe quelle partie du monde.<\/p>\n<p>Une fois, j'ai compl\u00e8tement arr\u00eat\u00e9 WOT en faisant une erreur avec le pare-feu. <code>rules_allow<\/code> \u2014 c'est notre assurance contre de tels cas. Si nous avons fait une erreur quelque part avec le pare-feu, si quelque chose est bloqu\u00e9, nous pouvons toujours envoyer un conditionnel <code>0.0\/0<\/code>, pour tout relever rapidement. Ensuite, nous r\u00e9parerons tout manuellement.<\/p>\n<h3>D'autres ensembles<\/h3>\n<p>\nOn peut ajouter d'autres ensembles dans l'espace <code>$IPSETS$<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/4e1e337b35da81cd7324b2adc106b085.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPourquoi ? Parfois, certaines personnes ont besoin d'ipset, par exemple, pour \u00e9muler la d\u00e9sactivation d'une partie du cluster. Chacun peut apporter n'importe quel ensemble, le nommer et ils seront r\u00e9cup\u00e9r\u00e9s depuis Consul. Ces ensembles peuvent participer aux r\u00e8gles iptables, mais peuvent aussi agir comme une sorte de commande <code>NOOP<\/code>: la coh\u00e9rence sera maintenue par un d\u00e9mon.<\/p>\n<h3>Utilisateurs<\/h3>\n<p>\nAvant, c'\u00e9tait comme \u00e7a : l'utilisateur se connectait au r\u00e9seau et recevait des param\u00e8tres via un domaine. Avant l'apparition des pare-feu de nouvelle g\u00e9n\u00e9ration, Cisco ne pouvait pas comprendre o\u00f9 \u00e9tait l'utilisateur, et o\u00f9 se trouvait l'IP. Par cons\u00e9quent, l'acc\u00e8s \u00e9tait accord\u00e9 uniquement via le hostname de la machine.<\/p>\n<p>Que avons-nous fait ? Nous nous sommes intercal\u00e9s au moment de la r\u00e9ception de l'adresse. G\u00e9n\u00e9ralement, c'est un dot1x, Wi-Fi ou VPN \u2014 tout passe par RADIUS. Pour chaque utilisateur, nous cr\u00e9ons un groupe bas\u00e9 sur le nom de l'utilisateur et y pla\u00e7ons l'IP avec un TTL \u00e9gal \u00e0 son dhcp.lease \u2014 d\u00e8s qu'il expire, la r\u00e8gle dispara\u00eet.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/04550475c6af49d094c18b1d5b89123a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMaintenant, nous pouvons ouvrir l'acc\u00e8s aux services, comme pour d'autres groupes, par username. Nous avons \u00e9limin\u00e9 la douleur li\u00e9e au hostname, lorsqu'ils changent, et avons r\u00e9duit la charge sur les ing\u00e9nieurs r\u00e9seaux, car ils n'ont plus besoin de Cisco. Maintenant, les ing\u00e9nieurs g\u00e8rent eux-m\u00eames les acc\u00e8s sur leurs serveurs.<\/p>\n<h3>Isolation<\/h3>\n<p>\nEn parall\u00e8le, nous avons commenc\u00e9 \u00e0 travailler sur l'isolation. Les gestionnaires de service ont fait un inventaire, et nous avons analys\u00e9 tous nos r\u00e9seaux. Nous les distribuerons en groupes similaires, et sur les serveurs n\u00e9cessaires, nous avons ajout\u00e9 ces groupes, par exemple, dans deny. Maintenant, la m\u00eame isolation de staging passe dans rules_deny pour la production, mais pas dans la production elle-m\u00eame.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/60fe7407013aa64b853791f8def627cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe sch\u00e9ma fonctionne rapidement et simplement : nous retirons tous les ACL des serveurs, d\u00e9chargeons les \u00e9quipements, et r\u00e9duisons le nombre de VLAN isol\u00e9s.<\/p>\n<h3>Contr\u00f4le de l'int\u00e9grit\u00e9<\/h3>\n<p>\nAuparavant, nous avions un d\u00e9clencheur sp\u00e9cial qui signalait quand quelqu'un modifiait manuellement une r\u00e8gle de pare-feu. J'\u00e9crivais un \u00e9norme linter pour v\u00e9rifier les r\u00e8gles de pare-feu, c'\u00e9tait compliqu\u00e9. Maintenant, l'int\u00e9grit\u00e9 est contr\u00f4l\u00e9e par BEFW. Il veille jalousement \u00e0 ce que les r\u00e8gles, qu'il \u00e9tablit, ne soient pas modifi\u00e9es. Si quelqu'un change les r\u00e8gles de pare-feu, il les remettra \u00e0 leur \u00e9tat d'origine. \u00ab J'ai vite mont\u00e9 un proxy pour travailler depuis chez moi \u00bb \u2014 ce genre de situation n'existe plus.<\/p>\n<p>BEFW contr\u00f4le l'ipset \u00e0 partir des services et de la liste dans befw.conf, les r\u00e8gles des services dans la cha\u00eene BEFW. Mais il ne surveille pas d'autres cha\u00eenes et r\u00e8gles et d'autres ipset.<\/p>\n<h3>Protection en cas d'accident<\/h3>\n<p>\nBEFW sauvegarde toujours le dernier \u00e9tat r\u00e9ussi directement dans la structure binaire state.bin. Si quelque chose ne va pas, il revient toujours \u00e0 cet \u00e9tat state.bin.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/724f3537c06a7135fa6397f9ddd5630f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nC'est une assurance contre le fonctionnement instable de Consul, lorsque des donn\u00e9es n'ont pas \u00e9t\u00e9 envoy\u00e9es ou si quelqu'un a fait une erreur en utilisant des r\u00e8gles qui ne peuvent pas \u00eatre appliqu\u00e9es. Pour que nous ne restions pas sans pare-feu, BEFW reviendra au dernier \u00e9tat, si une erreur se produit \u00e0 un moment donn\u00e9.<\/p>\n<p>Dans des situations critiques, c'est une garantie que nous aurons un pare-feu fonctionnel. Nous ouvrons tous les r\u00e9seaux en gris en esp\u00e9rant qu'un administrateur viendra et r\u00e9parera. Un jour, je le mettrai dans les configurations, mais pour l'instant, nous avons juste trois r\u00e9seaux en gris : 10\/8, 172\/12 et 192.168\/16. Dans le cadre de notre Consul, c'est une caract\u00e9ristique importante qui aide \u00e0 avancer.<\/p>\n<p><em>D\u00e9monstration : pendant la pr\u00e9sentation, Ivan montre le mode d\u00e9mo de BEFW. Il est plus pratique de regarder la d\u00e9monstration sur <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/4zP67uYnsR4?t=1663\">vid\u00e9o<\/a><\/noindex>. Le code source de la d\u00e9mo est disponible <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\/tree\/master\/demo\">sur GitHub<\/a><\/noindex>.<\/em><\/p>\n<h2>Les pi\u00e8ges<\/h2>\n<p>\nJe vais parler des bugs auxquels nous avons \u00e9t\u00e9 confront\u00e9s.<\/p>\n<p><strong>ipset add set 0.0.0.0\/0. <\/strong>Que se passe-t-il si nous ajoutons dans ipset 0.0.0.0\/0 ? Tous les IP vont-ils s'ajouter ? L'acc\u00e8s \u00e0 Internet sera-t-il ouvert ? <\/p>\n<p>Non, nous obtiendrons un bug qui nous a co\u00fbt\u00e9 deux heures d'arr\u00eat. De plus, le bug ne fonctionne pas depuis 2016, il est enregistr\u00e9 dans RedHat Bugzilla sous le num\u00e9ro #1297092, et nous l'avons trouv\u00e9 par hasard dans le rapport d'un d\u00e9veloppeur.<\/p>\n<p>Maintenant, il y a une r\u00e8gle stricte dans BEFW, que <code>0.0.0.0\/0<\/code> se transforme en deux adresses : <code>0.0.0.0\/1<\/code> et <code>128.0.0.0\/1<\/code>.<\/p>\n<p><strong>ipset restore set &lt; file. <\/strong>Que fait ipset lorsque vous lui dites <code>restore<\/code>? \u0412\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a iptables? \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435?<\/p>\n<p>Rien de tel \u2014 il effectue un merge, et les anciennes adresses ne disparaissent nulle part, vous ne fermez pas l'acc\u00e8s.<\/p>\n<p>Nous avons trouv\u00e9 le bug en testant l'isolement. Maintenant, il y a un syst\u00e8me assez complexe \u2014 au lieu de <code>restore<\/code> se d\u00e9roule <code>create temp<\/code>, puis <code>restore flush temp<\/code> et <code>restore temp<\/code>. \u00c0 la fin, swap : pour l'atomicit\u00e9, car si vous r\u00e9alisez d'abord <code>flush<\/code> Et \u00e0 ce moment-l\u00e0, si un paquet arrive, il sera rejet\u00e9 et quelque chose se passera mal. Donc, il y a un peu de magie noire l\u00e0-dedans.<\/p>\n<p><strong>consul kv get -datacenter=other. <\/strong>Comme je l'ai d\u00e9j\u00e0 dit, nous pensons demander certaines donn\u00e9es, mais nous obtiendrons soit des donn\u00e9es, soit une erreur. Nous pouvons le faire via Consul localement, mais dans ce cas, les deux vont se bloquer.<\/p>\n<p>Le client Consul local est une couche au-dessus de l'API HTTP. Mais il g\u00e8le simplement et ne r\u00e9pond ni \u00e0 Ctrl+C, ni \u00e0 Ctrl+Z, ni \u00e0 rien, seulement \u00e0 <code>kill -9<\/code> dans la console voisine. Nous nous sommes heurt\u00e9s \u00e0 ce probl\u00e8me lorsque nous construisions un grand cluster. Mais nous n'avons pas encore de solution, nous nous pr\u00e9parons \u00e0 corriger cette erreur dans Consul.<\/p>\n<p><strong>Le leader de Consul ne r\u00e9pond pas. <\/strong>Notre master dans le datacenter ne r\u00e9pond pas, nous pensons : \u00ab Peut-\u00eatre que l'algorithme de r\u00e9\u00e9lection va fonctionner ? \u00bb <\/p>\n<p>Non, \u00e7a ne va pas fonctionner, et la surveillance ne montrera rien : Consul dira qu'il y a un index d'engagement, un leader trouv\u00e9, tout va bien.<\/p>\n<p>Comment luttons-nous contre cela ? <code>service consul restart<\/code> dans cron toutes les heures. Si vous avez 50 serveurs, ce n'est pas grave. Quand il y en aura 16 000, vous comprendrez comment cela fonctionne.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nEn fin de compte, nous avons obtenu les avantages suivants :<\/p>\n<ul>\n<li>100% de couverture de toutes les machines Linux.<\/li>\n<li>Vitesse.<\/li>\n<li>Automatisation.<\/li>\n<li>Nous avons lib\u00e9r\u00e9 le mat\u00e9riel et les ing\u00e9nieurs r\u00e9seaux de l'esclavage.<\/li>\n<li>Des possibilit\u00e9s d'int\u00e9gration presque illimit\u00e9es : que ce soit avec Kubernetes, Ansible ou Python.<\/li>\n<\/ul>\n<p>\n<strong>Inconv\u00e9nients<\/strong>: Consul, avec lequel nous devons maintenant vivre, et un co\u00fbt d'erreur tr\u00e8s \u00e9lev\u00e9. Par exemple, une fois, \u00e0 18h (heure de pointe en Russie), je modifiais quelque chose dans les listes de r\u00e9seaux. Nous \u00e9tions en train de construire l'isolation sur BEFW. J'ai fait une erreur quelque part, je pense que j'ai indiqu\u00e9 le mauvais masque, et tout est tomb\u00e9 en deux secondes. La surveillance s'allume, le support arrive en courant : \u00ab Tout est tomb\u00e9 ! \u00bb Le chef de d\u00e9partement a grisonn\u00e9 en expliquant \u00e0 l'entreprise pourquoi cela s'est produit.<\/p>\n<p>Le co\u00fbt d'erreur est si \u00e9lev\u00e9 que nous avons invent\u00e9 notre propre proc\u00e9dure pr\u00e9ventive complexe. Si vous allez impl\u00e9menter cela sur un grand environnement de production, ne donnez pas de token master \u00e0 Consul \u00e0 tout le monde. Cela se terminera mal.<\/p>\n<p><strong>Co\u00fbt. <\/strong>J'ai \u00e9crit 400 heures de code tout seul. Mon \u00e9quipe de 4 personnes consacre 10 heures par mois pour le support de tous. Compar\u00e9 au co\u00fbt de n'importe quel pare-feu de nouvelle g\u00e9n\u00e9ration, c'est gratuit.<\/p>\n<p><strong>Plans. <\/strong>Le plan \u00e0 long terme est de chercher un moyen de transport alternatif \u00e0 Consul, ou en compl\u00e9ment. Cela pourrait \u00eatre Kafka ou quelque chose de similaire. Mais dans les prochaines ann\u00e9es, nous vivrons avec Consul.<\/p>\n<p>Plans \u00e0 venir : int\u00e9gration avec Fail2ban, surveillance, nftables, et peut-\u00eatre d'autres distributions, m\u00e9triques, surveillance avanc\u00e9e, optimisation. Le support de Kubernetes est \u00e9galement pr\u00e9vu, car nous avons actuellement plusieurs clusters et un d\u00e9sir.<\/p>\n<p>Autres projets pr\u00e9vus :<\/p>\n<ul>\n<li>recherche d'anomalies dans le trafic ;<\/li>\n<li>gestion de la carte r\u00e9seau ;<\/li>\n<li>support de Kubernetes ;<\/li>\n<li>compilation de paquets pour tous les syst\u00e8mes ;<\/li>\n<li>Web-UI.<\/li>\n<\/ul>\n<p>\nNous travaillons constamment \u00e0 l'\u00e9largissement de la configuration, \u00e0 l'augmentation des m\u00e9triques et \u00e0 l'optimisation.<\/p>\n<p><i>Rejoignez le projet. Le projet est g\u00e9nial, mais malheureusement, c'est pour l'instant un projet d'une seule personne. Venez sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">GitHub <\/a><\/noindex>et essayez de faire quelque chose : commettre, tester, proposer, donner votre avis.<\/i><\/p>\n<blockquote><p>En attendant, nous nous pr\u00e9parons pour <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\">Saint HighLoad++<\/a><\/noindex>, qui aura lieu les 6 et 7 avril \u00e0 Saint-P\u00e9tersbourg, et nous invitons les d\u00e9veloppeurs de syst\u00e8mes exigeants <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose?conference=hl2020-spb\">\u00e0 soumettre une proposition de pr\u00e9sentation<\/a><\/noindex>. Les conf\u00e9renciers exp\u00e9riment\u00e9s savent d\u00e9j\u00e0 quoi faire, et nous conseillons aux d\u00e9butants en pr\u00e9sentation de faire au moins <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\/speakers\">essayer<\/a><\/noindex>. Participer \u00e0 la conf\u00e9rence en tant que conf\u00e9rencier pr\u00e9sente plusieurs avantages. Vous pouvez lire sur lesquels \u00e0 la fin de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/486142\/\">de cet article<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/486842\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 2010 \u0433\u043e\u0434\u0443 \u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Wargaming \u0431\u044b\u043b\u043e 50 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0440\u043e\u0441\u043b\u043e, \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u0430\u0441\u044c: \u0441\u0442\u0435\u0439\u0434\u0436\u0438\u043d\u0433\u0438, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 VLAN \u0441 ACL, \u043f\u043e\u0442\u043e\u043c VPN \u0441 VRF, VLAN c ACL \u043d\u0430 L2, VRF \u0441 ACL \u043d\u0430 L3. \u0417\u0430\u043a\u0440\u0443\u0436\u0438\u043b\u0430\u0441\u044c \u0433\u043e\u043b\u043e\u0432\u0430? \u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0435\u043b\u0435\u0435. \u041a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441\u0442\u0430\u043b\u043e 16 000 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u0441\u043b\u0435\u0437 \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41052,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 2010 \u0433\u043e\u0434\u0443 \u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Wargaming \u0431\u044b\u043b\u043e 50 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/consul-iptables-3\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Consul + iptables = :3 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 2010 \u0433\u043e\u0434\u0443 \u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Wargaming \u0431\u044b\u043b\u043e 50 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/consul-iptables-3\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T18:28:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T18:28:58+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Consul + iptables = :3 | ProHoster","description":"En 2010, Wargaming avait 50 serveurs et un mod\u00e8le r\u00e9seau simple : backend, frontend et pare-feu.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/consul-iptables-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Consul + iptables = :3 | ProHoster","og:description":"\u0412 2010 \u0433\u043e\u0434\u0443 \u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Wargaming \u0431\u044b\u043b\u043e 50 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b.","og:url":"https:\/\/prohoster.info\/fr\/blog\/consul-iptables-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T18:28:58+00:00","article:modified_time":"2020-02-05T18:28:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"41051","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:24:42","updated":"2022-10-01 10:00:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/41051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=41051"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/41051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/41052"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=41051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=41051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=41051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}