Iptables - kako radi i kako ga konfigurisati?

Pozdrav svima,
potrebna mi je pomoć na pomenutu temu, znači kako pravilno instalirati i konfigurisati iptables, a naravno i objašnjenje kako i koji je princnip rada iptables-a. Možda je ova tema nekad bila na forumu, možda i ne, nije ni bitno…ali mi je stvarno potrebna pomoć oko ovoga. Ako je neko voljan da pruži objašnjenje neka bude slobodan to i učiniti jer je od opšteg interesa da sigurnost bude razvijena na visokom nivou.
Hvala na pomoći unaprijed.

Evo ti primjer sa mog sistema. Ovo ti je dovoljno ako si kućni korisnik. Sav izlazni saobraćaj će biti dozvoljen, a ulazni će biti dozvoljen samo za već uspostavljene konekcije. Možeš otići na grc.com, pa vidjeti da su svi portovi “Stealth”.

[code]# dozvoljava sav IN i OUT saobraćaj preko localhost-a
iptables -A INPUT -i lo -j ACCEPT

dozvoljava sav OUT saobraćaj (ekvivalentno -P ACCEPT)

iptables -A OUTPUT -j ACCEPT

dozvoljava IN saobraćaj na već uspostavljenim konekcijama

i dozvoljava nove konekcije u vezi sa postojećim (pr. active-ftp)

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Bilježi sve ostalo

iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "

sve za što ne postoje pravila iznad proslijedi na /dev/null

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

potrebno za one koji imaju dinamičku IP adresu (ne treba za one sa statičkom)

echo 2 > /proc/sys/net/ipv4/ip_dynaddr

onemogući ExplicitCongestionNotification

echo 0 > /proc/sys/net/ipv4/tcp_ecn
[/code]

Osnovni oblik koji će ti biti dovoljan za većinu stvari je:

iptables -A INPUT -i <interface> -s <izvorište> -d <odredište> -p <protokol> -m multiport --sports <izvorični_portovi> --dports <odredišni_portovi> -j <target> iptables -A OUTPUT -o <interface> -s <izvorište> -d <odredište> -p <protokol> -m multiport --sports <izvorični_portovi> --dports <odredišni_portovi> -j <target>
gdje su:
- interfejs preko koga ide veza (eth0, ppp0…)
<izvorište> - IP adresa ili skup adresa odakle paket dolazi
<odredište> - IP adresa ili skup adresa gdje paket stiže
- tcp, udp ili icmp
<izvorišni_portovi> - port ili skupovi portova odakle paket dolazi
<odredišni_portovi> - port ili skupovi portova gdje paket stiže
- ACCEPT (za dozvolu saobraćaja) ili DROP (za zabranu saobraćaja).

Ukoliko izostaviš neku od opcija ona se odnosi na sve moguće slučajeve (npr. ako izostaviš opciju -p pravilo će se odnositi na sve protokole; ako izostaviš -s <izvorište> pravilo će se odnositi na bilo koju izvorišnu IP adresu).

Primjeri:

dozvoljava pristup web serveru iz lokalne mreže

iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp -m multiport --dports 80 -j ACCEPT # dozvoljava Win sharing u lokalnoj mreži (potrebno ako imaš Samba server na računaru)

iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp -m multiport --dports 139,445 -j ACCEPT iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p udp -m multiport --dports 137,138 -j ACCEPT iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p udp -m udp --sport 137 --dport 32768:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

Za detaljnije imaš man iptables ili pročitaj Linux Network Administration Guide (imaš na www.tldp.org).

fino je nauciti namjestati iptables, ali sto ne pocnes koristiti vizualne ljuske kao npr. Firestarter :wink:

a kako si pravio ovu bash skriptu, na osnovu čega i dali je ja u svom slučaju mogu iskoristiti. Hvala ti na detaljnom opisu. I naravnko kako da vidim dali je na mašini gdje sam instalirao iptables se statao kao kernelov modul. koliko sam skontao to bi trebalo da ide iptables -L, ili već kako. kako se u opšte prati proces rada iptables-a i kako da formiram tabelu.

To gore možeš iskoristiti bez problema, ako imaš iptables instaliran. Ukoliko potrebni moduli nisu ugrađeni u kernel onda na početak skripte moraš dodati:

modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ipt_state modprobe ipt_LOG
Sa iptables -L listaš pravila definisana pomoću iptables i tu vidiš koliko je paketa/bajta propušteno, a koliko je zaustavljeno.

Na tvojoj distribuciji bi trebalo da postoji skripta koja je zadužena za iptables. Pogledaj u /etc/rc.d/* postoji li skripta pod nazivom firewall ili iptables ili filtering ili tako nešto. U tu skriptu staviš ova pravila i podesiš da se skripta pokrene kada pališ računar.

ovako pokušao sam slijedeće:
iptables-save > tabela.txt i dobio sam ovo napisano u fajlu:

[code]# Generated by iptables-save v1.2.7a on Sun Sep 4 04:39:42 2005
*filter
:INPUT ACCEPT [190:16522]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [206:18086]
COMMIT

Completed on Sun Sep 4 04:39:42 2005[/code]

e sad kad sam editovao ovaj fajl i ovako samo napisao tj. da zabranjujem određenim IP adresama pritup portu 80,

i kad sam probao da uradim ovo iptables < tabela.txt dobio sam slijedeću poruku:

linux:~ # iptables-restore < tabela.txt Bad argument `iptables' Try `iptables-restore -h' or 'iptables-restore --help' for more information.
Gdje griješim to mi nije jasno, znači jednostavno neće da importuje ovaj fajl i da radi po argumentima napisanim u njemu. Ako imate vremena da mi objasnite ili dopišete još linija koda ili kako bi trebalo da izgleda budite slobodni učiniti.

Ne znam čemu služe te komande…
Mogao si linije koje sam ti dao jednostavno otkucati u konzoli ili ih staviti u neku shell skriptu:

[code]#!/bin/sh

modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
modprobe ipt_LOG

dozvoljava sav IN i OUT saobraćaj preko localhost-a

iptables -A INPUT -i lo -j ACCEPT

dozvoljava sav OUT saobraćaj (ekvivalentno -P ACCEPT)

iptables -A OUTPUT -j ACCEPT

dozvoljava IN saobraćaj na već uspostavljenim konekcijama

i dozvoljava nove konekcije u vezi sa postojećim (pr. active-ftp)

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Bilježi sve ostalo

iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "

sve za što ne postoje pravila iznad proslijedi na /dev/null

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

potrebno za one koji imaju dinamičku IP adresu (ne treba za one sa statičkom)

echo 2 > /proc/sys/net/ipv4/ip_dynaddr

onemogući ExplicitCongestionNotification

echo 0 > /proc/sys/net/ipv4/tcp_ecn[/code]
Sačuvaj ovo gore u neki fajl, npr. firewall i dodijeli mu izvršna prava:

Nakon toga pokreni skriptu i podesićeš firewall.

Naravno, kao što sam rekao, trebalo bi podesiti da se skripta automatski pokreće pri pokretanju računara.

eh… da ja sinoc nisam napisao jedan veliki post, nebi se zalio… ALI ZALIM SE STO MI FORUM NIJE RADIO… nisam ga mogao postati… fakat sam iptables malo bolje objasnio ( par chainova, matching, tabele itd ) i onda nisam mogao da nadjem domenu forum.linux.org.ba??? to mi se desava stalno u zadnje vrijeme… valjda je radi bihnetovog “prese…” !

Pozdrav

Ice

Dragi moj brejkeru, budi slobodan ponovo napisati…znam da je zahmetli…ali je korisno. Nebilo ti zapovjeđeno, nego samo zamoljeno…napiši ponovo jer svaki od ovih postova puno znači. Hvala i tebi NNJ na strpljenju i na detaljima.

i meni se desava to sa forumom
nemogu nac forum.linux.org.ba domenu, dok lugbih.org ide dobro (do redirekta na forum.linux.org.ba)…

[quote]i meni se desava to sa forumom
nemogu nac forum.linux.org.ba domenu, dok lugbih.org ide dobro (do redirekta na forum.linux.org.ba)…[/quote]

kod mene je slicna sitacija, neke stranice neće da se otvore, ali nakon min. dva probam i otvori ih, garant je do opterećenja, a neko danas reče na štandu (sajam) da im je riknula neka mašina…

Da li bi neko mogao donirati mirror za linux.org.ba? Znači ništa zahtjevno ali bitno je da je hostirano izvan BiH (po mogućnosti u SAD ili nekon većoj Evropskoj zemlji), tu bi bio sekundarni DNS i eventualno par najvažnijih sajtova.

no frks… biraj … Austrija ( 2x2MB ) / Njemacka ( 155MB ) ? ako treba hostat cu ti i prim i sekundarni dns… mirror bi se mogao odraditi za neke djelove sajta, a ne znam kako bi odradili mirror za db od foruma itd itd… ajd da pokrenemo neku drugu diskusiju… ipak ovdje covjek zeli informacije o iptablesu :wink:

evo ukratko… ovi momci/djevojke sto su ti postali svoje skripe imaju tri tkz. chaina. eh… kakav sad chain ako je rijec o nekim tabelama… iptables imaju dvije glavne tabele : mangle i filter tabelu… mangle za sada zaboravi… tebi je vazna filter tabela. ona je default ( nigdje se ne navodi osim ako ti ne promjenis tabelu sa -t opcijom )…

eh… kao sto rekoh… u defaultnoj tabeli ( filter ) postoje tri chaina koja su standard rekao bih… INPUT, OUTPUT, FORWARD… eh… iptables primi paket i na osnovu sadrzaja paketa odlucuje koji ce chain da provjeri… zasto chain… chain je lanac a odnosi se na cinjenicu da se pravila ( rules ) provjeravaju redom ( lancano )… eh posto je firewalling jako povezano sa mreznim osnovama, preporucavam ti da i to dobro procitas ( TCP / IP osnove, OSI model, ICMP )…

http://iptables-tutorial.frozentux.net/iptables-tutorial.html

gore mozes naci dobar tutorial ( ako vec nisi :wink: )…

ovako se recimo odlucuje gdje ce koji paket uci/izaci i koji ce se chain koristiti…

eh sad da ne komplikujem vise jedan primjer…

iptables -A INPUT -i lo -j ACCEPT 

-A znaci append ( primjeni pravilo u chainu )… znaci primjenjujes novo pravilo za sve pakete koji ulaze ( logicno jer je INPUT chain ) na lo(opback) interface ( to je ono -i lo ). sa opcijom -j odredjujes tkz. target ( cilj ). drugim rijecima kazes sta da se uradi sa paketom… -j ACCEPT znaci da prihvati paket. takodjer postoji DROP, REJECT targeti i ( drugi koje moras sam nauciti kasnije :wink: )…

uglavnom… sjedi i polako… :wink:

Pozdrav

Ice[/img]

hvala na detaljima i prema preporuci ja sam napravio skriptu kojha glasi ovako:

[code]#!/bin/sh

modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
modprobe ipt_LOG

dozvoljava sav IN i OUT saobraćaj preko localhost-a

#iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.0.2/21 -p tcp -m multiport --dports 80 -j DROP

dozvoljava sav OUT saobraćaj (ekvivalentno -P ACCEPT)

iptables -A OUTPUT -i eth0 -j DROP

dozvoljava IN saobraćaj na već uspostavljenim konekcijama

i dozvoljava nove konekcije u vezi sa postojećim (pr. active-ftp)

iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Bilježi sve ostalo

iptables -A INPUT -i eth0 -j LOG --log-prefix "FIREWALL:INPUT "

sve za što ne postoje pravila iznad proslijedi na /dev/null

#iptables -P INPUT DROP
#iptables -P FORWARD DROP
#iptables -P OUTPUT ACCEPT
iptables -P INPUT -i eth0 -s 192.168.0.2/21 -p tcp -m multiport --dports 80 -j DROP

potrebno za one koji imaju dinamičku IP adresu (ne treba za one sa statičkom)

#echo 2 > /proc/sys/net/ipv4/ip_dynaddr

onemogući ExplicitCongestionNotification

#echo 0 > /proc/sys/net/ipv4/tcp_ecn[/code]

poslije startanja skripte dobijam slijedeću poruku:

./firewall: line 12: 1077 Segmentation fault iptables -A INPUT -i eth0 -s 192.168.0.2/21 -p tcp -m multiport --dports 80 -j DROP ./firewall: line 15: 1078 Segmentation fault iptables -A OUTPUT -i eth0 -j DROP ./firewall: line 19: 1079 Segmentation fault iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT ./firewall: line 22: 1080 Segmentation fault iptables -A INPUT -i eth0 -j LOG --log-prefix "FIREWALL:INPUT " iptables v1.2.7a: -P requires a chain and a policy Try `iptables -h' or 'iptables --help' for more information.

znači negdje konstanto griješim, a vezze neam gdje. ako ima neko riješenja i objašnjenje neka bude slobodan sugerisati ga.
Fakat ne kontam gdje griješim.

BTW hvala unaprijed…:-)))))???

khm…

input je eth0, ako se radi o source adresi sa maskom 21? jel ovo sigurno sto zelis… ako zelis hostu sa IP adresom 192.168.0.2 zabraniti pristup www na tom serveru, onda bi maska trebala biti ili 32 ili da je nema nikako ! -p tcp je okay… onda dolazi -m multiport a ti navodis samo jedan port kod opcije --destinationport !

onda ( dobro - komentar nije ispravan, ali to nije greska ) - sve izlazne pakete sa kartice eth0 dropas… cemu ti onda sluzi kartica eth0? bilo koji servis ako je vezan na toj kartici vjerovatno ce htjeti poslati neke podatke klijentu… tako ne moze…

onda pri kraju skripte imas slijedece

opcija -P podesava tkz. policy za odredjeni niz ( chain )… znaci jedina opcija koja je dozvoljena poslije -P je jedan od targeta ( ciljeva ) o kojem sam ti pisao u proslom postu… cemu sluzi taj policy… logika je da kad dizajniras firewall prvo definiras pravila koja nesto dopustaju i onda na kraju niza jednostavno imas opciju “odbij” :wink:

znaci ako iptables prime paket koji ulazi onda ce poceti da provjeravaju pravila u input chainu… provjeri prvo pravilo - ako se ne moze primjeniti na paket, onda ide na drugo pravilo itd dok ne dodje do jednog pravila koje se moze primjeniti na paket koji se provjerava, i nakon primjene, provjera se prekida… da ti nebi morao prvo napisati pravila koja ti recimo dopustaju konekciju na dva porta, i onda pisati jos 65533 pravila koja NE dozvoljavaju konekciju na ostale portove, logicno je da onda nakon ta dva prva pravila podesis tkz. policy za sve ostalo sto nije definirano i to je u ovom slucaju recimo DROP ! ( tako se barem radi :wink: ).

tvoja greska je sto koristis policy opciju kako bi primjenio svoje pravilo !

nadam se da moj post nije konfuzan, ali najbolje bi bilo da nam objasnis sta zelis postici kako bi ti mogli pomoci !

Pozdrav

Ice[/code]

  1. koristiš -A OUTPUT i -i (input interface). Ako koristiš -A OUTPUT, onda koristi -o eth0.
  2. 192.168.X.X je C tip IP adrese, a to znači da možeš praviti subnet samo sa posljednjim oktetom, dakle mislim da bi 192.168.0.0/21 moglo praviti grešku. Taj broj poslije “/” mora da bude veći ili jednak 24.
  3. broj 0 u IP adresama se koristi za oznaku mreže, a ne za adresiranje određenog hosta. Ovo najčešće ne predstavlja problem, ali se treba pridržavati pravila.
  4. ako staviš “iptables -A OUTPUT -o eth0 -j DROP” nikakav izlazni saobraćaj neće biti moguć, a ne vjerujem da to želiš.
  5. kod tebe je definisano da sve prolazi osim onoga što definišeš pravilima, umjesto da radiš suprotno - zabrani sav saobraćaj osim onog koji eksplicitno dozvoliš pomoću iptables.

Da ne nagađamo, najbolje da kažeš šta želiš da postigneš, pa da ti napišemo konfiguraciju. Opiši kakvu mrežu imaš, preko čega ideš na Net i sl.

vidi bas… to sa -i sam izgleda khm… preletio :smiley:

Pozdrav

Ice

ovako, evo šta je moj glavni cilj:

znači ako je neko voljan da napiše kod znači tačan kod za ovu skriptu pri čemu želim da ograničim IN/OUT saobraćaj. e sad prema vašoj analizi greške moje su kardinalne :), al nema vezze nešto sam naučio. što se tiče ip adrese, pa takva mi je mreža, on mora tako ostati. Ali ako želim da zabranim pristup na servise kao što su SMB(139/137) HTTP(80) kako bi onda trebala skripta da glasi, a da pri tom zabranim i IN i OUT saobraćaj, kako za klijent tako i za server mašinu.

Ona koju sam ti dao ovdje će da uradi to što tražiš, ako umjesto onog drugog pravila:

staviš:

… ali kao što Ice reče, čemu ti služi mrežna karta? Umjesto sve ove zaj… jednostavno iskopčaj mrežni kabl i postići ćeš isti rezultat.
Ako preko LAN-a imaš vezu sa Internetom, sa gore navedenim pravilima nećeš moći ni na Internet.

ama to je lokalna mreža, ali koliko sam te mogao shvatiti trebaju mi dvije mrežne karte, ali fol je da se nešto nauči ba ne samo internet.