
Plugin-i rrjetor Calico ofron një gamë të gjerë politikash rrjetore me një sintaksë të unifikuar për mbrojtjen e hosteve në hardware, makinave virtuale dhe pod-ëve. Këto politika mund të aplikohen brenda një namespace ose të jenë politika globale rrjetore të aplikueshme në (për mbrojtjen e aplikacioneve që funksionojnë menjëherë në host — hosti mund të jetë një server ose një makinë virtuale) ose në (për mbrojtjen e aplikacioneve që funksionojnë në kontejnerë ose makina virtuale të vendosura në host). Politikat Calico lejojnë aplikimin e masave të sigurisë për pika të ndryshme të kalimit të pakove duke përdorur parametra të tillë si preDNAT, unraracked dhe applyOnForward. Kuptimi i mënyrës se si funksionojnë këto opsione mund të ndihmojë në rritjen e sigurisë dhe performancës së sistemit në tërësi. Në këtë artikull shpjegohet thelbi i këtyre parametra të politikave Calico (preDNAT, unraracked dhe applyOnForward) të aplikuara në endpointet e hostit, me fokus në atë që ndodh në rrugët e përpunimit të pakove (zinxhirët e iptables).
Kyçja e këtij artikulli është që ju të keni një kuptim të parimeve themelore të politikave rrjetore të Kubernetes dhe Calico. Nëse nuk e keni, rekomandojmë të provoni dhe duke përdorur Calico, përpara se të lexoni këtë artikull. Po ashtu, ne supozojmë se keni një kuptim themelor të punës në Linux.
Calico ju lejon të aplikoni një set rregullash për aksesin sipas etiketave (në grupe hostesh dhe workloads/pods). Kjo është shumë e dobishme, nëse përdorni sisteme të ndryshme së bashku — makina virtuale, sistem në hardware ose infrastrukturë Kubernetes. Për më tepër, mund të mbrojtni klasterin tuaj (nodat) me një set politikash deklarative dhe të aplikoni politika rrjetore për trafik të ardhshëm (për shembull, përmes shërbimeve NodePorts ose IP-ve të jashtme).
Në nivelin bazë, kur Calico lidh një pod me rrjetin (shih diagramin më poshtë), ai e lidh atë me host-in përmes një interfeci virtual Ethernet (veth). Trafiku i dërguar nga pod-i arrin në host nga ky interfec virtual dhe trajtohet ashtu siç do të vinte nga një interfec fizik i rrjetit. Prej default-i, Calico i quan këto interface caliXXX. Pasi që trafiku hyn përmes interfecit virtual, ai kalon përmes iptables, ashtu siç do të ishte nëse pod-i ndodhej në një distancë prej një hop-i. Prandaj, kur trafiku arrin/konvertohet nga pod-i, ai transferohet (forwarded) nga pikëpamja e host-it.
Në nodën Kubernetes, në të cilën është aktivizuar Calico, mund të lidhni interfecin virtual (veth) me workload në këtë mënyrë. Në shembullin më poshtë mund të shihni se veth#10 (calic1cbf1ca0f8) është i lidhur me cnx-manager-* në namespace kalico-monitoring.
[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: mtu 1440 qdisc noqueue state UP group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::ecee:eeff:feee:eeee/64 scope link
valid_lft forever preferred_lft forever
...
[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
... 
Duke që Calico krijon një ndërfaqe veth për çdo workload, si i aplikon politikat? Për këtë, Calico krijon hook në zinxhirë të ndryshëm të rrugëve të përpunimit të paketave, duke përdorur iptables.
Në diagramin më poshtë janë paraqitur zinxhirët që marrin pjesë në përpunimin e paketave në iptables (ose në nënsistemin netfilter). Kur një paketë mbërrin përmes ndërfaqes rrjetërore, ajo fillimisht kalon përmes zinxhirit PREROUTING. Pastaj merret një vendim për rrugëzim, dhe mbi këtë bazë paketa kalon ose përmes INPUT (e cila është e orientuar për proceset e hostit), ose përmes FORWARD (e orientuar për pod ose një nodë tjetër në rrjet). Nga një proces lokal, paketa kalon përmes zinxhirit OUTPUT dhe më pas POSTROUTING përpara se të dërgohet përmes kabllit.
Vini re se pod gjithashtu është një objekt i jashtëm (i lidhur me veth) në aspektin e përpunimit të iptables. Le të përmbledhim:
- Trafiku i dërguar (forwarded) (nat, i rrugës ose në / nga pod) kalon përmes zinxhirëve PREROUTING — FORWARD — POSTROUTING.
- Trafiku në procesin lokal të hostit kalon përmes zinxhirit PREROUTING — INPUT.
- Trafiku nga procesi lokal të hostit kalon përmes zinxhirit OUTPUT — POSTROUTING.

Calico ofron mundësi për politika, përmes të cilave mund të aplikoni politika për të gjitha zinxhirët. Duke e pasur këtë në mendje, le të shqyrtojmë variante të ndryshme të konfigurimit të politikave që janë të disponueshme në Calico. Numrat në listën e mundësive më poshtë përputhen me numrat në diagramin më sipër.
- Politika e pikës së ngarkesës (pod)
- Politika e pikës së hostit
- Mundësia ApplyOnForward
- Politika PreDNAT
- Politika Untracked
Le të fillojmë me shqyrtimin e mënyrës se si aplikohen politikat në pikët e ngarkesës (pod’ët e Kubernetes ose VM-të e OpenStack), dhe pastaj të shqyrtojmë opsionet e politikave për pikët e hostit.
Pikat e Ngarkesës
Politika e Pikës së Ngarkesës (1)
Kjo është një mundësi për të mbrojtur pod’ët tuaj të kubernetes. Në Calico mbështetet përdorimi i Kubernetes NetworkPolicy, por gjithashtu ofron politika të tjera — Calico NetworkPolicy dhe GlobalNetworkPolicy. Calico krijon një zinxhir për çdo pod (ngarkesë) dhe lidhje në zinxhirët INPUT dhe OUTPUT për ngarkesën në tryezën e filtrave të zinxhirit FORWARD.
Pikat e Hostit
Politika e Pikës së Hostit (2)
Përveç CNI (ndërfaqja e rrjetit të kontejnerëve), politikat Calico ofrojnë mundësi mbrojtjeje drejtpërdrejtë për hostin. Në Calico, ju mund të krijoni një endpoint host duke caktuar një kombinim nga ndërfaqja e hostit dhe, nëse është e nevojshme, numrat e porteve. Zbatimi i politikave për këtë entitet arrin përmes tabelës së filtrave në zinxhirin INPUT dhe OUTPUT. Siç tregohet në diagram, ato (2) zbatohen në proceset lokale në node/host. Kjo do të thotë se nëse keni krijuar një politikë që zbatohet për endpoint-in host, ajo nuk do të ndikojë në trafikun që shkon në/nga pod'ët tuaj. Por ajo siguron një ndërfaqe/sintaksë të njëtrajtshme për bllokimin e trafikut për hostin tuaj dhe pod'ët përmes politikave të Calico. Kjo e thjeshton ndjeshëm procesin e menaxhimit të politikave për një rrjet heterogjen. Konfigurimi i politikave të endpoint-it host për përforcimin e mbrojtjes së grumbullit është një rast tjetër i rëndësishëm i përdorimit të tyre.
Politika ApplyOnForward (3)
Opcioni ApplyOnForward është në dispozicion në politikën globale të rrjetit Calico, për të mundësuar aplikimin e politikave për të gjithë trafikun që kalon përmes pikës së hostit, duke përfshirë trafikun që do të tregtohet nga hosti (forwarded). Ky trafikun përfshin atë që dërgohet në pod-in lokal ose në ndonjë vend tjetër në rrjet. Calico kërkon që ky parametër të jetë i aktivizuar për politikat që përdorin PreDNAT dhe untracked, shih seksionet e mëposhtme. Për më tepër, ApplyOnForward mund të përdoret për të ndjekur trafikun e hostit në raste përdorimi të router-it virtual ose NAT-it softuerik.
Vini re se nëse ju nevojitet të aplikoni të njëjtën politikë rrjeti si për proceset e hostit ashtu edhe për pod-et, nuk keni nevojë të përdorni opsionin ApplyOnForward. Mjafton të krijoni një etiketë për hostendpoint dhe workload endpoint (pod). Calico është mjaft i mençur për të aplikuar politikën në bazë të etiketave, pavarësisht nga lloji i endpoint-it (hostendpoint ose workload).
Politika PreDNAT (4)
Në Kubernetes, portet e entitetit shërbim mund të dërgohen jashtë përmes opsionit NodePorts ose, opcionalisht (kur përdoret Calico), duke i shpallur ato përmes opsioneve Cluster IPs ose External IPs. Kube-proxy balancën e trafikëve hyjësor, të lidhur me shërbimin, me pod-ët përkatës të shërbimit duke përdorur DNAT. Duke e marrë parasysh këtë, si mund të aplikoni politikat për trafikun që vjen përmes NodePorts? Që këto politika të aplikohen para se trafiku të përpunohet nga DNAT (i cili është përkufizimi i hostit: portit dhe shërbimit përkatës), Calico ofron një parametër për globalNetworkPolicy që quhet "preDNAT: true".
Kur pre-DNAT është i aktivizuar, këto politika zbatohen në (4) në diagram — në tabelën mangle të zinxhirit PREROUTING — direkt para DNAT. Renditja normale e politikave (order) këtu nuk respektohet, pasi zbatimi i këtyre politikave ndodh shumë më herët në rrugën e përpunimit të trafikut. Megjithatë, politikat preDNAT respektojnë renditjen e zbatimit (order) midis tyre.
Kur krijoni politika me pre-DNAT, është e rëndësishme të jeni të kujdesshëm me trafikun që dëshironi të përpunoni dhe të lejoni shumicën të refuzohet. Trafiku i shënuar si ‘lejo’ në politikën pre-DNAT nuk do të kontrollohet më nga politika hostendpoint, ndërsa trafiku që dështon kalimin e politikës pre-DNAT do të vazhdojë rrugën përmes zinxhirëve të tjerë.
Calico e bëri të detyrueshme aktivizimin e opsionit applyOnForward kur përdorim preDNAT, pasi për definicionin, pika e destinacionit të trafikut ende nuk është zgjedhur. Trafiku mund të drejtohet në procesin e hostit, ose mund të redirektohet në pod ose në një nod tjetër.
Politika e Pa Monitoruar (5)
Të dhënat dhe aplikacionet mund të kenë dallime të mëdha në sjellje. Në disa raste ekstreme, aplikacionet mund të krijojnë shumë lidhje të përkohshme. Kjo mund të çojë në mungesë të memories në conntrack (komponenti kryesor i stack-ut të rrjetit Linux). Tradicionalisht, për të drejtuar aplikacione të tillë në Linux, duhet të konfiguroni manualisht ose të çaktivizoni conntrack, ose të shkruani rregulla iptables për të anashkaluar conntrack. Politikë pa ndjekje në Calico është një opsion më i thjeshtë dhe efektiv, nëse dëshironi të trajtoni lidhjet sa më shpejt të jetë e mundur. Për shembull, nëse përdorni një ose si një masë shtesë mbrojtjeje kundër .
Lexoni këtë (ose ) për informacione të tjera, përfshirë testet e performancës duke përdorur politikën pa ndjekje.
Kur aktivizoni opsionin «doNotTrack: true» në Calico globalNetworkPolicy, bëhet një politikë **e paudhëzuar** dhe aplikohet në etapën më të hershme të procesimit të paketave në Linux. Nëse shikoni diagramin më sipër, politikat e paudhëzuara aplikohen në zinxhirët PREROUTING dhe OUTPUT në tabelën raw, përpara se të nisë ndjekja e lidhjeve (conntrack). Kur një paketë lejohet nga politika e paudhëzuar, ajo shënjohet për të çaktivizuar ndjekjen e lidhjes për këtë paketë. Kjo do të thotë:
- Politika e paudhëzuar aplikohet për secilën paketë. Nuk ka koncept lidhjeje (ose rrjedhe). Mungesa e lidhjeve (connection) sjell disa pasoja të rëndësishme:
- Nëse dëshironi të lejoni si trafikun e kërkesës ashtu edhe trafikun e përgjigjes, ju nevojitet një rregull për të dyja, atë për hyrjen dhe atë për dalje (së bashku me Calico zakonisht duke përdorur conntrack për të shënuar trafik të përgjigjes si të lejuar).
- Politika e paudhëzuar nuk funksionon për workload Kubernetes (pod'ët), sepse në këtë rast nuk ka asnjë mënyrë për të ndjekur lidhjen e daljes nga pod'i.
- NAT funksionon në mënyrë të papërshtatshme me paketat e paudhëzuara (pasi bërthama mban përputhjen NAT në conntrack).
- Kur kaloni përmes rregullit "lejo gjithçka" në politikën untracked, të gjithë paketat do të shënohen si të pa ndjekura. Kjo pothuajse gjithmonë nuk është ajo që ju nevojitet, prandaj është e rëndësishme të jeni shumë selektiv për paketat e lejuara nga politikat untracked (dhe të lejoni pjesën më të madhe të trafik dhe të kaloni përmes politikave të zakonshme të ndjekura).
- Politikat untracked zbatohen në fillim të tubit të përpunimit të paketave. Kjo është shumë e rëndësishme të kuptohet kur krijoni politikat Calico. Ju mund të keni një politikë për pod me order:1 dhe një politikë untracked me order:1000. Kjo do të ishte e parëndësishme. Politika untracked do të zbatohet para politikës për pod. Politikat untracked respektojnë rendin e ekzekutimit vetëm midis tyre.
Pasi një nga shpërblimet e politikës doNotTrack është për të siguruar përmbushjen e politikës në fazën më të hershme të tubit të përpunimit të paketave Linux, Calico e bën të detyrueshme tregimin e opsionit applyOnForward kur përdoret doNotTrack. Duke iu referuar diagramit të përpunimit të paketave, vini re se politika untracked (5) zbatohet para çdo vendimi për rrugë. Trafiku mund të drejtohet në procesin e pritësit, ose mund të ridrejtohet në pod ose në një nod tjetër.
Përfundimet
Kemi shqyrtuar mundësi të ndryshme politikash (Host endpoint, ApplyOnForward, preDNAT, dhe Untracked) në Calico dhe si i zbatohen ato në rrugën e procesimit të paketimeve. Kuptimi thelbësor i funksionit të tyre ndihmon në zhvillimin e politikave efektive dhe të sigurta. Me Calico, mund të përdorni politikën globale të rrjetit, e cila aplikohet në etiketa (grupin e konektuesve dhe pod-ve) dhe të aplikoni politika me parametra të ndryshëm. Kjo i lejon specialistët e sigurisë dhe dizajnit të rrjetit të mbrojnë lehtësisht 'gjithçka' (lloje të endpoint-ëve), duke përdorur një gjuhë të vetme politikash me politikat e Calico.
Faleminderit: Doja të falënderoj dhe për rishikimin e tyre dhe për informacionin e vlefshëm.
Burimi: habr.com
