Erinevus lehekülje "Iptables puust ja punaseks" redaktsioonide vahel

Allikas: Kuutõrvaja
(Tabelid)
 
(ei näidata 2 kasutaja 163 vahepealset redaktsiooni)
1. rida: 1. rida:
 
{{Täienda}}
 
{{Täienda}}
  
===Mis see on?===
+
===Tööpõhimõte===
Iptables on töövahend linuxi kernelisse ehitatud filtreerimismehanismi
 
kasutamiseks.
 
  
===Kernel ja moodulid===
+
Iptables või NetFilter on töövahend linuxi kernelisse ehitatud filtreerimismehanismi
 +
kasutamiseks. Kokku koosneb iptables niisiis kahest osast. Kerneli
 +
moodulitest ning käsurea utiliidist.
  
Iptablesi kasutamiseks peavad olema laetud vastavad kerneli moodulit. Näiteks
+
Iptables koosneb kolme tüüpi objektidest:
kui soovime kasutada enda reeglites LOG, REJECT ja MASQUERADE targeteid (ja need pole
 
kernelisse kompileeritud), peame laadima järgnevad moodulid.
 
  
Iptablesi mooduli laadimiseks
+
# Reeglid (Rules)
 +
# Ahelad (Chains)
 +
# Tabelid (Tables)
  
# modprobe ip_tables
+
Lisaks on olemas täiendavad moodulid nt erinevate protokollide jälgimiseks.
  
activate connection tracking (connection's status are taken into account)
+
Ülevaatlikult iseloomustab pakettide liikumist läbi ahelate ning tabelite järgnev skeem.
# modprobe ip_conntrack
 
  
Special features for FTP:
+
[[Pilt:Iptables.png]]
# modprobe ip_conntrack_ftp
+
====Reeglid====
 
 
Iptablesi moodulid, koos kirjeldustega, leiab siit lingilt
 
http://www.tummy.com/journals/entries/jafo_20050717_164535
 
  
Laaditud iptablesi moodulid leiab failist /proc/net/ip_tables_matches
+
Peamisteks reegliteks mida rakendatakse on ACCEPT, DROP, LOG, REJECT, DNAT, SNAT ja MASQUERADE.
  
Paigaldatud netfilteri mooduleid näeb käsuga
+
*ACCEPT - lubab paketi
 +
*DROP - kustutab paketi armutult
 +
*REJECT - kustutab paketi ja teavitab sellest ka paketi saatjat
 +
*LOG - logib paketi ja liigutab paketi edasi järgmisele ahelale
 +
*DNAT – paketi saaja aadress muutmine
 +
*SNAT – paketi saatja aadressi muutmine
 +
*MASQUERADE - Paketi saatja aadressi muutmine tulemüüri enda omaks
  
# ls /lib/modules/`uname -r`/kernel/net/ipv4/netfilter
+
====Tabelid====
  
===Iptablesi käsu süntaks===
+
Paketid liiguvad läbi tabelite ning ahelate ning seejärel neile omakorda rakendatakse reegleid.
  
*iptables -D chain {rule|rule-num} reegli kustutamine
+
Kõik ahelad kasutavad ühte või teist tabelit. Kui tabel pole
*iptables ‑F [chain] kõigi reeglite kustutamine
+
määratud võetakse vaikimisi FILTER tabel.
*iptables [-t table] -N name uue ahela loomine
 
*iptables [-v] [-n] -L kõikide reeglite näitamine
 
*iptable -P chain {ACCEPT|DROP} seadistab vaikimisi reeglit ahelatel
 
  
===Ahelad===
+
Iptables sisaldab kolme põhitabelit:
  
Iptablesi üheks olulisemaks punktiks on ahelad (chains).
+
'''filter TABEL'''
Pakett liigub mööda ahelaid seni kuni mõni reegel ühildub paketiga. Näiteks
 
lubab selle või kustutab.
 
  
[[Pilt:Image001.gif]]
+
Seda tabelit kasutatakse pakettide filtreerimiseks läbi tulemüüri.
 +
Eesmärgiks on puhtalt pakettide filtreerimine. Näiteks sissetulevate pakettide (incoming), väljuvate pakettide (outgoing) ja pakettide
 +
mis on edastatud võrgukaartide vahel (filtering).
  
Lihtsustatult on olemas kaks peamist ahelat mida paketid läbivad
+
See tabel sisaldab kolme ahelat:
INPUT ja OUTPUT. Tegelikult juba nagu ülemiselt skeemilt näha on peamisi
+
 
ahelaidki veel. Näiteks Prerouting ja Postrouting, mis rakenduvad enne ja peale ruutingu otsuse tegemist (lisaks saab ahelaid ka ise juurde luua). Aga hetkel lihtsustamise mõttes vaatleme vaid kahte.
+
*INPUT ahel - Sisenevate pakettide filtreerimine, ehk masinale endale suunatud liiklus.
 +
*OUTPUT ahel - Väljuvate pakettide filtreerimine, ehk masina enda genereeritud paketid.
 +
*FORWARD ahel - Võrgukaartide vahel edasi suunatud pakettide filtreerimine, või igasugune edastatav liiklus.
 +
 
 +
'''nat tabel'''
 +
Seda tabelit kasutatakse IP muutmiseks.
 +
*PREROUTING ahel - Kasutatakse IP aadressi muutmiseks enne paketi edastamist
 +
*POSTROUTING ahel - Kasutatakse IP muutmiseks peale paketi edastamist
 +
*OUTPUT ahel - Väljuvate ühenduste filtreerimiseks
 +
 
 +
'''mangle tabel'''
 +
Leiab kasutamist pakettide märgistamiseks.
 +
Igal linuxi tuuma läbival paketil on 32 bitine number ehk märk.
 +
 
 +
Tabelite sisu näeb järgnevate käsuga iptables -f <tabelinimi> -L. Näiteks:
 +
 
 +
# iptables -t filter -L
 +
 
 +
====Ahelad====
 +
 
 +
Ahel kujutab endast objekti mis on seotud mingi tabeliga ning millele
 +
on omakorda kirjutatud peale hulk erinevaid reegleid.
 +
 
 +
Masinasse sisenenud oakett liigub mööda ahelaid ülevalt alla seni kuni mõni reegel ühildub paketiga. Näiteks lubab selle või kustutab.
 +
 
 +
Vaatleme esialgu ahelaid FILTER tabelis. Ehk siis ahelaid INPUT, OUTPUT JA FORWARD.
  
 
Ahelates olevaid reegleid näeb käsuga:
 
Ahelates olevaid reegleid näeb käsuga:
68. rida: 92. rida:
 
  # iptables -A INPUT -i eth0 -j REJECT  
 
  # iptables -A INPUT -i eth0 -j REJECT  
  
See reegel on seotud INPUT ahelaga (ehk sissetulevad paketid) ja kehtib ainult pakettide kohta, mis tulevad eth0 võrguliidesele. Lisaks ütleb, et need paketid lükatakse tagasi.
+
See reegel on seotud INPUT ahelaga (-A) (ehk sissetulevad paketid) ja kehtib ainult pakettide kohta, mis sisenevad eth0 võrguliidesele (-i ehk input). -j Reject tähendab, et keeldutakse paketist ja antakse sellest ka paketi saatjale teada.
Reject tähendab, et keeldutakse paketist ja antakse sellest ka paketi saatjale teada.
+
 
 +
Ahelaid saab ka ise luua kasutades võtit -N. Aga selles juba edaspidi.
 +
 
 +
Ahela lõpetab ACCEPT, DROP, REJECT või RETURN. Lisaks on igal ahelal oma vaikimis
 +
poliitika. Kõigil kolmel põhiahelal (INPUT, FORWARD JA OUTPUT) on selleks ACCEPT.
  
Või keelustame ligipääsu teatud võrgule:
+
Vaikepoliitikate seadistamine ahelatele.
  
  iptables -I FORWARD -s 192.168.2.0/255.255.255.0 -j DROP
+
  # iptables -P INPUT ACCEPT
 +
# iptables -P OUTPUT ACCEPT
 +
# iptables -P FORWARD DROP
  
See reegel kustutab armutult kõik FORWARD ahelasse saabunud ja teatud
+
Kõik reeglid ahelast saab kustutada käsuga
võrku suunduvad paketid.
 
  
Lihtsate tulemüüride tegemisel piisabki ainult ahelatega mängimisest ning neile
+
# iptables --flush OUTPUT
reeglite loomisest. Näiteks oleks üks korralikult kinni kruvitud lauaarvuti tulemüür järgnev:
 
  
 +
Reeglite kustutamiseks on vaja teada reegli järjekorranumbrit. Nende nägemiseks
 +
näiteks INPUT ahelas
 +
 +
# iptables -L INPUT -n --line-numbers
 +
 +
Ja sealt reegli kustutamiseks
 +
 +
# iptables -D INPUT 4
 +
 +
Nat reeglite vaatamiseks tuleb anda käsk
 +
 +
# iptables -nvL -t nat
 +
 +
Kustutamiseks aga
 +
 +
# iptables -t nat -D OUTPUT 1
 +
 +
===Paneme nüüd ahelad, tabelid ja reeglid kokku===
 +
 +
====Mõned filtreerimise reeglid====
 +
 +
Loome näiteks mõned filtreeirmise reeglid kasutades FILTER vaiketabelit
 +
ning ahelaid INPUT ja OUTPUT
 +
 +
Selleks, et masina sees olevad programmid saaksid
 +
internetti kasutada lubame pakettidel väljuda läbi OUTPUT ahela
 +
 +
# iptables -A OUTPUT -j ACCEPT
 +
 +
Selleks, et välismaailmast pääseksid kliendid
 +
ligi meie veebiserverile lubame 80nenda pordi kaudu INPUT ahelast pakettidel siseneda
 +
 +
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 +
 +
Lubame terve hulga porte ühe käsuga
 +
 +
# iptables -A INPUT -p tcp 22,80,443 -j ACCEPT
 +
 +
Lisaks lubame välismaailmast serverit pingida
 +
 +
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 +
 +
Keelustame aga samas näiteks kõikidele ülejäänud portidele sissetulevad paketid
 +
 +
# iptables -A INPUT -j '''DROP'''
 +
 +
 +
Veel paranoilisem logida kõik muud paketid ning
 +
seejärel need keelustada.
 +
 +
# iptables -A INPUT -j LOG --log-level 4
 +
# iptables -A INPUT -j DROP
 +
 +
Ja põhimõtteliselt ongi meil masinale seadistatud primitiivne tulemüür mis lubab
 +
väljapoole ühendusi teha. Sisse lubab aga ainult ühendusi 80nendale pordile
 +
ning masinat pingida. Kõik muud ühendused logitakse ja keelatakse ilma paketi
 +
saatjat sellest teavitamata.
 +
 +
Veel võib meil tekkida soov vahel mõnd IP aadressi blokeerida.
 +
 +
# iptables -A INPUT -s 11.22.33.44 -j DROP
 +
 +
Üks võimalikult karm reeglistik veebi-serverile näeks välja aga seline
 +
 +
<source lang=bash>
 +
# 1. kustutame eksisteerivad reeglid
 +
iptables -F
 +
 +
# 2. Seadistame vaikekäitumiseks DROP
 
  iptables -P INPUT DROP
 
  iptables -P INPUT DROP
 
  iptables -P FORWARD DROP
 
  iptables -P FORWARD DROP
 +
iptables -P OUTPUT DROP
 +
 +
# 3. lubame sisse ssh
 +
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 +
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 +
 +
# 4. lubame sisse veebi
 +
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 +
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
 +
 +
# lubame väljuva ssh
 +
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 +
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 +
</source>
 +
 +
Või siis väiksemale lokaalvõrgu ruuterile/veebimasinale selline vähem karm poliitika
 +
 +
<source lang=bash>
 +
iptables -P INPUT DROP
 +
#See reegel ei luba mitte mingisugust sisenevat liiklust, väljaarvatud muidugi allpool tulevad  erandid.
 +
iptables -P FORWARD ACCEPT
 +
#edasisiinamised lubatud
 
  iptables -P OUTPUT ACCEPT
 
  iptables -P OUTPUT ACCEPT
 +
#väljuv liiklus lubatud
 +
iptables -A INPUT -i lo -j ACCEPT
 +
#lokaalmasina liiklus samuti lubatud
 +
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
 +
#Lubame kõik liikluse veebiserveri porti
 +
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
 +
#lubame liikluse veebiserveri https porti
 +
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
 +
#lubame kõik liikluse meie sisevõrgust
 +
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 +
#lubame masinat pingida
 +
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
 +
#lubame läbi juba loodud ühendused
 +
</source>
 +
 +
====Reeglite taasesitamine ja salvestamine====
 +
 +
Laadime reeglistiku mällu
 +
 +
# /sbin/iptables-restore < /etc/sysconfig/iptables
 +
 +
Salvesame aktiivsed reeglid
 +
 +
# /sbin/iptables-save > /etc/sysconfig/iptables
 +
 +
Mille tulemusena tekib umbes järgnev fail
 +
 +
*filter
 +
:FORWARD ACCEPT [0:0]
 +
:INPUT DROP [0:0]
 +
:OUTPUT ACCEPT [0:0]
 +
 +
-A INPUT -i lo -j ACCEPT
 +
-A INPUT -f -j ACCEPT
 +
-A INPUT -p icmp -j ACCEPT
 +
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
 +
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
 +
 +
-A OUTPUT  -p icmp -j ACCEPT
 +
-A OUTPUT  -p udp  -j ACCEPT
 +
-A OUTPUT  -p tcp  -j ACCEPT
 +
 +
COMMIT
 +
 +
====Pordiedastus====
 +
 +
Suuname serveri välise pordi edasi sisevõrgul olevale masinale IP aadressiga 192.168.2.20
  
Kus keelatatakse kõik INPUT ja FORWARDI ahelate paketid ning lubatakse
+
# iptables -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination  192.168.2.20
vaid väljuvad.
 
  
===Tabelid===
+
====Uute ahelate loomine ja reeglitega sidumine====
  
Tegelikult liigub pakett ahelaid mööda kulgedes ja läbi mitmesuguste tabelite
+
Võimalik on luua ka täiesti uusi ahelaid ning siduda neid omakorda erinevate tabelitega. Kui tabel pole määratud kasutatakse automaatselt FILTER tabelit.
kus saab neid pakette vastavalt oma soovile moondada.
 
  
Ehk soovides peale filtreerimise reeglitele kasutada ka portide suunamisi, NATi jms
+
'''Näide1''' Loome ahela nimega LOGDROP
vigureid tuleb appi võtta tabelid.
 
  
Vaikimisi mängivad reeglid puhtalt Filter tabeliga. Tegelikult
+
# iptables -N LOGDROP
on aga põhitabeleid kokku kolm. Nat,Filter ja Mangle.
 
  
Tabelite sisu näeb järgnevate käskudega.
+
Lisame sinna ahelasse, et sealsed paketid logitakse
  
  iptables -t filter -L
+
  # iptables -A LOGDROP -j LOG
iptables -t nat -L
 
  
 +
Ning seejärel kustutatakse
  
 +
# iptables -A LOGDROP -j DROP
  
'''Filter''' Pakettide filtreerimiseks.
+
Edaspidi saame nüüd hoida ruumi kokku ning igalepoole ahelatele kahe LOG ja DROP reegli
*INPUT filtreerime sisenevaid pakette
+
kirjutamise asemel võime suunata nad ümber meie loodud ahelale. Näiteks:
*FORWARD filtreerime edasi suunatavaid pakette
 
*OUTPUT filtreerime väljuvaid pakette
 
  
'''Nat''' Võrguaadresside transleerimiseks
+
# iptables -I FORWARD -d 192.168.1.6 -p tcp --dport 21 -j LOGDROP
*PREROUTING aadressi transleerimiseks enne marsruutimist
 
*DNAT ehk destination NAT
 
*POSTROUTING aadressi transleerimiseks peale
 
*marsruutimist SNAT source NAT
 
*OUTPUT tulemüüri poolt teostatav NAT
 
  
'''Mangle'''
+
'''Näide 2'''. Loome ahela nimega blacklist kus olevad aadressid armutult blokeeritakse
*Modifitseerime IP paketi päist
 
*QoS bittide modifitseerimine
 
  
      _____                                    _____
+
  # iptables -N blacklist
    /    \                                  /    \
 
  PREROUTING -->[Routing ]----------------->POSTROUTING----->
 
    \D-NAT/    [Decision]                    \S-NAT/
 
                    |                            ^
 
                    |                            |  
 
                    |                            |
 
                    |                            |
 
                    |                            |
 
                    |                            |
 
                    |                            |
 
                    --------> Local Process ------
 
  
===Paneme ahelad ning tabelid kokku ja kirjutame mõned reeglid===
+
Lisame sinna tabelisse kaks aadresside vahemikku
  
====ACCEPT====
+
# iptables -A blacklist -s 207.46.130.0/24 -j DROP
lubamine. Edasi ei uurita. Näiteks lubame INPUT ahelast 80nendatel veebipordile ühenduste tegemise
+
# iptables -A blacklist -s 207.46.250.0/24 -j DROP
  
iptables -A INPUT -p tcp --dport 80 -j '''ACCEPT'''
+
Seejärel blokeerime meie loodud ahela kõigis kolmes põhiahelas. Ehk
 +
siis keelame nii siseneva kui väljuva ja võrgukaartide
 +
vahel ruuditava liikluse neile võrkudele.
  
====DROP====
+
# iptables -A INPUT -j blacklist
Blokeerimine. Edasi ei uurita. Keelustame näiteks kõik sissetulevad paketid
+
# iptables -A OUTPUT -j blacklist
 +
# iptables -A FORWARD -j blacklist
  
iptables -A INPUT -j '''DROP'''
+
PS: tabelite/nimekirjade kasutamine ei ole iptablesis väga kergelt lahendatud
 +
Igast nimekirjast eraldi ahelate tegemine muudab iptablesi aeglaseks
  
====LOG====
+
Vajades suuri tabeleid on lahenduseks IPSet nimekirjad, mis tuleb eraldi paigaldada.
Logitakse sellele reeglile vastamine ja iptables jätkab reeglite uurimist
 
  
If you would like to log dropped packets to syslog, this would be the quickest way:
+
====Network adress translation kasutades NAT tabelit====
  
# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " -- log-level 7
+
Siin tuleb meels pidada, kui väline IP aadress on dünaamiline tuleb teha maskeraad, muidu
 +
tuleb teha sNATi
  
DROP everything and Log it
+
Lubame kerneline IP'de edastamise võrguseadmete vahel.
iptables -A INPUT -j '''LOG''' --log-level 4
 
iptables -A INPUT -j DROP
 
  
Create a LOGDROP chain to log and drop packets
+
  # echo "1" > /proc/sys/net/ipv4/ip_forward
  /sbin/iptables -N LOGDROP
 
/sbin/iptables -A LOGDROP -j LOG
 
/sbin/iptables -A LOGDROP -j DROP
 
  
Drop all other traffic
+
Laadime NAT'i mooduli
/sbin/iptables -A INPUT -j LOGDROP
 
  
====REJECT====
+
# modprobe iptable_nat
Blokeerimine. Saatjale edastatakse vastus, et pakett blokeeriti (näiteks icmp-host-prohibited)
 
  
*DNAT – saaja aadress muutmine
+
Oluline vahe on sellel, et kas teha maskeraadi või SNATi. Peamiselt seetõttu, et maskeraad on serverile töömahukam, kuna
 +
selle puhul kontrollitakse iga paketi korral väljuva võrguseadme IP aadressi. Seepärast tasub staatilise IP aadressi
 +
korral eelistada SNATi.
  
*SNAT – saatja aadressi muutmine
+
'''Maskeraad'''
  
====MASQUERADE====
 
 
Saatja aadress muudetakse tulemüüri omaks. Näiteks kasutame seda, et
 
Saatja aadress muudetakse tulemüüri omaks. Näiteks kasutame seda, et
 
ühendada LAN internetiga:
 
ühendada LAN internetiga:
  
  # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
+
  # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 +
 
 +
Võtmed tähendavad siin järgnevat:
  
*-t nat Valime tabeli nat.
+
*-t nat - Valime tabeli nat.
*-A POSTROUTING Kasutame postrouting ahelat
+
*-A - POSTROUTING Kasutame postrouting ahelat
*-o eth1 reegel kehtib pakettidele mis väljuvad teiselt interfacelt (-o tähendab output)
+
*-o - eth0 reegel kehtib pakettidele mis väljuvad esimeselt interfacelt (-o tähendab output)
*-j MASQUERADE Saatja aadress asendatakse ruuteri aadressiga.
+
*-j - MASQUERADE Saatja aadress asendatakse ruuteri aadressiga.
  
*chain - Send the packet to another chain for further processing.  If that chain’s rules fail to match the packet, then processing will continue with the next rule in the current chain.  (See also RETURN target.)
+
'''Snat'''
  
*MARK - Used with the iproute2 and the tc command for advanced routing and traffic shaping.
+
Juhul kui ruuter omab staatilist IP aadress on soovitatud ülaloleva näite kasutada source NAT'i. Selleks tuleb kirjutada järgnev käsk:
  
*REDIRECT
+
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to <eth0-ehk välise võrguseadme IP aadress>
Transparent proxying: local net at eth0, proxy server at port 8080)
 
  iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
 
  -j REDIRECT --to-ports 8080
 
  
*RETURN - This is the default target at the end of a user-defined chain.  It means to return to the next rule in the parent chain.
+
===Moodulid===
 +
====Tarpit====
  
Või lubame kohe terve portide vahemiku
+
you will need to enable the TARPIT option and rebuild the kernel. The new options will be found under "Networking Options -> IP: Netfilter Configuration". You will need to enable the "Packet Filtering" option to see the TARPIT option. Once you've successfully enabled the TARPIT module, rebuild the kernel and modules, and reboot if necessary.
  
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT
+
To tarpit connections to TCP port 80 destined for the current machine:
  
Teisisõnu blokeerib antud reegel kogu sissetuleva võrguliikluse eth0 võrguliidesel.
+
  iptables -A INPUT -p tcp -m tcp --dport 80 -j TARPIT
  
Allow loopback traffic!
+
To significantly slow down Code Red/Nimda-style scans of unused address
   
+
space, forward unused ip addresses to a Linux box not acting as a router
  iptables -I INPUT 1 -i lo -j ACCEPT
+
(e.g. "ip route 10.0.0.0 255.0.0.0 ip.of.linux.box" on a Cisco), enable IP
 +
forwarding on the Linux box, and add:
 +
 
 +
  iptables -A FORWARD -p tcp -j TARPIT
 +
  iptables -A FORWARD -j DROP
 +
 
 +
You probably don't want the conntrack module loaded while you are using
 +
TARPIT, or you will be using resources per connection.
 +
 
 +
====Moodul time====
 +
 
 +
Veel üks huvitav moodul, mis lubab teha reegleid, mis kehtivad vaid teatud kellaaegade.
 +
 
 +
iptables -A FORWARD -p tcp --dport 22 -m time --timestart 8:00 --timestop 22:00 --days \
 +
Mon,Tue,Wed,Thu,Fri -j ACCEPT
 +
 
 +
====Moodul owner====
 +
 
 +
Võimalik on seadistada ka reegleid teatud kasutajatele.
 +
 
 +
-m owner --uid-owner mart
 +
 
 +
====Geoip moodul====
 +
 
 +
Allow ssh for own country(DE) and the country where you take holidays(FR)
 +
 
 +
iptables -A INPUT -p tcp --dport 22 -m geoip --src-cc DE,FR -j ACCEPT
 +
iptables -A INPUT -p tcp --dport 22 -j DROP
 +
 
 +
Block access to FTP server for Papua New Guinea (PG)
 +
 
 +
iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc PG -j DROP
 +
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
 +
 
 +
Kasutamiseks on vajalik paigaldada http://xtables-addons.sourceforge.net/
 +
 
 +
====l7 filter====
 +
 
 +
Paigaldame paketid. Gentoos käib see järgnevalt:
 +
 
 +
  # emerge -av l7-protocols l7-filter
 +
 
 +
Ehitame kernelisse layer7 kontrolli mooduli
 +
 
 +
Networking
 +
    Networking support (NET [=y])
 +
      Networking options
 +
        Network packet filtering framework (Netfilter)
 +
          Core Netfilter Configuration
 +
            {*} Netfilter Xtables support (required for ip_tables)
 +
            [M] "layer7" match support
 +
 
 +
Kasutamine
 +
 
 +
  iptables -t filter -A INPUT -m layer7 --l7proto edonkey -j ACCEPT
 +
iptables -t filter -A OUTPUT -m layer7 --l7proto edonkey -j ACCEPT
 +
 
 +
*http://www.gentoo-wiki.info/L7-filter
 +
 
 +
====Quota====
 +
 
 +
iptables -A OUTPUT -p tcp --dport 80 -m quota --quota 1024 -j ACCEPT
 +
iptables -A OUTPUT -p tcp --dport 80 -j DROP
 +
 
 +
Lubab 1MB veebliiklust 80 pordile, misjärel reegel lõpetab toimimise ja
 +
liiklus kukutatakse maha.
 +
 
 +
===Koormusjagamine===
 +
 
 +
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
 +
 
 +
===Stateful tulemüür ja ühenduste jälgimine===
 +
 
 +
Kõik ühenduste jälgimised toimuvad raamistiku abil nimega conntrack (see võib olla kas juba kompileeritud staatiliselt kernelisse või laetud kerneli moodulina nimega ip_conntrack).
 +
 
 +
See raamistik jaotab paketid nelja state milledeks on NEW, ESTABLISHED, RELATED ka INVALID
 +
 
 +
*NEW – tegemist värske ühendusega
 +
*ESTABLISHED - Edukalt loodud ja töötav ühendus
 +
*RELATED – ühendus kuulub mõne teise ühenduse juurde (nt ftp data kanal)
 +
*UNTRACKED – ühendust ei jälgita
 +
 
 +
/proc/net/ip_conntrack sisaldab kõiki conntracki admebaasi sissekandeid. (selleks peab olema ip_conntrack moodul laetud)
 +
 
 +
# cat /proc/net/ip_conntrack
 +
tcp   6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
 +
dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
 +
dport=32775 [ASSURED] use=2
 +
 
 +
--state lipu kontrolli abil saab kergelt nendel pakettidel vahet teha
 +
 
 +
Näiteks saame lubada pakette, mis on seotud juba varemalt loodud ühendustaga --state ESTABLISHED võtmega. Või lasta läbi pakette, mis on seotud vana sessiooni põhjalt algatatud uue ühendusega --state RELATED abil.
 +
 
 +
Milleks seda vaja? Peamiselt siis kui meil asub tulemüüri taga klient, kes peale control ühenduse loomist soovib andmete ülekannuks luua veel eraldiseisvaid ühendusi. Näiteks kui on laetud nf_conntrack_ftp, siis esimene FTP info ülekandmiseks vajalikud pakettid liigitatakse sildiga "related", mitte "new" ja lubatakse sedaviisi tulemüürist mööda.
 +
 
 +
Laetud (või kernelisse kompileeritud) peab RELATED kontrolli jaoks olema veel lisaks ip_conntrackile moodul:
 +
 
 +
ip_conntrack_ftp
  
Logging. This will log dropped packets to syslog:
+
Juhul kui tegemist NATitud võrguga on vaja laadida ka spetsiifilised NATiga seotud jälgimismoodulid, mis algavad enamasti ip_nat_ algusega.
  
iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix \
+
Lihtne stateful tulemüür, mis keelaks kõik sisenevad aga lubaks väljuvad ühendused näeks välja selline:
"iptables denied: " --log- level 7
 
  
Accept packets from trusted IP addresses
+
iptables -P INPUT DROP
  iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate
+
iptables -A INPUT -i ! eth1 -j ACCEPT
 +
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  
Viimast rida võib paranoiline olles veelgi täiendada näitens nii MAC aadressiga
+
*http://www.faqs.org/docs/iptables/complexprotocols.html
  
  iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT
+
*http://www.iptel.org/sipalg/
  
====Eelmise peatüki jätkuna lihtne tulemüür serverile====
+
===Liikluse kontroll ehk qos===
  
Siis server vajab juba keerukamat lähenemist
+
Selleks on vaja paigaldada iproute2 pakett mis sisaldab programmi tc
  
<source lang=bash>
+
*tc - show / manipulate traffic control settings
#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
+
 
iptables -A INPUT -i lo -j ACCEPT
+
http://linux-ip.net/articles/Traffic-Control-HOWTO/
iptables -A INPUT -i lo -d 127.0.0.0/8 -j REJECT
 
  
#  Accepts all established inbound connections
+
[[Pilt:7562f2 (1).jpg]]
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  
#  Allows all outbound traffic
+
Olemasolevate reeglite nägemiseks
#  You can modify this to only allow certain traffic
 
iptables -A OUTPUT -j ACCEPT
 
  
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
+
# tc -s qdisc ls dev eth0
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
  
#  Allows SSH connections
+
Näiteks järgneva käsuga saame aeglustada liikluse kiiruse alla 200 ms peale
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
 
  
# Allow ping
+
# tc qdisc add dev eth0 root netem delay 200ms
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 
  
# log iptables denied calls
+
Selle käsu töötamist saame kergelt kontrollida ping käsu abil
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
 
  
# Reject all other inbound - default deny unless explicitly allowed policy
+
Reegli kustutamiseks
iptables -A INPUT -j REJECT
 
iptables -A FORWARD -j REJECT
 
</source>
 
  
===Lähme süviti keerukamaks===
+
# tc qdisc del dev eth0 root
  
hetkel tulemüürile teada olevate seansside tabel asub /proc/net/ip_conntrack
+
==== tc ehk traffic shaping ====
Custom Chains
+
''Traffic shaping'' keskendub tulemüürist väljuvale liikluse kujundamisele. Ehk LAN <- main_ROUTER/FIREWALL -> WAN.
iptables also allows you to create custom chains, which can then be specified as a target to jump to. For example, you could create a so-called whitelist for trusted IP address, and a blacklist for evil nodes on the Internet. To create the chains, you would give the following commands:
 
  
iptables -N whitelist
+
Linuxis on ''by-default'' pakettide väljumise reeglistik: '''''pfifo_fast'''''. Seal kasutatakse kolme "sektsiooni", milleks on: SSH, HTTP ja BULK. Ehk siis SSH on kõige tähtsama kaaluga ühendus, mille toimimisele aidatakse iga hinnaga kaasa, järgneb HTTP ja siis kõik muud ülejäänud.
iptables -N blacklist
 
To add a rule to these chains (or any other chain), use:
 
  
iptables -A whitelist -s 192.168.0.0/24 -j ACCEPT
+
Selleks, et ''pfifo_fast'' mingil võrguliidesel (näites eth0) asendada ''htb'' (vt ülevalt poolt), tuleb anda käsk:
iptables -A blacklist -s 207.46.130.0/24 -j DROP
+
  # tc qdisc add dev eth0 root handle 1: htb default 0
iptables -A blacklist -s 207.46.250.0/24 -j DROP
 
  
Then, specify these chains as a target in your INPUT, FORWARD and/or OUTPUT chain:
+
See loob nö peaklassi numbriga "1". '''default 0''' tähendab seda, et kui --set-class parameetrit mõnel reegil pole määratud, siis klassifitseeritakse 1:0 klassi.
  
iptables -A INPUT -j whitelist
+
HTB on hierahiline (nagu nimigi ütleb) ja kõikidele alumistele kehtivad ka ülemised reeglid. Peaklassi 1 jaoks luuakse alamklass 1:1, millele lisatakse reegel, mis piirab väljuva ühenduse piirkiirusele 3MB/s. Samuti on lisatud burst-kiirus (''ceil'') 3MB/s, mille võib suuremaks panna. Kui "bucket" tühjaks saab, siis vähendatakse kiirust esimese väärtuse peale.
iptables -A INPUT -j blacklist
+
  # tc class add dev eth0 parent 1: classid 1:1 htb rate 3072kbps ceil 3072kbps
iptables -A OUTPUT -j whitelist
 
iptables -A OUTPUT -j blacklist
 
iptables -A FORWARD -j whitelist
 
iptables -A FORWARD -j blacklist
 
  
Suppose there is a webserver in the SOHO Network, which must be available to the public (the Internet) as well as the clients on the LAN. This means you need to forward all requests to ROUTER B, port 80 to the webserver (suppose this webserver is at 192.168.2.20):
+
Lisame iptablesi reegli, mis määrab kõik sisevõrgust (eth1) tulnud paketid, mis suunduvad välisvõrku (eth0) klassi 1:1
 +
  # iptables -I FORWARD -t mangle -i eth1 -o eth0 -j CLASSIFY --set-class 1:1
  
# iptables -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination  192.168.2.20
+
Ülemine reegel kehtestab siis väljuva ühenduse maksimaalkiiruseks 3MB/s.
  
[[Pilt:Ftpcontrack1.png]]
+
Pakettide liikumist saab vaadata käsuga:
  
Serveri ja kliendi vahelise ühenduse loomine
+
  # watch --interval=0,1 tc -s class show dev eth0
  
Client                    Server
+
===Põnevat lisalugemist ehk lingid===
------                    -------
 
SYN------------------------>
 
      <---------------------SYN-ACK
 
ACK------------------------> Mõlemapoolne ühendus loodud
 
  
 
*https://wiki.itcollege.ee/index.php/Iptables
 
*https://wiki.itcollege.ee/index.php/Iptables
297. rida: 514. rida:
 
*http://newartisans.com/2007/09/neat-tricks-with-iptables/
 
*http://newartisans.com/2007/09/neat-tricks-with-iptables/
 
*http://aplawrence.com/Linux/iptables.html
 
*http://aplawrence.com/Linux/iptables.html
 +
*http://en.gentoo-wiki.com/wiki/Iptables
 +
*http://www.kmyfirewall.org/kmf_doc/iptables-concept.html
 +
*http://www.gege.org/iptables/
 +
*http://support.imagestream.com/QOS_with_iptables_CLASSIFY.html
 +
*http://samsclass.info/124/proj11/p5x-iptables-layer7.html
 +
 +
http://wiki.openwrt.org/doc/howto/tc
 +
http://www.amiryan.org/2009/02/16/traffic-shaping-under-linux-with-tc-and-iptables/
 +
http://lartc.org/howto/lartc.cookbook.fullnat.intro.html
 +
 +
*http://www.cyberciti.biz/faq/how-do-i-block-an-ip-on-my-linux-server/ hea kiire õpetus hädasolijatele saatmiseks. Kuidas IP blokeerida Linuxis
 +
 +
http://www.thice.nl/creating-ack-get-packets-with-scapy/
 +
 +
http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/ liikluse limiteerimine!
 +
 +
http://www.linuxjournal.com/article/7562?page=0,0
 +
 +
http://www.thegeekstuff.com/2011/06/iptables-rules-examples/

Viimane redaktsioon: 25. august 2014, kell 14:40

                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Tööpõhimõte

Iptables või NetFilter on töövahend linuxi kernelisse ehitatud filtreerimismehanismi kasutamiseks. Kokku koosneb iptables niisiis kahest osast. Kerneli moodulitest ning käsurea utiliidist.

Iptables koosneb kolme tüüpi objektidest:

  1. Reeglid (Rules)
  2. Ahelad (Chains)
  3. Tabelid (Tables)

Lisaks on olemas täiendavad moodulid nt erinevate protokollide jälgimiseks.

Ülevaatlikult iseloomustab pakettide liikumist läbi ahelate ning tabelite järgnev skeem.

Iptables.png

Reeglid

Peamisteks reegliteks mida rakendatakse on ACCEPT, DROP, LOG, REJECT, DNAT, SNAT ja MASQUERADE.

  • ACCEPT - lubab paketi
  • DROP - kustutab paketi armutult
  • REJECT - kustutab paketi ja teavitab sellest ka paketi saatjat
  • LOG - logib paketi ja liigutab paketi edasi järgmisele ahelale
  • DNAT – paketi saaja aadress muutmine
  • SNAT – paketi saatja aadressi muutmine
  • MASQUERADE - Paketi saatja aadressi muutmine tulemüüri enda omaks

Tabelid

Paketid liiguvad läbi tabelite ning ahelate ning seejärel neile omakorda rakendatakse reegleid.

Kõik ahelad kasutavad ühte või teist tabelit. Kui tabel pole määratud võetakse vaikimisi FILTER tabel.

Iptables sisaldab kolme põhitabelit:

filter TABEL

Seda tabelit kasutatakse pakettide filtreerimiseks läbi tulemüüri. Eesmärgiks on puhtalt pakettide filtreerimine. Näiteks sissetulevate pakettide (incoming), väljuvate pakettide (outgoing) ja pakettide mis on edastatud võrgukaartide vahel (filtering).

See tabel sisaldab kolme ahelat:

  • INPUT ahel - Sisenevate pakettide filtreerimine, ehk masinale endale suunatud liiklus.
  • OUTPUT ahel - Väljuvate pakettide filtreerimine, ehk masina enda genereeritud paketid.
  • FORWARD ahel - Võrgukaartide vahel edasi suunatud pakettide filtreerimine, või igasugune edastatav liiklus.

nat tabel Seda tabelit kasutatakse IP muutmiseks.

  • PREROUTING ahel - Kasutatakse IP aadressi muutmiseks enne paketi edastamist
  • POSTROUTING ahel - Kasutatakse IP muutmiseks peale paketi edastamist
  • OUTPUT ahel - Väljuvate ühenduste filtreerimiseks

mangle tabel Leiab kasutamist pakettide märgistamiseks. Igal linuxi tuuma läbival paketil on 32 bitine number ehk märk.

Tabelite sisu näeb järgnevate käsuga iptables -f <tabelinimi> -L. Näiteks:

# iptables -t filter -L

Ahelad

Ahel kujutab endast objekti mis on seotud mingi tabeliga ning millele on omakorda kirjutatud peale hulk erinevaid reegleid.

Masinasse sisenenud oakett liigub mööda ahelaid ülevalt alla seni kuni mõni reegel ühildub paketiga. Näiteks lubab selle või kustutab.

Vaatleme esialgu ahelaid FILTER tabelis. Ehk siis ahelaid INPUT, OUTPUT JA FORWARD.

Ahelates olevaid reegleid näeb käsuga:

# iptables -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

Selline pilt näitab, et mingeid reegleid hetkel pole kehtestatud.

Igal ahelaga saab siduda reegleid. Näiteks tekitame järgneva reegli:

# iptables -A INPUT -i eth0 -j REJECT 

See reegel on seotud INPUT ahelaga (-A) (ehk sissetulevad paketid) ja kehtib ainult pakettide kohta, mis sisenevad eth0 võrguliidesele (-i ehk input). -j Reject tähendab, et keeldutakse paketist ja antakse sellest ka paketi saatjale teada.

Ahelaid saab ka ise luua kasutades võtit -N. Aga selles juba edaspidi.

Ahela lõpetab ACCEPT, DROP, REJECT või RETURN. Lisaks on igal ahelal oma vaikimis poliitika. Kõigil kolmel põhiahelal (INPUT, FORWARD JA OUTPUT) on selleks ACCEPT.

Vaikepoliitikate seadistamine ahelatele.

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD DROP

Kõik reeglid ahelast saab kustutada käsuga

# iptables --flush OUTPUT

Reeglite kustutamiseks on vaja teada reegli järjekorranumbrit. Nende nägemiseks näiteks INPUT ahelas

# iptables -L INPUT -n --line-numbers

Ja sealt reegli kustutamiseks

# iptables -D INPUT 4

Nat reeglite vaatamiseks tuleb anda käsk

# iptables -nvL -t nat

Kustutamiseks aga

# iptables -t nat -D OUTPUT 1

Paneme nüüd ahelad, tabelid ja reeglid kokku

Mõned filtreerimise reeglid

Loome näiteks mõned filtreeirmise reeglid kasutades FILTER vaiketabelit ning ahelaid INPUT ja OUTPUT

Selleks, et masina sees olevad programmid saaksid internetti kasutada lubame pakettidel väljuda läbi OUTPUT ahela

# iptables -A OUTPUT -j ACCEPT

Selleks, et välismaailmast pääseksid kliendid ligi meie veebiserverile lubame 80nenda pordi kaudu INPUT ahelast pakettidel siseneda

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

Lubame terve hulga porte ühe käsuga

# iptables -A INPUT -p tcp 22,80,443 -j ACCEPT

Lisaks lubame välismaailmast serverit pingida

iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

Keelustame aga samas näiteks kõikidele ülejäänud portidele sissetulevad paketid

# iptables -A INPUT -j DROP


Veel paranoilisem logida kõik muud paketid ning seejärel need keelustada.

# iptables -A INPUT -j LOG --log-level 4
# iptables -A INPUT -j DROP

Ja põhimõtteliselt ongi meil masinale seadistatud primitiivne tulemüür mis lubab väljapoole ühendusi teha. Sisse lubab aga ainult ühendusi 80nendale pordile ning masinat pingida. Kõik muud ühendused logitakse ja keelatakse ilma paketi saatjat sellest teavitamata.

Veel võib meil tekkida soov vahel mõnd IP aadressi blokeerida.

# iptables -A INPUT -s 11.22.33.44 -j DROP

Üks võimalikult karm reeglistik veebi-serverile näeks välja aga seline

 # 1. kustutame eksisteerivad reeglid
 iptables -F
 
 # 2. Seadistame vaikekäitumiseks DROP
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT DROP 
 
 # 3. lubame sisse ssh
 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
 
 # 4. lubame sisse veebi
 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
 
 # lubame väljuva ssh
 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Või siis väiksemale lokaalvõrgu ruuterile/veebimasinale selline vähem karm poliitika

 iptables -P INPUT DROP
 #See reegel ei luba mitte mingisugust sisenevat liiklust, väljaarvatud muidugi allpool tulevad  erandid. 
 iptables -P FORWARD ACCEPT
 #edasisiinamised lubatud
 iptables -P OUTPUT ACCEPT
 #väljuv liiklus lubatud
 iptables -A INPUT -i lo -j ACCEPT
 #lokaalmasina liiklus samuti lubatud
 iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
 #Lubame kõik liikluse veebiserveri porti
 iptables -A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
 #lubame liikluse veebiserveri https porti
 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
 #lubame kõik liikluse meie sisevõrgust 
 iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 #lubame masinat pingida
 iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
 #lubame läbi juba loodud ühendused

Reeglite taasesitamine ja salvestamine

Laadime reeglistiku mällu

# /sbin/iptables-restore < /etc/sysconfig/iptables

Salvesame aktiivsed reeglid

# /sbin/iptables-save > /etc/sysconfig/iptables

Mille tulemusena tekib umbes järgnev fail

*filter
:FORWARD ACCEPT [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -f -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A OUTPUT  -p icmp -j ACCEPT
-A OUTPUT  -p udp  -j ACCEPT
-A OUTPUT  -p tcp  -j ACCEPT

COMMIT

Pordiedastus

Suuname serveri välise pordi edasi sisevõrgul olevale masinale IP aadressiga 192.168.2.20

# iptables -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination  192.168.2.20

Uute ahelate loomine ja reeglitega sidumine

Võimalik on luua ka täiesti uusi ahelaid ning siduda neid omakorda erinevate tabelitega. Kui tabel pole määratud kasutatakse automaatselt FILTER tabelit.

Näide1 Loome ahela nimega LOGDROP

# iptables -N LOGDROP

Lisame sinna ahelasse, et sealsed paketid logitakse

# iptables -A LOGDROP -j LOG

Ning seejärel kustutatakse

# iptables -A LOGDROP -j DROP

Edaspidi saame nüüd hoida ruumi kokku ning igalepoole ahelatele kahe LOG ja DROP reegli kirjutamise asemel võime suunata nad ümber meie loodud ahelale. Näiteks:

# iptables -I FORWARD -d 192.168.1.6 -p tcp --dport 21 -j LOGDROP

Näide 2. Loome ahela nimega blacklist kus olevad aadressid armutult blokeeritakse

# iptables -N blacklist

Lisame sinna tabelisse kaks aadresside vahemikku

# iptables -A blacklist -s 207.46.130.0/24 -j DROP
# iptables -A blacklist -s 207.46.250.0/24 -j DROP

Seejärel blokeerime meie loodud ahela kõigis kolmes põhiahelas. Ehk siis keelame nii siseneva kui väljuva ja võrgukaartide vahel ruuditava liikluse neile võrkudele.

# iptables -A INPUT -j blacklist
# iptables -A OUTPUT -j blacklist
# iptables -A FORWARD -j blacklist

PS: tabelite/nimekirjade kasutamine ei ole iptablesis väga kergelt lahendatud Igast nimekirjast eraldi ahelate tegemine muudab iptablesi aeglaseks

Vajades suuri tabeleid on lahenduseks IPSet nimekirjad, mis tuleb eraldi paigaldada.

Network adress translation kasutades NAT tabelit

Siin tuleb meels pidada, kui väline IP aadress on dünaamiline tuleb teha maskeraad, muidu tuleb teha sNATi

Lubame kerneline IP'de edastamise võrguseadmete vahel.

# echo "1" > /proc/sys/net/ipv4/ip_forward

Laadime NAT'i mooduli

# modprobe iptable_nat

Oluline vahe on sellel, et kas teha maskeraadi või SNATi. Peamiselt seetõttu, et maskeraad on serverile töömahukam, kuna selle puhul kontrollitakse iga paketi korral väljuva võrguseadme IP aadressi. Seepärast tasub staatilise IP aadressi korral eelistada SNATi.

Maskeraad

Saatja aadress muudetakse tulemüüri omaks. Näiteks kasutame seda, et ühendada LAN internetiga:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Võtmed tähendavad siin järgnevat:

  • -t nat - Valime tabeli nat.
  • -A - POSTROUTING Kasutame postrouting ahelat
  • -o - eth0 reegel kehtib pakettidele mis väljuvad esimeselt interfacelt (-o tähendab output)
  • -j - MASQUERADE Saatja aadress asendatakse ruuteri aadressiga.

Snat

Juhul kui ruuter omab staatilist IP aadress on soovitatud ülaloleva näite kasutada source NAT'i. Selleks tuleb kirjutada järgnev käsk:

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to <eth0-ehk välise võrguseadme IP aadress>

Moodulid

Tarpit

you will need to enable the TARPIT option and rebuild the kernel. The new options will be found under "Networking Options -> IP: Netfilter Configuration". You will need to enable the "Packet Filtering" option to see the TARPIT option. Once you've successfully enabled the TARPIT module, rebuild the kernel and modules, and reboot if necessary.

To tarpit connections to TCP port 80 destined for the current machine:

 iptables -A INPUT -p tcp -m tcp --dport 80 -j TARPIT

To significantly slow down Code Red/Nimda-style scans of unused address space, forward unused ip addresses to a Linux box not acting as a router (e.g. "ip route 10.0.0.0 255.0.0.0 ip.of.linux.box" on a Cisco), enable IP forwarding on the Linux box, and add:

 iptables -A FORWARD -p tcp -j TARPIT
 iptables -A FORWARD -j DROP

You probably don't want the conntrack module loaded while you are using TARPIT, or you will be using resources per connection.

Moodul time

Veel üks huvitav moodul, mis lubab teha reegleid, mis kehtivad vaid teatud kellaaegade.

iptables -A FORWARD -p tcp --dport 22 -m time --timestart 8:00 --timestop 22:00 --days \
Mon,Tue,Wed,Thu,Fri -j ACCEPT

Moodul owner

Võimalik on seadistada ka reegleid teatud kasutajatele.

-m owner --uid-owner mart

Geoip moodul

Allow ssh for own country(DE) and the country where you take holidays(FR)

iptables -A INPUT -p tcp --dport 22 -m geoip --src-cc DE,FR -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Block access to FTP server for Papua New Guinea (PG)

iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc PG -j DROP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Kasutamiseks on vajalik paigaldada http://xtables-addons.sourceforge.net/

l7 filter

Paigaldame paketid. Gentoos käib see järgnevalt:

# emerge -av l7-protocols l7-filter

Ehitame kernelisse layer7 kontrolli mooduli

Networking
    Networking support (NET [=y])
      Networking options
        Network packet filtering framework (Netfilter)
          Core Netfilter Configuration
            {*} Netfilter Xtables support (required for ip_tables)
            [M] "layer7" match support

Kasutamine

iptables -t filter -A INPUT -m layer7 --l7proto edonkey -j ACCEPT
iptables -t filter -A OUTPUT -m layer7 --l7proto edonkey -j ACCEPT

Quota

iptables -A OUTPUT -p tcp --dport 80 -m quota --quota 1024 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j DROP

Lubab 1MB veebliiklust 80 pordile, misjärel reegel lõpetab toimimise ja liiklus kukutatakse maha.

Koormusjagamine

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

Stateful tulemüür ja ühenduste jälgimine

Kõik ühenduste jälgimised toimuvad raamistiku abil nimega conntrack (see võib olla kas juba kompileeritud staatiliselt kernelisse või laetud kerneli moodulina nimega ip_conntrack).

See raamistik jaotab paketid nelja state milledeks on NEW, ESTABLISHED, RELATED ka INVALID

  • NEW – tegemist värske ühendusega
  • ESTABLISHED - Edukalt loodud ja töötav ühendus
  • RELATED – ühendus kuulub mõne teise ühenduse juurde (nt ftp data kanal)
  • UNTRACKED – ühendust ei jälgita

/proc/net/ip_conntrack sisaldab kõiki conntracki admebaasi sissekandeid. (selleks peab olema ip_conntrack moodul laetud)

# cat /proc/net/ip_conntrack
tcp	  6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
	 dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
	 dport=32775 [ASSURED] use=2

--state lipu kontrolli abil saab kergelt nendel pakettidel vahet teha

Näiteks saame lubada pakette, mis on seotud juba varemalt loodud ühendustaga --state ESTABLISHED võtmega. Või lasta läbi pakette, mis on seotud vana sessiooni põhjalt algatatud uue ühendusega --state RELATED abil.

Milleks seda vaja? Peamiselt siis kui meil asub tulemüüri taga klient, kes peale control ühenduse loomist soovib andmete ülekannuks luua veel eraldiseisvaid ühendusi. Näiteks kui on laetud nf_conntrack_ftp, siis esimene FTP info ülekandmiseks vajalikud pakettid liigitatakse sildiga "related", mitte "new" ja lubatakse sedaviisi tulemüürist mööda.

Laetud (või kernelisse kompileeritud) peab RELATED kontrolli jaoks olema veel lisaks ip_conntrackile moodul:

ip_conntrack_ftp

Juhul kui tegemist NATitud võrguga on vaja laadida ka spetsiifilised NATiga seotud jälgimismoodulid, mis algavad enamasti ip_nat_ algusega.

Lihtne stateful tulemüür, mis keelaks kõik sisenevad aga lubaks väljuvad ühendused näeks välja selline:

iptables -P INPUT DROP
iptables -A INPUT -i ! eth1 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Liikluse kontroll ehk qos

Selleks on vaja paigaldada iproute2 pakett mis sisaldab programmi tc

  • tc - show / manipulate traffic control settings

http://linux-ip.net/articles/Traffic-Control-HOWTO/

7562f2 (1).jpg

Olemasolevate reeglite nägemiseks

# tc -s qdisc ls dev eth0

Näiteks järgneva käsuga saame aeglustada liikluse kiiruse alla 200 ms peale

# tc qdisc add dev eth0 root netem delay 200ms

Selle käsu töötamist saame kergelt kontrollida ping käsu abil

Reegli kustutamiseks

# tc qdisc del dev eth0 root

tc ehk traffic shaping

Traffic shaping keskendub tulemüürist väljuvale liikluse kujundamisele. Ehk LAN <- main_ROUTER/FIREWALL -> WAN.

Linuxis on by-default pakettide väljumise reeglistik: pfifo_fast. Seal kasutatakse kolme "sektsiooni", milleks on: SSH, HTTP ja BULK. Ehk siis SSH on kõige tähtsama kaaluga ühendus, mille toimimisele aidatakse iga hinnaga kaasa, järgneb HTTP ja siis kõik muud ülejäänud.

Selleks, et pfifo_fast mingil võrguliidesel (näites eth0) asendada htb (vt ülevalt poolt), tuleb anda käsk:

  # tc qdisc add dev eth0 root handle 1: htb default 0

See loob nö peaklassi numbriga "1". default 0 tähendab seda, et kui --set-class parameetrit mõnel reegil pole määratud, siis klassifitseeritakse 1:0 klassi.

HTB on hierahiline (nagu nimigi ütleb) ja kõikidele alumistele kehtivad ka ülemised reeglid. Peaklassi 1 jaoks luuakse alamklass 1:1, millele lisatakse reegel, mis piirab väljuva ühenduse piirkiirusele 3MB/s. Samuti on lisatud burst-kiirus (ceil) 3MB/s, mille võib suuremaks panna. Kui "bucket" tühjaks saab, siis vähendatakse kiirust esimese väärtuse peale.

 # tc class add dev eth0 parent 1: classid 1:1 htb rate 3072kbps ceil 3072kbps

Lisame iptablesi reegli, mis määrab kõik sisevõrgust (eth1) tulnud paketid, mis suunduvad välisvõrku (eth0) klassi 1:1

 # iptables -I FORWARD -t mangle -i eth1 -o eth0 -j CLASSIFY --set-class 1:1

Ülemine reegel kehtestab siis väljuva ühenduse maksimaalkiiruseks 3MB/s.

Pakettide liikumist saab vaadata käsuga:

 # watch --interval=0,1 tc -s class show dev eth0

Põnevat lisalugemist ehk lingid

http://wiki.openwrt.org/doc/howto/tc http://www.amiryan.org/2009/02/16/traffic-shaping-under-linux-with-tc-and-iptables/ http://lartc.org/howto/lartc.cookbook.fullnat.intro.html

http://www.thice.nl/creating-ack-get-packets-with-scapy/

http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/ liikluse limiteerimine!

http://www.linuxjournal.com/article/7562?page=0,0

http://www.thegeekstuff.com/2011/06/iptables-rules-examples/