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 grepa NF_IP_PRE_ROUTING.
  • INPUT: Aktivizohet nga grepa NF_IP_LOCAL_IN.
  • PERPARA: Aktivizohet nga grepi NF_IP_FORWARD.
  • OUTPUT: Aktivizohet nga grepi NF_IP_LOCAL_OUT.
  • POSTROUTING: Aktivizohet nga grepa NF_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 PREROUTINGraw tabelat , mangle dhe nat. Më pas do të përshkojë zinxhirët INPUTmangle, 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 nga E REESABLISHED 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ërtohen LIDHUR. 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ënohen INVALID 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 si TË PAGJURMËRUARA nëse ato janë shënjestruar në një zinxhir tabele raw 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