Një zhytje e thellë në arkitekturën e Iptables dhe Netfilter
Prezantimi
Firewall-et janë një mjet i rëndësishëm që mund të konfigurohet për të mbrojtur serverët dhe infrastrukturën tuaj. Në ekosistemin Linux, iptables
është një mjet firewall i përdorur gjerësisht që funksionon me kornizën e filtrimit të paketave netfilter
të kernelit. Krijimi i politikave të besueshme të murit të zjarrit mund të jetë i frikshëm, për shkak të sintaksës komplekse dhe numrit të pjesëve të ndërlidhura të përfshira.
Në këtë udhëzues, ne do të zhytemi në arkitekturën iptables
me synimin për ta bërë atë më të kuptueshme për përdoruesit që duhet të ndërtojnë politikat e tyre të murit të zjarrit. Ne do të diskutojmë se si iptables
ndërvepron me netfilter
dhe se si përbërësit e ndryshëm përshtaten së bashku për të ofruar një sistem filtrimi gjithëpërfshirës.
Çfarë janë IPTables dhe Netfilter?
Për shumë vite, softueri i murit të zjarrit që përdoret më së shpeshti në Linux quhej iptables
. Në disa shpërndarje, ai është zëvendësuar nga një mjet i ri i quajtur nftables
, por sintaksa iptables
përdoret ende zakonisht si bazë. Muri i zjarrit iptables
funksionon duke ndërvepruar me grepat e filtrimit të paketave në pirgun e rrjetit të kernelit Linux. Këto grepa kernel njihen si korniza netfilter
.
Çdo paketë që kalon nëpër shtresën e rrjetit (hyrëse ose dalëse) do të shkaktojë këto grepa, duke i lejuar programet të ndërveprojnë me trafikun në pikat kyçe. Modulet e kernelit të lidhur me iptables
regjistrohen me këto grepa për të siguruar që trafiku të jetë në përputhje me kushtet e përcaktuara nga rregullat e murit të zjarrit.
Netfilter Hooks
Ka pesë grepa netfilter
me të cilat programet mund të regjistrohen. Ndërsa paketat përparojnë nëpër stek, ato do të aktivizojnë modulet e kernelit që janë regjistruar me këto grepa. Gjuajtjet që do të aktivizojë një paketë varen nga fakti nëse paketa është hyrëse ose dalëse, destinacioni i paketës dhe nëse paketa është hedhur ose është refuzuar në një pikë të mëparshme.
Grupet e mëposhtme përfaqësojnë këto pika të mirëpërcaktuara në grupin e rrjetit:
NF_IP_PRE_ROUTING
: Ky fiksim do të aktivizohet nga çdo trafik në hyrje shumë shpejt pas hyrjes në pirgun e rrjetit. Ky grep përpunohet përpara se të merret ndonjë vendim për drejtimin në lidhje me vendin ku të dërgohet paketa.NF_IP_LOCAL_IN
: Ky fiksim aktivizohet pasi një paketë hyrëse është drejtuar nëse paketa është e destinuar për sistemin lokal.NF_IP_FORWARD
: Ky fiksim aktivizohet pasi një paketë hyrëse është drejtuar nëse paketa do të përcillet te një host tjetër.NF_IP_LOCAL_OUT
: Ky fiksim aktivizohet nga çdo trafik dalës i krijuar lokalisht sapo të godasë grupin e rrjetit.NF_IP_POST_ROUTING
: Ky grep aktivizohet nga çdo trafik dalës ose i përcjellë pasi të ketë ndodhur itinerari dhe pak para se të dërgohet në tela.
Modulet e kernelit që duhet të regjistrohen në këto grepa duhet gjithashtu të ofrojnë një numër prioritar për të ndihmuar në përcaktimin e rendit në të cilin do të thirren kur të aktivizohet grepa. Kjo siguron mjetet për module të shumta (ose instanca të shumta të të njëjtit modul) për t'u lidhur me secilën prej grepave me renditje përcaktuese. Çdo modul do të thirret me radhë dhe do të kthejë një vendim në kornizën netfilter
pas përpunimit që tregon se çfarë duhet bërë me paketën.
IPT Tabelat dhe Zinxhirët
Muri i zjarrit iptables
përdor tabela për të organizuar rregullat e tij. Këto tabela klasifikojnë rregullat sipas llojit të vendimeve që përdoren për të marrë. Për shembull, nëse një rregull merret me përkthimin e adresave të rrjetit, ai do të vendoset në tabelën nat
. Nëse rregulli përdoret për të vendosur nëse do të lejohet që paketa të vazhdojë në destinacionin e saj, ajo ndoshta do të shtohet në tabelën filter
.
Brenda çdo tabele iptables
, rregullat organizohen më tej brenda zinxhirëve të veçantë. Ndërsa tabelat përcaktohen nga qëllimi i përgjithshëm i rregullave që ato mbajnë, zinxhirët e integruar përfaqësojnë filtrin e rrjetit grepa që i shkaktojnë ato. Zinxhirët përcaktojnë kur rregullat do të vlerësohen.
Emrat e zinxhirëve të integruar pasqyrojnë emrat e grepave netfilter
me të cilat lidhen:
PREROUTING
: Aktivizohet nga grepaNF_IP_PRE_ROUTING
.INPUT
: Aktivizohet nga grepaNF_IP_LOCAL_IN
.PERPARA
: Aktivizohet nga grepiNF_IP_FORWARD
.OUTPUT
: Aktivizohet nga grepiNF_IP_LOCAL_OUT
.POSTROUTING
: Aktivizohet nga grepaNF_IP_POST_ROUTING
.
Zinxhirët lejojnë administratorin të kontrollojë se ku do të vlerësohet një rregull në rrugën e dorëzimit të një pakete. Meqenëse çdo tabelë ka zinxhirë të shumtë, ndikimi i një tabele mund të ushtrohet në pika të shumta në përpunim. Për shkak se disa lloje vendimesh kanë kuptim vetëm në pika të caktuara në pirgun e rrjetit, çdo tabelë nuk do të ketë një zinxhir të regjistruar me çdo goditje të kernelit.
Ka vetëm pesë grepa kernel netfilter
, kështu që zinxhirët nga tabela të shumta regjistrohen në secilën prej grepave. Për shembull, tre tabela kanë zinxhirë PREROUTING
. Kur këta zinxhirë regjistrohen në grepin e lidhur NF_IP_PRE_ROUTING
, ata specifikojnë një prioritet që dikton se çfarë rendi quhet zinxhiri PREROUTING
i secilës tabelë. Secili prej rregullave brenda zinxhirit PREROUTING
me prioritet më të lartë vlerësohet në mënyrë sekuenciale përpara se të kalohet në zinxhirin e ardhshëm PREROUTING
. Ne do të hedhim një vështrim në rendin specifik të secilit zinxhir në një moment.
Cilat tabela janë në dispozicion?
Le të tërhiqemi për një moment dhe të hedhim një vështrim në tabelat e ndryshme që ofron iptables
. Këto përfaqësojnë grupe të veçanta rregullash, të organizuara sipas zonës së shqetësimit, për vlerësimin e paketave.
Tabela e Filtrave
Tabela e filtrit është një nga tabelat më të përdorura në iptables
. Tabela filter
përdoret për të marrë vendime nëse do të lihet një paketë të vazhdojë në destinacionin e synuar ose për të refuzuar kërkesën e saj. Në gjuhën e murit të zjarrit, kjo njihet si filtrimi i paketave. Kjo tabelë ofron pjesën më të madhe të funksionalitetit që njerëzit mendojnë kur diskutojnë për muret e zjarrit.
Tabela NAT
Tabela nat
përdoret për të zbatuar rregullat e përkthimit të adresave të rrjetit. Ndërsa paketat hyjnë në pirgun e rrjetit, rregullat në këtë tabelë do të përcaktojnë nëse dhe si të modifikohen adresat e burimit ose të destinacionit të paketës në mënyrë që të ndikojë në mënyrën se si udhëzohet paketa dhe çdo trafik përgjigjesh. Kjo përdoret shpesh për të drejtuar paketat në rrjete kur qasja e drejtpërdrejtë nuk është e mundur.
Tabela Mangle
Tabela mangle
përdoret për të ndryshuar titujt IP të paketës në mënyra të ndryshme. Për shembull, ju mund të rregulloni vlerën TTL (Time to Live) të një pakete, ose duke zgjatur ose shkurtuar numrin e lëvizjeve të vlefshme të rrjetit që mund të mbajë paketa. Titujt e tjerë të IP-së mund të ndryshohen në mënyra të ngjashme.
Kjo tabelë mund të vendosë gjithashtu një shenjë të brendshme të kernelit në paketë për përpunim të mëtejshëm në tabela të tjera dhe nga mjete të tjera rrjeti. Kjo shenjë nuk prek paketën aktuale, por shton shenjën në paraqitjen e paketës nga kernel.
Tabela e papërpunuar
Muri i zjarrit iptables
është i gjendjes, që do të thotë se paketat vlerësohen në lidhje me lidhjen e tyre me paketat e mëparshme. Veçoritë e gjurmimit të lidhjeve të ndërtuara në krye të kornizës netfilter
lejojnë iptables
të shikojnë paketat si pjesë e një lidhjeje ose sesioni në vazhdim në vend të një rryme paketash diskrete dhe të palidhura. Logjika e gjurmimit të lidhjes zakonisht zbatohet shumë shpejt pasi paketa godet ndërfaqen e rrjetit.
Tabela raw
ka një funksion të përcaktuar shumë ngushtë. Qëllimi i tij i vetëm është të sigurojë një mekanizëm për shënjimin e paketave në mënyrë që të largohet nga gjurmimi i lidhjes.
Tabela e Sigurisë
Tabela siguria
përdoret për të vendosur shenjat e brendshme të kontekstit të sigurisë SELinux në pako, të cilat do të ndikojnë në mënyrën se si SELinux ose sisteme të tjera që mund të interpretojnë kontekstet e sigurisë SELinux trajtojnë paketat. Këto shenja mund të aplikohen mbi bazën për pako ose për lidhje.
Marrëdhëniet ndërmjet zinxhirëve dhe tabelave
Nëse tre tabela kanë zinxhirë PREROUTING
, në cilën renditje vlerësohen ato?
Tabela e mëposhtme tregon zinxhirët që janë të disponueshëm brenda çdo tabele iptables
kur lexohen nga e majta në të djathtë. Për shembull, mund të themi se tabela raw
ka zinxhirë PREROUTING
dhe OUTPUT
. Kur lexohet nga lart-poshtë, ai shfaq gjithashtu rendin në të cilin thirret secili zinxhir kur aktivizohet grepa e lidhur netfilter
.
Duhet të theksohen disa gjëra. Në paraqitjen e mëposhtme, tabela nat
është ndarë midis operacioneve DNAT
(ato që ndryshojnë adresën e destinacionit të një pakete) dhe operacioneve SNAT
( ato që ndryshojnë adresën e burimit) për të shfaqur më qartë porosinë e tyre. Ne kemi përfshirë gjithashtu rreshta që përfaqësojnë pikat ku merren vendimet e rrugëzimit dhe ku është aktivizuar gjurmimi i lidhjes për të dhënë një pamje më tërësore të proceseve që ndodhin:
Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) | ✓ | ||||
raw | ✓ | ✓ | |||
(connection tracking enabled) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(routing decision) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
Ndërsa një paketë aktivizon një grep netfilter
, zinxhirët e lidhur do të përpunohen siç janë renditur në tabelën e mësipërme nga lart-poshtë. Grupet (kolonat) që do të aktivizojë një paketë varen nëse është një paketë hyrëse apo dalëse, vendimet e rrugëtimit që merren dhe nëse paketa i kalon kriteret e filtrimit.
Disa ngjarje do të bëjnë që zinxhiri i një tabele të anashkalohet gjatë përpunimit. Për shembull, vetëm paketa e parë në një lidhje do të vlerësohet kundrejt rregullave NAT. Çdo vendim nat
i marrë për paketën e parë do të zbatohet në të gjitha paketat pasuese në lidhje pa vlerësim shtesë. Përgjigjet ndaj lidhjeve të NAT do të kenë automatikisht të zbatohen rregullat e kundërta NAT për të drejtuar saktë.
Rendi i kalimit të zinxhirit
Duke supozuar se serveri di se si të drejtojë një paketë dhe se rregullat e murit të zjarrit lejojnë transmetimin e saj, rrjedhat e mëposhtme përfaqësojnë shtigjet që do të përshkohen në situata të ndryshme:
- Paketat hyrëse të destinuara për sistemin lokal:
PREROUTING
->INPUT
- Paketat hyrëse të destinuara për një host tjetër:
PREROUTING
->FORWARD
->POSTROUTING
- Paketat e krijuara në vend:
OUTPUT
->POSTROUTING
Nëse kombinojmë informacionin e mësipërm me renditjen e paraqitur në tabelën e mëparshme, mund të shohim se një paketë hyrëse e destinuar për sistemin lokal fillimisht do të vlerësohet kundrejt zinxhirëve PREROUTING
të raw
tabelat , mangle
dhe nat
. Më pas do të përshkojë zinxhirët INPUT
të mangle
, filterit
, sigurisë
dhe nat
tabela përpara se të dorëzohen përfundimisht në prizën lokale.
Rregullat e IPTables
Rregullat vendosen brenda një zinxhiri specifik të një tabele specifike. Ndërsa thirret çdo zinxhir, paketa në fjalë do të kontrollohet në përputhje me çdo rregull brenda zinxhirit. Çdo rregull ka një komponent që përputhet dhe një komponent veprimi.
Përputhja
Pjesa përputhëse e një rregulli specifikon kriteret që duhet të plotësojë një paketë në mënyrë që veprimi i lidhur (ose \objektivi) të ekzekutohet.
Sistemi i përputhjes është shumë fleksibël dhe mund të zgjerohet ndjeshëm me shtesa shtesë iptables
. Rregullat mund të ndërtohen që të përputhen me llojin e protokollit, destinacionin ose adresën e burimit, destinacionin ose portin burimor, destinacionin ose rrjetin burimor, ndërfaqen hyrëse ose dalëse, titujt ose gjendjen e lidhjes midis kritereve të tjera. Këto mund të kombinohen për të krijuar grupe rregullash komplekse për të dalluar trafikun e ndryshëm.
Objektivat
Një objektiv i referohet veprimeve që aktivizohen kur një paketë plotëson kriteret e përputhjes së një rregulli. Objektivat përgjithësisht ndahen në dy kategori:
- Objektivat përfundimtare: Objektivat përfunduese kryejnë një veprim që përfundon vlerësimin brenda zinxhirit dhe e kthen kontrollin në grepin
netfilter
. Në varësi të vlerës së kthimit të dhënë, grepa mund të heqë paketën ose të lejojë që paketa të vazhdojë në fazën tjetër të përpunimit. - Objektivat jo-përfunduese: Objektivat jo-përfunduese kryejnë një veprim dhe vazhdojnë vlerësimin brenda zinxhirit. Megjithëse çdo zinxhir duhet të kalojë përfundimisht një vendim përfundimtar përfundimtar, çdo numër objektivash jo-përfunduese mund të ekzekutohet paraprakisht.
Disponueshmëria e çdo objektivi brenda rregullave do të varet nga konteksti. Për shembull, tabela dhe lloji i zinxhirit mund të diktojnë objektivat në dispozicion. Shtesat e aktivizuara në rregull dhe klauzolat e përputhjes mund të ndikojnë gjithashtu në disponueshmërinë e objektivave.
Kërcimi te zinxhirët e përcaktuar nga përdoruesi
Ekziston gjithashtu një klasë e veçantë e objektivit jo-përfundues: objektivi i kërcimit. Objektivat e kërcimit janë veprime që rezultojnë në kalimin e vlerësimit në një zinxhir tjetër për përpunim shtesë. Ne kemi mbuluar zinxhirët e integruar të cilët janë të lidhur me grepa netfilter
që i thërrasin ato. Megjithatë, iptables
gjithashtu i lejon administratorët të krijojnë zinxhirët e tyre për qëllime organizative.
Rregullat mund të vendosen në zinxhirë të përcaktuar nga përdoruesi në të njëjtën mënyrë që mund të vendosen në zinxhirë të integruar. Dallimi është se zinxhirët e përcaktuar nga përdoruesi mund të arrihen vetëm duke\kërcyer tek ata nga një rregull (ato nuk janë të regjistruar vetë me një grep netfilter
).
Zinxhirët e përcaktuar nga përdoruesi veprojnë si zgjatime të zinxhirit që i thirri ato. Për shembull, në një zinxhir të përcaktuar nga përdoruesi, vlerësimi do të kalojë përsëri në zinxhirin thirrës nëse arrihet fundi i listës së rregullave ose nëse një objektiv RETURN
aktivizohet nga një rregull që përputhet. Vlerësimi gjithashtu mund të kalojë në zinxhirë shtesë të përcaktuar nga përdoruesi.
Ky konstrukt lejon organizim më të madh dhe siguron kuadrin e nevojshëm për degëzim më të fortë.
IPTables dhe Ndjekja e Lidhjeve
Ne prezantuam sistemin e gjurmimit të lidhjes të zbatuar në krye të kornizës netfilter
kur diskutuam tabelën raw
dhe kriteret e përputhjes së gjendjes së lidhjes. Gjurmimi i lidhjes lejon iptables
të marrin vendime në lidhje me paketat e shikuara në kontekstin e një lidhjeje të vazhdueshme. Sistemi i gjurmimit të lidhjeve ofron iptables
me funksionalitetin që i nevojitet për të kryer operacione stateful.
Ndjekja e lidhjes zbatohet shumë shpejt pasi paketat hyjnë në pirgun e rrjetit. Zinxhirët e tabelave raw
dhe disa kontrolle të arsyeshme janë logjika e vetme që kryhet në paketa përpara se të lidhen paketat me një lidhje.
Sistemi kontrollon çdo paketë kundrejt një sërë lidhjesh ekzistuese. Ai do të përditësojë gjendjen e lidhjes në dyqanin e tij nëse nevojitet dhe do të shtojë lidhje të reja në sistem kur është e nevojshme. Paketat që janë shënuar me objektivin NOTRACK
në një nga zinxhirët raw
do të anashkalojnë rutinat e gjurmimit të lidhjes.
Shtetet e disponueshme
Lidhjet e gjurmuara nga sistemi i gjurmimit të lidhjeve do të jenë në një nga gjendjet e mëposhtme:
E RE
: Kur arrin një paketë që nuk është e lidhur me një lidhje ekzistuese, por nuk është e pavlefshme si paketë e parë, një lidhje e re do t'i shtohet sistemit me këtë emërtim. Kjo ndodh si për protokollet e ndërgjegjshëm për lidhjen, si TCP, ashtu edhe për protokollet pa lidhje si UDP.KRIJUAR
: Një lidhje ndryshohet ngaE RE
nëESABLISHED
kur merr një përgjigje të vlefshme në drejtim të kundërt. Për lidhjet TCP, kjo do të thotë njëSYN/ACK
dhe për trafikun UDP dhe ICMP, kjo do të thotë një përgjigje ku ndërrohet burimi dhe destinacioni i paketës origjinale.LIDHUR
: Paketat që nuk janë pjesë e një lidhjeje ekzistuese, por janë të lidhura me një lidhje tashmë në sistem, emërtohenLIDHUR
. Kjo mund të nënkuptojë një lidhje ndihmëse, siç është rasti me lidhjet e transmetimit të të dhënave FTP, ose mund të jenë përgjigjet ICMP ndaj përpjekjeve për lidhje nga protokolle të tjera.INVALID
: Paketat mund të shënohenINVALID
nëse nuk janë të lidhura me një lidhje ekzistuese dhe nuk janë të përshtatshme për hapjen e një lidhjeje të re, nëse nuk mund të identifikohen, ose nëse ato nuk janë të kalueshme midis arsyeve të tjera.Të PAGJURMËRUARA
: Paketat mund të shënohen siTË PAGJURMËRUARA
nëse ato janë shënjestruar në një zinxhir tabeleraw
për të anashkaluar gjurmimin.SNAT
: Ky është një gjendje virtuale e vendosur kur adresa e burimit është ndryshuar nga operacionet NAT. Kjo përdoret nga sistemi i gjurmimit të lidhjeve në mënyrë që të dijë të ndryshojë adresat e burimit përsëri në paketat e përgjigjes.DNAT
: Ky është një gjendje virtuale e vendosur kur adresa e destinacionit është ndryshuar nga operacionet NAT. Kjo përdoret nga sistemi i gjurmimit të lidhjeve, në mënyrë që të dijë të ndryshojë adresën e destinacionit kur ruan paketat e përgjigjes.
Gjendjet e gjurmuara në sistemin e gjurmimit të lidhjeve lejojnë administratorët të krijojnë rregulla që synojnë pika specifike gjatë jetës së një lidhjeje. Kjo siguron funksionalitetin e nevojshëm për rregulla më të plota dhe të sigurta.
konkluzioni
Korniza e filtrimit të paketave netfilter
dhe muri i zjarrit iptables
janë baza për shumicën e zgjidhjeve të murit të zjarrit në serverët Linux. Gërshetat e kernelit netfilter
janë mjaft afër grupit të rrjetit për të siguruar kontroll të fuqishëm mbi paketat ndërsa ato përpunohen nga sistemi. Muri i zjarrit iptables
shfrytëzon këto aftësi për të ofruar një metodë fleksibël dhe të zgjerueshme për komunikimin e kërkesave të politikave në kernel. Duke mësuar se si këto pjesë përshtaten së bashku, ju mund t'i përdorni më mirë ato për të kontrolluar dhe siguruar mjediset e serverit tuaj.
Nëse dëshironi të dini më shumë se si të zgjidhni politikat efektive të iptables
, shikoni këtë udhëzues.
Këta udhëzues mund t'ju ndihmojnë të filloni zbatimin e rregullave tuaja të murit të zjarrit iptables
:
- Si të konfiguroni një mur zjarri duke përdorur Iptables
- Iptables Essentials: Rregullat dhe komandat e zakonshme të murit të zjarrit
- Si të konfiguroni një mur zjarri me UFW në Ubuntu 22.04
- Si të konfiguroni një mur zjarri duke përdorur murin e zjarrit në Rocky Linux 8
- Si të konfiguroni një mur zjarri Iptables për të mbrojtur trafikun ndërmjet serverëve tuaj