Iptables puust ja punaseks

Allikas: Kuutõrvaja
Redaktsioon seisuga 19. detsember 2011, kell 14:24 kasutajalt Jj (arutelu | kaastöö) (Ahelad)
                                        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.

DM NF.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

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

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.

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

Lubame kerneline IP'de edastamise võrguseadmete vahel.

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

Laadime NAT'i mooduli

# modprobe iptable_nat

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

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

Võtmed tähendavad siin järgnevat:

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

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 aadress>

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.

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/

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

Connection tracking helpers

Next type the following command to load two iptables modules:

# modprobe ip_conntrack
# modprobe ip_conntrack_ftp

sip-conntrack-nat

Once you've recompiled the kernel, make sure you load the modules.

       # modprobe ip_conntrack_sip ip_nat_sip
       # lsmod | grep ip_nat_sip
       ip_nat_sip              4288  0
       ip_conntrack_sip        6544  1 ip_nat_sip
       iptable_nat            20444  1 ip_nat_sip
       ip_conntrack           38808  3 ip_nat_sip,ip_conntrack_sip,iptable_nat
   

Netfilter will take care of the conntracking and NAT of SIP packets now, but don't forget the iptables rules. Examples as follows:

Set iptables rules to allow UDP packets on port 5060:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --dport 5060 -j ACCEPT
   

And NAT as follows:

iptables -A FORWARD -o eth0 -p udp --dport 5060 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 200.68.89.15
   

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/