
Calico-nĂ€tverkspluginet erbjuder ett omfattande utbud av nĂ€tverkspolicyer med en enhetlig syntax för att skydda vĂ€rdar pĂ„ hĂ„rdvara, virtuella maskiner och poddar. Dessa policyer kan tillĂ€mpas inom namespaces eller vara globala nĂ€tverkspolicyer som gĂ€ller för (för att skydda applikationer som körs direkt pĂ„ vĂ€rden â en vĂ€rd kan vara en fysisk server eller en virtuell maskin) eller för (för att skydda applikationer som körs i containrar eller virtuella maskiner som Ă€r vĂ€rdade pĂ„ vĂ€rden). Calico-policyer möjliggör sĂ€kerhetsĂ„tgĂ€rder för olika vĂ€gpunktspaket genom alternativ som preDNAT, unraracked och applyOnForward. Att förstĂ„ hur dessa alternativ fungerar kan bidra till att förbĂ€ttra sĂ€kerheten och prestandan hos systemet som helhet. I den hĂ€r artikeln förklaras kĂ€rnan i dessa Calico-policyalternativ (preDNAT, unraracked och applyOnForward) som tillĂ€mpas pĂ„ vĂ€rdĂ€ndpunkter, med fokus pĂ„ vad som hĂ€nder i paketbehandlingsvĂ€garna (iptables-kedjor).
Denna artikel förutsÀtter att du har en grundlÀggande förstÄelse för nÀtverkspolicyer i Kubernetes och Calico. Om du inte har det rekommenderar vi att du testar och med Calico innan du lÀser denna artikel. Vi förutsÀtter ocksÄ att du har en grundlÀggande förstÄelse av Linux.
Calico möjliggör för dig att tillĂ€mpa en uppsĂ€ttning Ă„tkomstregler baserat pĂ„ etiketter (till grupper av vĂ€rdar och arbetsbelastningar/poddar). Detta Ă€r mycket anvĂ€ndbart om du anvĂ€nder olika system tillsammans â virtuella maskiner, system direkt pĂ„ hĂ„rdvara eller Kubernetes-infrastruktur. Dessutom kan du skydda din kluster (noder) med en uppsĂ€ttning deklarativa policys och tillĂ€mpa nĂ€tverkspolicys pĂ„ inkommande trafik (till exempel genom NodePorts-tjĂ€nster eller externa IP-adresser).
PÄ en grundlÀggande nivÄ, nÀr Calico kopplar en pod till nÀtverket (se diagrammet nedan), kopplar det den till vÀrden med hjÀlp av en virtuell Ethernet-grÀnssnitt (veth). Trafik som skickas av podden kommer till vÀrden frÄn det virtuella grÀnssnittet och hanteras pÄ samma sÀtt som om den kom frÄn ett fysiskt nÀtverksgrÀnssnitt. Som standard kallar Calico dessa grÀnssnitt caliXXX. Eftersom trafiken kommer genom det virtuella grÀnssnittet gÄr den igenom iptables, som om podden var en hop bort. DÀrför, nÀr trafik kommer/frÄn podden, vidarebefordras den sett frÄn vÀrden.
PÄ Kubernetes-noden dÀr Calico körs kan du koppla det virtuella grÀnssnittet (veth) till arbetsbelastningen pÄ följande sÀtt. I exemplet nedan kan du se att veth#10 (calic1cbf1ca0f8) Àr kopplad till cnx-manager-* i calico-monitoring-namnsrymden.
[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
... 
Med tanke pÄ att Calico skapar veth-grÀnssnitt för varje arbetsbelastning, hur tillÀmpar det policyer? För detta skapar Calico hooks i olika kedjor för paketbehandling med hjÀlp av iptables.
I diagrammet nedan visas kedjorna som Àr involverade i paketbehandling i iptables (eller netfilter-systemet). NÀr ett paket kommer in genom nÀtverksgrÀnssnittet passerar det först genom kedjan PREROUTING. Beslut fattas om routing, och pÄ grundval av detta gÄr paketet antingen genom INPUT (dirigerat till vÀrdens processer), eller genom FORWARD (dirigerat till podden eller en annan nod i nÀtverket). FrÄn den lokala processen passerar paketet genom kedjan OUTPUT, och sedan POSTROUTING innan det skickas via kabeln.
Observera att podden Àven Àr ett externt objekt (kopplat till veth) sett ur iptables paketbehandling. LÄt oss sammanfatta:
- Vidarebefordrad trafik (nat, routad eller in/ut frĂ„n pod) passerar genom kedjorna PREROUTING â FORWARD â POSTROUTING.
- Trafik till den lokala vĂ€rdprocessen passerar genom kedjan PREROUTING â INPUT.
- Trafik frĂ„n den lokala vĂ€rdprocessen passerar genom kedjan OUTPUT â POSTROUTING.

Calico erbjuder alternativ för policyer som gör det möjligt att tillÀmpa policyer pÄ alla kedjor. Med detta i Ätanke, lÄt oss gÄ igenom de olika instÀllningsalternativen som Àr tillgÀngliga i Calico. Siffrorna i listan över alternativ nedan motsvarar siffrorna pÄ diagrammet ovan.
- Workload endpoint (pod) policy
- Host endpoint policy
- ApplyOnForward-alternativet
- PreDNAT-policy
- Untracked-policy
LÄt oss börja med att undersöka hur policyer tillÀmpas pÄ workload endpoints (Kubernetes-pods eller OpenStack-VM:ar) och sedan granska policyalternativen för host endpoints.
Workload Endpoints
Workload Endpoint Policy (1)
Detta Ă€r ett alternativ för att skydda dina Kubernetes-pods. Calico stödjer arbete med Kubernetes NetworkPolicy, men erbjuder ocksĂ„ ytterligare policyer â Calico NetworkPolicy och GlobalNetworkPolicy. Calico skapar en kedja för varje pod (workload) och hookar in i kedjorna INPUT och OUTPUT för workload till filtertabellen i kedjan FORWARD.
Host Endpoints
Host Endpoint Policy (2)
Utöver CNI (container network interface) erbjuder Calicos policyer möjlighet att skydda sjÀlva vÀrden. I Calico kan du skapa en host endpoint genom att ange en kombination av vÀrdgrÀnssnitt och, om sÄ önskas, portnummer. TillÀmpning av policyer för denna enhet uppnÄs med hjÀlp av filtertabeller i kedjorna INPUT och OUTPUT. Som visas i diagrammet, (2) tillÀmpas de pÄ lokala processer pÄ noden/vÀrden. Det vill sÀga, om du har skapat en policy som tillÀmpas pÄ en host endpoint, pÄverkar den inte trafiken till/frÄn dina pods. Men den sÀkerstÀller en enhetlig grÀnssnitt/syntax för att blockera trafik för din vÀrd och pods med hjÀlp av Calicos policyer. Detta gör hanteringen av policyer för heterogena nÀtverk betydligt enklare. Att konfigurera host endpoint-policyer för att stÀrka skyddet av klustret Àr ytterligare en viktig anvÀndning.
ApplyOnForward Policy (3)
ApplyOnForward-alternativet finns i Calico global network policy för att möjliggöra tillÀmpning av policyer pÄ all trafik som passerar genom host endpoint, inklusive trafik som kommer att vidarebefordras av vÀrden. Denna trafik inkluderar omdirigerad trafik till en lokal pod eller nÄgon annanstans i nÀtverket. Calico krÀver att detta alternativ aktiveras för policyer som anvÀnder PreDNAT och untracked, se följande avsnitt. Dessutom kan ApplyOnForward anvÀndas för att spÄra vÀrdtrafik i fall med virtuella routrar eller mjukvarunat.
Observera att om du behöver tillÀmpa en och samma nÀtverkspolicy för bÄde vÀrdprocesser och poddar, behöver du inte anvÀnda alternativet ApplyOnForward. Det rÀcker att skapa en etikett för de nödvÀndiga hostendpoint och workload endpoint (pod). Calico Àr tillrÀckligt intelligent för att tillÀmpa policyn baserat pÄ etiketter, oavsett typ av endpoint (hostendpoint eller workload).
PreDNAT Policy (4)
I Kubernetes kan portar för service-entiteten exponeras utÄt med hjÀlp av alternativet NodePorts eller, valfritt (vid anvÀndning av Calico), genom deklarationer via alternativ för Cluster IPs eller External IPs. Kube-proxy balanserar inkommande trafik kopplad till service till poddar av motsvarande service med hjÀlp av DNAT. Givet detta, hur kan du tillÀmpa policys för trafiken som kommer genom NodePorts? För att dessa policies ska tillÀmpas innan trafiken hanteras av DNAT (som representerar en koppling mellan vÀrd:port och motsvarande service), tillhandahÄller Calico ett parameter för globalNetworkPolicy som kallas "preDNAT: true".
NĂ€r pre-DNAT Ă€r aktiverat, implementeras dessa policies i (4) pĂ„ diagrammet â i mangle-kedjetabellen PREROUTING â direkt före DNAT. Den vanliga ordningen av policies (order) följs inte hĂ€r, eftersom tillĂ€mpningen av dessa policies sker mycket tidigare i trafikbehandlingsvĂ€gen. Dock följer preDNAT-policys ordningen för tillĂ€mpning (order) mellan sig.
NÀr man skapar policies med pre-DNAT Àr det viktigt att vara uppmÀrksam pÄ trafiken som du vill bearbeta, och att tillÄta majoriteten att avvisas. Trafik som mÀrks som 'allow' i pre-DNAT-policyn kommer inte lÀngre att kontrolleras av hostendpoint-policyn, medan trafik som misslyckas med att passera pre-DNAT-policyn fortsÀtter att gÄ genom de övriga kedjorna.
Calico har gjort det obligatoriskt att aktivera alternativet applyOnForward vid anvÀndning av preDNAT, eftersom destinationspunkten för trafiken Ànnu inte har valts. Trafiken kan riktas till en vÀrdprocess, eller den kan omdirigeras till en pod eller till en annan nod.
Untracked Policy (5)
NÀtverk och applikationer kan ha stora skillnader i beteende. I vissa extrema fall kan applikationer generera ett stort antal kortvariga anslutningar. Detta kan leda till minnesbrist hos conntrack (den grundlÀggande komponenten i Linux nÀtverksstack). Traditionellt behöver du manuellt konfigurera eller inaktivera conntrack eller skriva iptables-regler för att kringgÄ conntrack för att köra applikationer av denna typ i Linux. Untracked policy i Calico Àr ett enklare och mer effektivt alternativ om du vill hantera anslutningar sÄ snabbt som möjligt. Till exempel, om du anvÀnder en massiv eller som ett extra skydd mot .
LÀs detta (eller ) för mer information, inklusive prestandatest vid anvÀndning av untracked policy.
NÀr du stÀller in alternativet "doNotTrack: true" i Calico globalNetworkPolicy blir den en **oövervakad** policy och tillÀmpas i ett tidigt skede av Linux paketbehandlingskedja. Om du tittar pÄ diagrammet ovan tillÀmpas untracked policies i PREROUTING och OUTPUT kedjorna i raw-tabellen, innan anslutningsspÄrning (conntrack) aktiveras. NÀr ett paket tillÄts av untracked policyn, mÀrks det för att inaktivera anslutningsspÄrning för detta paket. Detta innebÀr:
- Untracked policyn tillÀmpas pÄ varje paket. Det finns inget begrepp om en anslutning (eller flöde). Avsaknaden av anslutningar medför flera viktiga konsekvenser:
- Om du vill tillÄta bÄde begÀrningstrafik och svarsanslutningar behöver du en regel för bÄde inkommande och utgÄende (eftersom Calico vanligtvis anvÀnder conntrack för att mÀrka svarstrafik som tillÄten).
- Untracked policyn fungerar inte för Kubernetes arbetsbelastningar (poddar), eftersom det i detta fall inte finns nÄgot sÀtt att spÄra utgÄende anslutningar frÄn en podd.
- NAT fungerar felaktigt med oövervakade paket (eftersom kÀrnan lagrar NAT-kopplingar i conntrack).
- Vid passage genom regeln "tillÄt allt" i untracked-policyn kommer alla paket att mÀrkas som oövervakade. Detta Àr nÀstan alltid inte vad du behöver, sÄ det Àr viktigt att vara mycket selektiv med de paket som tillÄts av untracked-policys (och lÄta större delen av trafiken gÄ igenom vanliga övervakade policies).
- Oövervakade policyer tillÀmpas i början av paketbearbetningskonvejerbelaget. Det Àr mycket viktigt att förstÄ detta nÀr man skapar Calico-policyer. Du kan ha en policy för en pod med order:1 och en oövervakad policy med order:1000. Detta spelar ingen roll. Den oövervakade policyn kommer att tillÀmpas innan pod-policyn. Oövervakade policies följer endast exekveringsordning mellan sig sjÀlva.
Eftersom ett av mÄlen med doNotTrack-policyn Àr att tvinga tillÀmpningen av policyn tidigt i Linux paketbearbetningskonvejerbelaget, gör Calico det obligatoriskt att ange alternativet applyOnForward nÀr doNotTrack anvÀnds. Titta pÄ paketbearbetningsdiagrammet, notera att den oövervakade policyn (5) tillÀmpas innan nÄgra routingbeslut fattas. Trafik kan riktas till vÀrdprocessen, eller sÄ kan den omdirigeras till en pod eller en annan nod.
Sammanfattning
Vi har granskat olika policyalternativ (Host endpoint, ApplyOnForward, preDNAT och Oövervakad) i Calico och hur de tillÀmpas pÄ vÀgen för paketbearbetning. Att förstÄ deras essens hjÀlper till att utveckla effektiva och sÀkra policys. Med Calico kan du anvÀnda globala nÀtverkspolicyer som tillÀmpas pÄ etiketter (grupper av noder och pods) och tillÀmpa policys med olika alternativ. Detta gör det möjligt för sÀkerhets- och nÀtverksdesignspecialister att enkelt skydda allt (typer av endpoints) med ett enhetligt sprÄk för policys med Calico-policys.
Tacksamhet: Jag vill tacka och för deras översyn och vÀrdefull information.
KĂ€lla: habr.com
