Consul + iptables = :3

År 2010 hade företaget Wargaming 50 servrar och en enkel nĂ€tverksmodell: backend, frontend och brandvĂ€gg. Antalet servrar ökade, modellen blev mer komplex: stagingar, isolerade VLAN med ACL, sedan VPN med VRF, VLAN med ACL pĂ„ L2, VRF med ACL pĂ„ L3. Snurrar det i huvudet? Det blir roligare lĂ€ngre fram.

NÀr antalet servrar nÄdde 16 000 blev det omöjligt att arbeta utan problem med sÄ mÄnga olika segment. SÄ vi kom pÄ en annan lösning. Vi anvÀnde Netfilter-stacken och lade till Consul som datakÀlla, vilket resulterade i en snabb distribuerad brandvÀgg. Vi ersatte ACL pÄ routrarna och anvÀnde den som extern och intern brandvÀgg. För dynamisk hantering av verktyget utvecklade vi BEFW-systemet, som tillÀmpades överallt: frÄn hantering av anvÀndartillgÄng i det produktiva nÀtverket till isolering av nÀtverkssegment frÄn varandra.

Consul + iptables = :3

Hur detta fungerar och varför du bör titta nĂ€rmare pĂ„ detta system kommer att berĂ€tta Ivan Agarov (annmuor) — chef för infrastruktursĂ€kerhetsgruppen inom underhĂ„llsdivisionen vid Wargaming i Minsk. Ivan Ă€r en fan av SELinux, Ă€lskar Perl och skriver kod. Som chef för informationssĂ€kerhetsgruppen arbetar han regelbundet med loggar, sĂ€kerhetskopior och R&D för att skydda Wargaming frĂ„n hackare och sĂ€kerstĂ€lla driften av alla företagets spelservrar.

Spela video

Historisk översikt

Innan jag berÀttar hur vi gjorde detta, ska jag förklara hur vi kom hit och varför det behövdes. För detta, lÄt oss resa nio Är tillbaka: Är 2010, nÀr World of Tanks precis hade lanserats. Wargaming hade ungefÀr 50 servrar.

Consul + iptables = :3
Graf över företagets servertillvÀxt.

Vi hade en nÀtverksmodell. För den tiden var den optimal.

Consul + iptables = :3
NĂ€tverksmodellen 2010.

I frontenden finns de dÄliga killarna som vill krossa oss, men det finns en brandvÀgg. I backend finns det ingen brandvÀgg, men dÀr finns 50 servrar, och vi kÀnner till dem alla. Allt fungerar bra.

Under fyra Ă„r vuxit serverparken hundrafaldigt, till 5000. De första isolerade nĂ€tverken — stagingar — dök upp: de kan inte gĂ„ i produktion, och dĂ€r fanns ofta sĂ„dant som kunde vara farligt.

Consul + iptables = :3
NĂ€tverksmodellen 2014.

Av ren vana anvÀnde vi fortfarande samma hÄrdvara, och allt arbete utfördes pÄ isolerade VLAN: ACL skrivs till VLAN som tillÄter eller blockerar vissa anslutningar.

År 2016 nĂ„dde antalet servrar 8000. Wargaming förvĂ€rvade andra studior, och ytterligare partnernĂ€tverk tillkom. De verkar vara vĂ„ra, men Ă€r inte helt sĂ„: för partner fungerade VLAN ofta inte, man behövde anvĂ€nda VPN med VRF, och isoleringarna blev svĂ„rare. Blandningen av ACL-isoleringar vĂ€xte.

Consul + iptables = :3
NÀtverksmodellen Är 2016.

I början av 2018 hade maskinparken vuxit till 16 000. Det fanns 6 segment, och de andra rĂ€knade vi inte, inklusive de som var stĂ€ngda, dĂ€r finansiella data förvarades. Det dök upp containernĂ€tverk (Kubernetes), DevOps, molnnĂ€tverk som anslöts via VPN, till exempel frĂ„n IWS. Det fanns vĂ€ldigt mĂ„nga regler – det var smĂ€rtsamt.

Consul + iptables = :3
NÀtverksmodellen och isoleringssÀtten Är 2018.

För isolering anvÀnde vi: VLAN med ACL pÄ L2, VRF med ACL pÄ L3, VPN och mycket annat. För mÄnga.

Problem

Alla lever med ACL och VLAN. Vad Àr egentligen problemet? Den frÄgan kommer Harold att svara pÄ, som döljer sin smÀrta.

Consul + iptables = :3

Det fanns mÄnga problem, men fÄ av dem var massiva.

  • Geometrisk prishöjning för nya regler. Varje ny regel tog lĂ€ngre tid att lĂ€gga till Ă€n den föregĂ„ende, eftersom man först var tvungen att kolla om det redan fanns en sĂ„dan regel.
  • Ingen brandvĂ€gg inom segmenten. Segmenten var pĂ„ nĂ„got sĂ€tt Ă„tskilda, men innanför fanns det inte tillrĂ€ckligt med resurser.
  • Reglerna tillĂ€mpades lĂ„ngsamt. Med manuellt skrivna lokala regler kunde operatörerna skriva en pĂ„ en timme. Globala tog flera dagar.
  • SvĂ„righeter med reglernas granskning. Eller snarare, det var omöjligt. De första reglerna skrevs redan 2010, och de flesta av deras författare arbetade inte lĂ€ngre i företaget.
  • LĂ„g kontrollnivĂ„ över infrastrukturen. Det Ă€r det största problemet - vi visste dĂ„ligt vad som egentligen hĂ€nde.

SÄ hÀr sÄg en nÀtverksingenjör ut Är 2018 nÀr han hörde: "Vi behöver lite mer ACL".

Consul + iptables = :3

Lösningar

I början av 2018 beslutades det att göra nÄgot Ät detta.

Kostnaden för integrationer vÀxer konstant. UtgÄngspunkten var att stora datacenter slutade stödja isolerade VLAN och ACL, eftersom minnet pÄ enheterna tog slut.

Lösningen: att ta bort den mÀnskliga faktorn och automatisera Ätkomsten i största möjliga utstrÀckning.

Nya regler tillÀmpas lÄngsamt. Lösningen: snabba upp tillÀmpningen av regler, göra den distribuerad och parallell. För detta behövs ett distribuerat system sÄ att regler levereras automatiskt, utan rsync eller SFTP till tusen system.

Avsaknad av brandvĂ€gg inom segmenten. BrandvĂ€ggar inom segmenten började pĂ„verka oss nĂ€r olika tjĂ€nster upptrĂ€dde inom samma nĂ€tverk. Lösningen: anvĂ€nd brandvĂ€gg pĂ„ vĂ€rdnivĂ„ — host-baserade brandvĂ€ggar. Praktiskt taget överallt anvĂ€nder vi Linux, och överallt har vi iptables, det Ă€r inget problem.

SvÄrigheter med granskning av regler. Lösningen: lagra alla regler pÄ ett och samma stÀlle för översikt och hantering, sÄ att vi kan granska allt.

LÄg kontrollnivÄ över infrastrukturen. Lösningen: genomför en inventering av alla tjÀnster och Ätkomster mellan dem.

Detta Àr mer en administrativ process Àn en teknisk. Ibland har vi 200-300 nya releaser per vecka, sÀrskilt under kampanjer och helgdagar. Detta gÀller bara för ett team av vÄra DevOps. Med sÄ mÄnga releaser Àr det omöjligt att se och förstÄ vilka portar, IP-adresser och integrationer som behövs. DÀrför behövde vi sÀrskilt utbildade servicechefer som intervjuade teamen: "Vad finns överhuvudtaget och varför har ni startat detta?"

Efter allt vi har lanserat ser nÀtverksingenjören redan ut sÄ hÀr Är 2019.

Consul + iptables = :3

Consul

Vi beslutade att allt vi hittade med hjÀlp av servicecheferna skulle placeras i Consul och dÀrifrÄn skulle vi skriva iptables-regler.

Hur beslutade vi att göra detta?

  • Vi samlar alla tjĂ€nster, nĂ€tverk och anvĂ€ndare.
  • Vi skapar iptables-regler baserade pĂ„ dem.
  • Vi automatiserar kontrollen.
  • 
.
  • VINST.

Consul Ă€r ingen fjĂ€rr-API, den kan fungera pĂ„ varje nod och skriva till iptables. ÅterstĂ„r att komma pĂ„ automatiska kontrollverktyg som rensar bort det överflödiga, och en stor del av problemen kommer att lösas! Det övriga förbĂ€ttrar vi under processen.

Varför Consul?

Har visat sig vara tillförlitlig. Vi anvÀnde den som backend för Vault mellan 2014 och 2015, dÀr vi lagrar lösenord.

Förlorar inte data.. Under hela tiden vi anvÀnde Consul har den inte förlorat data vid en enda incident. Detta Àr en stor fördel för systemet för brandvÀggshantering.

P2P-kopplingar pÄskyndar spridningen av förÀndringar.. Med P2P kommer alla förÀndringar snabbt, man behöver inte vÀnta i timmar.

BekvÀm REST API. Vi övervÀgde Àven Apache ZooKeeper, men den har ingen REST API, man fÄr anvÀnda knep.

Fungerar bÄde som nyckelförvaring (KV) och som katalog (Service Discovery).. Man kan lagra tjÀnster, kataloger och datacenter pÄ en gÄng. Detta Àr bekvÀmt inte bara för oss utan Àven för angrÀnsande team, eftersom vi tÀnker globalt nÀr vi bygger en stor tjÀnst.

Skriven i Go, vilket ingÄr i Wargaming-teknologin. Vi Àlskar detta sprÄk, vi har mÄnga Go-utvecklare.

Ett kraftfullt ACL-system. Med hjÀlp av ACL i Consul kan vi styra vem som fÄr skriva och vad. Vi garanterar att brandvÀggsreglerna inte kommer att krocka med nÄgot annat och att vi inte kommer att ha problem med detta.

Men Consul har ocksÄ nackdelar.

  • Det skalar inte inom datacenter om du inte har affĂ€rsversionen. Det skalar endast genom federation.
  • Mycket beroende av nĂ€tverkskvalitet och serverbelastning. Consul fungerar inte korrekt som server pĂ„ en överbelastad server om det finns nĂ„gra laggar i nĂ€tverket, till exempel ojĂ€mn hastighet. Det beror pĂ„ P2P-anslutningar och modeller för uppdateringsfördelning.
  • SvĂ„righeter med att övervaka tillgĂ€nglighet. I Consuls status kan det stĂ„ att allt Ă€r bra, men den har redan dött för lĂ€nge sedan.

De flesta av dessa problem löste vi under driften av Consul, och dÀrför valde vi det. Företaget har planer pÄ en alternativ backend, men vi har lÀrt oss att hantera problem och lever för tillfÀllet med Consul.

Hur Consul fungerar

I det hypotetiska datacentret installerar vi servrar - frÄn tre till fem. En eller tvÄ servrar fungerar inte: de kan inte organisera quorum och avgöra vem som har rÀtt nÀr data inte stÀmmer. Fler Àn fem Àr meningslöst, prestandan kommer att minska.

Consul + iptables = :3

Kunder kopplar upp sig till servrarna i valfri ordning: samma agenter, men med flaggan server = false.

Consul + iptables = :3

Efter detta fÄr kunderna en lista med P2P-anslutningar och bygger relationer sinsemellan.

Consul + iptables = :3

PÄ global nivÄ kopplar vi samman flera datacenter. De kopplas ocksÄ samman P2P och kommunicerar.

Consul + iptables = :3

NÀr vi vill hÀmta data frÄn ett annat datacenter gÄr förfrÄgan frÄn server till server. Denna struktur kallas Serf-protokollet. Serf-protokollet, liksom Consul, Àr utvecklat av HashiCorp.

NÄgra viktiga fakta om Consul

Consul har dokumentation som beskriver dess funktion. Jag ger endast utvalda fakta som Àr vÀrda att veta.

Consul-servrar vĂ€ljer en master bland de röstberĂ€ttigade. Consul vĂ€ljer en master frĂ„n listan över servrar för varje datacenter, och alla förfrĂ„gningar gĂ„r endast till denne, oavsett antalet servrar. Om mastern hĂ€nger följs inga omröstningar. Om ingen master Ă€r vald – hanteras inga förfrĂ„gningar.

Ville du ha horisontell skalning? TyvÀrr, nej.

FörfrÄgan till ett annat datacenter gÄr frÄn master till master, oavsett vilken server den kom till. Den valda mastern fÄr 100% av belastningen, förutom lasten för att vidarebefordra förfrÄgningar. En aktuell kopia av data finns pÄ alla servrar i datacentret, men bara en svarar.

Det enda sÀttet att skala Àr att aktivera stale-lÀget pÄ klienten.

I stale-lÀget kan man svara utan kvorum. Detta Àr ett lÀge dÀr vi avstÄr frÄn datakonsistens, men lÀser nÄgot snabbare Àn normalt, och vilken server som helst kan svara. Naturligtvis, skrivning görs endast via master.

Consul kopierar inte data mellan datacenter. Vid federationsuppbyggnad kommer varje server endast att ha sina egna data. För andra hÀnvisar den alltid till nÄgon annan.

Atomaritet av operationer garanteras inte utanför en transaktion. Kom ihÄg att du inte bara kan Àndra nÄgot. Om du vill göra det pÄ ett annat sÀtt, genomför en transaktion med lÄs.

Blockerande operationer garanterar inte lÄsning. FörfrÄgan gÄr frÄn master till master, inte direkt, sÄ det finns inga garantier för att lÄsningen fungerar nÀr du gör lÄsning, till exempel, i ett annat datacenter.

ACL garanterar inte heller Ă„tkomst (i mĂ„nga fall). ACL kan misslyckas, eftersom den lagras i ett datacenter i federation — i ACL datacenter (PrimĂ€rt DC). Om DC inte svarar, kommer ACL inte att fungera.

En hÀngande master kommer att leda till att hela federationen hÀnger. Till exempel, i federationen finns 10 datacenter, och i ett finns ett dÄligt nÀtverk, vilket leder till att en master gÄr ner. Alla som kommunicerar med den kommer att hÀnga i en loop: det kommer en förfrÄgan, men inget svar, trÄden hÀnger. Det gÄr inte att veta nÀr detta kommer att hÀnda, bara efter en timme eller tvÄ kommer hela federationen att gÄ ner. Du kommer inte kunna göra nÄgot Ät det.

Status, kvorum och val hanteras av en separat trĂ„d. Omskolning kommer inte att ske, status visar inget. Du tror att du har en levande Consul, gör en förfrĂ„gan och inget hĂ€nder — inget svar. Samtidigt visar status att allt Ă€r bra.

Vi har stött pÄ det hÀr problemet, vi har behövt omstrukturera specifika delar av datacenter för att undvika det.

I affĂ€rsversionen av Consul Enterprise finns vissa av bristerna ovan inte.. Det finns mĂ„nga anvĂ€ndbara funktioner: röstningsval, fördelning, skalning. Det finns bara en nackdel – licenssystemet för det distribuerade systemet Ă€r mycket dyrt.

Livhack: rm -rf /var/lib/consul – panacea för alla problem med agenten. Om nĂ„got inte fungerar, tar du bara bort dina data och laddar ned data frĂ„n en kopia. Förmodligen kommer Consul att fungera igen.

BEFW

Nu ska vi prata om vad vi har lagt till i Consul.

BEFW – Ă€r en akronym för BackEndFireWall. Vi var tvungna att ge produkten ett namn nĂ€r jag skapade repositoryt för att placera de första testcommits. Det namnet Ă€r kvar.

Regelmallar

Reglerna skrivs i iptables-syntax.

  • -N BEFW
  • -P INPUT DROP
  • -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • -A INPUT -i lo -j ACCEPT
  • -A INPUT -j BEFW

All vÄr trafik gÄr till BEFW-kedjan, förutom ESTABLISHED., RELATED och localhost. Mallen kan vara vad som helst, det hÀr Àr bara ett exempel.

Vad Àr BEFW bra för?

TjÀnster

Vi har en tjÀnst, den har alltid en port, en nod dÀr den körs. FrÄn vÄr nod kan vi lokalt frÄga agenten och ta reda pÄ att vi har en viss tjÀnst. Det gÄr ocksÄ att sÀtta taggar.

Consul + iptables = :3

Varje tjĂ€nst som körs och registreras i Consul blir en iptables-regel. Vi har SSH – vi öppnar port 22. Bash-scriptet Ă€r enkelt: curl och iptables, inget mer som behövs.

Kunder

Hur öppnar man Ätkomst inte för alla, utan selektivt? Genom att lÀgga IP-listor i KV-lagringen baserat pÄ tjÀnstens namn.

Consul + iptables = :3

Till exempel vill vi att alla frÄn det tionde nÀtverket ska kunna komma Ät tjÀnsten SSH_TCP_22. Vi lÀgger till ett litet fÀlt TTL? och nu har vi tidsbegrÀnsade tillstÄnd, till exempel i ett dygn.

Åtkomster

Vi kopplar samman tjÀnster och kunder: vi har en tjÀnst dÀr vi alltid har ett KV-lager redo. Nu ger vi Ätkomst inte till alla, utan selektivt.

Consul + iptables = :3

Grupper

Om vi varje gĂ„ng ska skriva tusentals IP för Ă„tkomster sĂ„ kommer vi bli trötta. Vi hittar pĂ„ grupper – en enskild subset i KV. Vi döper den till Alias (eller grupper) och lagrar grupper dĂ€r pĂ„ samma princip.

Consul + iptables = :3

Kopplar samman: nu kan vi öppna SSH inte specifikt för P2P, utan för en hel grupp eller flera grupper. Precis som med TTL – vi kan temporĂ€rt lĂ€gga till eller ta bort frĂ„n gruppen.

Consul + iptables = :3

Integration

VĂ„r utmaning – den mĂ€nskliga faktorn och automation. SĂ„ hĂ€r har vi löst det fram tills nu.

Consul + iptables = :3

Vi arbetar med Puppet och överför allt relaterat till systemet (applikationskod) dit. I puppetdb (vanlig PostgreSQL) lagras en lista över tjÀnster som körs dÀr, och de kan hittas efter resurstyp. DÀr kan man ocksÄ se vem som kommunicerar med vad. Dessutom har vi ett system för pull requests och merge requests för detta.

Vi har skrivit befw-sync — en enkel lösning som hjĂ€lper till att överföra data. Först kontaktar sync cookies puppetdb. DĂ€r Ă€r en HTTP-API instĂ€lld: vi begĂ€r vilka tjĂ€nster vi har och vad som mĂ„ste göras. Sedan görs en förfrĂ„gan till Consul.

Finns det en integration? Ja: vi har skrivit regler och tillĂ„tit att ta emot Pull Requests. Behöver nĂ„gon port eller lĂ€gga till en vĂ€rd i nĂ„gon grupp? Pull Request, granskning — inga fler »Hitta 200 andra ACL och försök göra nĂ„got med dem«.

Optimering

Ping localhost med en tom regelkedja tar 0,075 ms.

Consul + iptables = :3

Vi lÀgger till 10 000 adresser till iptables. Som ett resultat ökar pingtiden femfaldigt: iptables Àr helt linjÀr, bearbetningen av varje adress tar tid.

Consul + iptables = :3

För brandvÀggen dit vi migrerar tusentals ACL har vi mÄnga regler, och det medför fördröjning. För spelprotokoll Àr detta dÄligt.

Men om vi placerar 10 000 adresser i ipset minskar pingtiden till och med.

Consul + iptables = :3

PoĂ€ngen Ă€r att "O" (algoritmkomplexitet) för ipset alltid Ă€r 1, oavsett hur mĂ„nga regler det finns. Visserligen finns det en begrĂ€nsning — antalet regler fĂ„r inte överstiga 65535. Tills vidare lever vi med det: vi kan kombinera dem, utöka, göra tvĂ„ ipset i en.

Lagring

En logisk fortsÀttning pÄ iterationsprocessen Àr att lagra information om kunder för tjÀnsten i ipset.

Consul + iptables = :3

Nu har vi samma SSH, och vi skriver inte omedelbart 100 IP, utan anger namnet pÄ ipset som vi behöver kommunicera med, och följande regel DROP. Det gÄr att omformulera till en regel "Den som inte Àr hÀr, Àr DROP", men det Àr tydligare sÄ hÀr.

Nu har vi regler och set. Huvuduppgiften Àr att skapa setet innan vi skriver regeln, för annars registrerar inte iptables regeln.

Översiktsdiagram

Som en schematisk bild ser allt jag har berÀttat ut sÄ hÀr.

Consul + iptables = :3

Vi commit:ar till Puppet, allt skickas till vÀrden, tjÀnster hÀr, ipset dÀr, och den som inte Àr registrerad dÀr fÄr inte komma in.

TillÄta & avvisa

För att snabbt rÀdda vÀrlden eller snabbt stÀnga av nÄgon, skapade vi i början av alla kedjor tvÄ ipset: rules_allow och rules_deny. Hur fungerar det?

Till exempel, nÄgon skapar belastning pÄ vÄr webbplats med hjÀlp av bottar. Tidigare var vi tvungna att hitta IP-adressen via loggarna, ge den till nÀtverksingenjörer sÄ att de kunde hitta kÀllan till trafiken och blockera den. Nu ser det annorlunda ut.

Consul + iptables = :3

Vi skickar till Consul, vÀntar 2,5 sekunder, och Àr klara. Eftersom Consul snabbt distribuerar via P2P fungerar det överallt i vÀrlden.

En gĂ„ng lyckades jag helt stoppa WOT genom att göra ett misstag med brandvĂ€ggen. rules_allow — det Ă€r vĂ„r försĂ€kring mot sĂ„dana fall. Om vi gör nĂ„got fel med brandvĂ€ggen, dĂ€r nĂ„got blockeras, kan vi alltid skicka en villkorlig 0.0/0, för att snabbt Ă„terstĂ€lla allt. Sen kan vi fixa allt manuellt.

Andra set

Vi kan lÀgga till vilka andra set som helst i utrymmet $IPSETS$.

Consul + iptables = :3

Varför? Ibland behöver nÄgon ipset, till exempel för att emulera avstÀngningen av en del av klustret. Alla kan ta med sig vilka set som helst, namnge dem och de kommer att hÀmtas frÄn Consul. Dessa set kan ocksÄ delta i iptables-regler, eller fungera som en slags NOOP: konsistensen kommer att upprÀtthÄllas av en demon.

AnvÀndare

Tidigare var det sÄ hÀr: anvÀndaren kopplade upp sig mot nÀtverket och fick parametrarna via domÀnen. Innan nÀsta generations brandvÀggar förstod Cisco inte skillnaden mellan anvÀndaren och IP-adressen. DÀrför gavs Ätkomst endast via maskinens vÀrdnamn.

Vad gjorde vi? Vi insĂ„g oss i ögonblicket av adressmottagningen. Ofta gĂ„r detta via dot1x, Wi-Fi eller VPN — allt gĂ„r genom RADIUS. Vi skapar en grupp för varje anvĂ€ndare med anvĂ€ndarnamnet och placerar IP-adressen i den med en TTL som Ă€r lika med hans dhcp.lease — sĂ„ snart den löper ut, försvinner regeln.

Consul + iptables = :3

Nu kan vi ge Ätkomst till tjÀnster, precis som i andra grupper, baserat pÄ anvÀndarnamn. Vi har blivit av med besvÀret med vÀrdnamn som Àndras, och avlastat nÀtverksingenjörerna, eftersom de inte lÀngre behöver Cisco. Nu skriver ingenjörerna sjÀlva Ätkomster pÄ sina servrar.

Isolering

Parallellt började vi undanröja isoleringen. TjÀnstecheferna gjorde en inventering och vi analyserade alla vÄra nÀtverk. Vi kommer att dela upp dem i liknande grupper, och pÄ de nödvÀndiga servrarna lade vi till grupper i till exempel deny. Nu hamnar samma isolering för staging i rules_deny för produktionen, men inte i sjÀlva produktionen.

Consul + iptables = :3

Schemat fungerar snabbt och enkelt: vi tar bort alla ACL frÄn servrarna, avlastar hÄrdvaran, och minskar antalet isolerade VLAN.

Integritetskontroll

Tidigare hade vi en speciell trigger som meddelade nĂ€r nĂ„gon manuellt Ă€ndrade brandvĂ€gtsreglerna. Jag skrev en stor linter för att kontrollera brandvĂ€gtsregler, det var utmanande. Nu övervakas integriteten av BEFW. Den ser noga till att de regler den skapar inte Ă€ndras. Om nĂ„gon Ă€ndrar brandvĂ€gtsreglerna Ă„terstĂ€ller den allt. "Jag satte snabbt upp en proxy för att arbeta hemifrĂ„n" — sĂ„dana alternativ finns inte lĂ€ngre.

BEFW kontrollerar ipset frÄn tjÀnster och listan i befw.conf, tjÀnsternas regler i BEFW-kedjan. Men den övervakar inte andra kedjor och regler samt andra ipset.

Skydd mot krascher

BEFW sparar alltid det senaste lyckade tillstÄndet direkt i den binÀra strukturen state.bin. Om nÄgot gÄr fel, ÄtergÄr den alltid till detta state.bin.

Consul + iptables = :3

Detta Àr en försÀkring mot instabil drift av Consul, nÀr den inte skickar data eller nÄgon gör ett misstag och anvÀnder regler som inte kan tillÀmpas. För att vi inte ska bli utan brandvÀgg kommer BEFW att ÄtergÄ till det senaste tillstÄndet om det uppstÄr ett fel i nÄgot steg.

I kritiska situationer Àr detta en garanti för att vi förblir med en fungerande brandvÀgg. Vi öppnar alla grÄ nÀtverk i hopp om att administratören kommer och fixar det. En dag ska jag ta med det i konfigarna, men just nu har vi bara tre grÄ nÀtverk: 10/8, 172/12 och 192.168/16. Inom vÄr Consul Àr detta en viktig funktion som hjÀlper oss att utvecklas vidare.

Demo: under presentationen visar Ivan BEFW:s demolÀge. Det Àr lÀttare att följa demon pÄ video. KÀllkoden för demon finns tillgÀnglig pÄ GitHub.

FĂ€llor

Jag kommer att berÀtta om buggarna vi stötte pÄ.

ipset add set 0.0.0.0/0. Vad hÀnder om man lÀgger till 0.0.0.0/0 i ipset? Kommer alla IP-adresser att lÀggas till? Kommer internetÄtkomsten att öppnas?

Nej, vi fĂ„r en bugg som kostade oss tvĂ„ timmars driftstopp. Och buggen har inte fungerat sedan 2016, den ligger i RedHat Bugzilla under nummer #1297092, och vi hittade den av en slump — frĂ„n utvecklarens rapport.

Nu gÀller det strikta regeln i BEFW att 0.0.0.0/0 omvandlas till tvÄ adresser: 0.0.0.0/1 och 128.0.0.0/1.

ipset restore set < file. Vad gör ipset nĂ€r du sĂ€ger till den att Ă„terstĂ€lla? Вы ĐŽŃƒĐŒĐ°Đ”Ń‚Đ”, ĐŸĐœ Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ таĐșжД, ĐșаĐș iptables? Đ’ĐŸŃŃŃ‚Đ°ĐœĐŸĐČот ĐŽĐ°ĐœĐœŃ‹Đ”?

Ingenting sĂ„dant — den gör en sammanslagning, och de gamla adresserna försvinner inte, du stĂ€nger inte Ă„tkomsten.

Vi hittade buggen nĂ€r vi testade isoleringen. Nu finns det ett ganska komplext system — istĂ€llet för Ă„terstĂ€lla genomförs create temp, sedan restore flush temp och restore temp. I slutet swap: för atomaritet, för om man först genomför flush Och i det ögonblicket kommer nĂ„gon paketering att intrĂ€ffa, dĂ„ kommer den att avvisas och nĂ„got kommer att gĂ„ fel. DĂ€rför finns det lite svart magi.

consul kv get -datacenter=other. Som jag redan har nÀmnt, vi tror att vi begÀr vissa data, men vi kommer att fÄ antingen data eller ett fel. Vi kan göra detta via Consul lokalt, men Àven dÄ kommer bÄde detta och det andra att hÀnga sig.

Den lokala Consul-klienten Àr ett wrapper över HTTP API. Men den hÀnger bara och svarar inte pÄ Ctrl+C, Ctrl+Z eller nÄgot annat, bara pÄ , mjukt avsluta processen och stoppa servern ( i den intilliggande konsolen. Vi stötte pÄ detta nÀr vi byggde en stor kluster. Men vi har fortfarande ingen lösning, vi förbereder oss för att ÄtgÀrda detta fel i Consul.

Consul-leder svarar inte. VÄr mÀster har inte svarat i datacentret, vi tÀnker: "Kanske aktiveras omvalsalgoritmen nu?"

Nej, det kommer inte att hÀnda, och övervakningen visar ingenting: Consul kommer att sÀga att det finns ett commitment index, ledaren har hittats, allt Àr bra.

Hur hanterar vi detta? service consul restart i cron varje timme. Om du har 50 servrar - det Àr inte sÄ farligt. NÀr de blir 16 000, kommer du att förstÄ hur det fungerar.

Slutsats

Till slut fick vi följande fördelar:

  • 100% tĂ€ckning av alla Linux-maskiner.
  • Hastighet.
  • Automatisering.
  • Vi befriade hĂ„rdvaran och nĂ€tverksingenjörerna frĂ„n slaveri.
  • Möjligheterna för integration har blivit nĂ€stan obegrĂ€nsade: antingen med Kubernetes, Ansible eller Python.

Nackdelar: Consul, som vi nu mĂ„ste leva med, och en mycket hög kostnad för fel. Som exempel, en gĂ„ng vid 18-tiden (prime time i Ryssland) Ă€ndrade jag nĂ„got i nĂ€tverkslistorna. Vi höll pĂ„ att bygga isolering pĂ„ BEFW. Jag gjorde nĂ„gon form av fel, verkade som jag angav en felaktig mask, men allt kraschade pĂ„ tvĂ„ sekunder. Övervakningen tĂ€nds, supportassistenten kommer springande: "Vi ligger alla ner!". Chefens hĂ„r blev grĂ„tt nĂ€r han förklarade för företaget varför detta hĂ€nde.

Kostnaden för fel Àr sÄ hög att vi har kommit pÄ en egen komplicerad förebyggande ÄtgÀrd. Om du ska implementera detta i en stor produktion, ge inte mÀstertoken över Consul till alla. Det kommer att sluta dÄligt.

Kostnad. Jag skrev kod i 400 timmar pÄ egen hand. För underhÄll lÀgger mitt team pÄ 4 personer 10 timmar i mÄnaden pÄ alla. JÀmfört med kostnaden för nÄgon ny generation brandvÀgg, Àr detta gratis.

Planer. Den lÄngsiktiga planen Àr att söka efter alternativ transport istÀllet för eller som komplement till Consul. Kanske blir det Kafka eller nÄgot liknande. Men under de nÀrmaste Ären kommer vi att leva med Consul.

NÀsta steg: integration med Fail2ban, övervakning, nftables, eventuellt med andra distributioner, metriker, utökad övervakning, optimering. Stöd för Kubernetes Àr ocksÄ pÄ gÄng, eftersom vi för nÀrvarande har flera kluster och intresse.

Andra planer:

  • anomalidetektering i trafiken;
  • hantering av nĂ€tverkskartan;
  • stöd för Kubernetes;
  • paketkompilering för alla system;
  • Webb-UI.

Vi arbetar kontinuerligt med att utöka konfigurationen, öka metrikerna och optimera.

GÄ med i projektet. Projektet har blivit fantastiskt, men tyvÀrr Àr det för nÀrvarande ett enmansprojekt. Kom till GitHub och försök göra nÄgot: kommitta, testa, föreslÄ nÄgot, ge din feedback.

Under tiden förbereder vi oss för Saint HighLoad++, som Àger rum den 6 och 7 april i Sankt Petersburg, och vi bjuder in utvecklare av högbelastade system att ansöka om att hÄlla ett föredrag. Erfaren talare vet redan vad de ska göra, och vi rekommenderar att nybörjare i presentationer Ätminstone prova. Deltagande i konferensen som talare har flera fördelar. Vilka, kan man lÀsa om i slutet av denna artikel.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster