{"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\/it\/blog\/consul-iptables-3","title":{"rendered":"Consul + iptables = :3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nel 2010 l'azienda <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/wargaming\/\">Wargaming<\/a><\/noindex> aveva 50 server e un modello di rete semplice: backend, frontend e firewall. Il numero di server cresceva, il modello si complicava: staging, VLAN isolate con ACL, poi VPN con VRF, VLAN con ACL su L2, VRF con ACL su L3. Ti gira la testa? Andr\u00e0 ancora meglio.<\/p>\n<p>Quando il numero di server \u00e8 arrivato a 16.000, lavorare senza lacrime con una tale quantit\u00e0 di segmenti eterogenei \u00e8 diventato impossibile. Pertanto, hanno trovato un'altra soluzione. Hanno preso il stack Netfilter, aggiunto Consul come fonte di dati, e hanno ottenuto un firewall distribuito e veloce. Hanno sostituito le ACL sui router e lo hanno utilizzato come firewall esterno e interno. Per la gestione dinamica dello strumento, hanno sviluppato il sistema BEFW, applicato ovunque: dalla gestione dell'accesso degli utenti nella rete di produzione all'isolamento dei segmenti di rete l'uno dall'altro.<\/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 \/>\nCome funziona tutto ci\u00f2 e perch\u00e9 dovreste prestare attenzione a questo sistema, sar\u00e0 spiegato da <strong>Ivan Agar'kov<\/strong> (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/annmuor\/\" class=\"user_link\">annmuor<\/a><\/noindex>) \u2014 responsabile del gruppo di sicurezza infrastrutturale del dipartimento Maintenance presso il centro di sviluppo di Minsk dell'azienda. Ivan \u00e8 un fan di SELinux, ama Perl e scrive codice. Come responsabile del gruppo di sicurezza informatica, lavora regolarmente con i log, i backup e R&amp;D per proteggere Wargaming dagli hacker e garantire il funzionamento di tutti i server di gioco dell'azienda.<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=\"Guarda il video\" 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>Nota storica<\/h2>\n<p>\nPrima di spiegare come abbiamo fatto, voglio raccontare come siamo arrivati a questa situazione e perch\u00e9 \u00e8 stato necessario. Torniamo indietro di 9 anni: 2010, \u00e8 appena uscito World of Tanks. Wargaming aveva circa 50 server.<\/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>Grafico della crescita dei server dell'azienda.<\/em><\/p>\n<p>Avevamo un modello di rete. Per quell'epoca era ottimale.<\/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>Modello di rete nel 2010.<\/em><\/p>\n<p>Nel frontend ci sono i cattivi che vogliono romperci, ma c'\u00e8 un firewall. Nel backend non c'\u00e8 firewall, ma ci sono 50 server, li conosciamo tutti. Tutto funziona bene.<\/p>\n<p>In 4 anni, il parco server \u00e8 cresciuto di 100 volte, raggiungendo i 5000. Sono emerse le prime reti isolate: gli staging: non possono andare in produzione, e spesso era in esecuzione ci\u00f2 che poteva essere pericoloso.<\/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>Modello di rete nel 2014.<\/em><\/p>\n<p>Per inerzia abbiamo usato gli stessi hardware e tutto il lavoro si svolgeva su VLAN isolate: sulle VLAN sono scritte le ACL che autorizzano o impediscono una certa connessione.<\/p>\n<p>Nel 2016 il numero dei server ha raggiunto 8000. Wargaming ha acquisito altri studi, sono emerse ulteriori reti partner. Sembrano essere nostri, ma non del tutto: per i partner, VLAN funzionano spesso male, \u00e8 necessario utilizzare VPN con VRF, le isolazioni si complicano. La miscela di isolamenti ACL \u00e8 aumentata.<\/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>Modello di rete nel 2016.<\/em><\/p>\n<p>All'inizio del 2018 il parco macchine \u00e8 cresciuto fino a 16.000. C'erano 6 segmenti e gli altri non li contavamo, compresi quelli chiusi, in cui erano conservati dati finanziari. Sono emerse reti containerizzate (Kubernetes), DevOps, reti cloud collegate tramite VPN, ad esempio, da ISV. C'erano troppe regole \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>Modello di rete e metodi di isolamento nel 2018.<\/em><\/p>\n<p>Per l'isolamento abbiamo utilizzato: VLAN con ACL su L2, VRF con ACL su L3, VPN e molto altro. Troppo.<\/p>\n<h2>Problemi<\/h2>\n<p>\nTutti vivono con ACL e VLAN. Cosa c'\u00e8 che non va? A questa domanda risponder\u00e0 Harold, nascondendo il dolore.<\/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 \/>\nCi sono stati molti problemi, ma quelli di massa sono stati cinque.<\/p>\n<ul>\n<li><strong>Aumento geometrico del prezzo per nuove regole<\/strong>. Ogni nuova regola impiegava pi\u00f9 tempo per essere aggiunta rispetto alla precedente, perch\u00e9 dovevamo prima vedere se esisteva gi\u00e0 una regola simile.<\/li>\n<li><strong>Nessun firewall all'interno dei segmenti<\/strong>. I segmenti sono stati in qualche modo separati tra loro, all'interno non ci sono risorse sufficienti.<\/li>\n<li><strong>Le regole venivano applicate lentamente. <\/strong>A mano, un operatore poteva scrivere una regola locale in un'ora. Una globale richiedeva diversi giorni.<\/li>\n<li><strong>Difficolt\u00e0 con l'audit delle regole<\/strong>. A dire il vero, non era possibile. Le prime regole sono state scritte nel 2010 e gran parte dei loro autori non lavorava pi\u00f9 in azienda.<\/li>\n<li><strong>Basso livello di controllo sull'infrastruttura<\/strong>. Questo \u00e8 il problema principale: non sapevamo cosa stesse succedendo.<\/li>\n<\/ul>\n<p>\nEcco come appariva un ingegnere di rete nel 2018 quando sentiva: \u00abServe ancora un po' di ACL\u00bb.<\/p>\n<p><img decoding=\"async\" alt=\"Consul + iptables = :3\" src=\"\/wp-content\/uploads\/2020\/02\/8366d3092558ebb15a4ba6d8e5702032.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Soluzioni<\/h2>\n<p>\nAll'inizio del 2018 \u00e8 stato deciso di fare qualcosa al riguardo.<\/p>\n<p><strong>Il costo delle integrazioni cresce continuamente. <\/strong>Il punto di partenza \u00e8 stato che i grandi data center hanno smesso di supportare VLAN e ACL isolati perch\u00e9 la memoria sui dispositivi era esaurita.<\/p>\n<p>Soluzione: eliminato il fattore umano e massimizzato l'automazione della concessione degli accessi.<\/p>\n<p><strong>Le nuove regole vengono applicate lentamente. <\/strong>Soluzione: accelerare l'applicazione delle regole, renderla distribuita e parallela. \u00c8 necessaria una rete distribuita affinch\u00e9 le regole vengano applicate automaticamente, senza rsync o SFTP su mille sistemi.<\/p>\n<p><strong>Assenza di firewall all'interno dei segmenti. <\/strong>Il firewall all'interno dei segmenti ha iniziato a influenzarci quando diversi servizi sono emersi all'interno della rete. Soluzione: utilizzare un firewall a livello host \u2014 firewalls basati su host. Praticamente ovunque abbiamo Linux e ovunque ci sono iptables, quindi non \u00e8 un problema.<\/p>\n<p><strong>Difficolt\u00e0 con l'audit delle regole.<\/strong> Soluzione: conservare tutte le regole in un'unica posizione per una visione e una gestione migliori, cos\u00ec potremo auditarle tutte.<\/p>\n<p><strong>Basso livello di controllo sull'infrastruttura. <\/strong>Soluzione: effettuare un'inventario di tutti i servizi e degli accessi tra di essi.<\/p>\n<p>Questo \u00e8 pi\u00f9 un processo amministrativo che tecnico. A volte abbiamo 200-300 nuove release a settimana, specialmente durante le promozioni e le festivit\u00e0. Questo \u00e8 solo per un team dei nostri DevOps. Con un numero cos\u00ec elevato di release \u00e8 impossibile definire quali porte, IP e integrazioni siano necessari. Pertanto, abbiamo avuto bisogno di manager di servizio specificamente formati, che interrogassero i team: 'Cosa esiste realmente e perch\u00e9 lo avete lanciato?'<\/p>\n<p>Dopo tutto ci\u00f2 che abbiamo avviato, nel 2019 l'ingegnere di rete era gi\u00e0 cos\u00ec.<\/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>\nAbbiamo deciso di inserire tutto ci\u00f2 che abbiamo trovato tramite i manager di servizio in Consul e da l\u00ec scriveremo le regole di iptables.<\/p>\n<p>Come abbiamo deciso di procedere?<\/p>\n<ul>\n<li>Raccoglieremo tutti i servizi, le reti e gli utenti.<\/li>\n<li>Creeremo regole iptables basate su di essi.<\/li>\n<li>Automatizzeremo il controllo.<\/li>\n<li>\u2026.<\/li>\n<li>PROFIT.<\/li>\n<\/ul>\n<p>\nConsul non \u00e8 un'API remota, pu\u00f2 funzionare su ogni nodo e scrivere in iptables. Rimane solo da inventare strumenti di controllo automatico che puliranno il superfluo, e la maggior parte dei problemi sar\u00e0 risolta! Il resto verr\u00e0 completato durante il processo.<\/p>\n<h3>Perch\u00e9 Consul?<\/h3>\n<p>\n<strong>Si \u00e8 dimostrato efficace. <\/strong>Nel 2014-15 lo abbiamo utilizzato come backend per Vault, dove conserviamo le password.<\/p>\n<p><strong>Non perde dati.<\/strong>Durante l'uso, Consul non ha mai perso dati in nessun incidente. Questo \u00e8 un grande vantaggio per il sistema di gestione del firewall.<\/p>\n<p><strong>Le connessioni P2P accelerano la diffusione delle modifiche.<\/strong>Con P2P tutte le modifiche arrivano rapidamente, non bisogna aspettare per ore.<\/p>\n<p><strong>API REST conveniente.<\/strong> Abbiamo considerato anche Apache ZooKeeper, ma non ha un'API REST, quindi dovremo trovare soluzioni alternative.<\/p>\n<p><strong>Funciona sia come un deposito di chiavi (KV) che come un catalogo (Service Discovery).<\/strong>\u00c8 possibile conservare servizi, cataloghi e data center simultaneamente. Questo \u00e8 utile non solo per noi, ma anche per i team vicini, poich\u00e9 costruendo un servizio globale, pensiamo in grande.<\/p>\n<p><strong>Scritto in Go, che fa parte dello stack di Wargaming. <\/strong>Amiamo questa lingua, abbiamo molti sviluppatori Go.<\/p>\n<p><strong>Un potente sistema ACL. <\/strong>In Consul, grazie all'ACL, puoi gestire chi pu\u00f2 scrivere e cosa. Garantiamo che le regole del firewall non entreranno in conflitto e non avremo problemi con questo.<\/p>\n<p>Ma Consul ha anche delle limitazioni.<\/p>\n<ul>\n<li><strong>Non si scala all'interno del data center, a meno che tu non abbia la versione business. <\/strong>Si scala solo attraverso la federazione.<\/li>\n<li><strong>\u00c8 molto dipendente dalla qualit\u00e0 della rete e dal carico dei server. <\/strong>Consul non funzioner\u00e0 correttamente come server su un server sovraccarico, se ci sono dei lag in rete, per esempio, velocit\u00e0 irregolare. Questo \u00e8 legato alle connessioni P2P e ai modelli di distribuzione degli aggiornamenti.<\/li>\n<li><strong>Difficolt\u00e0 nel monitorare la disponibilit\u00e0<\/strong>. Nel rapporto di stato, Consul pu\u00f2 dire che va tutto bene, mentre in realt\u00e0 \u00e8 gi\u00e0 morto da tempo.<\/li>\n<\/ul>\n<p>\nLa maggior parte di questi problemi sono stati risolti durante l'uso di Consul, per questo motivo siamo stati costretti a sceglierlo. Ci sono piani per un backend alternativo, ma abbiamo imparato a gestire i problemi e per ora conviviamo con Consul.<\/p>\n<h3>Come funziona Consul<\/h3>\n<p>\nNel nostro data center ipotetico installeremo server \u2014 da tre a cinque. Uno o due server non andranno bene: non riusciranno a organizzare un quorum e decidere chi ha ragione e chi ha torto quando i dati non corrispondono. Pi\u00f9 di cinque non ha senso, la performance caler\u00e0.<\/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 \/>\nI client si connettono ai server in qualsiasi ordine: gli stessi agenti, ma con il 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 \/>\nDopo di che, i client ricevono un elenco di connessioni P2P e stabiliscono connessioni tra di loro.<\/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 \/>\nA livello globale, colleghiamo pi\u00f9 data center. Anche loro si connettono in P2P e comunicano.<\/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 vogliamo prelevare dati da un altro data center, la richiesta passa da server a server. Questo schema si chiama <strong>protocollo Serf<\/strong>. Il protocollo Serf, come Consul, \u00e8 una creazione di HashiCorp.<\/p>\n<h3>Alcuni fatti importanti su Consul<\/h3>\n<p>\nConsul ha una documentazione che ne descrive il funzionamento. Riporter\u00f2 solo alcuni fatti selettivi che \u00e8 opportuno conoscere.<\/p>\n<p><strong>I server Consul scelgono un master tra i votanti<\/strong>. Consul sceglie un master dalla lista di server per ogni data center, e tutte le richieste vanno solo a lui, indipendentemente dal numero di server. Il blocco del master non porta a nuove elezioni. Se non viene scelto un master, le richieste non vengono servite.<\/p>\n<blockquote><p>Volevi scalabilit\u00e0 orizzontale? Ci dispiace, no.<\/p><\/blockquote>\n<p> La richiesta in un altro data center va da master a master, indipendentemente dal server su cui \u00e8 arrivata. Il master selezionato riceve il 100% del carico, eccetto il carico sulla richiesta di inoltro. Ogni server del data center ha una copia attuale dei dati, ma solo uno risponde.<\/p>\n<blockquote><p>L'unico modo per scalare \u00e8 attivare la modalit\u00e0 stale sul client.<\/p><\/blockquote>\n<p>In modalit\u00e0 stale si pu\u00f2 rispondere senza quorum. Questo \u00e8 un modo in cui rinunciamo alla coerenza dei dati, ma leggiamo un po' pi\u00f9 velocemente del normale e risponde qualsiasi server. Naturalmente, le scritture sono solo attraverso il master.<\/p>\n<p><strong>Consul non copia i dati tra i data center.<\/strong>Durante la federazione ogni server avr\u00e0 solo i propri dati. Per gli altri si rivolger\u00e0 sempre a qualcun altro.<\/p>\n<p><strong>L'atomicit\u00e0 delle operazioni non \u00e8 garantita al di fuori della transazione.<\/strong>Ricorda che a modificare qualcosa non sei solo tu. Se vuoi farlo in modo diverso, esegui una transazione con blocco.<\/p>\n<p><strong>Le operazioni bloccanti non garantiscono il blocco.<\/strong>La richiesta va da master a master e non direttamente, quindi non ci sono garanzie che il blocco funzioni quando lo instauri, ad esempio in un altro data center.<\/p>\n<p><strong>Anche l'ACL non garantisce l'accesso (in molti casi).<\/strong>L'ACL potrebbe non funzionare perch\u00e9 \u00e8 memorizzato in un solo data center della federazione \u2014 nel data center ACL (Primary DC). Se il DC non risponde, l'ACL non funzioner\u00e0.<\/p>\n<p><strong>Un master bloccato porter\u00e0 al blocco dell'intera federazione.<\/strong>Ad esempio, in una federazione di 10 data center, se uno ha una connessione scadente e un master si blocca, tutti coloro che comunicano con esso si bloccheranno in un ciclo: c'\u00e8 una richiesta, non c'\u00e8 risposta, il thread si blocca. Non sar\u00e0 possibile sapere quando accadr\u00e0; semplicemente dopo un'ora o due tutta la federazione si bloccher\u00e0. Non potrai farci nulla.<\/p>\n<p>Lo stato, il quorum e le elezioni vengono gestiti da un thread separato. Non ci saranno rieleggibilit\u00e0, lo stato non mostrer\u00e0 nulla. Pensate di avere un Consul attivo, lo interrogate e non succede nulla: non c'\u00e8 risposta. Eppure lo stato mostra che tutto va bene.<\/p>\n<p>Ci siamo imbattuti in questo problema, ci \u00e8 toccato ricostruire parti specifiche dei data center per evitarlo.<\/p>\n<p><strong>Nella versione aziendale di Consul Enterprise non ci sono alcuni difetti sopra citati.<\/strong>. Ci sono molte funzionalit\u00e0 utili: selezione dei votanti, distribuzione, scalabilit\u00e0. C'\u00e8 solo un \u00abma\u00bb: il sistema di licensing per il sistema distribuito \u00e8 molto costoso.<\/p>\n<p>Trick: <code>rm -rf \/var\/lib\/consul<\/code> \u2014 la medicina per tutti i mali dell'agente. Se qualcosa non funziona, basta eliminare i propri dati e caricare i dati da una copia. Probabilmente Consul riprender\u00e0 a funzionare.<\/p>\n<h2>BEFW<\/h2>\n<p>\nOra parliamo di ci\u00f2 che abbiamo aggiunto a Consul.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">BEFW<\/a><\/noindex> \u2014 \u00e8 un acronimo di <strong>B<\/strong>ack<strong>E<\/strong>nd<strong>F<\/strong>ire<strong>W<\/strong>all. Dovevo trovare un nome per il prodotto quando ho creato il repository, per inserirvi i primi commit di test. Questo nome \u00e8 rimasto.<\/p>\n<h3>Template delle regole<\/h3>\n<p>\nLe regole sono scritte nella sintassi di 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>\nTutto passa attraverso la catena BEFW, tranne <code>ESTABLISHED<\/code>, <code>RELATED<\/code> e localhost. Il template pu\u00f2 essere qualsiasi, \u00e8 solo un esempio.<\/p>\n<p>Qual \u00e8 l'utilit\u00e0 di BEFW?<\/p>\n<h3>Servizi<\/h3>\n<p>\nAbbiamo un servizio, ha sempre una porta, un nodo su cui funziona. Dallo stesso nodo possiamo localmente chiedere all'agente e scoprire che abbiamo un certo servizio. Possono anche essere assegnati tag.<\/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 \/>\nQualsiasi servizio avviato e registrato in Consul si trasforma in una regola di iptables. Abbiamo SSH \u2014 apriamo la porta 22. Lo script Bash \u00e8 semplice: curl e iptables, non serve altro.<\/p>\n<h3>Clienti<\/h3>\n<p>\nCome permettere l'accesso non a tutti, ma selettivamente? Aggiungere elenchi di IP nel KV-storage per nome del servizio.<\/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 \/>\nAd esempio, vogliamo che tutti dalla decima rete possano accedere al servizio SSH_TCP_22. Aggiungiamo un piccolo campo TTL? e ora abbiamo permessi temporanei, ad esempio per un giorno.<\/p>\n<h3>Accessi<\/h3>\n<p>\nColleghiamo servizi e clienti: abbiamo un servizio, per ogni servizio \u00e8 pronta una KV-storage. Ora diamo accesso non a tutti, ma selettivamente.<\/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>Gruppi<\/h3>\n<p>\nSe ogni volta dobbiamo scrivere migliaia di IP per gli accessi, ci stancheremo. Creiamo delle raggruppamenti: un sottoinsieme separato nel KV. Lo chiameremo Alias (o gruppi) e vi conserveremo i gruppi secondo lo stesso principio.<\/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 \/>\nColleghiamo: ora possiamo aprire SSH non specificamente su P2P, ma su un intero gruppo o pi\u00f9 gruppi. Anche in questo caso c'\u00e8 TTL \u2014 si possono aggiungere e rimuovere dai gruppi temporaneamente.<\/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>Integrazione<\/h3>\n<p>\nIl nostro problema &mdash;&nbsp;il fattore umano e l'automazione. Per ora lo abbiamo risolto cos\u00ec.<\/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 \/>\nLavoriamo con Puppet e trasferiamo a lui tutto ci\u00f2 che riguarda il sistema (codice delle applicazioni). In puppetdb (un comune PostgreSQL) \u00e8 memorizzato un elenco dei servizi in esecuzione, che possono essere trovati in base al tipo di risorsa. L\u00ec possiamo anche vedere chi richiede cosa. Abbiamo anche un sistema di pull request e merge request per questo.<\/p>\n<p>Abbiamo scritto befw-sync \u2014 una soluzione semplice che aiuta a trasferire dati. Innanzitutto, gli sync cookies fanno riferimento a puppetdb. L\u00ec \u00e8 configurato un HTTP API: chiediamo quali servizi abbiamo e cosa deve essere fatto. Poi viene effettuata una richiesta a Consul.<\/p>\n<p>C'\u00e8 integrazione? S\u00ec: abbiamo scritto delle regole, consentito di accettare Pull Request. Serve una porta o aggiungere un host a un gruppo? Pull Request, revisione \u2014 nulla di pi\u00f9 'Trova 200 altri ACL e prova a fare qualcosa con essi'.<\/p>\n<h3>Ottimizzazione<\/h3>\n<p>\nIl ping a localhost con una catena di regole vuota impiega 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 \/>\nAggiungiamo a questa catena 10.000 indirizzi iptables. Di conseguenza, il ping aumenta di 5 volte: iptables \u00e8 completamente lineare, il trattamento di ogni indirizzo richiede un certo 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 \/>\nPer il firewall in cui migreremo migliaia di ACL, abbiamo molte regole, e questo introduce ritardi. Questo \u00e8 negativo per i protocolli di gioco.<\/p>\n<p>Ma se inseriamo <strong>10.000 indirizzi in ipset<\/strong> il ping diminuir\u00e0 persino.<\/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 \/>\nIl punto \u00e8 che \"O\" (complessit\u00e0 dell'algoritmo) per ipset \u00e8 sempre uguale a 1, indipendentemente da quante regole ci siano. In realt\u00e0, c'\u00e8 un limite: non pu\u00f2 esserci pi\u00f9 di 65535 regole. Fino ad ora ci conviviamo: possiamo combinarle, espandere, fare due ipset in uno.<\/p>\n<h3>Archiviazione<\/h3>\n<p>\nUn'estensione logica del processo di iterazione \u00e8 la memorizzazione delle informazioni sui clienti per il servizio in 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 \/>\nOra abbiamo lo stesso SSH e non scriviamo immediatamente 100 IP, ma definiamo il nome dell'ipset con cui dobbiamo interagire e la seguente regola <code>DROP<\/code>. Possiamo riformulare in un'unica regola 'Chi non \u00e8 qui, viene bloccato', ma cos\u00ec \u00e8 pi\u00f9 chiaro.<\/p>\n<p>Ora abbiamo regole e set. L'obiettivo principale \u00e8 creare il set prima di scrivere la regola, perch\u00e9 altrimenti iptables non registrer\u00e0 la regola.<\/p>\n<h3>Schema generale<\/h3>\n<p>\nIn forma schematica, tutto ci\u00f2 che ho raccontato sembra cos\u00ec.<\/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 \/>\nEffettuiamo il commit in Puppet, tutto viene inviato all'host, i servizi qui, ipset l\u00ec, e chi non \u00e8 registrato l\u00ec non \u00e8 autorizzato ad accedere.<\/p>\n<h3>Allow &amp; deny<\/h3>\n<p>\nPer salvare rapidamente il mondo o disconnettere qualcuno repentinamente, all'inizio di tutte le catene abbiamo creato due ipset: <code>rules_allow<\/code> e <code>rules_deny<\/code>. Come funziona?<\/p>\n<p>Ad esempio, qualcuno crea un carico sul nostro Web con bot. In passato era necessario trovare il suo IP nei log, portarlo agli ingegneri di rete affinch\u00e8 trovassero la sorgente del traffico e la bloccassero. Ora \u00e8 diverso.<\/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 \/>\nInvio a Consul, aspetto 2,5 secondi, ed \u00e8 fatto. Poich\u00e9 Consul distribuisce rapidamente grazie al P2P, funziona ovunque, in qualsiasi parte del mondo.<\/p>\n<p>Una volta ho completamente bloccato WOT, commettendo un errore con il firewall. <code>rules_allow<\/code> \u2014 questa \u00e8 la nostra assicurazione contro tali casi. Se abbiamo commesso un errore con il firewall e qualcosa viene bloccato, possiamo sempre inviare un <code>0.0\/0<\/code>, per ripristinare tutto velocemente. Poi sistemeremo tutto manualmente.<\/p>\n<h3>Altri set<\/h3>\n<p>\n\u00c8 possibile aggiungere altri set nello spazio <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 \/>\nPerch\u00e9? A volte qualcuno ha bisogno di ipset, ad esempio per emulare la disattivazione di una parte del cluster. Ognuno pu\u00f2 portare qualsiasi set, chiamarlo e saranno recuperati da Consul. Inoltre, i set possono partecipare alle regole iptables o funzionare come un comando <code>NOOP<\/code>: la coerenza sar\u00e0 mantenuta dal demone.<\/p>\n<h3>Utenti<\/h3>\n<p>\nUna volta era cos\u00ec: l'utente si collegava alla rete e riceveva parametri tramite un dominio. Fino all'arrivo dei firewall di nuova generazione, Cisco non sapeva dove si trovasse l'utente e dove fosse l'IP. Pertanto, l'accesso veniva fornito solo tramite il nome host della macchina.<\/p>\n<p>Cosa abbiamo fatto noi? Ci siamo inseriti nel momento in cui si riceve l'indirizzo. Di solito si tratta di dot1x, Wi-Fi o VPN, tutto passa attraverso RADIUS. Creiamo un gruppo per ogni utente con il nome utente e ci mettiamo l'IP con TTL, che \u00e8 uguale al suo dhcp.lease: non appena scade, la regola scompare.<\/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 \/>\nOra possiamo aprire l'accesso ai servizi, come negli altri gruppi, in base al nome utente. Ci siamo liberati del problema del nome host, quando questi cambiano, e abbiamo alleggerito il carico sugli ingegneri di rete, poich\u00e9 non hanno pi\u00f9 bisogno di Cisco. Ora gli ingegneri stesso configurano gli accessi sui loro server.<\/p>\n<h3>Isolamento<\/h3>\n<p>\nParallelamente, abbiamo iniziato a esaminare l'isolamento. I manager dei servizi hanno effettuato un inventario e noi abbiamo analizzato tutte le nostre reti. Le organizziamo in gruppi simili e sui server necessari abbiamo aggiunto i gruppi, ad esempio, in deny. Ora la stessa isolamento del staging finisce nelle rules_deny della produzione, ma non nella produzione stessa.<\/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 \/>\nLo schema funziona in modo veloce e semplice: rimuoviamo tutte le ACL dai server, alleviamo il carico dell'hardware e riduciamo il numero di VLAN isolate.<\/p>\n<h3>Controllo dell'integrit\u00e0<\/h3>\n<p>\nIn passato avevamo un trigger speciale che avvisava quando qualcuno cambiava manualmente una regola del firewall. Ho scritto un enorme linter per il controllo delle regole del firewall, \u00e8 stato complicato. Ora l'integrit\u00e0 \u00e8 controllata da BEFW. Esso segue attentamente affinch\u00e9 le regole che crea non vengano modificate. Se qualcuno cambia le regole del firewall, ritorna tutto indietro. \"Ho rapidamente avviato un proxy per lavorare da casa\" \u2014 non ci sono pi\u00f9 queste opzioni.<\/p>\n<p>BEFW controlla ipset dei servizi e dell'elenco in befw.conf, le regole dei servizi nella catena BEFW. Ma non controlla altre catene e regole e altri ipset.<\/p>\n<h3>Protezione da guasti<\/h3>\n<p>\nBEFW salva sempre l'ultimo stato positivo direttamente nella struttura binaria state.bin. Se qualcosa va storto, torna sempre a questo 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 \/>\nQuesta \u00e8 un'assicurazione contro il funzionamento instabile di Consul, quando non invia dati o qualcuno ha commesso un errore utilizzando regole che non sono applicabili. Cos\u00ec, per non rimanere senza firewall, BEFW torner\u00e0 all'ultimo stato se si verifica un errore in qualche fase.<\/p>\n<p>In situazioni critiche, questa \u00e8 una garanzia che rimarremo con un firewall funzionante. Apriamo tutte le reti grigie nella speranza che l'amministratore venga e ripari. Prima o poi porter\u00f2 queste informazioni nei config, ma ora abbiamo semplicemente tre reti grigie: 10\/8, 172\/12 e 192.168\/16. Nell'ambito del nostro Consul, questa \u00e8 una caratteristica importante che aiuta a progredire ulteriormente.<\/p>\n<p><em>Demo: durante la relazione Ivan dimostra la modalit\u00e0 demo di funzionamento di BEFW. \u00c8 pi\u00f9 comodo guardare la dimostrazione su <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/4zP67uYnsR4?t=1663\">video<\/a><\/noindex>. Il codice sorgente della demo \u00e8 disponibile <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\/tree\/master\/demo\">su GitHub<\/a><\/noindex>.<\/em><\/p>\n<h2>Inconvenienti<\/h2>\n<p>\nParler\u00f2 dei bug con cui abbiamo avuto a che fare.<\/p>\n<p><strong>ipset add set 0.0.0.0\/0. <\/strong>Cosa succede se si aggiunge a ipset 0.0.0.0\/0? Aggiunge tutti gli IP? Si apre l'accesso a Internet? <\/p>\n<p>No, otteniamo un bug che ci \u00e8 costato due ore di inattivit\u00e0. Inoltre, il bug non funziona dal 2016, \u00e8 registrato in RedHat Bugzilla con il numero #1297092, e lo abbiamo trovato per caso \u2014 dal rapporto dello sviluppatore.<\/p>\n<p>Ora in BEFW c'\u00e8 una regola rigida, che <code>0.0.0.0\/0<\/code> si trasforma in due indirizzi: <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>Cosa fa ipset quando gli dici <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>Niente affatto \u2014 fa un merge, e i vecchi indirizzi non scompaiono, non chiudi l'accesso.<\/p>\n<p>Abbiamo trovato il bug quando testavamo l'isolamento. Ora l\u00ec c'\u00e8 un sistema piuttosto complesso \u2014 invece di <code>restore<\/code> si svolge <code>create temp<\/code>, poi <code>restore flush temp<\/code> e <code>restore temp<\/code>. Alla fine swap: per atomicit\u00e0, perch\u00e9 se si fa prima <code>flush<\/code> e in quel momento arriver\u00e0 qualche pacchetto, esso sar\u00e0 scartato e qualcosa andr\u00e0 storto. Quindi c'\u00e8 un po' di magia nera.<\/p>\n<p><strong>consul kv get -datacenter=other. <\/strong>Come ho gi\u00e0 detto, pensiamo di richiedere alcuni dati, ma riceveremo o i dati o un errore. Possiamo farlo tramite Consul localmente, ma in questo caso si bloccher\u00e0 sia quello che l'altro.<\/p>\n<p>Il client Consul locale \u00e8 un involucro sopra l'API HTTP. Ma si blocca semplicemente e non risponde n\u00e9 a Ctrl+C, n\u00e9 a Ctrl+Z, n\u00e9 a nulla, solo a <code>kill -9<\/code> nella console vicina. Abbiamo riscontrato questo quando stavamo costruendo un grande cluster. Ma per ora non abbiamo soluzioni, ci stiamo preparando a correggere questo errore in Consul.<\/p>\n<p><strong>Il leader di Consul non risponde. <\/strong>Il nostro master nel data center non risponde, pensiamo: \u00abProbabilmente sta per attivarsi l'algoritmo di ripristino?\u00bb <\/p>\n<p>No, non succeder\u00e0 e il monitoraggio non mostrer\u00e0 nulla: Consul dir\u00e0 che c'\u00e8 un commitment index, che il leader \u00e8 stato trovato, tutto bene.<\/p>\n<p>Come facciamo a combattere questo? <code>service consul restart<\/code> in cron ogni ora. Se hai 50 server, non \u00e8 grave. Quando ne avrai 16.000, capirai come funziona.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nAlla fine abbiamo ottenuto i seguenti vantaggi:<\/p>\n<ul>\n<li>copertura del 100% di tutte le macchine Linux.<\/li>\n<li>Velocit\u00e0.<\/li>\n<li>Automazione.<\/li>\n<li>Abbiamo liberato l'hardware e gli ingegneri di rete dalla schiavit\u00f9.<\/li>\n<li>Sono emerse possibilit\u00e0 di integrazione che sono praticamente illimitate: con Kubernetes, con Ansible, con Python.<\/li>\n<\/ul>\n<p>\n<strong>Contro<\/strong>: Consul, con cui ora dobbiamo convivere, e il prezzo dell'errore \u00e8 molto alto. Come esempio, una volta ho modificato alcuni elenchi di reti alle 6 di sera (ora di punta in Russia). Proprio in quel momento stavamo costruendo l'isolamento su BEFW. Ho fatto qualche errore, credo di aver specificato la maschera errata, ma tutto \u00e8 crollato in due secondi. Si accende il monitoraggio, il tecnico del supporto corre: \u00abTutto \u00e8 gi\u00f9!\u00bb Il capo dipartimento \u00e8 diventato grigio mentre spiegava al business perch\u00e9 era successo.<\/p>\n<p>Il prezzo dell'errore \u00e8 cos\u00ec alto che abbiamo ideato una complessa procedura preventiva. Se stai implementando questa cosa in una grande produzione, non dare il master-token su Consul a chiunque. Finir\u00e0 male.<\/p>\n<p><strong>Costo. <\/strong>Ho scritto codice per 400 ore da solo. La mia squadra di 4 persone spende 10 ore al mese per il supporto a tutti. Rispetto al costo di qualsiasi firewall di nuova generazione, \u00e8 gratis.<\/p>\n<p><strong>Piani. <\/strong>Il piano a lungo termine \u00e8 cercare un trasporto alternativo in sostituzione o in aggiunta a Consul. Potrebbe essere Kafka o qualcosa di simile. Ma nei prossimi anni vivremo con Consul.<\/p>\n<p>Piani pi\u00f9 prossimi: integrazione con Fail2ban, monitoraggio, nftables, forse con altri sistemi operativi, metriche, monitoraggio avanzato, ottimizzazione. Il supporto per Kubernetes \u00e8 anche in programma, poich\u00e9 attualmente abbiamo diversi cluster e la volont\u00e0.<\/p>\n<p>Altri piani:<\/p>\n<ul>\n<li>ricerca di anomalie nel traffico;<\/li>\n<li>gestione della mappa di rete;<\/li>\n<li>supporto per Kubernetes;<\/li>\n<li>compilazione di pacchetti per tutti i sistemi;<\/li>\n<li>Web-UI.<\/li>\n<\/ul>\n<p>\nLavoriamo costantemente per espandere la configurazione, aumentare le metriche e ottimizzare.<\/p>\n<p><i>Unisciti al progetto. Il progetto \u00e8 fantastico, ma, sfortunatamente, \u00e8 ancora un progetto di una sola persona. Vieni su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wgnet\/befw\">GitHub <\/a><\/noindex>e prova a fare qualcosa: commit, testare, fare una proposta, dare il tuo feedback.<\/i><\/p>\n<blockquote><p>Nel frattempo, ci stiamo preparando per <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\">Saint HighLoad++<\/a><\/noindex>, che si terr\u00e0 il 6 e 7 aprile a San Pietroburgo, e invitiamo gli sviluppatori di sistemi ad alta intensit\u00e0 di carico <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose?conference=hl2020-spb\">a presentare una proposta per una relazione<\/a><\/noindex>. I relatori esperti sanno gi\u00e0 cosa fare, ma ai principianti nei loro interventi raccomandiamo almeno di <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/spb\/2020\/speakers\">provare<\/a><\/noindex>. Partecipare alla conferenza come relatore ha diversi vantaggi. Di quali vantaggi, puoi leggere, per esempio, alla fine <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/486142\/\">di questo articolo,<\/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.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\/it\/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=\"it_IT\" \/>\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\/it\/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":"Nel 2010, l'azienda Wargaming aveva 50 server e un modello di rete semplice: backend, frontend e firewall.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/consul-iptables-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/41051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=41051"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/41051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/41052"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=41051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=41051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=41051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}