{"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\/pl\/blog\/consul-iptables-3","title":{"rendered":"Consul + iptables = :3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>W 2010 roku firma <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/wargaming\/\">Wargaming<\/a><\/noindex> posiada\u0142a 50 serwer\u00f3w i prost\u0105 struktur\u0119 sieciow\u0105: backend, frontend i zapor\u0119. Liczba serwer\u00f3w ros\u0142a, a model stawa\u0142 si\u0119 coraz bardziej skomplikowany: stagingi, izolowane VLAN z ACL, potem VPN z VRF, VLAN z ACL na L2, VRF z ACL na L3. Zawroty g\u0142owy? B\u0119dzie jeszcze ciekawiej.<\/p>\n<p>Kiedy liczba serwer\u00f3w osi\u0105gn\u0119\u0142a 16 000, praca bez \u0142ez w takiej ilo\u015bci r\u00f3\u017cnorodnych segment\u00f3w sta\u0142a si\u0119 niemo\u017cliwa. Dlatego wymy\u015blono inne rozwi\u0105zanie. Wzi\u0119to stos Netfilter, dodano do niego Consul jako \u017ar\u00f3d\u0142o danych, powsta\u0142a szybka, rozproszona zapora. Zast\u0105piono ni\u0105 ACL na routerach i u\u017cywano jako zapory zewn\u0119trznej i wewn\u0119trznej. Aby dynamicznie zarz\u0105dza\u0107 narz\u0119dziem, opracowano system BEFW, kt\u00f3ry wdro\u017cono wsz\u0119dzie: od zarz\u0105dzania dost\u0119pem u\u017cytkownik\u00f3w do sieci produkcyjnej po izolacj\u0119 segment\u00f3w sieci od siebie.<\/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 \/>\nJak to wszystko dzia\u0142a i dlaczego warto zwr\u00f3ci\u0107 uwag\u0119 na ten system, opowie <strong>Ivan Agarkov<\/strong> (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annmuor\/\" class=\"user_link\">annmuor<\/a><\/noindex>) \u2014 lider grupy bezpiecze\u0144stwa infrastruktury w dziale Utrzymania w Mi\u0144skim Centrum Rozwoju firmy. Ivan jest fanem SELinux, uwielbia Perla, pisze kod. Jako lider grupy IB regularnie pracuje z logami, kopiami zapasowymi i R&amp;D, aby chroni\u0107 Wargaming przed hakerami i zapewni\u0107 dzia\u0142anie wszystkich serwer\u00f3w gier w firmie.<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=\"Odtwarzaj wideo\" 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>Kontekst historyczny<\/h2>\n<p>\nZanim opowiem, jak to robili\u015bmy, przedstawi\u0119, jak w og\u00f3le do tego dosz\u0142o i dlaczego to by\u0142o potrzebne. W tym celu przenie\u015bmy si\u0119 9 lat wstecz: 2010 rok, w\u0142a\u015bnie pojawi\u0142y si\u0119 World of Tanks. Firma Wargaming mia\u0142a oko\u0142o 50 serwer\u00f3w.<\/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>Wykres wzrostu serwer\u00f3w firmy.<\/em><\/p>\n<p>Mieli\u015bmy model sieciowy. Jak na tamte czasy, by\u0142 optymalny.<\/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>Model sieciowy w 2010 roku.<\/em><\/p>\n<p>Na frontendzie \u017cyj\u0105 \u017ali ludzie, kt\u00f3rzy chc\u0105 nas z\u0142ama\u0107, ale jest tam zapora. Na backendzie nie ma zapory, ale s\u0105 tam 50 serwer\u00f3w, kt\u00f3re wszyscy znamy. Wszystko dzia\u0142a dobrze.<\/p>\n<p>W ci\u0105gu 4 lat liczba serwer\u00f3w wzros\u0142a 100 razy, do 5000. Pojawi\u0142y si\u0119 pierwsze izolowane sieci \u2014 stagingi: nie mog\u0105 one przechodzi\u0107 do produkcji, a cz\u0119sto kr\u0119ci\u0142y si\u0119 tam rzeczy, kt\u00f3re mog\u0142y by\u0107 niebezpieczne.<\/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>Model sieciowy w 2014 roku.<\/em><\/p>\n<p>Z przyzwyczajenia korzystano z tych samych urz\u0105dze\u0144, a ca\u0142a praca odbywa\u0142a si\u0119 na izolowanych VLAN: do VLAN pisane s\u0105 ACL, kt\u00f3re pozwalaj\u0105 lub zabraniaj\u0105 jakiego\u015b po\u0142\u0105czenia.<\/p>\n<p>W 2016 roku liczba serwer\u00f3w osi\u0105gn\u0119\u0142a 8000. Wargaming przejmowa\u0142 inne studia, pojawi\u0142y si\u0119 dodatkowe sieci partnerskie. Wydaj\u0105 si\u0119 by\u0107 nasze, ale nie do ko\u0144ca: dla partner\u00f3w VLAN cz\u0119sto nie dzia\u0142a, konieczne jest korzystanie z VPN z VRF, izolacje si\u0119 komplikuj\u0105. Mieszanka izolacji ACL ros\u0142a.<\/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>Model sieciowy w 2016 roku.<\/em><\/p>\n<p>Na pocz\u0105tku 2018 roku flota maszyn wzros\u0142a do 16000. By\u0142o 6 segment\u00f3w, pozosta\u0142ych nie liczyli\u015bmy, w tym zamkni\u0119tych, w kt\u00f3rych przechowywane by\u0142y dane finansowe. Pojawi\u0142y si\u0119 sieci kontenerowe (Kubernetes), DevOps, sieci chmurowe po\u0142\u0105czone przez VPN, na przyk\u0142ad z IWS. Regu\u0142 by\u0142o bardzo du\u017co \u2014 to bola\u0142o.<\/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>Model sieciowy i sposoby izolacji w 2018 roku.<\/em><\/p>\n<p>Do izolacji u\u017cywali\u015bmy: VLAN z ACL na L2, VRF z ACL na L3, VPN i wielu innych. Zbyt wiele.<\/p>\n<h2>Problemy<\/h2>\n<p>\nWszyscy \u017cyj\u0105 z ACL i VLAN. Co w\u0142a\u015bciwie jest nie tak? Na to pytanie odpowie Harold, ukrywaj\u0105cy b\u00f3l.<\/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 \/>\nBy\u0142o wiele problem\u00f3w, ale masowych \u2014 pi\u0119\u0107.<\/p>\n<ul>\n<li><strong>Geometryczny wzrost ceny dla nowych regu\u0142<\/strong>. Ka\u017cda nowa regu\u0142a dodawana by\u0142a d\u0142u\u017cej ni\u017c poprzednia, poniewa\u017c najpierw trzeba by\u0142o sprawdzi\u0107, czy nie ma ju\u017c takiej regu\u0142y.<\/li>\n<li><strong>Brak firewalla wewn\u0105trz segment\u00f3w<\/strong>. Segmenty oddzieli\u0142y si\u0119 jako\u015b od siebie, wewn\u0105trz ju\u017c brakuje zasob\u00f3w.<\/li>\n<li><strong>Regu\u0142y stosowane by\u0142y d\u0142ugo. <\/strong>Jedn\u0105 lokaln\u0105 regu\u0142\u0119 operatorzy mogli napisa\u0107 r\u0119cznie w ci\u0105gu godziny. Globalna zajmowa\u0142a kilka dni.<\/li>\n<li><strong>Trudno\u015bci z audytem regu\u0142<\/strong>. Dok\u0142adniej, by\u0142 niemo\u017cliwy. Pierwsze regu\u0142y by\u0142y pisane ju\u017c w 2010 roku, a wi\u0119kszo\u015b\u0107 ich autor\u00f3w ju\u017c nie pracowa\u0142a w firmie.<\/li>\n<li><strong>Niski poziom kontroli nad infrastruktur\u0105<\/strong>. To g\u0142\u00f3wny problem \u2014 \u017ale wiedzieli\u015bmy, co w og\u00f3le si\u0119 u nas dzieje.<\/li>\n<\/ul>\n<p>\nTak wygl\u0105da\u0142 in\u017cynier sieciowy w 2018 roku, kiedy s\u0142ysza\u0142: \u201eJeszcze troch\u0119 ACL\u201d.<\/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>Rozwi\u0105zania<\/h2>\n<p>\nNa pocz\u0105tku 2018 roku postanowiono co\u015b z tym zrobi\u0107.<\/p>\n<p><strong>Cena integracji stale ro\u015bnie. <\/strong>Punktem wyj\u015bcia by\u0142o to, \u017ce du\u017ce centra danych przesta\u0142y wspiera\u0107 izolowane VLAN i ACL, poniewa\u017c sko\u0144czy\u0142a si\u0119 pami\u0119\u0107 na urz\u0105dzeniach.<\/p>\n<p>Rozwi\u0105zanie: wyeliminowanie czynnika ludzkiego i maksymalizacja automatyzacji dost\u0119pu.<\/p>\n<p><strong>Nowe regu\u0142y stosowane s\u0105 d\u0142ugo. <\/strong>Rozwi\u0105zanie: przyspieszenie stosowania regu\u0142, uczynienie go rozproszonym i r\u00f3wnoleg\u0142ym. W tym celu potrzebny jest system rozproszony, aby regu\u0142y by\u0142y dostarczane same, bez rsync lub SFTP na tysi\u0105c system\u00f3w.<\/p>\n<p><strong>Brak firewalla wewn\u0105trz segment\u00f3w. <\/strong>Zapora ogniowa w segmentach zacz\u0119\u0142a do nas dociera\u0107, gdy w ramach jednej sieci pojawia\u0142y si\u0119 r\u00f3\u017cne us\u0142ugi. Rozwi\u0105zanie: u\u017cy\u0107 zapory ogniowej na poziomie hosta - firewalle oparte na ho\u015bcie. Prawie wsz\u0119dzie mamy Linuxa, a wsz\u0119dzie s\u0105 iptables, to nie jest problem.<\/p>\n<p><strong>Trudno\u015bci z audytowaniem regu\u0142.<\/strong> Rozwi\u0105zanie: przechowywa\u0107 wszystkie regu\u0142y w jednym miejscu dla przegl\u0105du i zarz\u0105dzania, w ten spos\u00f3b b\u0119dziemy mogli wszystko audytowa\u0107.<\/p>\n<p><strong>Niski poziom kontroli nad infrastruktur\u0105. <\/strong>Rozwi\u0105zanie: przeprowadzi\u0107 inwentaryzacj\u0119 wszystkich us\u0142ug i dost\u0119p\u00f3w mi\u0119dzy nimi.<\/p>\n<p>To bardziej proces administracyjny ni\u017c techniczny. Czasami mamy 200-300 nowych wyda\u0144 w tygodniu, szczeg\u00f3lnie w czasie promocji i \u015bwi\u0105t. Przy tym to tylko dla jednego zespo\u0142u naszych DevOps. Przy takiej liczbie wyda\u0144 niemo\u017cliwe jest zrozumienie, jakie porty, IP, integracje s\u0105 potrzebne. Dlatego potrzebowali\u015bmy specjalnie przeszkolonych mened\u017cer\u00f3w us\u0142ug, kt\u00f3rzy pytali zespo\u0142y: 'Co w\u0142a\u015bciwie macie i po co to uruchomili\u015bcie?'<\/p>\n<p>Po wszystkim, co uruchomili\u015bmy, in\u017cynier sieciowy w 2019 roku wygl\u0105da\u0142 ju\u017c tak.<\/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>\nZdecydowali\u015bmy, \u017ce wszystko, co znale\u017ali\u015bmy za pomoc\u0105 mened\u017cer\u00f3w us\u0142ug, umie\u015bcimy w Consulu i stamt\u0105d b\u0119dziemy pisa\u0107 regu\u0142y iptables.<\/p>\n<p>Jak zdecydowali\u015bmy to zrobi\u0107?<\/p>\n<ul>\n<li>Zbierzemy wszystkie us\u0142ugi, sieci i u\u017cytkownik\u00f3w.<\/li>\n<li>Na ich podstawie stworzymy regu\u0142y iptables.<\/li>\n<li>Zautomatyzujemy kontrol\u0119.<\/li>\n<li>\u2026.<\/li>\n<li>ZYSK.<\/li>\n<\/ul>\n<p>\nConsul to nie zdalne API, mo\u017ce dzia\u0142a\u0107 na ka\u017cdym w\u0119\u017ale i pisa\u0107 w iptables. Pozostaje tylko wymy\u015bli\u0107 automatyczne \u015brodki kontroli, kt\u00f3re b\u0119d\u0105 usuwa\u0142y zb\u0119dne elementy, a wi\u0119kszo\u015b\u0107 problem\u00f3w zostanie rozwi\u0105zana! Reszt\u0119 dopracujemy w procesie.<\/p>\n<h3>Dlaczego Consul?<\/h3>\n<p>\n<strong>Dobrze si\u0119 sprawdzi\u0142. <\/strong>W latach 2014-15 u\u017cywali\u015bmy go jako backendu dla Vault, w kt\u00f3rym przechowujemy has\u0142a.<\/p>\n<p><strong>Nie gubi danych.<\/strong>Podczas korzystania z Consula nie utracono danych w \u017cadnej awarii. To ogromny plus dla systemu zarz\u0105dzania zapor\u0105 ogniow\u0105.<\/p>\n<p><strong>Po\u0142\u0105czenia P2P przyspieszaj\u0105 rozprzestrzenianie zmian.<\/strong>Dzi\u0119ki P2P wszystkie zmiany przychodz\u0105 szybko, nie trzeba czeka\u0107 godzinami.<\/p>\n<p><strong>Wygodne REST API.<\/strong> Rozwa\u017cali\u015bmy tak\u017ce Apache ZooKeeper, ale nie ma on REST API, trzeba by\u0142oby wprowadza\u0107 obej\u015bcia.<\/p>\n<p><strong>Dzia\u0142a zar\u00f3wno jako magazyn kluczy (KV), jak i jako katalog (Odkrywanie us\u0142ug).<\/strong>Mo\u017cna przechowywa\u0107 od razu us\u0142ugi, katalogi, centra danych. To wygodne nie tylko dla nas, ale i dla s\u0105siednich zespo\u0142\u00f3w, poniewa\u017c buduj\u0105c globaln\u0105 us\u0142ug\u0119, my\u015blimy w skali.<\/p>\n<p><strong>Napisany w Go, kt\u00f3ry wchodzi w sk\u0142ad stosu Wargaming. <\/strong>Uwielbiamy ten j\u0119zyk, mamy wielu programist\u00f3w Go.<\/p>\n<p><strong>Pot\u0119\u017cny system ACL. <\/strong>W Consulu za pomoc\u0105 ACL mo\u017cna zarz\u0105dza\u0107 tym, kto i co mo\u017ce pisa\u0107. Gwarantujemy, \u017ce zasady zapory ogniowej nie b\u0119d\u0105 si\u0119 ze sob\u0105 krzy\u017cowa\u0107 i nie b\u0119dziemy z tym mieli problem\u00f3w.<\/p>\n<p>Jednak Consul ma r\u00f3wnie\u017c wady.<\/p>\n<ul>\n<li><strong>Nie skalowalny w ramach centrum danych, je\u015bli nie masz wersji biznesowej. <\/strong>Skalowalny tylko przez federacj\u0119.<\/li>\n<li><strong>Bardzo zale\u017cny od jako\u015bci sieci i obci\u0105\u017cenia serwer\u00f3w. <\/strong>Consul nie b\u0119dzie dzia\u0142a\u0142 poprawnie jako serwer na obci\u0105\u017conym serwerze, je\u015bli w sieci s\u0105 jakie\u015b op\u00f3\u017anienia, na przyk\u0142ad niestabilna pr\u0119dko\u015b\u0107. Jest to zwi\u0105zane z po\u0142\u0105czeniami P2P i modelami dystrybucji aktualizacji.<\/li>\n<li><strong>Trudno\u015bci z monitorowaniem dost\u0119pno\u015bci<\/strong>. W statusie Consula mo\u017ce m\u00f3wi\u0107, \u017ce wszystko dobrze, a on ju\u017c od dawna nie dzia\u0142a.<\/li>\n<\/ul>\n<p>\nWi\u0119kszo\u015b\u0107 tych problem\u00f3w rozwi\u0105zali\u015bmy podczas eksploatacji Consula, dlatego go wybrali\u015bmy. Firma ma plany na alternatywny backend, ale nauczyli\u015bmy si\u0119 radzi\u0107 sobie z problemami i na razie \u017cyjemy z Consulem.<\/p>\n<h3>Jak dzia\u0142a Consul<\/h3>\n<p>\nW przyporz\u0105dkowanym centrum danych zainstalujemy serwery \u2014 od trzech do pi\u0119ciu. Jeden lub dwa serwery si\u0119 nie sprawdz\u0105: nie b\u0119d\u0105 w stanie zorganizowa\u0107 kworum i ustali\u0107, kto ma racj\u0119, gdy dane si\u0119 nie zgadzaj\u0105. Wi\u0119cej ni\u017c pi\u0119\u0107 nie ma sensu, wydajno\u015b\u0107 spadnie.<\/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 \/>\nKlienci \u0142\u0105cz\u0105 si\u0119 z serwerami w dowolnej kolejno\u015bci: to ci sami agenci, tylko z flag\u0105 <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 \/>\nPo tym klienci otrzymuj\u0105 list\u0119 po\u0142\u0105cze\u0144 P2P i tworz\u0105 mi\u0119dzy sob\u0105 powi\u0105zania.<\/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 \/>\nNa poziomie globalnym \u0142\u0105czymy kilka centr\u00f3w danych. One r\u00f3wnie\u017c \u0142\u0105cz\u0105 si\u0119 P2P i komunikuj\u0105.<\/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 \/>\nKiedy chcemy pobra\u0107 dane z innego centrum danych, zapytanie idzie od serwera do serwera. Taki schemat nazywa si\u0119 <strong>protoko\u0142em Serf<\/strong>. Protok\u00f3\u0142 Serf, podobnie jak Consul, jest rozwijany przez HashiCorp.<\/p>\n<h3>Kilka wa\u017cnych fakt\u00f3w o Consulu<\/h3>\n<p>\nConsul ma dokumentacj\u0119 opisuj\u0105c\u0105 swoj\u0105 prac\u0119. Przytocz\u0119 tylko wybrane fakty, kt\u00f3re warto zna\u0107.<\/p>\n<p><strong>Serwery Consula wybieraj\u0105 lidera spo\u015br\u00f3d g\u0142osuj\u0105cych<\/strong>. Consul wybiera lidera z listy serwer\u00f3w dla ka\u017cdego centrum danych i wszystkie zapytania id\u0105 tylko do niego, niezale\u017cnie od liczby serwer\u00f3w. Zawieszenie lidera nie prowadzi do nowych wybor\u00f3w. Je\u015bli lider nie jest wybrany \u2014 zapytania nie s\u0105 obs\u0142ugiwane przez nikogo.<\/p>\n<blockquote><p>Chcia\u0142e\u015b skalowania horyzontalnego? Przykro mi, nie ma takiej opcji.<\/p><\/blockquote>\n<p> Zapytanie do innego centrum danych jest przekazywane od mastera do mastera, niezale\u017cnie od tego, na kt\u00f3rym serwerze si\u0119 pojawi\u0142o. Wybrany master otrzymuje 100% obci\u0105\u017cenia, z wyj\u0105tkiem obci\u0105\u017cenia na przekierowane zapytania. Aktualna kopia danych jest dost\u0119pna dla wszystkich serwer\u00f3w centrum danych, ale odpowiada tylko jeden.<\/p>\n<blockquote><p>Jedynym sposobem na skalowanie jest w\u0142\u0105czenie trybu stale na kliencie.<\/p><\/blockquote>\n<p>W trybie stale mo\u017cna odpowiada\u0107 bez kworum. To tryb, w kt\u00f3rym rezygnujemy z sp\u00f3jno\u015bci danych, ale czytamy nieco szybciej ni\u017c zwykle, a odpowiedzie\u0107 mo\u017ce ka\u017cdy serwer. Oczywi\u015bcie zapis odbywa si\u0119 tylko przez mastera.<\/p>\n<p><strong>Consul nie kopiuje danych mi\u0119dzy centrami danych.<\/strong>Podczas zbierania federacji ka\u017cdy serwer b\u0119dzie mia\u0142 tylko w\u0142asne dane. Po inne zawsze zwraca si\u0119 do kogo\u015b innego.<\/p>\n<p><strong>Atomowo\u015b\u0107 operacji nie jest gwarantowana poza transakcjami.<\/strong>Pami\u0119taj, \u017ce zmienia\u0107 co\u015b mog\u0105 nie tylko wy. Je\u015bli chcesz inaczej, przeprowad\u017a transakcj\u0119 z blokad\u0105.<\/p>\n<p><strong>Operacje blokuj\u0105ce nie gwarantuj\u0105 blokady.<\/strong>Zapytanie odbywa si\u0119 od mastera do mastera, a nie bezpo\u015brednio, dlatego nie ma gwarancji, \u017ce blokada zadzia\u0142a, gdy dokonujesz blokady, na przyk\u0142ad w innym centrum danych.<\/p>\n<p><strong>ACL r\u00f3wnie\u017c nie gwarantuje dost\u0119pu (w wielu przypadkach).<\/strong>ACL mo\u017ce nie dzia\u0142a\u0107, poniewa\u017c jest przechowywana w jednym centrum danych federacji \u2014 w centrum danych ACL (Primary DC). Je\u015bli DC ci nie odpowie, ACL nie b\u0119dzie dzia\u0142a\u0107.<\/p>\n<p><strong>Jeden zawieszony master spowoduje zawieszenie ca\u0142ej federacji.<\/strong>Na przyk\u0142ad, w federacji 10 centr\u00f3w danych, a w jednym z\u0142a sie\u0107, jeden master pada. Wszyscy, kt\u00f3rzy si\u0119 z nim komunikuj\u0105, b\u0119d\u0105 zawieszeni w cyklu: odbywa si\u0119 zapytanie, nie ma odpowiedzi, w\u0105tek si\u0119 zawiesza. Nie da si\u0119 przewidzie\u0107, kiedy to si\u0119 wydarzy, po prostu za godzin\u0119 lub dwie ca\u0142a federacja padnie. Nic z tym nie zrobisz.<\/p>\n<p>Status, kworum i wybory s\u0105 przetwarzane osobnym w\u0105tkiem. Nie nast\u0105pi\u0105 nowe wybory, status nic nie poka\u017ce. My\u015blisz, \u017ce masz aktywny Consul, pytasz, a nic si\u0119 nie dzieje \u2014 nie ma odpowiedzi. Status pokazuje, \u017ce wszystko jest w porz\u0105dku.<\/p>\n<p>Spotkali\u015bmy si\u0119 z tym problemem, musieli\u015bmy przebudowa\u0107 konkretne cz\u0119\u015bci centr\u00f3w danych, aby go unikn\u0105\u0107.<\/p>\n<p><strong>W wersji biznesowej Consul Enterprise brak niekt\u00f3rych wymienionych wcze\u015bniej wad.<\/strong>Ma ona wiele przydatnych funkcji: wyb\u00f3r g\u0142osuj\u0105cych, rozdzielanie, skalowanie. Jest tylko jeden \"ale\" \u2014 system licencyjny dla systemu rozproszonego jest bardzo drogi.<\/p>\n<p>Lifehack: <code>rm -rf \/var\/lib\/consul<\/code> \u2014 lekarstwo na wszelkie problemy agenta. Je\u015bli co\u015b nie dzia\u0142a, po prostu usu\u0144 swoje dane i za\u0142aduj dane z kopii. Najprawdopodobniej Consul zacznie dzia\u0142a\u0107.<\/p>\n<h2>BEFW<\/h2>\n<p>\nTeraz porozmawiajmy o tym, co dodali\u015bmy do Consul.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">BEFW<\/a><\/noindex> \u2014 to akronim od <strong>B<\/strong>ack<strong>E<\/strong>nd<strong>F<\/strong>ire<strong>W<\/strong>wszystko. Musia\u0142em jako\u015b nazwa\u0107 produkt, gdy tworzy\u0142em repozytorium, aby umie\u015bci\u0107 w nim pierwsze testowe commity. Taka nazwa i pozosta\u0142a.<\/p>\n<h3>Szablony regu\u0142<\/h3>\n<p>\nRegu\u0142y s\u0105 napisane w sk\u0142adni iptables.<\/p>\n<ul>\n<li>-N BEFW<\/li>\n<li>-P INPUT DROP<\/li>\n<li>-A INPUT -m state&mdash;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>\nWszystko idzie do \u0142a\u0144cucha BEFW, z wyj\u0105tkiem <code>ESTABLISHED<\/code>, <code>RELATED<\/code> i localhost. Szablon mo\u017ce by\u0107 dowolny, to tylko przyk\u0142ad.<\/p>\n<p>Jak przydatny jest BEFW?<\/p>\n<h3>Us\u0142ugi<\/h3>\n<p>\nMamy us\u0142ug\u0119, w kt\u00f3rej zawsze jest port oraz w\u0119ze\u0142, na kt\u00f3rym dzia\u0142a. Z w\u0142asnego w\u0119z\u0142a mo\u017cemy lokalnie zapyta\u0107 agenta i dowiedzie\u0107 si\u0119, \u017ce mamy jak\u0105\u015b us\u0142ug\u0119. Mo\u017cna tak\u017ce dodawa\u0107 tagi.<\/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 \/>\nKa\u017cda us\u0142uga, kt\u00f3ra jest uruchomiona i zarejestrowana w Consul, zamienia si\u0119 w regu\u0142\u0119 iptables. Mamy SSH \u2014 otwieramy port 22. Skrypt bash jest prosty: curl i iptables, nic wi\u0119cej nie potrzeba.<\/p>\n<h3>Klienci<\/h3>\n<p>\nJak otworzy\u0107 dost\u0119p nie wszystkim, a selektywnie? Zbieraj\u0105c IP do przechowalni KV po nazwie us\u0142ugi.<\/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 \/>\nNa przyk\u0142ad, chcemy, aby wszyscy z dziesi\u0105tej sieci mogli \u0142\u0105czy\u0107 si\u0119 z us\u0142ug\u0105 SSH_TCP_22. Dodajemy jedno ma\u0142e pole TTL? i teraz mamy tymczasowe zezwolenia, na przyk\u0142ad na dob\u0119.<\/p>\n<h3>Dost\u0119py<\/h3>\n<p>\n\u0141\u0105czymy us\u0142ugi i klient\u00f3w: mamy us\u0142ug\u0119, dla ka\u017cdej gotowe jest przechowalnia KV. Teraz dajemy dost\u0119p nie wszystkim, a selektywnie.<\/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>Grupy<\/h3>\n<p>\nJe\u015bli za ka\u017cdym razem b\u0119dziemy pisa\u0107 tysi\u0105ce IP do dost\u0119p\u00f3w, to si\u0119 zm\u0119czymy. Wymy\u015blimy grupy \u2014 oddzielny subset w KV. Nazwiemy go Alias (lub grupy) i b\u0119dziemy przechowywa\u0107 tam grupy wed\u0142ug tego samego zasad.<\/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 \/>\n\u0141\u0105czymy: teraz mo\u017cemy otworzy\u0107 SSH nie konkretnie na P2P, a na ca\u0142\u0105 grup\u0119 lub kilka grup. Tak samo mamy TTL \u2014 mo\u017cna tymczasowo dodawa\u0107 i usuwa\u0107 z grupy.<\/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>Integracja<\/h3>\n<p>\n\u041d\u0430\u0448\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &mdash;&nbsp;\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f. \u041f\u043e\u043a\u0430 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0435\u0435 \u0442\u0430\u043a.<\/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 \/>\nPracujemy z Puppet i przekazujemy mu wszystko, co dotyczy systemu (kod aplikacji). W puppetdb (zwyk\u0142y PostgreSQL) przechowywana jest lista uruchomionych us\u0142ug, kt\u00f3re mo\u017cna znale\u017a\u0107 wed\u0142ug typu zasobu. Tam r\u00f3wnie\u017c mo\u017cna sprawdzi\u0107, kto do czego si\u0119 odwo\u0142uje. Mamy tak\u017ce system pull request\u00f3w i merge request\u00f3w do tego.<\/p>\n<p>Napisali\u015bmy befw-sync \u2014 najprostsze rozwi\u0105zanie, kt\u00f3re pomaga przenosi\u0107 dane. Najpierw sync cookies kieruj\u0105 zapytania do puppetdb. Tam skonfigurowane jest API HTTP: \u017c\u0105damy, jakie mamy us\u0142ugi i co trzeba zrobi\u0107. Nast\u0119pnie wykonuj\u0105 zapytanie do Consul.<\/p>\n<p>Czy istnieje integracja? Tak: napisali\u015bmy zasady, pozwolili\u015bmy na akceptacj\u0119 Pull Request\u00f3w. Potrzebny jest jaki\u015b port lub dodanie hosta do jakiej\u015b grupy? Pull Request, przegl\u0105d \u2014 \u017cadnych \u201eZnajd\u017a 200 innych ACL i spr\u00f3buj co\u015b z tym zrobi\u0107\u201d.<\/p>\n<h3>Optymalizacja<\/h3>\n<p>\nPing localhost z pustym \u0142a\u0144cuchem regu\u0142 zajmuje 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 \/>\nDodamy do tego \u0142a\u0144cucha 10 000 adres\u00f3w iptables. W rezultacie ping zwi\u0119kszy si\u0119 5 razy: iptables jest ca\u0142kowicie liniowe, przetwarzanie ka\u017cdego adresu zajmuje troch\u0119 czasu.<\/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 \/>\nDla zapory, do kt\u00f3rej migrujemy tysi\u0105ce ACL, mamy du\u017co regu\u0142, co wprowadza op\u00f3\u017anienia. To jest z\u0142e dla protoko\u0142\u00f3w gier.<\/p>\n<p>Ale je\u015bli umie\u015bcimy <strong>10 000 adres\u00f3w w ipset<\/strong> ping nawet si\u0119 zmniejszy.<\/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 \/>\nSens polega na tym, \u017ce \u201eO\u201d (z\u0142o\u017cono\u015b\u0107 algorytmu) dla ipset zawsze wynosi 1, niezale\u017cnie od tego, ile tam jest regu\u0142. Istnieje ograniczenie \u2014 nie mo\u017ce by\u0107 wi\u0119cej ni\u017c 65535 regu\u0142. Na razie z tym \u017cyjemy: mo\u017cna je kombinowa\u0107, rozszerza\u0107, tworzy\u0107 dwa ipset w jednym.<\/p>\n<h3>Przechowywanie<\/h3>\n<p>\nLogiczn\u0105 kontynuacj\u0105 procesu iteracji jest przechowywanie informacji o klientach dla us\u0142ugi w 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 \/>\nTeraz mamy ten sam SSH, i nie wpisujemy od razu 100 IP, tylko podajemy nazw\u0119 ipset, z kt\u00f3rym trzeba si\u0119 skontaktowa\u0107, i nast\u0119pn\u0105 regu\u0142\u0119 <code>DROP<\/code>. Mo\u017cna to przekszta\u0142ci\u0107 w jedn\u0105 regu\u0142\u0119 \u201eKto nie tutaj, ten DROP\u201d, ale tak wygl\u0105da to bardziej czytelnie.<\/p>\n<p>Teraz mamy regu\u0142y i zestawy. G\u0142\u00f3wne zadanie to utworzenie zestawu przed napisaniem regu\u0142y, poniewa\u017c w przeciwnym razie iptables nie zapisze regu\u0142y.<\/p>\n<h3>Og\u00f3lny schemat<\/h3>\n<p>\nW postaci schematu wszystko, co opowiedzia\u0142em, wygl\u0105da tak.<\/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 \/>\nPotwierdzamy w Puppet, wszystko wysy\u0142ane jest na hosta, us\u0142ugi s\u0105 tutaj, ipset tam, a kto tam nie jest zapisany, ten nie jest wpuszczany.<\/p>\n<h3>Zezw\u00f3l i zabro\u0144<\/h3>\n<p>\nAby szybko ratowa\u0107 \u015bwiat lub szybko kogo\u015b od\u0142\u0105czy\u0107, na pocz\u0105tku wszystkich \u0142a\u0144cuch\u00f3w stworzyli\u015bmy dwa ipset: <code>rules_allow<\/code> i <code>rules_deny<\/code>. Jak to dzia\u0142a?<\/p>\n<p>Na przyk\u0142ad, kto\u015b generuje obci\u0105\u017cenie na naszym serwisie za pomoc\u0105 bot\u00f3w. Kiedy\u015b trzeba by\u0142o znale\u017a\u0107 jego IP w logach, przekaza\u0107 to in\u017cynierom sieciowym, aby znale\u017ali \u017ar\u00f3d\u0142o ruchu i zablokowali je. Teraz wygl\u0105da to inaczej.<\/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 \/>\nWysy\u0142amy do Consul, czekamy 2,5 s i gotowe. Poniewa\u017c Consul szybko rozprowadza dzi\u0119ki P2P, dzia\u0142a wsz\u0119dzie, w ka\u017cdej cz\u0119\u015bci \u015bwiata.<\/p>\n<p>Kiedy\u015b ca\u0142kowicie zatrzyma\u0142em WOT przez pomy\u0142k\u0119 z firewallem. <code>rules_allow<\/code> \u2014 to nasze ubezpieczenie od takich przypadk\u00f3w. Je\u015bli gdzie\u015b pope\u0142nili\u015bmy b\u0142\u0105d z firewallem i co\u015b zosta\u0142o zablokowane, zawsze mo\u017cemy wys\u0142a\u0107 warunkowy <code>0.0\/0<\/code>, aby szybko wszystko przywr\u00f3ci\u0107. Potem naprawimy to r\u0119cznie.<\/p>\n<h3>Inne zestawy<\/h3>\n<p>\nMo\u017cna dodawa\u0107 dowolne inne zestawy w przestrzeni <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 \/>\nPo co? Czasami kto\u015b potrzebuje ipset, na przyk\u0142ad, aby emulowa\u0107 wy\u0142\u0105czenie jakiej\u015b cz\u0119\u015bci klastra. Ka\u017cdy mo\u017ce przynie\u015b\u0107 dowolne zestawy, nada\u0107 im nazwy, a one b\u0119d\u0105 pobierane z Consul. Zestawy mog\u0105 bra\u0107 udzia\u0142 w regu\u0142ach iptables, a tak\u017ce by\u0107 jakby komend\u0105 <code>NOOP<\/code>: sp\u00f3jno\u015b\u0107 b\u0119dzie utrzymywana przez demona.<\/p>\n<h3>U\u017cytkownicy<\/h3>\n<p>\nKiedy\u015b by\u0142o tak: u\u017cytkownik \u0142\u0105czy\u0142 si\u0119 z sieci\u0105 i przez domen\u0119 otrzymywa\u0142 parametry. Przed pojawieniem si\u0119 nowej generacji firewalli Cisco nie potrafi\u0142a rozpozna\u0107, gdzie jest u\u017cytkownik, a gdzie IP. Dlatego dost\u0119p by\u0142 wydawany tylko przez hostname maszyny.<\/p>\n<p>Co zrobili\u015bmy? Wkr\u0119cili\u015bmy si\u0119 w momencie uzyskiwania adresu. Zwykle to dot1x, Wi-Fi lub VPN \u2014 wszystko przechodzi przez RADIUS. Dla ka\u017cdego u\u017cytkownika tworzymy grup\u0119 o nazwie u\u017cytkownika i umieszczamy w niej IP z TTL, kt\u00f3ry jest r\u00f3wny jego dhcp.lease \u2014 gdy tylko wygasa, regu\u0142a znika.<\/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 \/>\nTeraz mo\u017cemy otwiera\u0107 dost\u0119p do us\u0142ug, jak i dla innych grup, na podstawie nazwy u\u017cytkownika. Pozbyli\u015bmy si\u0119 b\u00f3lu z hostname, gdy si\u0119 zmieniaj\u0105, oraz odci\u0105\u017camy in\u017cynier\u00f3w sieciowych, poniewa\u017c nie potrzebuj\u0105 ju\u017c Cisco. Teraz in\u017cynierowie sami definiuj\u0105 dost\u0119p na swoich serwerach.<\/p>\n<h3>Izolacja<\/h3>\n<p>\nR\u00f3wnolegle zacz\u0119li\u015bmy zajmowa\u0107 si\u0119 izolacj\u0105. Mened\u017cerowie us\u0142ug przeprowadzili inwentaryzacj\u0119, a my przeanalizowali\u015bmy wszystkie nasze sieci. Podzielimy je na takie same grupy, a na odpowiednich serwerach dodali\u015bmy grupy, na przyk\u0142ad, do deny. Teraz ta sama izolacja stagingowa trafia do rules_deny w produkcji, ale nie w samej produkcji.<\/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 \/>\nSchemat dzia\u0142a szybko i prosto: usuwamy wszystkie ACL z serwer\u00f3w, odci\u0105\u017camy sprz\u0119t, zmniejszamy liczb\u0119 izolowanych VLAN\u00f3w.<\/p>\n<h3>Kontrola integralno\u015bci<\/h3>\n<p>\nDawniej mieli\u015bmy specjalny wyzwalacz, kt\u00f3ry informowa\u0142, kiedy kto\u015b r\u0119cznie zmienia\u0142 zasady zapory. Napisa\u0142em ogromny lint do sprawdzania zasad zapory, by\u0142o to trudne. Teraz integralno\u015b\u0107 kontroluje BEFW. Intensywnie pilnuje, aby zasady, kt\u00f3re ustala, nie by\u0142y zmieniane. Je\u015bli kto\u015b zmieni zasady zapory, przywr\u00f3ci wszystko z powrotem. \u201eSzybko uruchomi\u0142em proxy, aby pracowa\u0107 z domu\u201d \u2014 takich opcji ju\u017c nie ma.<\/p>\n<p>BEFW kontroluje ipset z us\u0142ug i listy w befw.conf, zasady us\u0142ug w \u0142a\u0144cuchu BEFW. Jednak nie monitoruje innych \u0142a\u0144cuch\u00f3w i zasad oraz innych ipset.<\/p>\n<h3>Ochrona przed awariami<\/h3>\n<p>\nBEFW zawsze zapisuje ostatni udany stan bezpo\u015brednio w binarnej strukturze state.bin. Je\u015bli co\u015b posz\u0142o nie tak, zawsze wraca do tego 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 \/>\nTo rodzaj ubezpieczenia przed niestabiln\u0105 prac\u0105 Consul, kiedy nie wys\u0142a\u0142 danych lub kto\u015b pomyli\u0142 si\u0119 i u\u017cy\u0142 zasad, kt\u00f3re nie mog\u0105 by\u0107 zastosowane. Aby\u015bmy nie zostali bez zapory, BEFW cofn\u0105\u0142 si\u0119 do ostatniego stanu, je\u015bli na kt\u00f3rym\u015b etapie wyst\u0105pi b\u0142\u0105d.<\/p>\n<p>W krytycznych sytuacjach to gwarancja, \u017ce pozostaniemy z dzia\u0142aj\u0105c\u0105 zapor\u0105. Otwieramy wszystkie szare sieci w nadziei, \u017ce administrator przyjdzie i naprawi. Kiedy\u015b to umieszcz\u0119 w konfiguracjach, ale teraz mamy tylko trzy szare sieci: 10\/8, 172\/12 i 192.168\/16. W ramach naszego Consul to wa\u017cna cecha, kt\u00f3ra pomaga si\u0119 rozwija\u0107.<\/p>\n<p><em>Demo: podczas wyk\u0142adu Ivan demonstruje tryb demo pracy BEFW. Wygodniej ogl\u0105da\u0107 demonstracj\u0119 na <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/4zP67uYnsR4?t=1663\">wideo<\/a><\/noindex>. Kod \u017ar\u00f3d\u0142owy demo jest dost\u0119pny <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\/tree\/master\/demo\">na GitHubie<\/a><\/noindex>.<\/em><\/p>\n<h2>Pu\u0142apki<\/h2>\n<p>\nOpowiem o b\u0142\u0119dach, z kt\u00f3rymi si\u0119 spotkali\u015bmy.<\/p>\n<p><strong>ipset add set 0.0.0.0\/0. <\/strong>Co si\u0119 stanie, je\u015bli dodasz do ipset 0.0.0.0\/0? Dodane zostan\u0105 wszystkie IP? Otworzy si\u0119 dost\u0119p do internetu? <\/p>\n<p>Nie, otrzymamy b\u0142\u0105d, kt\u00f3ry kosztowa\u0142 nas dwie godziny przestoju. Ten b\u0142\u0105d nie dzia\u0142a\u0142 od 2016 roku, le\u017cy w RedHat Bugzilla pod numerem #1297092, a odkryli\u015bmy go przypadkowo \u2014 z raportu programisty.<\/p>\n<p>Teraz w BEFW obowi\u0105zuje \u015bcis\u0142a zasada, \u017ce <code>0.0.0.0\/0<\/code> zmienia si\u0119 w dwa adresy: <code>0.0.0.0\/1<\/code> i <code>128.0.0.0\/1<\/code>.<\/p>\n<p><strong>ipset restore set &lt; file. <\/strong>Co robi ipset, gdy m\u00f3wisz mu <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>Nic podobnego \u2014 robi merge, a stare adresy nie znikaj\u0105, dost\u0119pu nie zamykasz.<\/p>\n<p>B\u0142\u0105d odkryli\u015bmy, gdy testowali\u015bmy izolacj\u0119. Teraz tam jest do\u015b\u0107 skomplikowany system \u2014 zamiast <code>restore<\/code> prowadzi si\u0119 <code>create temp<\/code>, potem <code>restore flush temp<\/code> i <code>restore temp<\/code>. Na ko\u0144cu swap: dla atomowo\u015bci, bo je\u015bli najpierw przeprowadza <code>flush<\/code> I w tym momencie przyjdzie jaki\u015b pakiet, kt\u00f3ry zostanie odrzucony i co\u015b p\u00f3jdzie nie tak. Dlatego czeka nas troch\u0119 czarnej magii.<\/p>\n<p><strong>consul kv get -datacenter=other. <\/strong>Jak ju\u017c m\u00f3wi\u0142em, my\u015blimy, \u017ce \u017c\u0105damy jakich\u015b danych, ale otrzymamy albo dane, albo b\u0142\u0105d. Mo\u017cemy to robi\u0107 lokalnie przez Consul, ale w takim przypadku oba procesy zawiesz\u0105 si\u0119.<\/p>\n<p>Lokalny klient Consul to pow\u0142oka nad HTTP API. Jednak po prostu zawiesza si\u0119 i nie odpowiada na Ctrl+C, Ctrl+Z ani nic, tylko na <code>kill -9<\/code> w s\u0105siedniej konsoli. Napotkali\u015bmy to, gdy budowali\u015bmy du\u017cy klaster. Ale na razie nie mamy rozwi\u0105zania, przygotowujemy si\u0119 do naprawy tego b\u0142\u0119du w Consul.<\/p>\n<p><strong>Lider Consul nie odpowiada. <\/strong>Nasz master w centrum danych nie odpowiada, my\u015blimy: \"Chyba teraz zadzia\u0142a algorytm ponownego wyboru?\" <\/p>\n<p>Nie, nie zadzia\u0142a, a monitoring nic nie poka\u017ce: Consul powie, \u017ce commitment index jest, lider znaleziony, wszystko w porz\u0105dku.<\/p>\n<p>Jak z tym walczymy? <code>service consul restart<\/code> w cron co godzin\u0119. Je\u015bli masz 50 serwer\u00f3w \u2013 to nie problem. Gdy b\u0119dzie ich 16 000, zrozumiesz, jak to dzia\u0142a.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>\nOstatecznie uzyskali\u015bmy nast\u0119puj\u0105ce korzy\u015bci:<\/p>\n<ul>\n<li>100% pokrycie wszystkich maszyn z systemem Linux.<\/li>\n<li>Szybko\u015b\u0107.<\/li>\n<li>Automatyzacja.<\/li>\n<li>Uw freeing hardware and network engineers from servitude.<\/li>\n<li>Pojawi\u0142y si\u0119 mo\u017cliwo\u015bci integracji, kt\u00f3re s\u0105 praktycznie nieograniczone: z Kubernetes, z Ansible, z Pythonem.<\/li>\n<\/ul>\n<p>\n<strong>Minusy<\/strong>: Consul, z kt\u00f3rym teraz musimy \u017cy\u0107, oraz bardzo wysoka cena b\u0142\u0119du. Dla przyk\u0142adu, raz o 18:00 (czas szczytowy w Rosji) co\u015b zmienia\u0142em na listach sieci. W\u0142a\u015bnie wtedy budowali\u015bmy izolacj\u0119 na BEFW. Gdzie\u015b si\u0119 pomyli\u0142em, wydaje mi si\u0119, \u017ce poda\u0142em niew\u0142a\u015bciw\u0105 mask\u0119, a wszystko pad\u0142o w ci\u0105gu dw\u00f3ch sekund. Uruchomi\u0142 si\u0119 monitoring, przybieg\u0142 dy\u017curny wsparcia: \"Wszystko u nas le\u017cy!\" Szef dzia\u0142u siwieje, gdy t\u0142umaczy biznesowi, dlaczego tak si\u0119 sta\u0142o.<\/p>\n<p>Cena b\u0142\u0119du jest tak wysoka, \u017ce wymy\u015blili\u015bmy w\u0142asn\u0105 skomplikowan\u0105 procedur\u0119 zapobiegawcz\u0105. Je\u015bli zamierzasz wdra\u017ca\u0107 to w du\u017cej produkcji, nie dawaj master-tokenu nad Consul wszystkim bez wyj\u0105tku. To \u017ale si\u0119 sko\u0144czy.<\/p>\n<p><strong>Koszt. <\/strong>Sp\u0119dzi\u0142em 400 godzin na pisaniu kodu samodzielnie. Na wsparcie moja czteroosobowa dru\u017cyna po\u015bwi\u0119ca 10 godzin miesi\u0119cznie na wszystkich. W por\u00f3wnaniu z kosztami jakiejkolwiek zapory nowej generacji, to za darmo.<\/p>\n<p><strong>Plany. <\/strong>D\u0142ugoterminowym planem jest poszukiwanie alternatywnego transportu w zamian lub dodatkowo do Consul. Mo\u017ce to by\u0107 Kafka lub co\u015b w tym stylu. Ale przez najbli\u017csze lata b\u0119dziemy \u017cy\u0107 na Consul.<\/p>\n<p>Najbli\u017csze plany: integracja z Fail2ban, monitorowanie, nftables, by\u0107 mo\u017ce z innymi dystrybucjami, metryki, rozszerzone monitorowanie, optymalizacja. Wsparcie dla Kubernetes r\u00f3wnie\u017c jest w planach, poniewa\u017c obecnie mamy kilka klastr\u00f3w i ch\u0119ci.<\/p>\n<p>Jeszcze z plan\u00f3w:<\/p>\n<ul>\n<li>wykrywanie anomalii w ruchu;<\/li>\n<li>zarz\u0105dzanie map\u0105 sieci;<\/li>\n<li>wsparcie dla Kubernetes;<\/li>\n<li>kompilacja pakiet\u00f3w dla wszystkich system\u00f3w;<\/li>\n<li>Web-UI.<\/li>\n<\/ul>\n<p>\nNieprzerwanie pracujemy nad rozszerzeniem konfiguracji, zwi\u0119kszeniem metryk i optymalizacj\u0105.<\/p>\n<p><i>Do\u0142\u0105cz do projektu. Projekt sta\u0142 si\u0119 \u015bwietny, ale niestety to wci\u0105\u017c projekt jednej osoby. Przyjd\u017a na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">GitHub <\/a><\/noindex>i spr\u00f3buj co\u015b zrobi\u0107: zakomitowa\u0107, przetestowa\u0107, co\u015b zaproponowa\u0107, oceni\u0107.<\/i><\/p>\n<blockquote><p>W mi\u0119dzyczasie przygotowujemy si\u0119 do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\">Saint HighLoad++<\/a><\/noindex>, kt\u00f3re odb\u0119dzie si\u0119 6 i 7 kwietnia w Sankt Petersburgu, i zapraszamy tw\u00f3rc\u00f3w system\u00f3w wysokoobci\u0105\u017ceniowych <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose?conference=hl2020-spb\">do zg\u0142oszenia si\u0119 na wyk\u0142ad<\/a><\/noindex>. Do\u015bwiadczeni prelegenci i tak wiedz\u0105, co robi\u0107, a nowicjuszom w wyst\u0105pieniach polecamy chocia\u017cby <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\/speakers\">spr\u00f3buj<\/a><\/noindex>. Udzia\u0142 w konferencji jako prelegent ma szereg zalet. Jakich, mo\u017cna przeczyta\u0107 na przyk\u0142ad na ko\u0144cu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/486142\/\">tego artyku\u0142u<\/a><\/noindex>.<\/p><\/blockquote>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/consul-iptables-3\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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":"W 2010 roku firma Wargaming mia\u0142a 50 serwer\u00f3w i prosty model sieciowy: backend, frontend i firewall.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/consul-iptables-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/41051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=41051"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/41051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/41052"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=41051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=41051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=41051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}