Tulemüürimas IPTABLES abiga

Allikas: Pingviini viki

Enne kui asuda IPTABLES juurde

Antud manuaalis tuleb juttu ainult kõige tavalisematest kasutamisviisidest, nendest algteadmisteks millest peaks piisama, et edasi uurida või koostada enda vajadustele vajalik tulemüürimisreeglistik.

Siinkohas tooks ka ära materjalid, mida kasutasin antud manuaali koostamiseks: Järgmised lingid on http://www.netfilter.org kellel inglise keel suus võib lugeda antuid manuaale seal käsitletakse rohkem IPTABLES võimalusi.

Antud manuaalis võib olla vigu, ebatäpsusi. Kõik ettepanekud ja parandused on teretulnud mr.bobc[ät]gmail.com


Milleks tulemüür?

Tulemüüri vajalikus seisneb selles, et kaitsta oma võrgurakendusi, balansseerida võrguliiklust, suunata, jagada võrguühendust ja veel muid võimalusi millel esialgu ei peatu. Juhul kui arvuti asub sisevõrgus ja arvuti on välisvõrgus nähtav (näiteks: võrku jagab ruuter, mis on varustatud ja häälestatud tulemüüriga) siis ei pruugi kasutaja vajalikuks pidada lisaks eraldi tulemüüri häälestada. Ka peaks enamus GNU/Linux distributsioone olema eelnevalt koostatud minimaalse tulemüürimisreeglistikuga. Seega need, kes on rahul oma senise olukorraga ja ei pea vajalikuks torkida IPTABLES või lihtsalt minimaalselt end harida, jätku asi siinkohas katki. Minu arvates on tulemüür arvuti, eriti kui on kasutuses mingit liiki ???, jaoks vägagi tähtsal kohal.

IPCHAINS või IPTABLES?

Kernelite seeria 2.2 ja ka 2.4 on võimalus kasutada IPCHAINS'i mida küll tulevikus hakkab asendama IPTABLES. Kernel seeria 2.4 ja 2.6 on siis varustatud IPTABLES`iga, mida saab sisse kompileerida nii moodulina või otse kerneli bzImage`sse. Eeldan, et lugejal on väikene kogemus kerneli kompileerimisega, kui pole siis pole midagi muud teha kui lugeda kernel-compiling HOWTO'd. Vägagi vajalikuks osutub siinkohas omada ülevaadet, mis riistvaraga tegemist on, et vältida ebameeldivusi kui mõni seade või liides ei toimi.

Kerneli moodulid

Mida siis valida, et oleks iptables kernelisse sisse kompileeritud (kas moodulina või mitte) ise eelistan moodulina.

Valides:

Device Drivers ->
Networking Support ->
Networking Options ->
*Network paket filtering

Siin saab valida kas IPv4 ja ka IPv6 kohta iptables tugi, ise peatun IPv4 kohapealt kuigi toon ära ka lihtsa reeglistiku IPv6 kohta. On ju ka IPv6 juba üpris palju levinud. Ettetulevas loetelus märkisin enamus Moodulitena jätsin valimata ainult EXPERIMENTAL, kuigi ei pruugi kõiki mooduleid vaja minna. Muidugi on iga mooduli, optioni kohta ka piisav Help, soovitan seda uurida enne kui otsustad. Kui soovid võrku jagada siis vali kindlasti ka M, kus on märge masq/NAT.


Mida vaja läheb

*Connection tracking
*IP Tables support
*Limit match support (võib vaja minna näiteks pingimise piiramisel), lisaks võib hiljem vaja
 minna  mark mooduleid (näiteks võrgu liikluse balansseerimisel või muul    otstarbel)
*IP range match
*Ka on soovitav äramärkida kõik FTP IRC TFTP ja muud protocol support, neid on siis vaja kui 
kasutada MASQ ja sisevõrgus on kellelgi vaja antud protokolli kasutus (FTP ja IRC ikka on).
*Packet filtering
*LOG rarget support vajalik näiteks võrguliikluse jälgimiseks, kes kust 
üritas ühendust saada.
*Full NAT MASQURADE REDIRECT

Nüüd peaks eluks vajalik olemas olema, antud loetelus võib olla midagi puudu või üleliigselt, ise nagu eespool mainisin selekteerin tavaliselt enamuse, kunagi ei või teada ette mida võib vaja minna, ja ega need moodulid kettaruumi ka nii palju võta. Siinkohas sai ainult äratoodud kerneli pinnapealne konfigureerimine, vähemalt annab see suuna kätte. Ka eeldan, et Netfilter IPTABLES on eelnevalt installeeritud, kui pole saab selle lehelt http://www.netfilter.org/ millega kaasneb ka korralik installeerimisõpetus, kus ka peaks olema äramainitud vajaminevad moodulid mida kernelisse kompileerida.

Aeg asuda IPTABLES juurde

Põhiahelad

Natuke ka juttu kolmest põhiahelast:

  • INPUT - läbi selle ahela käib kogu sissetulev liiklus.
  • FORWARD - läbi selle ahela edastatakse paketid, muudele ip näiteks sisevõrgus asuvale pc'le.
  • OUTPUT - siit lähevad paketid välja.


Pisike ASCII skeem illustreerimaks põhiahelaid, siinkohas veel niipalju, et ära on jäetud NAT kolm ahelat aga nende juures peatume hiljem.

[sissetulevad paketid N:eth0 seadmele]->(otsustus, kas) 
->INPUT ---> PROGRAMM->OUTPUT->

või

->FORWARD ----------------->OUTPUT-> 
[väljuvad paketid N:eth0 seadmele] 

Kuna skeem on kehvavõitu siis ka selgitav jutt juurde. Kuidas siis kernel pakette käsitleb:

  • Kõigepealt kui pakett tuleb võrgu seadme pealt, kontrollitakse paketti lõpppunkti (kuhu pakett oli suunatud, mis ip ja mis pordi peale)
  • Kui pakett oli suunatud antud PC ip peale, siis läbib pakett INPUT ahelat. Kui ta läbib selle, st. ei visata maha siis jõuab ta programmile.
  • Kui paketiedastus (ip forward) on lubatud ja sissetulev paketti lõpppunkt on teine ip, võrguseade, siis pakett läbib FORWARD ahelat.
  • Kõik paketid, mis saavad algust antud PC pealt läbivad OUTPUT ahelat enne kui nad jõuavad võrguseadmele.


Kui nüüd nendele ahelatele on seatud reeglid ja sissetulev, edastatav või väljaminev pakett ei vasta reeglile, siis ta lihtsalt visatakse maha (DROP), kui just pole ahelatele äramärgitud käitumisviisiks (ACCEPT).


Kuidas luua muuta reeglikogu

  • Loo uus reeglikogu -N Näiteks: iptables -N test
  • Kustuta reeglikogu -X Näiteks: iptabels -X test (kustutab test reeglikogu, koos reeglitega)
  • Muuda käitumisviisi -P Näiteks: iptables -P INPUT DROP
  • Kuva reeglistikke -L Näiteks: iptables -L
  • Kustuta reeglikogu reeglid -F Näiteks: iptables -F


Kuidas lisada, eemaldada või muuta reegleid

  • Lisab uue reegli -A
  • Lisab uue reegi määratud positsioonile -I , kui pole positsiooni määratud lisab kõige esimeseks
  • Muudab reeglit määratud positsioonil -R
  • Kustutab reegli -D


Nagu sai ära toodud kas lisatakse määratud positsioonile milleks on siis järjekorra number (kui kuvada iptables -L) ja siis lugeda mitmendat rida kustutada tahad. Iga reegli INPUT FORWARD ja OUTPUT juures hakkab reegel nr. 1. Ka saab kustutada või muuta kui kirjutada reegel täielikul kujul välja. Hiljem enda jaoks elu lihtsamaks tegemiseks koostad kogu reeglistik enne sisestamist valmis ja polegi vaja midagi lugeda.


Näited

Näiteks sisestasid:

iptables -I INPUT -s 192.168.1.2 -p tcp --dprot 21 -j DROP

//ei taha, et sisevõrgus  192...2 sinu ftp  serverisse saaks.


Selle reegli kustutamine:

iptables -D INPUT 1  // eeldusel, et see reegel on esimene või siis 

iptables -D INPUT -s 192.168.1.2 -p tcp --dprot 21 -j DROP 

 //mis siis eemaldab antud reegli.


Millest koosneb reegel

iptables [MIDA_TEHA] [KUHU_LISADA] [PROTOKOL] [ALLIKAS] [KUHU] [REEGEL]


MIDA_TEHA

  • Sisestad -A või -I
  • Kustutad -D
  • muude optionite jaoks vaata 'Kuidas lisada, eemaldada või muuta reegleid


KUHU_LISADA

  • INPUT
  • OUTPUT
  • FORWARD
  • Või siis omapoolt loodud reeglikogusse (iptables -N reeglikogu_nimi)


PROTOKOL

  • --protocol tcp või -p tcp - TCP protokolli korral. TCP protokolli kohta käivad lisa valikud:
    • --tcp-options
    • --tcp-flags
    • --syn
  • --protocol udp või -p udp - UDP protokolli korral
  • --protocol icmp või -p icmp - ICMP protokolli korral. ICMP protokolli kohta käivad lisa valikud:
    • --icmp-type echo-reply - PING päring.
    • Muude valikute kohta saab infot kasutades: iptables -p icmp --help

Näide: on soov, et viskaks maha kõik ping päringud.

iptables -A INPUT -p icmp --icmp-type ! echo-reply -j ACCEPT 	

Lubab kõiki icmp paketitüüpe väljaarvatud echo-reply. Siinkohas tooks ka näite limit kasutamise kohta, lubame ainult ühe pingi sekundis.

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT 


ALLIKAS

Siia määratakse ära kust päring on alguse saanud, mis ip, pordi ja ka seadme (võrgukaart) pealt.

  • -s IP/NETMASK - allika ip ja netmask
  • --sport PORDI_NR - port
  • -i SEADE - ppp0, eth0, jne.

Kui näiteks tahetakse lubada ühendust igalt aadressi pealt siis panna lihtsalt -s 0/0 või jätta üldse -s ja --sport ära, mis pannakse siis vaikimisi -s 0/0 .


KUHU

Siia määratakse ära kuhu päring võib minna, mis ip, porti ja ka seadme (võrgukaart) peale, lõpppunkt.

  • -d IP/NETMASK - allika ip ja ka netmask
  • --dport PORDI_NR - port
  • -i SEADE - ppp0, eth0, jne.

Näiteks on soov kehtestada reegel kõigi eth või siis ppp seadmete kohta, selleks märkida -i eth+ või siis ppp jaoks -i ppp+


REEGEL

  • -j DROP Viskab sellele reeglile vastava paketti maha.
  • -j ACCEPT Lubab antud reeglile vastava paketi läbi.


Näited

iptables -A INPUT -p tcp -s 0/0 -i ppp0 --dport 80 -j ACCEPT 

Antud reegel lubab, kõiki pakette, mis tulevad seadme ppp0 pealt pordi 80`le.

Näiteks reegel illustreerimaks keeldu:

iptables -A INPUT -p tcp -s 0/0 -i ! ppp0 --dport 80 -j ACCEPT 

Antud reegel lubab kõikide võrguseadmete pealt tulevat liiklust port 80`le väljaarvatud ppp0 pealt tulevat. Hetkel võib tunduda eelnev jutt tiba segasena, seega asume konkreetse näite juurde.

Keerulisem näide

Antud näide on võetud www.netfilter.org lehelt, kuna hea lihtne mida seletada ja ka edasi kohendada vastavalt enda vajadustele. Link näite juurde.

1.# iptables -N block 
2.# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT 
3.# iptables -A block -m state --state NEW,INVALID -i ! ppp0 -j ACCEPT 
4.# iptables -A block -j DROP 
5.# iptables -A INPUT -j block 
6.# iptables -A FORWARD -j block


State

Enne kui alustab selle lühikese reeglistiku lahtiseletamist natuke STATE kohta State (paketi olek või kuidas seda paremini tõlkida)

State tüübid:

  • NEW - uus pakett, mis soovib ühendust luua.
  • ESTABLISHED - olemas olev ühendus.
  • RELATED - seotud juba loodud ühendusega.
  • INVALID - vigane paket või pole lihtsalt seotud olemasolevate ühendustega.

Näite seletus

1. reas koostatakse uus reeglikogu, kasulik on see antud puhul, et ei peaks sisestama FORWARD sama mida INPUTI.

Ka läheb vaja reeglikogu keerulisemate reeglite koostamisel. 

2. rida lubab siis kõiki pakette läbi, mis on olemas olevad või seotud.

3. lubab läbi uusi pakette väljaarvatud seadme ppp0 pealt.

4. rida määrab ära, et ülejäänud paketid, mis ei vasta reeglitele 2 ja 3 visatakse maha. Reegleid hakatakse kontrollima ülevaltpoolt alla 2 -> 3 -> 4.

Näiteks kui sooviks antud reeglistiku nii ümber teha, et lubaks väljastpoolt tulevat liiklust port 80 peale. Selleks tuleb ainult sisestada reegel enne rida 3. ja milleks võiks olla:

input -I block -p tcp --dport 80 -j ACCEPT 

 //mis lisab antud reegli esimeseks.


Näiteks sooviks veel ka logi paketide kohta, mis maha visatakse. LOG peab siis asuma enne DROP rida, kui asuks peale siis teda ei logitaks. Saab ka logida näiteks ühendust mingi pordi peale jne.

input -I block -m limit -j LOG

 // log kirjutatakse /var/log/message faili.


5. ja 6. lisavad antud reeglikogu INPUT ja FORWARD põhikogusse.

Näide koos LOG ja avatud port 80.

# iptables -F  // kustutab kõik eelnevad reeglid 
# iptables -N block 
# iptables -A block -p tcp --dport 80 -j ACCEPT 
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT 
# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT 
# iptables -A  block -m limit -j LOG 
# iptables -A block -j DROP 
# iptables -A INPUT -j block 
# iptables -A FORWARD -j block

Neti jagamine ja teised NAT'i võimalused

Neti jagamine MASQURADE ja SNAT

Antud kohas peaks paar sõna mainima NAT (Network Adress Translation) kohta.

NAT jaguneb ise kaheks:

  • SNAT - Kus siis muudetakse allika aadressi st. muudetakse aadressi kust ühendus tuleb enne kui pakett välja saadetakse.

Kuulub POSTROUTINGU alla.

  • DNAT - Kus siis muudetakse aadressi kuhu pakett saadetakse. Tehakse alati enne INPUT, FORWARD`i.

Kuulub PREROUTINGU alla.

NAT all on ka 3 ahelat.

  • PREROUTING - käivad läbi sissetulevad paketid, enne kui nad lähevad INPUT või FORWARDI
  • POSTROUTING - käivad läbi väljuvad paketid, peale OUTPUT'i
  • OUTPUT - väljund.
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE	

Kui see lihtne reegel lisada eelnevale näitele, siis saavad sisevõrgus olevad arvutid ka internetti kasutada, tuleb ka lubada paketide forwarding (echo 1 > /proc/sys/net/ipv4/ip_forward). Alternatiiviks sulgudes näidatud käsule on failis /etc/sysctl.conf muuta muutuja net.ipv4.ip_forward väärtus 1-ks, mis vaikimisi on 0.

MASQUERADE on hea siis kasutada kui on dünaamilise ip interneti ühendus.

Kui aga on staatilise ip, siis võiks kasutada ka järgnevat

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to VÄLINE_IP

Pordi edastus sisevõrgus olevale PC'le

Antud osa võib ka üpriski vajalikuks osutuda, mõningane tarkvara vajab välisvõrguga otseühendust (st. et mujalt saaks ühendust sisevõrgus oleva PC'ga).

iptables -t nat -I PREROUTING -i ppp0 -p tcp --dport PORT -j DNAT --to SISEVÕRGUS_PC_IP
iptables -I block -p tcp --dport PORT -j ACCEPT 


Esimene rida siis muudab ära kõik paketid, mis tulevad PORT peale ja suunab nad edasi SISEVÕRGUS_PC_IP peale.

Teine rida on vajalik selleks, et peale PREROUTINGUT läbib ka paket INPUT ja FORWARD reeglistikud.

Et nüüd ka ühendus toimiks peab programmis paika pandud VÄLISVÕRGU_IP ja PORT, piisab ka PORDI määramisega, sest välisvõrgus asuv server näeb paketti tulevat VÄLISVÕRGU_PC tänu MASQ või SNAT`le. Ja kõik ühendused, mis tulevad PORDI peale suunatakse automaatselt SISEVORGUS_PC_IP peale.


Liikluse suunamine

Suunaks ümber liiklust

Näiteks sooviksid, et kõik paketid, mis lähevad IP'le XXX.XXX.XXX.XXX ümber suunata IP'le YYY.YYY.YYY.YYY.

iptables -t nat -I PREROUTING -d XXX.XXX.XXX.XXX -j DNAT --to-destination YYY.YYY.YYY.YYY


Kui nüüd üritad saada ühendust XXX...XXX siis sattud hoopis YYY...YYY peale.

Võimalus on kombineerida erinevaid viise kust pakett alguse sai ja kuhu läheb.NAT kohta peaks esialgu piisama.

Lõpetuseks, NÄIDE ning natuke ka IPv6'st

Reeglite salvestamine

Hoiatus! Reeglid püsivad järgneva reboodini!

Kuna reegleid hoitakse mälus ja ei salvestata kettale peab, kasutaja seda tegema, või teeb vastavalt distributsioonile seda init rc skriptid. Näiteks RedHat olid iptables reeglistik failis /etc/sysconfig/iptables. Siin kohas mainin ainult ära kuidas salvestada ja uuesti laadida reeglistikku failist. Kuidas täpsemini sinu distributsioonis asi käib uuri kodulehelt või tehnilise toe foorumist.

iptables-save > FAILI    


Salvestab reeglistiku faili. On nüüd vaja paigaldada saadud fail või faili sisu sinna kust IPTABLES init.rc script seda laeb. (loe enda distro manuaali) iptables-restore < FAILIST

Laeb failist reeglistiku.

Näide, kus kõik on koos

iptables -P INPUT DROP 
iptables -N test 
iptables -A test -p tcp -m tcp --dport 30100:30200 -j ACCEPT 
iptables -A test -p icmp -m icmp ! --icmp-type 0 -j DROP 
iptables -A test -p udp -m udp --dport 10000 -j ACCEPT 
iptables -A test -p udp -m udp --dport 10002 -j ACCEPT 
iptables -A test -p tcp -m tcp --dport 10002 -j ACCEPT 
iptables -A test -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A test -i ! ppp0 -m state --state NEW -j ACCEPT 
iptables -A test -m limit -j LOG --log-prefix "MAHAVISATUD PAKETID:" 
iptables -A test -j DROP 

iptables -A INPUT -j test 
iptables -A FORWARD -j test 

iptables -A POSTROUTING -o ppp0 -j MASQUERADE 

IPv6

Ipv6 reeglistik sarnaneb IPv4 omaga suuremaid erinevusi on see, et IPv6 ei toeta connection state, seega sarnaneb reeglistik nagu IPCHAIN'iga ka pole NAT tänu IPv6 võimalustele.

Näide IPv6 kohta

ip6tables -P INPUT DROP 
ip6tables -P FORWARD DROP 
ip6tables -N test6 
ip6tables -A test6 -p tcp --syn -j DROP 
ip6tables -A test6 -p tcp --dport 32768:61000 -j ACCEPT 
ip6tables -A test6 -p udp --dport 32768:61000 -j ACCEPT 
ip6tables -A test6 -p ipv6-icmp --icmpv6-type destination-unreachable -j ACCEPT 
ip6tables -A test6 -p ipv6-icmp --icmpv6-type packet-too-big -j ACCEPT 
ip6tables -A test6 -p ipv6-icmp --icmpv6-type time-exceeded -j ACCEPT 
ip6tables -A test6 -p ipv6-icmp --icmpv6-type parameter-problem -j ACCEPT 
ip6tables -A test6 -p ipv6-icmp --icmpv6-type echo-reply -j ACCEPT 
ip6tables -A INPUT -j test6 
ip6tables -A FORWARD -j test6 

Kindlasti on siin veel hulganisti vigu, kui märkad anna kindlasti teada, olen väga tänulik.

Kui tekkis küsimusi ideid paluks emailida mr.bobc[ät]gmail.com

Välislingid


Autor:bobc