{"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\/pt\/blog\/consul-iptables-3","title":{"rendered":"Consul + iptables = :3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Em 2010, a empresa <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/wargaming\/\">Wargaming<\/a><\/noindex> tinha 50 servidores e um modelo de rede simples: backend, frontend e firewall. O n\u00famero de servidores crescia, o modelo se tornava mais complexo: st\u00e1gios, VLANs isoladas com ACL, depois VPN com VRF, VLAN com ACL no L2, VRF com ACL no L3. Ficou confuso? O que vem a seguir ser\u00e1 ainda mais interessante.<\/p>\n<p>Quando o n\u00famero de servidores atingiu 16.000, ficou imposs\u00edvel operar sem dificuldades com tantos segmentos heterog\u00eaneos. Por isso, foi encontrada uma solu\u00e7\u00e3o diferente. Usou-se a pilha Netfilter, adicionou-se o Consul como fonte de dados, resultando em um firewall distribu\u00eddo r\u00e1pido. Ele substituiu as ACL nos roteadores e foi utilizado como firewall externo e interno. Para um gerenciamento din\u00e2mico da ferramenta, foi desenvolvida a sistema BEFW, aplicada em todos os lugares: desde o gerenciamento de acesso de usu\u00e1rios na rede de produtos at\u00e9 a isola\u00e7\u00e3o dos segmentos de rede entre si.<\/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 \/>\nComo tudo isso funciona e por que voc\u00ea deve considerar esse sistema, ser\u00e1 explicado por <strong>Ivan Agarov<\/strong> (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annmuor\/\" class=\"user_link\">annmuor<\/a><\/noindex>) \u2014 l\u00edder do grupo de seguran\u00e7a da infraestrutura na divis\u00e3o de Manuten\u00e7\u00e3o do centro de desenvolvimento de Minsk da empresa. Ivan \u00e9 f\u00e3 do SELinux, adora Perl e escreve c\u00f3digo. Como l\u00edder do grupo de seguran\u00e7a, trabalha regularmente com logs, backups e P&amp;D para proteger a Wargaming de hackers e garantir o funcionamento de todos os servidores de jogos da empresa.<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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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>Hist\u00f3rico<\/h2>\n<p>\nAntes de explicar como fizemos isso, contarei como chegamos a isso e por que era necess\u00e1rio. Para isso, retrocedamos 9 anos: 2010, quando apenas surgiram os World of Tanks. A Wargaming tinha cerca de 50 servidores.<\/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>Gr\u00e1fico de crescimento dos servidores da empresa.<\/em><\/p>\n<p>T\u00ednhamos um modelo de rede. Para aquela \u00e9poca, era o ideal.<\/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>Modelo de rede em 2010.<\/em><\/p>\n<p>No frontend habitam os vil\u00f5es que querem nos derrubar, mas h\u00e1 um firewall. No backend, n\u00e3o h\u00e1 firewall, mas h\u00e1 50 servidores, e conhecemos todos eles. Tudo funciona bem.<\/p>\n<p>Em 4 anos, o parque de servidores cresceu 100 vezes, chegando a 5.000. Surgiram as primeiras redes isoladas \u2014 est\u00e1gios: elas n\u00e3o podem acessar a produ\u00e7\u00e3o, e frequentemente havia o que poderia ser perigoso.<\/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>Modelo de rede em 2014.<\/em><\/p>\n<p>Por in\u00e9rcia, continuamos a usar o mesmo hardware, e todo o trabalho era realizado em VLANs isoladas: as VLANs tinham ACLs que permitem ou pro\u00edbem alguma conex\u00e3o.<\/p>\n<p>Em 2016, o n\u00famero de servidores atingiu 8000. A Wargaming adquiriu outros est\u00fadios e surgiram redes de parceiros adicionais. Eles parecem nossos, mas n\u00e3o s\u00e3o bem: para os parceiros, o VLAN muitas vezes n\u00e3o funciona, \u00e9 necess\u00e1rio usar VPN com VRF, as isolamentos tornam-se complicadas. A mistura de isolamentos ACL aumentou.<\/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>Modelo de rede em 2016.<\/em><\/p>\n<p>No in\u00edcio de 2018, a frota de m\u00e1quinas cresceu para 16.000. Havia 6 segmentos, e os demais n\u00e3o eram contabilizados, incluindo os fechados, onde eram armazenados dados financeiros. Surgiram redes de cont\u00eaineres (Kubernetes), DevOps, redes em nuvem conectadas via VPN, por exemplo, de IVC. Havia muitas regras \u2014 era doloroso.<\/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>Modelo de rede e m\u00e9todos de isolamento em 2018.<\/em><\/p>\n<p>Para isolamento, usamos: VLAN com ACL em L2, VRF com ACL em L3, VPN e muitas outras coisas. Eram muitas.<\/p>\n<h2>Problemas<\/h2>\n<p>\nTodos vivem com ACL e VLAN. O que est\u00e1 errado? Essa pergunta ser\u00e1 respondida por Harold, que esconde a dor.<\/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 \/>\nHavia muitos problemas, mas em massa \u2014 cinco.<\/p>\n<ul>\n<li><strong>Crescimento geom\u00e9trico do pre\u00e7o para novas regras.<\/strong>. Cada nova regra levava mais tempo para ser adicionada do que a anterior, porque era necess\u00e1rio primeiro verificar se j\u00e1 n\u00e3o havia uma regra semelhante.<\/li>\n<li><strong>N\u00e3o havia firewall dentro dos segmentos.<\/strong>. Os segmentos foram de alguma forma separados entre si, mas internamente j\u00e1 n\u00e3o havia recursos suficientes.<\/li>\n<li><strong>As regras eram aplicadas lentamente. <\/strong>Um operador poderia escrever uma regra local manualmente em uma hora. A global levava alguns dias.<\/li>\n<li><strong>Dificuldades com a auditoria de regras.<\/strong>. Na verdade, ela era imposs\u00edvel. As primeiras regras foram escritas em 2010, e a maior parte de seus autores j\u00e1 n\u00e3o trabalhava na empresa.<\/li>\n<li><strong>Baixo n\u00edvel de controle sobre a infraestrutura.<\/strong>. Este \u00e9 o maior problema \u2014 n\u00e3o sab\u00edamos bem o que estava acontecendo conosco.<\/li>\n<\/ul>\n<p>\nAssim era o engenheiro de rede em 2018, quando ouvia: 'Precisamos de mais algumas ACL.'<\/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>Solu\u00e7\u00f5es<\/h2>\n<p>\nNo in\u00edcio de 2018, foi decidido fazer algo a respeito.<\/p>\n<p><strong>O pre\u00e7o das integra\u00e7\u00f5es cresce continuamente. <\/strong>O ponto de partida foi que grandes data centers pararam de suportar VLAN e ACL isoladas, porque a mem\u00f3ria dos dispositivos havia se esgotado.<\/p>\n<p>Solu\u00e7\u00e3o: eliminou-se o fator humano e automatizou-se ao m\u00e1ximo a concess\u00e3o de acesso.<\/p>\n<p><strong>Novas regras s\u00e3o aplicadas lentamente. <\/strong>Solu\u00e7\u00e3o: acelerar a aplica\u00e7\u00e3o das regras, torn\u00e1-la distribu\u00edda e paralela. Para isso, \u00e9 necess\u00e1rio um sistema distribu\u00eddo, de modo que as regras sejam entregues sozinhas, sem rsync ou SFTP em mil sistemas.<\/p>\n<p><strong>Aus\u00eancia de firewall dentro dos segmentos. <\/strong>O firewall dentro dos segmentos come\u00e7ou a nos impactar quando diferentes servi\u00e7os surgiram dentro de uma mesma rede. Solu\u00e7\u00e3o: usar um firewall em n\u00edvel de host \u2014 firewalls baseados em host. Praticamente em todos os lugares utilizamos Linux, e em todos eles existe iptables, n\u00e3o \u00e9 um problema.<\/p>\n<p><strong>Dificuldades com a auditoria das regras.<\/strong> Solu\u00e7\u00e3o: armazenar todas as regras em um \u00fanico local para revis\u00e3o e gerenciamento, assim poderemos auditar tudo.<\/p>\n<p><strong>Baixo n\u00edvel de controle sobre a infraestrutura. <\/strong>Solu\u00e7\u00e3o: realizar um invent\u00e1rio de todos os servi\u00e7os e acessos entre eles.<\/p>\n<p>Esse \u00e9 um processo mais administrativo do que t\u00e9cnico. \u00c0s vezes temos de 200 a 300 novos lan\u00e7amentos por semana, especialmente durante promo\u00e7\u00f5es e feriados. Isso \u00e9 apenas para uma equipe de DevOps. Com esse n\u00famero de lan\u00e7amentos, \u00e9 imposs\u00edvel entender quais portas, IPs e integra\u00e7\u00f5es s\u00e3o necess\u00e1rias. Portanto, precisamos de gerentes de servi\u00e7o especialmente treinados que interrogam as equipes: \"O que h\u00e1 e por que voc\u00eas levantaram isso?\"<\/p>\n<p>Depois de tudo que lan\u00e7amos, o engenheiro de rede em 2019 j\u00e1 parecia assim.<\/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>\nDecidimos que tudo o que encontramos com a ajuda dos gerentes de servi\u00e7o seria colocado no Consul e de l\u00e1 escreveremos as regras iptables.<\/p>\n<p>Como decidimos fazer isso?<\/p>\n<ul>\n<li>Reuniremos todos os servi\u00e7os, redes e usu\u00e1rios.<\/li>\n<li>Faremos regras iptables com base neles.<\/li>\n<li>Automatizaremos o controle.<\/li>\n<li>\u2026.<\/li>\n<li>PROFIT.<\/li>\n<\/ul>\n<p>\nConsul n\u00e3o \u00e9 uma API remota, ele pode funcionar em cada n\u00f3 e escrever em iptables. Resta apenas criar meios autom\u00e1ticos de controle que ir\u00e3o eliminar o que n\u00e3o \u00e9 necess\u00e1rio, e assim a maior parte dos problemas ser\u00e1 resolvida! O restante ser\u00e1 ajustado no processo.<\/p>\n<h3>Por que Consul?<\/h3>\n<p>\n<strong>Tem se mostrado eficaz. <\/strong>Nos anos de 2014-15, o utilizamos como backend para o Vault, onde armazenamos senhas.<\/p>\n<p><strong>N\u00e3o perde dados<\/strong>. Durante o uso do Consul, n\u00e3o houve perda de dados em nenhum acidente. Isso \u00e9 um grande ponto positivo para o sistema de gerenciamento de firewall.<\/p>\n<p><strong>Conex\u00f5es P2P aceleram a dissemina\u00e7\u00e3o das mudan\u00e7as<\/strong>. Com P2P, todas as mudan\u00e7as s\u00e3o r\u00e1pidas, n\u00e3o \u00e9 necess\u00e1rio esperar horas.<\/p>\n<p><strong>API REST conveniente.<\/strong> Consideramos tamb\u00e9m o Apache ZooKeeper, mas ele n\u00e3o tem API REST, ser\u00e1 necess\u00e1rio construir gambiarras.<\/p>\n<p><strong>Funciona tanto como armazenamento de chaves (KV) quanto como cat\u00e1logo (Servi\u00e7o de Descoberta)<\/strong>. \u00c9 poss\u00edvel armazenar servi\u00e7os, diret\u00f3rios e data centers ao mesmo tempo. Isso \u00e9 conveniente n\u00e3o apenas para n\u00f3s, mas tamb\u00e9m para equipes vizinhas, pois ao construir um servi\u00e7o global, pensamos em grande.<\/p>\n<p><strong>Escrito em Go, que faz parte da stack da Wargaming. <\/strong>Amamos esta linguagem, temos muitos desenvolvedores Go.<\/p>\n<p><strong>Sistema de ACL poderoso. <\/strong>Com o Consul, a ACL permite gerenciar quem pode escrever e o que pode ser escrito. Garantimos que as regras do firewall n\u00e3o se sobreponham a mais nada e n\u00e3o teremos problemas com isso.<\/p>\n<p>Mas o Consul tamb\u00e9m tem desvantagens.<\/p>\n<ul>\n<li><strong>N\u00e3o se escala dentro do data center, a menos que voc\u00ea tenha a vers\u00e3o empresarial. <\/strong>Ele se escala apenas atrav\u00e9s de federa\u00e7\u00e3o.<\/li>\n<li><strong>Muito dependente da qualidade da rede e da carga dos servidores. <\/strong>O Consul n\u00e3o funcionar\u00e1 adequadamente como servidor em um servidor sobrecarregado se houver lag na rede, por exemplo, velocidade irregular. Isso est\u00e1 relacionado \u00e0s conex\u00f5es P2P e aos modelos de distribui\u00e7\u00e3o de atualiza\u00e7\u00f5es.<\/li>\n<li><strong>Dificuldades com a monitoriza\u00e7\u00e3o da disponibilidade<\/strong>. O status do Consul pode indicar que tudo est\u00e1 bem, mas ele j\u00e1 est\u00e1 fora do ar h\u00e1 muito tempo.<\/li>\n<\/ul>\n<p>\nA maior parte desses problemas resolvemos durante a opera\u00e7\u00e3o do Consul, por isso decidimos por ele. A empresa tem planos para um backend alternativo, mas aprendemos a lidar com os problemas e por enquanto estamos vivendo com o Consul.<\/p>\n<h3>Como o Consul funciona<\/h3>\n<p>\nVamos instalar servidores em um data center hipot\u00e9tico \u2014 entre tr\u00eas e cinco. Um ou dois servidores n\u00e3o servem: eles n\u00e3o conseguir\u00e3o estabelecer um qu\u00f3rum e decidir quem est\u00e1 certo, quem est\u00e1 errado quando os dados n\u00e3o coincidem. Mais de cinco n\u00e3o faz sentido, a performance cair\u00e1.<\/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 \/>\nOs clientes se conectam aos servidores em qualquer ordem: s\u00e3o os mesmos agentes, apenas com a flag <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 \/>\nDepois disso, os clientes recebem uma lista de conex\u00f5es P2P e estabelecem v\u00ednculos entre si.<\/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 \/>\nEm n\u00edvel global, conectamos v\u00e1rios data centers entre si. Eles tamb\u00e9m se conectam P2P e se comunicam.<\/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 \/>\nQuando queremos obter dados de outro data center, a solicita\u00e7\u00e3o vai de servidor para servidor. Esse modelo \u00e9 chamado de <strong>protocolo Serf<\/strong>. O protocolo Serf, assim como o Consul, \u00e9 uma cria\u00e7\u00e3o da HashiCorp.<\/p>\n<h3>Alguns fatos importantes sobre o Consul<\/h3>\n<p>\nO Consul possui documenta\u00e7\u00e3o descrevendo seu funcionamento. Vou listar apenas alguns fatos selecionados que vale a pena saber.<\/p>\n<p><strong>Os servidores Consul escolhem um mestre entre os votantes<\/strong>. O Consul seleciona um mestre da lista de servidores para cada data center, e todas as solicita\u00e7\u00f5es v\u00e3o apenas para ele, independentemente do n\u00famero de servidores. A falha do mestre n\u00e3o resulta em novas elei\u00e7\u00f5es. Se um mestre n\u00e3o for escolhido, as solicita\u00e7\u00f5es n\u00e3o s\u00e3o atendidas.<\/p>\n<blockquote><p>Voc\u00ea queria escalabilidade horizontal? Desculpe, n\u00e3o.<\/p><\/blockquote>\n<p> A solicita\u00e7\u00e3o de um data center diferente vai de mestre a mestre, independentemente do servidor em que chegou. O mestre escolhido recebe 100% da carga, exceto a carga de encaminhamento de solicita\u00e7\u00f5es. A c\u00f3pia atual dos dados est\u00e1 dispon\u00edvel em todos os servidores do data center, mas apenas um responde.<\/p>\n<blockquote><p>A \u00fanica forma de escalar \u00e9 ativar o modo stale no cliente.<\/p><\/blockquote>\n<p>No modo stale, \u00e9 poss\u00edvel responder sem qu\u00f3rum. Este \u00e9 um modo em que abrimos m\u00e3o da consist\u00eancia dos dados, mas lemos um pouco mais r\u00e1pido do que o normal, e qualquer servidor pode responder. Naturalmente, a grava\u00e7\u00e3o deve ser feita apenas atrav\u00e9s do mestre.<\/p>\n<p><strong>O Consul n\u00e3o copia dados entre data centers.<\/strong>Ao coletar a federa\u00e7\u00e3o, cada servidor ter\u00e1 apenas seus pr\u00f3prios dados. Para outros, sempre consultar\u00e1 algu\u00e9m diferente.<\/p>\n<p><strong>A atomicidade das opera\u00e7\u00f5es n\u00e3o \u00e9 garantida fora de uma transa\u00e7\u00e3o.<\/strong>Lembre-se de que voc\u00ea n\u00e3o \u00e9 o \u00fanico que pode modificar algo. Se quiser fazer de outra forma, realize a transa\u00e7\u00e3o com bloqueio.<\/p>\n<p><strong>Opera\u00e7\u00f5es bloqueantes n\u00e3o garantem bloqueio.<\/strong>A solicita\u00e7\u00e3o vai de mestre a mestre, e n\u00e3o diretamente, portanto n\u00e3o h\u00e1 garantias de que o bloqueio funcione quando voc\u00ea o aplica, por exemplo, em outro data center.<\/p>\n<p><strong>ACL tamb\u00e9m n\u00e3o garante acesso (em muitos casos).<\/strong>O ACL pode n\u00e3o funcionar porque \u00e9 armazenado em um \u00fanico data center da federa\u00e7\u00e3o \u2014 no data center ACL (DC Prim\u00e1rio). Se o DC n\u00e3o responder, o ACL n\u00e3o funcionar\u00e1.<\/p>\n<p><strong>Um mestre travado resultar\u00e1 na paralisa\u00e7\u00e3o de toda a federa\u00e7\u00e3o.<\/strong>Por exemplo, em uma federa\u00e7\u00e3o com 10 data centers, se um tiver uma rede ruim e um mestre falhar. Todos que se comunicam com ele ficar\u00e3o presos em um ciclo: uma solicita\u00e7\u00e3o \u00e9 feita, n\u00e3o h\u00e1 resposta, a thread fica travada. N\u00e3o \u00e9 poss\u00edvel prever quando isso acontecer\u00e1, simplesmente em uma ou duas horas toda a federa\u00e7\u00e3o vai falhar. Voc\u00ea n\u00e3o poder\u00e1 fazer nada a respeito.<\/p>\n<p>O status, o qu\u00f3rum e as elei\u00e7\u00f5es s\u00e3o processados por uma thread separada. N\u00e3o haver\u00e1 reelei\u00e7\u00f5es, o status n\u00e3o mostrar\u00e1 nada. Voc\u00ea pode pensar que seu Consul est\u00e1 vivo, fazer uma consulta e nada acontece \u2014 n\u00e3o h\u00e1 resposta. No entanto, o status mostra que est\u00e1 tudo bem.<\/p>\n<p>J\u00e1 encontramos esse problema, tivemos que reconstruir partes espec\u00edficas dos data centers para evit\u00e1-lo.<\/p>\n<p><strong>Na vers\u00e3o de neg\u00f3cios, o Consul Enterprise n\u00e3o possui algumas das desvantagens mencionadas acima.<\/strong>Tem muitas fun\u00e7\u00f5es \u00fateis: sele\u00e7\u00e3o de votantes, distribui\u00e7\u00e3o, escalonamento. H\u00e1 apenas um \"mas\" \u2014 o sistema de licenciamento para o sistema distribu\u00eddo \u00e9 muito caro.<\/p>\n<p>Dica: <code>rm -rf \/var\/lib\/consul<\/code> \u2014 a cura para todos os problemas do agente. Se algo n\u00e3o estiver funcionando, basta excluir seus dados e carregar os dados de um backup. \u00c9 muito prov\u00e1vel que o Consul volte a funcionar.<\/p>\n<h2>BEFW<\/h2>\n<p>\nAgora vamos falar sobre o que adicionamos ao Consul.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">BEFW<\/a><\/noindex> \u2014 \u00e9 um acr\u00f4nimo de <strong>B<\/strong>ack<strong>E<\/strong>nd<strong>F<\/strong>ire<strong>W<\/strong>all. Tive que dar um nome ao produto quando criei o reposit\u00f3rio para armazenar os primeiros commits de teste. Esse nome permaneceu.<\/p>\n<h3>Modelos de regras<\/h3>\n<p>\nAs regras s\u00e3o escritas na sintaxe do iptables.<\/p>\n<ul>\n<li>-N BEFW<\/li>\n<li>-P INPUT DROP<\/li>\n<li>-A INPUT -m state \u2014 state 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>\nTudo o que temos vai para a cadeia BEFW, exceto <code>ESTABELECIDO<\/code>, <code>RELATED<\/code> e localhost. O modelo pode ser qualquer um, este \u00e9 apenas um exemplo.<\/p>\n<p>Qual \u00e9 a utilidade do BEFW?<\/p>\n<h3>Servi\u00e7os<\/h3>\n<p>\nTemos um servi\u00e7o, sempre h\u00e1 uma porta, o n\u00f3 onde ele est\u00e1 funcionando. Podemos perguntar localmente ao agente do nosso n\u00f3 e descobrir que h\u00e1 um servi\u00e7o. Tamb\u00e9m \u00e9 poss\u00edvel adicionar tags.<\/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 \/>\nQualquer servi\u00e7o que est\u00e1 rodando e registrado no Consul se transforma em uma regra do iptables. Temos SSH \u2014 abrimos a porta 22. O script Bash \u00e9 simples: curl e iptables, nada mais \u00e9 necess\u00e1rio.<\/p>\n<h3>Clientes<\/h3>\n<p>\nComo abrir o acesso n\u00e3o para todos, mas de forma seletiva? Por nome do servi\u00e7o, armazenar listas de IPs no armazenamento 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 \/>\nPor exemplo, queremos que todos da d\u00e9cima rede possam acessar o servi\u00e7o SSH_TCP_22. Adicionamos um pequeno campo TTL? e agora temos permiss\u00f5es tempor\u00e1rias, por exemplo, para um dia.<\/p>\n<h3>Acessos<\/h3>\n<p>\nConectamos servi\u00e7os e clientes: temos um servi\u00e7o, para cada um h\u00e1 um armazenamento KV pronto. Agora damos acesso n\u00e3o a todos, mas de forma seletiva.<\/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>Grupos<\/h3>\n<p>\nSe a cada vez tivermos que escrever milhares de IPs para acessos, ficaremos cansados. Vamos pensar em agrupamentos \u2014 um subconjunto separado no KV. Chamaremos de Alias (ou grupos) e armazenaremos l\u00e1 grupos com o mesmo princ\u00edpio.<\/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 \/>\nConectamos: agora podemos abrir SSH n\u00e3o especificamente para P2P, mas para um grupo inteiro ou v\u00e1rios grupos. Da mesma forma, h\u00e1 TTL \u2014 podemos adicionar e remover temporariamente de um grupo.<\/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>Integra\u00e7\u00e3o<\/h3>\n<p>\nNosso problema \u2014 o fator humano e a automa\u00e7\u00e3o. At\u00e9 agora, decidimos resolv\u00ea-lo assim.<\/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 \/>\nTrabalhamos com Puppet e transferimos tudo o que diz respeito ao sistema (c\u00f3digo dos aplicativos). No puppetdb (um PostgreSQL comum) est\u00e1 armazenada a lista de servi\u00e7os que est\u00e3o em execu\u00e7\u00e3o, que podem ser encontrados pelo tipo de recurso. Tamb\u00e9m \u00e9 poss\u00edvel descobrir quem est\u00e1 acessando o qu\u00ea. Al\u00e9m disso, temos um sistema de pull request e merge request para isso.<\/p>\n<p>Criamos o befw-sync \u2014 uma solu\u00e7\u00e3o simples que ajuda a transferir dados. Primeiro, os cookies de sincroniza\u00e7\u00e3o fazem uma chamada ao puppetdb. L\u00e1, uma API HTTP est\u00e1 configurada: solicitamos quais servi\u00e7os temos e o que precisa ser feito. Em seguida, fazemos uma solicita\u00e7\u00e3o ao Consul.<\/p>\n<p>H\u00e1 integra\u00e7\u00e3o? Sim: escrevemos regras, permitimos aceitar Pull Requests. Precisa de alguma porta ou adicionar um host a algum grupo? Pull Request, revis\u00e3o \u2014 nada de \"Encontre 200 outras ACLs e tente fazer algo com isso\".<\/p>\n<h3>Otimiza\u00e7\u00e3o<\/h3>\n<p>\nO ping para localhost com uma cadeia de regras vazia leva 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 \/>\nVamos adicionar 10.000 endere\u00e7os no iptables. Como resultado, o ping aumentar\u00e1 5 vezes: o iptables \u00e9 totalmente linear, o processamento de cada endere\u00e7o leva algum tempo.<\/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 \/>\nPara o firewall para o qual estamos migrando milhares de ACLs, temos muitas regras, e isso causa atraso. Para protocolos de jogos, isso \u00e9 ruim.<\/p>\n<p>Mas se colocarmos <strong>10.000 endere\u00e7os em ipset<\/strong> o ping at\u00e9 diminui.<\/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 \/>\nA quest\u00e3o \u00e9 que \"O\" (complexidade do algoritmo) para o ipset \u00e9 sempre igual a 1, n\u00e3o importa quantas regras existam. Na verdade, h\u00e1 uma limita\u00e7\u00e3o \u2014 n\u00e3o pode haver mais de 65.535 regras. Enquanto vivemos com isso: \u00e9 poss\u00edvel combin\u00e1-las, expandir, criar dois ipsets em um.<\/p>\n<h3>Armazenamento<\/h3>\n<p>\nA continua\u00e7\u00e3o l\u00f3gica do processo de itera\u00e7\u00f5es \u00e9 armazenar informa\u00e7\u00f5es sobre clientes para o servi\u00e7o no 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 \/>\nAgora temos o mesmo SSH, e n\u00e3o escrevemos imediatamente 100 IPs, mas informamos o nome do ipset com o qual precisamos interagir, e a pr\u00f3xima regra <code>DROP<\/code>. Pode ser feito como uma \u00fanica regra \"Quem n\u00e3o est\u00e1 aqui, \u00e9 DROP\", mas assim fica mais visual.<\/p>\n<p>Agora temos regras e conjuntos. A principal tarefa \u00e9 fazer o conjunto antes de escrever a regra, porque sen\u00e3o o iptables n\u00e3o registrar\u00e1 a regra.<\/p>\n<h3>Esquema geral<\/h3>\n<p>\nEm forma de diagrama, tudo o que falei se parece com isso.<\/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 \/>\nFazemos commit no Puppet, tudo \u00e9 enviado para o host, os servi\u00e7os est\u00e3o aqui, o ipset l\u00e1, e quem n\u00e3o estiver listado l\u00e1, n\u00e3o \u00e9 admitido.<\/p>\n<h3>Permitir &amp; negar<\/h3>\n<p>\nPara salvar o mundo rapidamente ou desconectar algu\u00e9m rapidamente, no in\u00edcio de todas as cadeias, fizemos dois ipsets: <code>rules_allow<\/code> e <code>rules_deny<\/code>. Como funciona isso?<\/p>\n<p>Por exemplo, algu\u00e9m cria carga no nosso Web com bots. Anteriormente, era necess\u00e1rio encontrar o IP nos logs, enviar para os engenheiros de rede para que eles localizassem a origem do tr\u00e1fego e o bloqueassem. Agora isso funciona de maneira diferente.<\/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 \/>\nEnviamos para o Consul, aguardamos 2,5 s e est\u00e1 pronto. Como o Consul distribui rapidamente via P2P, funciona em qualquer lugar do mundo.<\/p>\n<p>Uma vez eu parei completamente o WOT, errando na configura\u00e7\u00e3o do firewall. <code>rules_allow<\/code> \u2014 essa \u00e9 a nossa prote\u00e7\u00e3o contra tais casos. Se cometemos algum erro no firewall e algo for bloqueado, sempre podemos enviar um <code>0.0\/0<\/code>, para rapidamente restaurar tudo. Depois, consertaremos tudo manualmente.<\/p>\n<h3>Outros conjuntos<\/h3>\n<p>\n\u00c9 poss\u00edvel adicionar qualquer outro conjunto no espa\u00e7o <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 \/>\nPor que? \u00c0s vezes, algu\u00e9m precisa de ipset, por exemplo, para emular a desativa\u00e7\u00e3o de alguma parte do cluster. Qualquer um pode trazer quaisquer conjuntos, nome\u00e1-los e eles ser\u00e3o obtidos a partir do Consul. Al\u00e9m disso, os conjuntos podem participar das regras do iptables ou funcionar como um comando <code>NOOP<\/code>: a consist\u00eancia ser\u00e1 mantida pelo daemon.<\/p>\n<h3>Usu\u00e1rios<\/h3>\n<p>\nAntes era assim: o usu\u00e1rio se conectava \u00e0 rede e recebia par\u00e2metros atrav\u00e9s do dom\u00ednio. At\u00e9 o surgimento dos firewalls de nova gera\u00e7\u00e3o, a Cisco n\u00e3o conseguia entender onde estava o usu\u00e1rio e onde estava o IP. Portanto, o acesso era concedido apenas atrav\u00e9s do hostname da m\u00e1quina.<\/p>\n<p>O que fizemos? Interceptamos o momento da obten\u00e7\u00e3o do endere\u00e7o. Normalmente, isso \u00e9 dot1x, Wi-Fi ou VPN \u2014 tudo passa pelo RADIUS. Para cada usu\u00e1rio, criamos um grupo com o nome de usu\u00e1rio e colocamos nele o IP com TTL, equivalente ao seu dhcp.lease \u2014 assim que expirar, a regra desaparecer\u00e1.<\/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 \/>\nAgora podemos abrir o acesso a servi\u00e7os, assim como em outros grupos, pelo nome de usu\u00e1rio. Eliminamos a dor com o hostname, quando eles mudam, e aliviamos a carga dos engenheiros de rede, porque eles n\u00e3o precisam mais da Cisco. Agora os engenheiros configuram os acessos em seus pr\u00f3prios servidores.<\/p>\n<h3>Isolamento<\/h3>\n<p>\nParalelamente, come\u00e7amos a trabalhar na isola\u00e7\u00e3o. Os gerentes de servi\u00e7o fizeram um invent\u00e1rio, e n\u00f3s analisamos todas as nossas redes. Vamos distribu\u00ed-las em grupos semelhantes, e nos servidores necess\u00e1rios adicionamos grupos, por exemplo, ao deny. Agora, a mesma isolamento de staging vai para rules_deny na produ\u00e7\u00e3o, mas n\u00e3o na pr\u00f3pria produ\u00e7\u00e3o.<\/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 \/>\nO esquema funciona de forma r\u00e1pida e simples: removemos todos os ACL dos servidores, aliviamos o hardware e diminu\u00edmos a quantidade de VLANs isoladas.<\/p>\n<h3>Controle de integridade<\/h3>\n<p>\nAnteriormente, t\u00ednhamos um gatilho especial que avisava quando algu\u00e9m mudava manualmente a regra do firewall. Eu escrevi um enorme linter para verificar as regras do firewall, foi complicado. Agora, a integridade \u00e9 controlada pelo BEFW. Ele cuida com zelo para que as regras que ele cria n\u00e3o sejam alteradas. Se algu\u00e9m mudar as regras do firewall, ele reverter\u00e1 tudo. \"Levantei rapidamente um proxy para trabalhar de casa\" \u2014 essas op\u00e7\u00f5es n\u00e3o existem mais.<\/p>\n<p>O BEFW controla o ipset dos servi\u00e7os e a lista no befw.conf, as regras dos servi\u00e7os na cadeia BEFW. Mas n\u00e3o monitora outras cadeias e regras e outros ipsets.<\/p>\n<h3>Prote\u00e7\u00e3o contra falhas<\/h3>\n<p>\nO BEFW sempre salva o \u00faltimo estado bem-sucedido diretamente na estrutura bin\u00e1ria state.bin. Se algo sair errado, ele sempre reverte para esse 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 \/>\nIsso \u00e9 um seguro contra o funcionamento inst\u00e1vel do Consul, quando ele n\u00e3o enviou os dados ou algu\u00e9m cometeu um erro ao usar regras que n\u00e3o podem ser aplicadas. Para que n\u00e3o fiquemos sem firewall, o BEFW retornar\u00e1 ao \u00faltimo estado se ocorrer um erro em algum ponto.<\/p>\n<p>Em situa\u00e7\u00f5es cr\u00edticas, isso \u00e9 uma garantia de que permaneceremos com um firewall funcional. Abrimos todas as redes cinzas na esperan\u00e7a de que um administrador venha e conserte. Algum dia eu colocarei isso nas configura\u00e7\u00f5es, mas agora temos apenas tr\u00eas redes cinzas: 10\/8, 172\/12 e 192.168\/16. Dentro do nosso Consul, essa \u00e9 uma caracter\u00edstica importante que ajuda a avan\u00e7ar.<\/p>\n<p><em>Demonstra\u00e7\u00e3o: durante a apresenta\u00e7\u00e3o, Ivan demonstra o modo demo do BEFW. \u00c9 mais f\u00e1cil assistir \u00e0 demonstra\u00e7\u00e3o em <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/4zP67uYnsR4?t=1663\">v\u00eddeo<\/a><\/noindex>. O c\u00f3digo-fonte da demo est\u00e1 dispon\u00edvel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\/tree\/master\/demo\">no GitHub<\/a><\/noindex>.<\/em><\/p>\n<h2>Pontos cr\u00edticos<\/h2>\n<p>\nVou falar sobre os bugs que encontramos.<\/p>\n<p><strong>ipset add set 0.0.0.0\/0. <\/strong>O que acontece se adicionarmos ao ipset 0.0.0.0\/0? Todos os IPs ser\u00e3o adicionados? O acesso \u00e0 internet ser\u00e1 aberto? <\/p>\n<p>N\u00e3o, teremos um bug que nos custou duas horas de inatividade. E o bug n\u00e3o funciona desde 2016, est\u00e1 no RedHat Bugzilla sob o n\u00famero #1297092, e o encontramos por acaso \u2014 a partir do relat\u00f3rio do desenvolvedor.<\/p>\n<p>Agora no BEFW existe uma regra r\u00edgida que <code>0.0.0.0\/0<\/code> se transforma em dois endere\u00e7os: <code>0.0.0.0\/1<\/code> e <code>128.0.0.0\/1<\/code>.<\/p>\n<p><strong>ipset restore set &lt; file. <\/strong>O que o ipset faz quando voc\u00ea diz a ele <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>Nada disso \u2014 ele faz um merge, e os endere\u00e7os antigos n\u00e3o desaparecem, voc\u00ea n\u00e3o fecha o acesso.<\/p>\n<p>Encontramos o bug enquanto test\u00e1vamos a isola\u00e7\u00e3o. Agora existe um sistema bastante complexo \u2014 em vez de <code>restore<\/code> \u00e9 realizado <code>create temp<\/code>, depois <code>restore flush temp<\/code> e <code>restore temp<\/code>. No final, swap: para atomicidade, porque se primeiro fizer <code>flush<\/code> E nesse momento, se algum pacote chegar, ele ser\u00e1 descartado e algo dar\u00e1 errado. Portanto, h\u00e1 um pouco de magia negra l\u00e1.<\/p>\n<p><strong>consul kv get -datacenter=outro. <\/strong>Como mencionei, achamos que estamos solicitando alguns dados, mas receberemos ou os dados ou um erro. Podemos fazer isso atrav\u00e9s do Consul localmente, mas nesse caso tamb\u00e9m travar\u00e1 ambos.<\/p>\n<p>O cliente local do Consul \u00e9 uma camada sobre a API HTTP. Mas ele simplesmente trava e n\u00e3o responde nem a Ctrl+C, nem a Ctrl+Z, nem a nada, apenas a <code>kill -9<\/code> na console ao lado. Enfrentamos isso quando constru\u00edmos um grande cluster. Mas ainda n\u00e3o temos uma solu\u00e7\u00e3o, estamos nos preparando para corrigir esse erro no Consul.<\/p>\n<p><strong>O l\u00edder do Consul n\u00e3o responde. <\/strong>Nosso master no datacenter n\u00e3o est\u00e1 respondendo, pensamos: 'Provavelmente, agora o algoritmo de reelei\u00e7\u00e3o funcionar\u00e1?' <\/p>\n<p>N\u00e3o, n\u00e3o funcionar\u00e1, e a monitoriza\u00e7\u00e3o n\u00e3o mostrar\u00e1 nada: o Consul dir\u00e1 que o \u00edndice de compromisso existe, o l\u00edder foi encontrado, tudo bem.<\/p>\n<p>Como estamos lidando com isso? <code>service consul restart<\/code> no cron a cada hora. Se voc\u00ea tiver 50 servidores, n\u00e3o \u00e9 um problema. Quando chegar a 16.000, voc\u00ea entender\u00e1 como isso funciona.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>\nNo final, obtivemos as seguintes vantagens:<\/p>\n<ul>\n<li>100% de cobertura de todas as m\u00e1quinas Linux.<\/li>\n<li>Velocidade.<\/li>\n<li>Automatiza\u00e7\u00e3o.<\/li>\n<li>Libertamos o hardware e os engenheiros de rede da escravid\u00e3o.<\/li>\n<li>Surgiram oportunidades de integra\u00e7\u00e3o que s\u00e3o praticamente ilimitadas: tanto com Kubernetes, quanto com Ansible, quanto com Python.<\/li>\n<\/ul>\n<p>\n<strong>Desvantagens<\/strong>: Consul, com o qual agora temos que conviver, e um pre\u00e7o de erro muito alto. Como exemplo, uma vez, \u00e0s 18h (hor\u00e1rio nobre na R\u00fassia), eu estava ajustando algumas listas de redes. Est\u00e1vamos no meio da constru\u00e7\u00e3o de isolamento na BEFW. Eu cometi um erro, parece que indiquei a m\u00e1scara errada, mas tudo caiu em dois segundos. O monitoramento acende, o suporte corre: 'Est\u00e1 tudo fora do ar!' O chefe do departamento ficou grisalho ao explicar ao neg\u00f3cio porque isso aconteceu.<\/p>\n<p>O custo do erro \u00e9 t\u00e3o alto que inventamos nosso pr\u00f3prio e complexo procedimento de preven\u00e7\u00e3o. Se voc\u00ea for implementar isso em uma grande produ\u00e7\u00e3o, n\u00e3o deve dar o token mestre do Consul a todos. Isso acabar\u00e1 mal.<\/p>\n<p><strong>Custo. <\/strong>Eu escrevi c\u00f3digo por 400 horas sozinho. O suporte de minha equipe de 4 pessoas gasta 10 horas por m\u00eas com todos. Comparado ao custo de qualquer firewall de nova gera\u00e7\u00e3o, isso \u00e9 gratuito.<\/p>\n<p><strong>Planos. <\/strong>O plano de longo prazo \u00e9 encontrar um transporte alternativo em vez de ou al\u00e9m do Consul. Talvez seja Kafka ou algo semelhante. Mas nos pr\u00f3ximos anos, viveremos com o Consul.<\/p>\n<p>Os pr\u00f3ximos planos: integra\u00e7\u00e3o com Fail2ban, monitoramento, nftables, e possivelmente com outras distribui\u00e7\u00f5es, m\u00e9tricas, monitoramento avan\u00e7ado, otimiza\u00e7\u00e3o. O suporte ao Kubernetes tamb\u00e9m est\u00e1 nos planos, pois atualmente temos alguns clusters e interesse.<\/p>\n<p>Outros planos incluem:<\/p>\n<ul>\n<li>detec\u00e7\u00e3o de anomalias no tr\u00e1fego;<\/li>\n<li>gerenciamento de mapa de rede;<\/li>\n<li>suporte ao Kubernetes;<\/li>\n<li>compila\u00e7\u00e3o de pacotes para todos os sistemas;<\/li>\n<li>Web-UI.<\/li>\n<\/ul>\n<p>\nEstamos constantemente trabalhando na expans\u00e3o da configura\u00e7\u00e3o, aumento das m\u00e9tricas e otimiza\u00e7\u00e3o.<\/p>\n<p><i>Junte-se ao projeto. O projeto ficou incr\u00edvel, mas, infelizmente, ainda \u00e9 um projeto de uma s\u00f3 pessoa. Venha no <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">GitHub <\/a><\/noindex>e tente fazer algo: enviar um commit, testar, sugerir algo, dar sua avalia\u00e7\u00e3o.<\/i><\/p>\n<blockquote><p>Enquanto isso, estamos nos preparando para <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\">Saint HighLoad++<\/a><\/noindex>, que ocorrer\u00e1 nos dias 6 e 7 de abril em S\u00e3o Petersburgo, e convidamos desenvolvedores de sistemas de alto desempenho <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose?conference=hl2020-spb\">a se inscrever para uma apresenta\u00e7\u00e3o<\/a><\/noindex>. Os palestrantes experientes j\u00e1 sabem o que fazer, enquanto os novatos em apresenta\u00e7\u00f5es recomendamos que pelo menos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\/speakers\">tentar<\/a><\/noindex>. A participa\u00e7\u00e3o na confer\u00eancia como palestrante tem v\u00e1rias vantagens. Para saber quais, voc\u00ea pode ler, por exemplo, no final <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/486142\/\">este artigo<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Fonte: <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.3 - 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\/pt\/blog\/consul-iptables-3\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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":"Em 2010, a Wargaming tinha 50 servidores e um modelo de rede simples: backend, frontend e firewall.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/consul-iptables-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/41051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=41051"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/41051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/41052"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=41051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=41051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=41051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}