Si të konfiguroni një mur zjarri duke përdorur Iptables në Ubuntu 14.04


Prezantimi

Vendosja e një muri të mirë zjarri është një hap thelbësor për të marrë në sigurimin e çdo sistemi operativ modern. Shumica e shpërndarjeve Linux dërgohen me disa mjete të ndryshme të murit të zjarrit që mund t'i përdorim për të konfiguruar muret tona të zjarrit. Në këtë udhëzues, ne do të mbulojmë murin e zjarrit iptables.

Iptables është një mur zjarri standard i përfshirë në shumicën e shpërndarjeve Linux si parazgjedhje (një variant modern i quajtur nftables do të fillojë ta zëvendësojë atë). Në të vërtetë është një pjesë e përparme e grepave të netfilterit të nivelit të kernelit që mund të manipulojnë grupin e rrjetit Linux. Ai funksionon duke përputhur çdo paketë që kalon ndërfaqen e rrjetit me një sërë rregullash për të vendosur se çfarë të bëni.

Në udhëzuesin e mëparshëm, mësuam se si funksionojnë rregullat iptables për të bllokuar trafikun e padëshiruar. Në këtë udhëzues, ne do të kalojmë në një shembull praktik për të demonstruar se si të krijoni një grup rregullash bazë për një server Ubuntu 14.04. Firewall-i që rezulton do të lejojë trafikun SSH dhe HTTP.

Shënim: Ky udhëzues mbulon sigurinë IPv4. Në Linux, siguria IPv6 ruhet veçmas nga IPv4. Për shembull, \iptables ruan vetëm rregullat e murit të zjarrit për adresat IPv4, por ka një homolog IPv6 të quajtur \ip6tables, i cili mund të përdoret për të ruajtur rregullat e murit të zjarrit për adresat e rrjetit IPv6.

Nëse VPS-ja juaj është e konfiguruar për IPv6, mos harroni të siguroni ndërfaqet e rrjetit IPv4 dhe IPv6 me mjetet e duhura. Për më shumë informacion rreth mjeteve IPv6, referojuni këtij udhëzuesi: Si të konfiguroni mjetet për të përdorur IPv6 në një Linux VPS

Parakushtet

Përpara se të filloni të përdorni këtë tutorial, duhet të keni një llogari të veçantë superpërdoruesi jo-root—një përdorues me privilegje sudo—të konfiguruar në serverin tuaj. Nëse duhet ta konfiguroni këtë, ndiqni këtë udhëzues: Konfigurimi fillestar i serverit me Ubuntu 14.04.

Komandat themelore të iptables

Tani që i keni kuptuar mirë konceptet iptables, ne duhet të mbulojmë komandat bazë që do të përdoren për të formuar grupe rregullash komplekse dhe për të menaxhuar ndërfaqen iptables në përgjithësi.

Së pari, duhet të jeni të vetëdijshëm se komandat iptables duhet të ekzekutohen me privilegje rrënjësore. Kjo do të thotë që ju duhet të identifikoheni si rrënjë, të përdorni su ose sudo -i për të fituar një guaskë rrënjë, ose t'i paraprini të gjitha komandave me sudo. Ne do të përdorim sudo në këtë udhëzues pasi kjo është metoda e preferuar në një sistem Ubuntu.

Një pikënisje e mirë është të listoni rregullat aktuale që janë konfiguruar për iptables. Ju mund ta bëni këtë me flamurin -L:

  1. sudo iptables -L
Output:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

Siç mund ta shihni, ne kemi tre zinxhirët tanë të paracaktuar (INPUT, OUTPUT dhe FORWARD). Ne gjithashtu mund të shohim politikën e paracaktuar të secilit zinxhir (çdo zinxhir ka ACCEPT si politikën e tij të paracaktuar). Ne shohim gjithashtu disa tituj kolonash, por nuk shohim ndonjë rregull aktual. Kjo është për shkak se Ubuntu nuk dërgohet me një grup rregullash të paracaktuar.

Ne mund ta shohim daljen në një format që pasqyron komandat e nevojshme për të aktivizuar çdo rregull dhe politikë duke përdorur në vend të kësaj flamurin -S:

  1. sudo iptables -S
Output:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT

Për të përsëritur konfigurimin, do të na duhet vetëm të shkruajmë sudo iptables të ndjekur nga secila prej rreshtave në dalje. (Në varësi të konfigurimit, në fakt mund të jetë pak më e ndërlikuar nëse jemi të lidhur nga distanca në mënyrë që të mos krijojmë një politikë të paracaktuar të heqjes përpara se rregullat të jenë në fuqi për të kapur dhe lejuar lidhjen tonë aktuale.)

Nëse ke keni rregulla në fuqi dhe dëshironi t'i anuloni ato dhe të filloni nga e para, mund t'i pastroni rregullat aktuale duke shkruar:

  1. sudo iptables -F

Edhe një herë, politika e paracaktuar është e rëndësishme këtu, sepse, ndërsa të gjitha rregullat janë fshirë nga zinxhirët tuaj, politika e paracaktuar nuk do të ndryshojë me këtë komandë. Kjo do të thotë që nëse jeni i lidhur nga distanca, duhet të siguroheni që politika e parazgjedhur në zinxhirët tuaj INPUT dhe OUTPUT të jetë vendosur në ACCEPT përpara se të pastroni rregullat tuaja. Ju mund ta bëni këtë duke shtypur:

  1. sudo iptables -P INPUT ACCEPT
  2. sudo iptables -P OUTPUT ACCEPT
  3. sudo iptables -F

Më pas mund ta ndryshoni politikën e paracaktuar të rënies në DROP pasi të keni vendosur rregulla që lejojnë në mënyrë eksplicite lidhjen tuaj. Ne do të shqyrtojmë se si ta bëjmë këtë në një moment.

Bëni rregullin tuaj të parë

Ne do të fillojmë të ndërtojmë politikat tona të murit të zjarrit. Siç thamë më lart, ne do të punojmë me zinxhirin INPUT pasi që është gypi nëpër të cilin do të dërgohet trafiku në hyrje. Ne do të fillojmë me rregullin për të cilin kemi folur pak më lart: rregulli që pranon në mënyrë eksplicite lidhjen tuaj aktuale SSH.

Rregulli i plotë që na nevojitet është ky:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Kjo mund të duket tepër e ndërlikuar, por shumica e saj do të ketë kuptim kur të shqyrtojmë komponentët:

  • -A INPUT: Flamuri -A shton një rregull në fund të një zinxhiri. Kjo është pjesa e komandës që i thotë iptables se ne dëshirojmë të shtojmë një rregull të ri, që duam që ai rregull të shtohet në fund të zinxhirit dhe se zinxhiri me të cilin duam të operojmë është zinxhiri INPUT.
  • -m conntrack: iptables ka një grup funksionesh thelbësore, por gjithashtu ka një grup shtesash ose modulesh që ofrojnë aftësi shtesë. Në këtë pjesë të komandës, ne po deklarojmë se dëshirojmë të kemi akses në funksionalitetin e ofruar nga moduli conntrack. Ky modul jep akses në komandat që mund të përdoren për të marrë vendime bazuar në marrëdhëniet e paketës me lidhjet e mëparshme.
  • –ctstate: Kjo është një nga komandat e disponueshme duke thirrur modulin conntrack. Kjo komandë na lejon të përputhim paketat bazuar në mënyrën se si ato lidhen me paketat që kemi parë më parë. I kalojmë vlerën ESTABLISHED për të lejuar paketat që janë pjesë e një lidhjeje ekzistuese. Ne i kalojmë vlerën RELATED për të lejuar paketat që lidhen me një lidhje të vendosur. Kjo është pjesa e rregullit që përputhet me sesionin tonë aktual SSH.
  • -j PRANOJ: Kjo specifikon objektivin e paketave që përputhen. Këtu, ne i themi iptables se paketat që përputhen me kriteret e mëparshme duhet të pranohen dhe të lejohen.

Ne e vendosëm këtë rregull në fillim, sepse duam të sigurohemi që lidhjet që po përdorim tashmë të përputhen, pranohen dhe tërhiqen nga zinxhiri përpara se të arrijmë ndonjë rregull DROP.

Ne mund t'i shohim ndryshimet nëse rendisim rregullat:

  1. sudo iptables -L
Output:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

Tani që e dini sintaksën e përgjithshme, le të vazhdojmë duke shtuar disa raste të tjera ku duam të pranojmë lidhjen.

Pranoni lidhje të tjera të nevojshme

Ne i kemi thënë iptables të mbajnë hapur çdo lidhje që është tashmë e hapur dhe të lejojë lidhje të reja që lidhen me ato lidhje. Megjithatë, ne duhet të krijojmë disa rregulla për të vendosur kur duam të pranojmë lidhje të reja që nuk i plotësojnë ato kritere.

Ne duam të mbajmë dy porte të hapura në mënyrë specifike. Ne duam ta mbajmë portën tonë SSH të hapur (në këtë udhëzues do të supozojmë se kjo është 22 e paracaktuar. Nëse e keni ndryshuar këtë në konfigurimin tuaj SSH, modifikoni vlerën tuaj këtu). Ne gjithashtu do të supozojmë se ky kompjuter po ekzekuton një server në internet në portën e paracaktuar 80. Nëse nuk është kështu për ju, nuk keni pse ta shtoni atë rregull.

Dy rreshtat që do të përdorim për të shtuar këto rregulla janë:

  1. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Siç mund ta shihni, këto janë shumë të ngjashme me rregullin tonë të parë, por ndoshta më të thjeshtë. Opsionet e reja janë:

  • -p tcp: Ky opsion përputhet me paketat nëse protokolli që përdoret është TCP. Ky është një protokoll i bazuar në lidhje që do të përdoret nga shumica e aplikacioneve sepse lejon komunikim të besueshëm.
  • –dport: Ky opsion është i disponueshëm nëse jepet flamuri -p tcp. Ai jep një kërkesë të mëtejshme për përputhjen e portit të destinacionit për paketën që përputhet. Rregulli i parë përputhet për paketat TCP të destinuara për portin 22, ndërsa rregulli i dytë përputhet me trafikun TCP të drejtuar drejt portit 80.

Ekziston edhe një rregull tjetër pranimi që duhet të sigurohemi që serveri ynë të funksionojë siç duhet. Shpesh, shërbimet në kompjuter komunikojnë me njëri-tjetrin duke dërguar paketa rrjeti tek njëri-tjetri. Ata e bëjnë këtë duke përdorur një ndërfaqe pseudo rrjeti të quajtur pajisja loopback, e cila drejton trafikun mbrapsht tek vetvetja dhe jo te kompjuterët e tjerë.

Pra, nëse një shërbim dëshiron të komunikojë me një shërbim tjetër që po dëgjon për lidhje në portin 4555, ai mund të dërgojë një paketë në portin 4555 të pajisjes loopback. Ne duam që kjo lloj sjelljeje të lejohet, sepse është thelbësore për funksionimin korrekt të shumë programeve.

Rregulli që duhet të shtojmë është ky:

  1. sudo iptables -I INPUT 1 -i lo -j ACCEPT

Kjo duket paksa ndryshe nga komandat tona të tjera. Le të shohim se çfarë po bën:

  • -I INPUT 1: Flamuri -I u thotë iptables të fusin një rregull. Ky është i ndryshëm nga flamuri -A i cili shton një rregull në fund. Flamuri -I merr një zinxhir dhe pozicionin e rregullit ku dëshironi të futni rregullin e ri. Në këtë rast, ne po e shtojmë këtë rregull si rregullin e parë të zinxhirit INPUT. Kjo do të rrëzojë pjesën tjetër të rregullave. Ne e duam këtë në krye, sepse është thelbësore dhe nuk duhet të ndikohet nga rregullat e mëvonshme.
  • -i lo: Ky komponent i rregullit përputhet nëse ndërfaqja që po përdor paketa është ndërfaqja \lo. Ndërfaqja \lo është një emër tjetër për pajisjen loopback. Kjo do të thotë që çdo paketë që përdor atë ndërfaqe për të komunikuar (paketat e krijuara në serverin tonë, për serverin tonë) duhet të pranohet.

Për të parë rregullat tona aktuale, duhet të përdorim flamurin -S. Kjo për shkak se flamuri -L nuk përfshin disa informacione, si ndërfaqja me të cilën lidhet një rregull, e cila është një pjesë e rëndësishme e rregullit që sapo shtuam:

  1. sudo iptables -S
Output:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Zbatimi i një rregulli të rënies

Tani kemi katër rregulla të veçanta që pranojnë në mënyrë eksplicite paketa bazuar në kritere të caktuara. Megjithatë, muri ynë i zjarrit aktualisht nuk po bllokon asgjë.

Nëse një paketë hyn në zinxhirin INPUT dhe nuk përputhet me një nga katër rregullat që kemi bërë, ajo kalon në politikën tonë të paracaktuar, që është pranimi i paketës gjithsesi. Ne duhet ta ndryshojmë këtë.

Ka dy mënyra të ndryshme që ne mund ta bëjmë këtë, me disa dallime mjaft të rëndësishme.

Mënyra e parë se si mund ta bëjmë këtë është të modifikojmë politikën e paracaktuar të zinxhirit tonë INPUT. Këtë mund ta bëjmë duke shtypur:

  1. sudo iptables -P INPUT DROP

Kjo do të kapë çdo paketë që bie përmes zinxhirit tonë INPUT dhe do t'i lëshojë ato. Kjo është ajo që ne e quajmë një politikë e lëshimit të paracaktuar. Një nga implikimet e këtij lloji të një dizajni është se ai bie përsëri në hedhjen e paketave nëse rregullat janë flush.

Kjo mund të jetë më e sigurt, por gjithashtu mund të ketë pasoja serioze nëse nuk keni një mënyrë tjetër për të hyrë në serverin tuaj. Me DigitalOcean, ju mund të identifikoheni përmes tastierës sonë të internetit për të hyrë në serverin tuaj nëse kjo ndodh. Konsola në internet vepron si një lidhje virtuale lokale, kështu që rregullat iptables nuk do të ndikojnë në të.

Ju mund të dëshironi që serveri juaj të heqë automatikisht të gjitha lidhjet në rast se rregullat janë hedhur poshtë. Kjo do të parandalonte që serveri juaj të lihej i hapur. Kjo gjithashtu do të thotë që ju mund t'i bashkëngjitni lehtësisht rregullave në fund të zinxhirit, ndërkohë që ende hidhni paketa sipas dëshirës tuaj.

Qasja alternative është të mbash politikën e paracaktuar për zinxhirin si prano dhe të shtosh një rregull që hedh çdo paketë të mbetur në fund të vetë zinxhirit.

Nëse keni ndryshuar politikën e parazgjedhur për zinxhirin INPUT më lart, mund ta riktheni atë për ta ndjekur duke shkruar:

  1. sudo iptables -P INPUT ACCEPT

Tani, mund të shtoni një rregull në fund të zinxhirit që do të heqë paketat e mbetura:

  1. sudo iptables -A INPUT -j DROP

Rezultati në kushte normale funksionimi është saktësisht i njëjtë me një politikë të paracaktuar të rënies. Ky rregull funksionon duke përputhur çdo paketë të mbetur që e arrin atë. Kjo parandalon që një paketë ndonjëherë të bjerë deri në fund të zinxhirit për të arritur politikën e paracaktuar.

Në thelb, kjo përdoret për të mbajtur politikën e paracaktuar për të pranuar trafikun. Në këtë mënyrë, nëse ka ndonjë problem dhe rregullat janë shpëlarë, ju do të jeni ende në gjendje të hyni në makinë përmes rrjetit. Kjo është një mënyrë për të zbatuar një veprim të paracaktuar pa ndryshuar politikën që do të zbatohet në një zinxhir bosh.

Sigurisht, kjo do të thotë gjithashtu se çdo rregull që çdo rregull shtesë që dëshironi të shtoni në fund të zinxhirit do të duhet të shtohet përpara rregullit të rënies. Ju mund ta bëni këtë ose duke hequr përkohësisht rregullin e rënies:

  1. sudo iptables -D INPUT -j DROP
  2. sudo iptables -A INPUT new_rule_here
  3. sudo iptables -A INPUT -j DROP

Ose, mund të futni rregullat që ju nevojiten në fund të zinxhirit (por para rënies) duke specifikuar numrin e linjës. Për të futur një rregull në rreshtin numër 4, mund të shkruani:

  1. sudo iptables -I INPUT 4 new_rule_here

Nëse keni vështirësi të dini se cili numër rreshti është secili rregull, mund t'i tregoni iptables të numërojë rregullat duke shtypur:

  1. sudo iptables -L --line-numbers
Output:
Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere 2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 4 ACCEPT tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

Kjo mund të jetë e dobishme për t'u siguruar që po e shtoni rregullin tuaj në pozicionin e duhur.

Rregullat e listimit dhe fshirjes së Iptables

Nëse dëshironi të mësoni detaje rreth renditjes dhe fshirjes së rregullave të iptables, shikoni këtë tutorial: Si të listoni dhe fshini rregullat e murit të zjarrit të Iptables.

Ruajtja e konfigurimit tuaj të Iptables

Si parazgjedhje, rregullat që shtoni në iptables janë kalimtare. Kjo do të thotë që kur rinisni serverin tuaj, rregullat tuaja iptables do të zhduken.

Ky është në të vërtetë një veçori për disa përdorues, sepse u jep atyre një rrugë për t'u rikthyer nëse ata janë mbyllur aksidentalisht nga serveri. Megjithatë, shumica e përdoruesve do të duan një mënyrë për të ruajtur automatikisht rregullat që keni krijuar dhe për t'i ngarkuar ato kur të fillojë serveri.

Ka disa mënyra për ta bërë këtë, por mënyra më e lehtë është me paketën iptables-persistent. Ju mund ta shkarkoni këtë nga depot e paracaktuara të Ubuntu:

  1. sudo apt-get update
  2. sudo apt-get install iptables-persistent

Gjatë instalimit, do t'ju kërkohet nëse dëshironi të ruani rregullat tuaja aktuale për t'u ngarkuar automatikisht. Nëse jeni të kënaqur me konfigurimin tuaj aktual (dhe keni testuar aftësinë tuaj për të krijuar lidhje të pavarura SSH, mund të zgjidhni të ruani rregullat tuaja aktuale.

Gjithashtu do t'ju pyesë nëse dëshironi të ruani rregullat IPv6 që keni konfiguruar. Këto janë konfiguruar përmes një programi të veçantë të quajtur ip6tables i cili kontrollon rrjedhën e paketave IPv6 pothuajse në të njëjtën mënyrë.

Pasi të përfundojë instalimi, do të keni një shërbim të ri të quajtur iptables-persistent që është konfiguruar të funksionojë në nisje. Ky shërbim do të ngarkojë në rregullat tuaja dhe do t'i zbatojë ato kur serveri të fillojë.

Ruajtja e përditësimeve

Nëse ndonjëherë përditësoni murin e zjarrit dhe dëshironi të ruani ndryshimet, duhet të ruani rregullat e iptables që ato të jenë të qëndrueshme.

Ruani rregullat e firewall-it tuaj me këtë komandë:

  1. sudo invoke-rc.d iptables-persistent save

konkluzioni

Tani duhet të keni një pikënisje të mirë për të zhvilluar një mur zjarri që adreson nevojat tuaja. Ka shumë shërbime të tjera të murit të zjarrit dhe disa që mund të jenë më të lehta, por iptables është një mjet i mirë mësimor, qoftë edhe vetëm sepse ekspozon një pjesë të strukturës së filtrit të rrjetit dhe sepse është i pranishëm në shumë sisteme.

Për të mësuar më shumë rreth sigurimit të rrjetit tuaj me iptables, shikoni këto udhëzime:

  • Si të zbatoni një shabllon bazë të murit të zjarrit me Iptables në Ubuntu 14.04
  • Iptables Essentials: Rregullat dhe komandat e zakonshme të murit të zjarrit
  • Si të konfiguroni një mur zjarri Iptables për të mbrojtur trafikun ndërmjet serverëve tuaj
  • Një zhytje e thellë në arkitekturën e Iptables dhe Netfilter
  • Si të testoni konfigurimin e murit të zjarrit me Nmap dhe Tcpdump