IPTables firewall – praktikum – Deo I

U računarstvu, firewall je mrežni sigurnosni sistem koji nadgleda i kontroliše dolazeći i odlazeći mrežni saobraćaj na osnovu unapred utvrđenih sigurnosnih pravila. Firewall formira barijeru kroz koju mrežni saobraćaj, iz oba smera, mora da prođe. Sigurnosna politika firewall-a diktira koji mrežni saobraćaj ima ovlašćenje da prođe a koji ne. Firewall može biti dizajniran da radi na nivou IP paketa ili na višim nivoima protokola.

IPTables

IPTables je korisnički aplikacioni program koji omogućava konfiguraciju tabela firewall-a jezgra Linuxa, kao i održavanje lanaca i pravila. IPTables funkcioniše tako što upoređuje mrežni saobraćaj sa skupom pravila. Kroz pravila se definišu karakteristike koje paket mora da ima kako bi se složio sa pravilom i akcijom koja će se odigrati ukoliko dođe do slaganja paketa sa definisanim pravilom. Postoji mnogo opcija putem kojih se definišu pravila. Može se, na primer, postaviti pravilo koje će da proverava protokol paketa, izvornu ili odredišnu adresu ili port paketa, interfejs koji se koristi, relaciju paketa sa prethodnim paketima, itd.

Kada se definisani obrazac poklapa, tj. kada se paket složi sa definisanim pravilom, akcija koja nakon toga nastupa se naziva „target“ ili cilj. Cilj može biti konačna odluka za dati paket, poput prihvatanja ili odbacivanja paketa. Takođe, može prebaciti paket na drugi lanac za procesiranje ili jednostavno zabeležiti dolazak.

Pravila su organizovana u grupe nazvane lanci. Lanac je skup pravila nad kojima je paket testiran sekvencijalno. Kada se paket poklopi sa nekim pravilom biva izvršena akcija asocirana sa datim pravilom i ostala pravila u nizu se ne proveravaju.

Lanac može biti podrazumevan ili korisnički definisan. Postoje tri podrazumevana lanca i ona su:

  • INPUT – ovaj lanac rukuje sa svim paketima koji su adresirani za naš računar,
  • OUTPUT – ovaj lanac sadrži pravila za saobraćaj kreiran našim računarom,
  • FORWARD – ovaj lanac se koristi kako bi se suočio sa saobraćajem namenjenim ostalim računarima koji nisu kreirani našim računarom i u osnovi predstavlja način da se naš računar konfiguriše da preusmeri zahteve ostalim mašinama.

Svaki lanac može sadržati nula ili više pravila i ima podrazumevanu politiku. Politika određuje šta se dešava kada paket prođe kroz sva pravila u lancu a ne poklopi se ni sa jednim. Ukoliko dođe do toga da se paket ne podudari ni sa jednim pravilom, paket se može odbaciti ili prihvatiti.

Na slici je prikazan način prolaženja kroz pravila lanaca i podlanaca.

Postoji mogućnost da IPTables prati veze kroz modul koji može biti učitan pomoću pravila. Ovo znači da je moguće kreirati pravilo koje definiše šta će se desiti ukoliko je paket baziran na nekoj relaciji sa prethodnim paketom što se naziva „mogućnost praćenja stanja“.

Netfilter firewall koji je uključen u Linux jezgro posmatra IPv4 i IPv6 saobraćaj potpuno odvojeno. Isto tako, alati pomoću kojih manipulišemo tabelama koje sadrže firewall pravila su takođe različita za IPv4 i IPv6. Regularna IPTables komanda se koristi za manipulaciju tabela koje sadrže pravila koja upravljaju IPv4 saobraćajem, dok se za IPv6 saobraćaj koristi komanda ip6tables. Ovo znači da pravila postavljena sa komandom iptables neće imati uticaja na pakete koje koriste verziju 6 protokola.

Redosled pravila u svakom lancu je bitan. Paket ne sme naići na opštije pravilo pre specifičnijeg pravila. Iz ovog razloga, pravila pri vrhu lanca bi trebalo da imaju veći nivo specifičnosti u odnosu na pravila pri dnu lanca. Paketi bi trebalo da imaju mogućnost da se prvo poklope sa specifičnim pravilima, a zatim da se obezbedi njihovo poklapanje sa opštijim pravilima koji obuhvataju šire obrasce. Ukoliko se paket ne poklopi ni sa jednim pravilom onda će se poklopiti sa najopštijim pravilom a to je podrazumevana politika.

Putanja kroz tabele i lance

Kada paket prvo ulazi u firewall, dolazi do hardvera a zatim se prosleđuje odgovarajućem drajveru u jezgru operativnog sistema. Nakon toga, paket prolazi kroz niz koraka u jezgru pre nego što se prosledi odgovarajućoj aplikaciji (lokalno) ili bude prosleđen nekom drugom uređaju.

Ukoliko je namenjen za naš računar, paket prolazi kroz sledeće korake pre nego što se isporuči aplikaciji koja ga prihvata:

  • raw PREROUTING – ovaj lanac se koristi za rukovanje paketima pre nego što praćenje veze započne, može se koristiti i kako bi se za određenu vezu specificiralo da li je potrebno da bude rukovana od strane koda za praćenje veze ili ne,
  • mangle PREROUTING – ovaj lanac se obično koristi za izmenu polja paketa (na primer TOS polja i slično),
  • nat PREROUTING – ovaj lanac se koristi uglavnom za DNAT i poželjno je izbegavati filtriranje u ovom lancu,
  • mangle INPUT – ovaj lanac se koristi za izmenu paketa nakon njihovog rutiranja, a pre nego što su zapravo prosleđeni procesu na računaru,
  • filter INPUT – ovo je lanac za filtriranje svog dolazećeg saobraćaja namenjenog našem lokalnom računaru i svi dolazeći paketi, određeni za lokalni računar, prolaze kroz ovaj lanac bez obzira na interfejs sa kojeg doloze.

Kada je reč o odlazećem paketu sa našeg lokalnog računara, nastupaju sledeći koraci:

  • raw OUTPUT – u ovom lancu se definišu pravila kod kojih praćenje veze još uvek nije otpočelo za lokalno generisane pakete (mogu se, na primer, označiti veze tako da ne budu praćene),
  • mangle OUTPUT – u okviru ovog lanca se vrše izmene paketa ali se ne preporučuje filtriranje paketa jer to može imati negativne posledice,
  • nat OUTPUT – ovaj lanac se može koristiti za NAT-ovanje odlazećih paketa,
  • filter OUTPUT – u okviru ovog lanca se vrši filtriranje paketa koji odlaze sa našeg računara,
  • mangle POSTROUTING – ovaj lanac, u mangle tabeli, se uglavnom koristi kada želimo da izmenimo paket pre nego što napusti lokalni računar a nakon stvarne odluke rutiranja,
  • nat POSTROUTING – u okviru ovog lanca se vrši SNAT-ovanje, nije preporučeno filtriranje jer to može imati negativne posledice.

Ukoliko pretpostavimo da je paket namenjen za neki drugi računar na mreži, onda će proći kroz sledeće korake:

  • raw PREROUTING – u okviru ovog lanca se može podesiti veza tako da bude rukovana od strane sistema za praćenje veza,
  • mangle PREROUTING – ovaj lanac se obično koristi za izmenu polja paketa (na primer TOS polja i slično),
  • nat PREROUTING – ovaj lanac se uglavnom koristi za DNAT i ne preporučuje se filtriranje paketa jer to može imati negativne posledice,
  • mangle FORWARD – ovaj lanac se može koristiti za veoma specifične potrebe, ukoliko se na primer vrše izmene paketa nakon inicijalne odluke rutiranja ali pre nego što se donese konačna odluka o rutiranju i pre slanja paketa,
  • filter FORWARD – u okviru ovog lanca prolaze samo prosleđeni paketi i u okviru ovog lanca se vrše sva filtriranja,
  • mangle POSTROUTING – ovo je lanac koji se koristi za specifične tipove izmene paketa koje želimo da izmenimo nakon svih odluka rutiranja,
  • nat POSTROUTING – ovaj lanac bi pre svega trebalo da se koristi za SNAT, a neophodno je izbegavati filtriranje u okviru ovog lanca zato što određeni paketi mogu preskočiti ovaj lanac.

Ako bismo napravili mapu za ove putanje izgledala bi otprilike ovako:

Ukoliko pre prve odluke rutiranja paket nije predodređen za naš lokalni računar, onda će biti rutiran kroz FORWARD lanac. Ukoliko je paket ipak predodređen za našu IP adresu onda će biti poslat kroz INPUT lanac. Takođe, treba imati u vidu slučaj gde je paket predodređen za naš računar ali se tokom PREROUTING lanaca odredišna adresa promeni radeći NAT-ovanje. S obzirom na to da se ova promena izvršava pre prve odluke rutiranja, paketi će biti provereni nakon ove promene. Iz ovog razloga, rutiranje je moguće da se promeni pre nego što je odluka o rutiranju donešena.

Svi paketi će proći kroz neki od prethodno navedenih lanaca. Ukoliko DNAT-ujemo paket na istu mrežu sa koje je došla, i dalje će putovati kroz ostale lance dok ne izađe na mrežu.

IPTables komande

Kako bismo mogli da izvršavamo IPTables komande potreban nam je korisnički nalog sa superuser privilegijama.

Kucajući komandu:

sudo iptables -L

izlistavaju se trenutna pravila u IPTables-u. Međutim, treba imati u vidu da, ukoliko je server tek podešen, neće biti pravila za prikazivanje.

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination                 
DOCKER-ISOLATION  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

Chain DOCKER (2 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Kako bi se proverila pravila za IPv6 saobraćaj koristi se komanda:

sudo ip6tables -L

$ sudo ip6tables -L
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   

Kao što je prikazano na izlazima, IPTables pravila za IPv4 i IPv6 saobraćaj su potpuno različita.

Ukoliko umesto opcije -L koristimo opciju -S, biće nam prikazane komande neophodne da se omogući svako pravilo ili politika.

Ukoliko želimo da napravimo istu konfiguraciju, sve što je neophodno da uradimo jeste da pokrenemo komandu sudo iptables iza koje sledi svaka linija u izlazu:

$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-bd0717dd290d -j DOCKER
-A FORWARD -o br-bd0717dd290d -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-bd0717dd290d ! -o br-bd0717dd290d -j ACCEPT
-A FORWARD -i br-bd0717dd290d -o br-bd0717dd290d -j ACCEPT
-A DOCKER-ISOLATION -i br-bd0717dd290d -o docker0 -j DROP
-A DOCKER-ISOLATION -i docker0 -o br-bd0717dd290d -j DROP
-A DOCKER-ISOLATION -j RETURN

Ukoliko je neophodno da se obrišu postojeća pravila i da se rad započne iznova, potrebno je uneti komandu:

sudo iptables -F

Podrazumevana politika je veoma važna, a posebno iz razloga što se prethodno navedenom komandom brišu samo pravila dok podrazumevana politika ostaje ista. Ukoliko je neko ulogovan sa udaljenog računara, trebalo bi, pre nego što izbriše pravila, da podesi podrazumevanu politiku INPUT i OUTPUT lanaca na ACCEPT kako ne bi izgubio vezu, a to se postiže komandama:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

Osnovne IPTables opcije

Neke od opcija IPTables komande su:

-A – dodaje pravilo na kraj lanca pravila,

-L – izlistava trenutna filter pravila,

-m conntrack – dozvoljava filter pravilima da se sparuju na osnovu stanja veze, dozvoljava upotrebu –ctstate opcije,

--ctstate – definiše listu stanja pravila sa kojim paket treba da se poklopi. Validna stanja su:

  • NEW – veza još uvek nije viđena,
  • RELATED – veza je nova, ali je povezana sa drugom vezom koja je već dozvoljena,
  • ESTABLISHED – konekcija je već uspostavljenja,
  • INVALID – saobraćaj se ne može identifikovati iz nekog razloga,

-m limit – zahteva da se pravilo poklapa samo ograničeni broj puta, dozvoljava korišćenje –limit opcije i korisno je za ograničavanje pravila koja se koriste za upisivanje u dnevnik,

--limit – maksimalno podudaranje, dato kao broj iza koga sledi „/second“, „/minute“, „/hour“, ili „/day“ u zavisnosti koliko često je potrebno da se to pravilo podudara. Međutim, ukoliko ova opcija nije korišćena a -m limit jeste, onda je podrazumevano „3/hour“,

-p – veza protokola koja se koristi

--dport – odredišni port ili portovi neophodni za ovo pravilo, a moguće je dati jedan port ili raspon portova u formatu start:end koji će poklopiti sve portove od start do end, inkluzivno,

-j – skače na specifični cilj (target). IPTables dozvoljava četiri cilja:

  • ACCEPT – prihvata paket i prestaje sa procesiranjem pravila u ovom lancu,
  • REJECT – odbija paket, obaveštava pošiljaoca da je došlo do odbijanja i prestaje se sa procesiranjem pravila u ovom lancu,
  • DROP – tiho ignoriše paket i prestaje sa procesiranjem pravila u ovom lancu,
  • LOG – unosi u dnevnik ovaj paket, nastavlja sa procesiranjem još pravila u ovom lancu i dozvoljava korišćenje –log-prefix i –log-level opcija:
    • --log-prefix – kada se upisuju paketi u dnevnik, staviće definisani tekst pre poruke za dnevnik (koriste se dvostruki navodnici),
    • --log-level – upisuje pakete u dnevnik sa specifičnim syslog nivoom,

-i – poklapa pravila ako paket dolazi sa specifičnog interfejsa,

-I – ubacuje pravilo kroz definisanje dve opcije – lanca u koji će se ubaciti pravilo i broja pravila, na primer:

  • -I INPUT 5 će ubaciti pravilo u INPUT lanac i staviće da bude peto pravilo u listi.

-v – prikazuje više informacija o izlazu i korisna je za pravila koja izgledaju slično ,

-s --source-adress[/mask] – specifikacija izvora,

-d --destination-address[/mask] – specifikacija odredišta,

-o --out-interface-output name[+] – ime interfejsa ([+] za džoker)

Dozvoljavanje uspostavljenih sesija

Uspostavljenim vezama je moguće dozvoliti da primaju saobraćaj sledećom komandom:

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

-A INPUT – ovaj deo komande govori IPTables da želimo da dodamo novo pravilo, da ovo pravilo želimo da dodamo na kraju lanca (opcija A dodaje pravilo kraju lanca) i da ovo primenjujemo na lancu INPUT,

-m conntrack – IPTables ima skup core funkcionalnosti ali i skup ekstenzija ili modula koje pružaju dodatne mogućnosti, a ovim delom komande definiše se da se želi pristupiti funkcionalnostima koje pruža conntrack modul (ovaj modul pruža komande koje se mogu koristiti za odluke vezane za relaciju paketa sa prethodnim paketima),

--ctstate – ovo je komanda koja je dozvoljena kada učitamo conntrack module i dopušta nam da poklopimo pakete u odnosu na pre već viđene pakete.

Postavljanjem vrednosti ESTABLISHED dozvoljavamo pakete koji su već deo postojeće veze. Slanjem vrednosti RELATED dozvoljavamo pakete koji su u relaciji sa već uspostavljenom vezom.

-j ACCEPT – specificira cilj poklapanja paketa i ovom komandom zadajemo IPTables-u da bi pakete koji se poklope sa kriterijumom trebalo prihvatiti i propustiti.

Dozvoljavanje dolazećeg saobraćaja na specifičnim portovima

Proces pravljenja firewall pravila moguće je započeti tako što će se blokirati sav saobraćaj ali je neophodno da se, iz razloga zato što se koristi SSH, dozvoli SSH pre nego što se blokira bilo šta drugo. Kako bi ste omogućio dolazeći saobraćaj na podrazumevanom portu za SSH, koji je 22, moguće je zadati komandu koja će dozvoliti sav TCP saobraćaj na tom portu:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT

Ukoliko je potrebno da se omogući sav dolazni saobraćaj na portu 80, to je moguće postići komandom:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

-p tcp – je opcija koja poklapa pakete kod kojih je korišćeni protokol TCP,

--dport – je opcija koja je dostupna ako je korišćena opcija -p tcp i pruža dodatne zahteve za poklpapanje odredišnog port-a datog paketa sa vrednošću datom ovom opcijom.

Dozvoljavanje dolazećeg saobraćaja na specifičnom interfejsu

Servisi na računaru često komuniciraju međusobno slanjem mrežnih paketa jedan drugome. Ova komunikacija vrši se korišćenjem pseudo mrežnog interfejsa zvanog loopback device, koji usmerava saobraćaj ponovo na isti računar. Pravilo koje je neophodno dodati za dozvoljavanje saobraćaja na loopback interefejsu je:

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

-I INPUT 1 – I opcija definiše da je pravilo potrebno umetnuti (umesto -A koje definiše da je pravilo potrebno staviti na kraju lanca) i kroz ovu opciju se definišu dva parametra a to su lanac i mesto u lancu gde je potrebno ubaciti pravilo (u ovom slučaju u lancu INPUT i na prvom mestu). Ova komanda će pomeriti sva pravila za po jedno mesto ispod zadate pozicije.

-i lo – ovaj deo pravila označava da je potrebno upariti paket sa pravilom ako je paket došao sa „lo“ interfejsa, odnosno loopback interfejsa.

Implementiranje drop pravila

Ukoliko paket uđe u INPUT lanac i ne poklopi se ni sa jednim pravilom onda će se odigrati podrazumevana politika lanca (u ovom slučaju je to da se prihvate paketi). Bilo bi poželjno promeniti ovu politiku lanca. Postoje dva načina da se izvrši navedena promena, sa veoma važnim razlikama.

Prvi način je da se izmeni podrazumevana politika našeg INPUT lanca, što se postiže komandom:

sudo iptables -P INPUT DROP

Ovakva promena će pokupiti sve pakete koji prođu kroz INPUT lanac i odbaciti ih. Jedna od posledica ovog pristupa jeste da će se odbacivati svi paketi ako izbrišemo sva pravila. Ovaj pristup je možda sigurniji ali može imati i ozbiljne posledice ukoliko ne postoji još neki način da se pristupi udaljenom serveru.

Alternativni pristup je da se ostavi da podrazumevana politika lanca prihvata sve pakete i da se na kraju lanca doda pravilo koje će odbacivati sve pakete.

Ovo se postiže komandama:

sudo iptables -P INPUT ACCEPT

koja postavlja podrazumevanu politiku lanca INPUT da prihvata i

sudo iptables -A INPUT -j DROP

koja poklapa svaki paket bez uslova i odbacuje.

Rezultat u normalnim uslovima rada je potpuno isti kao i podrazumevana politika odbacivanja.

Ovo znači da svako novo pravilo, koje se dodaje na kraju lanca, mora da se doda pre poslednjeg pravila odbacivanja, što se postiže na dva načina. Jedan je da se privremeno izbriše pravilo odbacivanja koristeći komande:

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT novo_pravilo
sudo iptables -A INPUT -j DROP

Drugi način je da se ubaci pravilo na kraju lanca ali ispred pravila odbacivanja, specifirajući broj linije. Ovo se postiže komandom:

sudo iptables -I INPUT pozicija novo_pravilo

Kako bi se videlo na kojoj poziciji je potrebno da se ubaci pravilo, moguće je prvo izlistati redne brojeve pravila koristeći komandu:

sudo iptables -L --line-numbers

$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
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
5       DROP       all  --  anywhere             anywhere

Chain FORWARD (policy DROP)
num     target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num     target     prot opt source               destination

Sa izlaza vidimo da je sledeće pravilo, koje će se nalaziti pre zadnjeg pravila odbacivanja, potrebno ubaciti na petoj poziciji.

Brisanje svih pravila

Brisanje svih pravila se postiže sledećom komandom:

sudo iptables -F

Postoji mogućnost prosleđivanja vrednosti opciji -F gde zadata vrednost predstavlja lanac iz kojeg želimo da obrišemo sva pravila. Naravno, ovo je ekvivalentno brisanju pravila, jedno po jedno.

$ sudo iptables -F
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION

Kao što vidimo na izlazu nakon komande sa opcijom -F sva pravila su obrisana.

Brisanje lanaca

Brisanje opcionih korisnički definisanih lanaca postiže se korišćenjem komande sa opcijom -X.

sudo iptables -X [ime_lanca]

Opcija -X može primiti argument za ime lanca koji se briše ili će se, ukoliko se izostavi ovaj parametar, izbrisati svi korisnički definisani lanci.

$ sudo iptables -X DOCKER
$ sudo iptables -X DOCKER-ISOLATION
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT

Na izlazu je prikazano brisanje DOCKER i DOCKER-ISOLATION lanaca. Pre nego što se obrišu lanci, neophodno je da se obrišu sva referisanja na lance.

Snimanje konfiguracije IPTables

Pravila koja se dodaju u IPTables su kratkotrajna, odnosno ona nestaju kada se ponovo pokrene računar. Većini korisnika je potreban način da automatski snime pravila koja su kreirali i da ih zatim učitaju kada ponovo pokrenu računar. Postoji više načina da se ovo postigne ali najednostavniji je koristeći iptables-persistent paket. Tokom instalacije će biti ponuđeno da se snime trenutna pravila kako bi se automatski učitala. Kada se instalacija završi, formira se novi servis nazvan iptables-persistent koji je konfigurisan da se pokrene prilikom pokretanja računara. Ovaj servis će učitati pravila i primeniti ih kada je računar pokrenut.

Ukoliko se ažurira firewall, a potrebno je da se sačuvaju izmene, snimanje pravila vrši se koristeći komandu:

sudo invoke-rc.d iptables-persistent save

Anti-spoofing

Anti-spoofing je tehnika koja identifikuje i odbacuje pakete koji imaju lažnu izvorišnu adresu. U spoofing napadima, izvorišna adresa dolazećeg paketa je promenjena tako da izgleda kao da dolazi sa poznatog, pouzdanog izvora. Spoofed paketi se obično koriste za izvršavanje denial of service (DoS) napada, iskorišćavanje mrežnih i sistemskih ranjivosti i da bi se dobio neovlašćen pristup korporativnim mrežama i podacima.

Sledećom komandom vrši se odbrana od ove vrste napada:

sudo iptables -A INPUT --in-interface ! lo --source 127.0.0.0/8 -j DROP

Ova komanda će odbaciti pakete koji tvrde da imaju loopback IP ali dolaze sa fizičkog mrežnog interfejsa.

Limitiranje ping zahteva

Sprečavanje smurf napada, koji se sastoje od slanja velikog broja ping zahteva, može se izvršiti dozvoljavanjem samo jednog ping zahteva po sekundi, koristeći komandu:

sudo iptables -A INPUT -p icmp -m icmp -m limit -limit 1/second -j ACCEPT

Balansiranje opterećenja veb saobraćaja

Moguće je balansirati dolazeći veb saobraćaj koristeći IPTables firewall pravila. Za ovo je potrebna nth ekstenzija. Sledeći primer balansira opterećenje HTTPS saobraćaja na tri različite IP adrese. Svaki treći paket balansiran je na odgovarajući server, koristeći counter 0.

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

Source NAT

Promena izvorišne adrese veze vrši se u POSTROUTING lancu, pre nego što je paket konačno poslat. Ovo je veoma važno iz razloga što će sve ostalo na sistemu, poput rutiranja i filtriranja, paket videti kao nepromenjen. Takođe je moguće koristiti opciju -o za odlazni interfejs.

Izvorni NAT je specificiran sa -j SNAT i –to-source opcijom koja specificira IP adresu kao i port.

Ukoliko je potrebo da se promeni izvorišna adresa na 1.2.3.4, to je moguće postići koristeći komandu:

sudo iptables -t nat -A POSTROUTING -o wlp8s0 -j SNAT --to 1.2.3.4

Proveravanje SNAT-ovanja u praksi može se izvršiti upotrebom dva računara u lokalnoj mreži. U ovom slučaju, upotrebljena su dva računara na wireless mreži i iz ovog razloga korišćen je interfejs wlp8s0. Na jednom računaru napisana je serverska aplikacija koja prihvata pakete na određenom portu, a zatim ispisuje IP adresu paketa.

1 import java.io.IOException;
2 import java.net.*;
3
4 public class Server {
5   public static void main(String []args) {
6     try{
7       byte[] buffer = new byte[256];
8       DatagramSocket socket = new DatagramSocket(1234);
9       DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
10      System.out.println("Listening for packets...");
11      socket.receive(packet);
12      System.out.println("Packet IP adress: " + packet.getAddress());
13    } catch(IOException e){
14      System.err.println(e.getMessage());
15    }
16  }
17 }

Na drugom računaru, na kojem je izvršeno SNAT-ovanje, napisana je klijentska aplikacija koja šalje pakete na adresu računara u lokalnoj mreži i na određenom portu. U ovom slučaju serverski računar se nalazio na 192.168.1.4 IP adresi. Takođe, neophodno je podesiti firewall na serverskom računaru tako da dozvoljava veze na određenom portu (u ovom slučaju portu 1234).

1 import java.io.IOException;
2 import java.net.*;
3
4 public class Client {
5   public static void main(String []args){
6     try{
7       DatagramSocket socket = new DatagramSocket();
8       DatagramPacket packet = new DatagramPacket(new byte[]{'h','e','l','l','o','!'}, 
         6,InetAddress.getByName("192.168.1.4"),1234);
9       socket.send(packet);
10    }catch(IOException e){
11      System.err.println(e.getMessage());
12    }
13  }
14 }

Pre korišćenja IPTables komanda za SNAT-ovanje izlaz na serveru je izgledao ovako:

Nakon korišćenja komande za promenu IP adrese, na serveru se ispisuje sledeće:

Kako bi se izlistala sva pravila iz nat tabele i pronašao broj pravila, potrebno je koristiti sledeću komandu:

sudo iptables -t nat -L --line-numbers

Nakon pronađenog broja pravila, pravilo je moguće obrisati koristeći komandu:

sudo iptables -t nat -D POSTROUTING 6

U ovom slučaju, SNAT pravilo se nalazilo pod brojem 6, kao što je prikazano na sledećem izlazu:

Chain POSTROUTING (policy ACCEPT)
num     target     prot opt source               destination
1       MASQUERADE  all  --  172.17.0.0/16        anywhere
2       MASQUERADE  all  --  172.18.0.0/16        anywhere
3       POSTROUTING_direct  all  --  anywhere             anywhere
4       POSTROUTING_ZONES_SOURCE  all  --  anywhere             anywhere
5       POSTROUTING_ZONES  all  --  anywhere             anywhere
6       SNAT       all  --  anywhere             anywhere             to:1.2.3.4

Destination NAT

Za DNAT je potrebno postaviti pravilo u PREROUTING lancu čim paketi dođu. Ovo znači da će sve na Linux-u (rutiranje, filtriranje) videti gde paket zaista ide. Moguće je, takođe, koristiti opciju -i za dolazeći interfejs.

Odredišni NAT se specificira koristeći -j DNAT i –to-destination opciju kojom specificiramo IP adresu kao I port.

Ukoliko je potrebno izvršiti promenu odredišne adrese na intefejsu eth0 na 5.6.7.8, može se koristiti sledeća komanda:

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8

Korisni linkovi