IPTABLES naudojimas

16 vasario, 2007 – 12:32

IPTABLES tai paketų filtras (prafiltruojami nereikalingi paketai (nesupratusiems tai paketai būtų tinklo srautas; juos filtruoti reikia, nes visiškai uždarydami nereikalingus prievadus (pavyzdžiui 80 prievadą, kurio mes nenaudojame, arba 22 (SSH)) mes sumažiname įsilaužimo tikimybę), taip pat jie gali būti persiunčiami į kitą kompiuterį (su IPTABLES galima iš paprasto kompiuterio pasidaryti maršrutizatorių (aparatas, kuris aprūpina tinklą srautu ir atlieka dar keletą funkcijų, bet ši buvo esminė)); kitaip sakant IPTABLES gali dirbti ne tik kaip ugniasienė, bet ir maršrutizatorius) Unix tipo sistemoms. Juo iš tikrųjų gana patogu naudotis ir jis yra labai galingas. Bet tai tik mano nuomonė. Įsitikinti galėsite šiame straipsnyje.

Jau senai norėjau parašyti straipsnį apie IPTABLES naudojimą. Viską darysime Gentoo sistemoje, todėl gali kilti šiek tiek nesuderinamumų tarp kitų OS dėl komandų, bet pagrindinės IPTABLES komandos tos pačios. Pavyzdyje naudosimės 2.6 kernel’iu.

Pirmiausiai turime įsitikinti, kad mūsų sistema palaiko IPTABLES, o ne IPCHAINS (tai senesnė paketų filtro versija, kuri naudojama 2.4 kerneliuose). Tai padarysime šia komanda:

# grep -i netfilter /usr/src/linux/.config

Jeigu gausime atsakymą, kuris nėra „CONFIG_NETFILTER=y“, vadinasi mes neturime IPTABLES palaikymo dabar naudojamame kernel’yje. O jeigu gausime tokį atsakymą tai galime praleisti kernel’io kompiliavimo sekciją.

Kompiliuojame kernel’į su IPTABLES palaikymu

Pirmiausiai atsisiųskime kernel’io išeities tekstus („sources“; iš www.kernel.org) ir išpakuokime į /usr/src/linux komanda:

# tar xzfv kernel*.tar.gz -C /usr/src/linux

tar.gz archyvui, o tar.bz2 archyvui būtų tokia komanda:

# tar xjfv kernel*.tar.bz2 -C /usr/src/linux

Toliau konfigūruosime kernel’į:

$ cd /usr/src/linux
# make menuconfig

Jeigu norite, tai galite naudoti „make xconfig“ komandą, bet atminkite, kad ji reikalauja Qt ir paleistų X’ų. xconfig’e galėsite naudotis paieška, o menuconfig – ne.

Einame į Networking–>Networking Options–>su Space klavišu pažymime Network packet filtering (replaces ipchains)–>įeikime į Network packet filtering (replaces ipchains) ant šios eilutės paspausdami Enter–>įjunkime Netfilter Xtables support (required for iptables), rekomenduoju nejungti kaip modulio t. y. Spauskite Space tol kol pamatysite šią eilutę pažymėta žvaigždute, o ne raide M ar iš viso nepažymėtą–>išeikime vienu lygiu aukščiau ir eikime į IP: Netfilter configuration–>įjunkime IP tables support (required for filtering/masq/nat)–>taip pat įjunkime Packet filtering. To turėtų užtekti, kad kernel’is palaikytų IPTABLES. Pabandykite sukompiliuoti ir išbandyti kernel’į (visur paspauskite Exit ir, kai iškris klausimas Do you wish to save your new kernel configuration?, paspauskite „Yes“).

Kompiliuojame kernel’į:

# make && make modules_install

Įdedame naujojo kernel’io pasirinkimą GRUB’e:

# cp arch/i386/boot/bzImage /boot/kernelis

Atkreipkite dėmesį, kad galite vietoje i386 rašyti savo platformą.

Konfigūruokime GRUB:

# nano -w /boot/grub/menu.lst

Įdėkime šias eilutes:

title=Gentoo Linux 2.6.20 # ši eilutė nurodys ką rodyti GRUB meniu kaip pasirinkimą šio kernel'io
root (hd0,0)# nurodome kur ieškoti kernel'io
kernel /boot/kernelis root=/dev/hda2 video=vesa:mytt:3,ywrap # konfigūruokime kernel'į. Jeigu nenaudojate VESA framebuffer tai ištrinkite "video=vesa:mytt:3,ywrap".

Patikrinkime ar timeout eilutėje nėra nustatyta skaičius 0. Jeigu yra tai jį padidinkime. Tai nurodys kiek sekundžių laukti kol pasirinksime kernel’į. Jeigu jo nepasirinksime tai sistema kraus tą, kuris į x-asis (x tai skaičius nurodytas default eilutėje, kernel’iai numeruojami pagal jų išsidėstymą meniu).

Jeigu turime LILO tai atlikime šiuos veiksmus:

# nano -w /etc/lilo.conf

timeout nurodykime ne mažiau kaip 0.
default reikšmę nurodykime tą meniu punktą, kurį LILO turi krauti jeigu per timeout eilutėje nurodytą sekundžių skaičių jūs nepasirinksite ką krauti.

image=/boot/kernel-2.6.20 # nurodykime kur yra kernel'is
label=gentoo # Meniu punkto pavadinimas
read-only # Uždrausime įrašymą į kernel'io particiją
root=/dev/hda3 # root particija

Ir išsaugokime konfigūracinį failą.
Dabar galima perkrauti kompiuterį ir džiaugtis nauju kernel’iu.

Instaliuojame IPTABLES

Mes pavyzdyje naudosimės Portage, nes mūsų pavyzdinė OS yra Gentoo. Jums siūlau naudotis savo sistemos paketų valdikliais (Aptitude, Yum, Pacman ir pan.).

# emerge net-firewall/iptables

Tai būtų Portage IPTABLES instaliavimo komanda Gentoo sistemoje.
Aptitude vartotojams:

# apt-get install iptables

Yum vartotojams:

# yum install iptables

IPTABLES suinstaliuota. Dabar galime pereiti prie kitos dalies – IPTABLES konfigūravimo.

IPTABLES konfigūravimas

Iš karto norėčiau paminėti, kad vartotojai, kurie tiesiog nori ugniasienės Linux distribucijoje, gali įsidiegti Firestarter (Linux ugniasienė, kuri paremta IPTABLES) arba susigeneruoti konfigūruojantį IPTABLES bash scenarijų tinklalapyje http://easyfwgen.morizot.net/gen/.

Jeigu pasirinkote konfigūracinio failo generavimą tai nueikite pateiktu adresu ir atsakykite į klausimus. Jums bus pateiktas ilgas scenarijus. Jį išsaugokite kaip „scenarijus.sh“ ir suchmodinkite:

# chmod +x scenarijus.sh

Dabar jį paleiskite:

# sh scenarijus.sh

IPTABLES dabar turėtų būti sukonfigūruota. Tiesa, tai nėra geriausias būdas apsaugoti savo kompiuterį ar tinklą nuo įsilaužėlių. Geriausia tai padaryti yra pačiam konfigūruojant IPTABLES. Būtent todėl ir rašau šį straipsnį.

Pirmiausiai turėtume pasirinkti kaip konfigūruosime IPTABLES. Mes galime sukonfigūruoti ją per bash scenarijų (panašiai kaip ir easyfwgen.morizot.net/gen, tik visą failą pasirašysime patys ir taip padidinsime saugumą) arba paprasčiausiai vykdydami pavienes komandas. Tai jau jūsų skonio reikalas.

Norėdami savo bash scenarijų paleisti jūs turite jį suchmodinti kaip ir sugeneruotą scenarijų:

# chmod +x scenarijus.sh

O paleisti jį irgi reikalautina super vartotojo teisių:

# sh scenarijus.sh

Jeigu rašysime bash scenarijų tai atminkime tokią jo konstrukciją (bash scenarijai tai paprasti tekstiniai failai susidedantys iš konsolės komandų):

#!/bin/bash
# pirmoji eilutė („#!/bin/bash“) yra būtina, o kitose eilutėse grotelės („#“ simbolis) reiškia, kad visa toji eilutė yra komentaras ir kad ir ką jūs ten berašytumėte toje eilutėje, bash’as į tai nekreips dėmesio.# pačioje scenarijaus pradžioje susirašykime konstantas, kurias naudosime. Taip vėliau sutaupysime daugiau laiko, nes nereikės atsiminti anksčiau nurodytų duomenų.
TINKLESKE=“eth0“
LANOMASK=“192.168.2.0/24“
# vėliau jos gali būti panaudojamos vietoje reikšmės rašant konstantos pavadinimą su dolerio ženklu priešais ir be kabučių.
# pavyzdžiui: iptables -A FORWARD -s 192.168.1.2 -i $VIDINE_KORTA -j ACCEPT
# komandos rašyti dėl patogumo siūlau atskirose eilutėse. Ir nerašykite komandų su grotelėmis („#“ simbolis prieš komandą), nes jas reikia rašyti be grotelių priekyje, kadangi aš grotelėmis nurodau, kad komanda privaloma vykdyti super vartotojo teisėmis, o dolerio ženklu („$“) nurodau, kad komandą patartina įvykdyti su paprasto vartotojo teisėmis.
# tai yra viskas ką jums reikia žinoti kuriant bash scenarijus.

Dabar apžvelkime didžiąją dalį komandų:

# iptables -F

Šia komanda ištrinsime buvusią konfigūracija.

Prieš sekančiąją komandą norėčiau priminti, kad INPUT – įeinantis srautas (pavyzdžiui, norint pasiekti jūsų kompiuteryje esančią serverinę tarnybą (tarkim Apache) reikia leisti srautą pro 80 prievadą (jeigu norime dirbti iš išorės su mūsų kompiuteryje esančiu Apache)); OUTPUT – išeinantis srautas; FORWARD – persiunčiamas srautas į kitą kompiuterį (jeigu norėsime pakurti maršrutizatorių tai mums prireiks šios grandinės).

# iptables -P chain DROP

Ši komanda nurodys IPTABLES blokuoti tai ką nurodome vietoje chain (INPUT/OUTPUT/FORWARD – tai tarsi taisyklių grandinės (iš angl. k. chains; kiekviena skirta vis kitam srautui), jas ir rašykite vietoje chain). Pavyzdžiui, iptables -P INPUT DROP komanda užblokuos visą įeinantį srautą. Vietoje DROP mes galime rašyti anksčiau nurodytas grandines (INPUT/OUTPUT/FORWARD). Atkreipkite dėmesį, kad IPTABLES konfigūracijoje būtina blokuoti viską, kad toliau esanti konfigūracija turėtų kažkokią reikšmę. Vietoje DROP taip pat galite rašyti kitokią užduotį, bet mes norime viską užblokuoti, o ne leisti.

# iptables -A INPUT -i lo -j ACCEPT

A opcija prideda taisyklę prie mūsų nurodytos grandinės. i opcija mes nurodome tinklo įrenginį, o j nurodome užduotį, kurią IPTABLES turi atlikti su tais duomenimis. ACCEPT – nurodydami šią užduotį mes priimame visą srautą iš lo t. y. localhost.

Nepamirškime to pačio atlikti su OUTPUT ir FORWARD:

# iptables -A OUTPUT -o lo -j ACCEPT

Atkreipkite dėmesį, kad nenaudojame i opcijos, nes i opcija nurodo įeinančio srauto įrenginį, o o nurodo išeinančio srauto įrenginį.

# iptables -A FORWARD -i lo -j ACCEPT

Šiuo metu mes galime naudotis localhost, bet negalime naudotis internetu. Jeigu taip ir yra tai galime tęsti straipsnio skaitymą kaip niekur nieko, o jeigu ne tai rekomenduoju pasiskaityti IPTABLES dokumentaciją ir paieškoti ką darote ne taip.

# iptables -A INPUT -j ACCEPT -i eth0 -p tcp -d xxx.xxx.xxx.xxx –dport x

Vietoje eth0 įrašykime tinklo plokštę (taip nepamirškime padaryti ir kitose komandose, nes apie tai, kad reikia pakeisti eth0 aš tikriausiai jau nebeužsiminsiu), kurią naudojame internetui. p opcija nurodo protokolą (TCP – Transmission Control Protocol (šiuo protokolu duomenys siunčiami „bendraujant“ dviems kompiuteriams t. y. vienas siunčia, o kitas užtikrina pirmąjį kompiuterį, kad duomenis gauna), UDP – User Datagram Protocol (juo siunčiami/gaunami duomenys tiesiog siunčiami be jokių „klausimų“ nutolusiam kompiuteriui)). Šiuo atveju tai tcp. d opcija nurodo išorinį IP (pavyzdyje xxx.xxx.xxx.xxx), su kuriuo atliksime veiksmą, bet prisiminkite, kad tai nebūtina nurodyti. Tačiau IP arba prievadą nurodyti yra būtina. dport opcija nurodo išorinį prievadą (pavyzdyje x). Jeigu prievado nenurodysime tai bus naudojami visi prievadai.

# iptables -A OUTPUT -j ACCEPT -o eth0 -p tcp -s xxx.xxx.xxx.xxx –sport

Viskas taip pat kaip ir prieš tai buvusiame pavyzdyje, tik dabar naudojame vidinius IP adresus ir prievadus ir vietoje i nurodome o opciją.

Šiomis dviem komandomis įsileisime prisijungimus iš mūsų nurodytų IP adresų per mūsų nurodytus prievadus (pvz., 21) TCP protokolu.

# iptables -A INPUT -j ACCEPT -i eth0 -p udp -d xxx.xxx.xxx.xxx –dport 21
# iptables -A OUTPUT -j ACCEPT -o eth0 -p udp -s xxx.xxx.xxx.xxx –sport 21

Čia taip pat kaip ir su TCP, tik dabar p opcijai nurodykime UDP protokolą.

# iptables -A INPUT -i eth0 -p icmp -j ACCEPT
# iptables -A OUTPUT -o eth0 -p icmp -j ACCEPT

ICMP – Internet Control Message Protocol. Turėtume šį protokolą leisti, nes be jo mes negalėsime būti ping’inami ir iškils daug kitų problemų.

# iptables -A OUTPUT -j DROP -o eth0 -d one.lt

Tokia komanda užblokuosime priėjimą prie one.lt pro eth0 tinklo plokštę.

Mano nuomone šios informacijos turėtų užtekti, kad galėtumėte sukonfigūruoti iptables (atminkite, kad straipsnis nebaigtas ir tikriausiai ateityje dar bus pildomas ir koreguojamas, todėl rekomenduojame pastoviai tikrinti Versme.net ar nėra straipsnių apie saugumą arba apžvelkite IPTABLES dokumentaciją).

2007 m. vasario 16 d., Pixel
  1. 12 Responses to “IPTABLES naudojimas”

  2. ideja gal ir gera, bet klaidu ir netikslumu nemazai. naujokui nerekomenduociau pradeti dirbti su fw naudojant si manuala. no offence.

    By kubas on Sau 3, 2010

  3. Ja, klaidų yra + straipsnis senas, bet ne vienas jau pradėjo sėkmingai ir neverkė (: .

    By Ernestas on Sau 3, 2010

  4. neverke, nes a) isjunge isvis fw b) uzsiblokavo ir negalejo parasyti. :))

    By kubas on Sau 3, 2010

  5. Na, remiantis komentarais, tu apskritai pirmas kažkuo nepatenkintas (; .
    http://209.85.129.132/search?q=cache:2jreD-EWUogJ:pixel.lt/iptables-naudojimas.html+pixel.lt+iptables&cd=1&hl=lt&ct=clnk&client=opera

    By Ernestas on Sau 3, 2010

  6. nepatenkintas, kad atmestinai parasyta.

    galiu pavardinti kas tas „kazkas” jei jau paciam sunku pagalvoti.

    #!/bin/bash

    pas mane bash nera ne kvapo. tik del kazkokio dvieju eiluciu skripto turiu ji susidiegti. kuo blogai naudoti /bin/sh, kuris randasi daugelyje sistemu kaip defaultas?

    iptables -A OUTPUT -j DROP -o eth0 -d one.lt

    pasikeis ip, ir visas srautas praeis. kadangi taisyklese bus idetas ip, ne hostas.

    nepaminetas, RELATED,ESTABLISHED idejimas, naudojant DROP’a INPUT/OUTPUT.

    By kubas on Sau 3, 2010

  7. Nežinau kokio senumo ar kiek sulaupytą sistemą naudoji, bet praktiškai visose Linux distribucijose (galiu pavardinti, nors neišvardinsiu nė lašo: Gentoo, ArchLinux, Ubuntu, Slackware, SUSE, Debian, Fedora ir t. t.) bash eina su „base“ sistema. bash tai ne sh todėl ir nenaudoju sh, jog nekiltų problemų.
    Ir būtent, jog daugelyje sistemų ne sh, o bash yra default’as. Ir bash’as apskritai turi daugiau pranašumų prieš sh script’uose. Todėl jį ir reikėtų propaguoti, o ne sh.

    „kadangi taisyklese bus idetas ip, ne hostas.“
    Iš kur ištraukei?

    „nepaminetas, RELATED,ESTABLISHED idejimas, naudojant DROP’a INPUT/OUTPUT.“
    čia „netikslumas“ ar „klaida“? 🙂
    Kitą kartą rašydamas apie telefoną pamiršiu paminėti, jog jis turi bateriją, tai jau reikš, kad jis be baterijos ir skaitytojui tai svarbu?
    Čia ne dokumentacija, jog viską aprašinėčiau.

    By Ernestas on Sau 3, 2010

  8. i „kieta” antispama turbut patekau, tai rasau dar karta 😉

    cia del fw.
    p.defau. lt/?RjsNlkQWI8BEOH_DYq_Kzw

    del shell’o, pats atsakei. distribuciju n kiekis, todel butina rasyti portable koda.

    taigi skaityk dar knyguciu protingu, ir gerink linux manualu kokybe.
    apie mobiliakus nieko neismanau, todel neacakisiu 😉

    By kubas on Sau 3, 2010

  9. Tai būtent, jog reikia portable kodą rašyt. bash visur tas pats, o sh daug kur būna symlink’as į kokį zsh ar netgi tą patį bash. Naudojant sudėtingesnius scenarijus jau kyla problemų, jeigu ne bash (: .

    Aha, IP taisyklėse, ne domenas. Tą reikėtų paminėti įraše. O nori pasakyti yra geresnis variantas su IPTABLES blokuot srautą iš domeno (: ? Realiai geriau be kitų metodų, kad ir hosts, nepadarysi.

    By Ernestas on Sau 3, 2010

  10. portable nereiskia vien linux,,, yra dar solaris, hp-ux, *bsd. kur ne nekvepia jokiu bash’u by default. pats dirbu, su visom paminetom sistemom. tai tokius argumentus kaip „bash yra visur ir visuomet” pasilaikik ir garsiai nepasakok 🙂

    aisku yra! KIS. blokuoti viska ir leisti tik tai kas galima 😉

    By kubas on Sau 6, 2010

  11. kubas, matau, jog neturi prie ko prisikabinti? (:
    Argumentus kaip „neveikia tokioj ir tokioj sistemoj“ pasilaikyk sau – script’as Linux’ui, o ne kitom sistemom

    Jeigu dirbi su šitom sistemom tai turėtum žinoti, jog IPTABLES Solaris, HP-UX, *BSD NĖRA, tai ko čia kabiniesi? (:

    By Ernestas on Sau 6, 2010

  12. kabiniuosi, del to, kad kalbi apie portable skriptus, taciau nezinai ka tas portable reiskia 😉

    By kubas on Sau 6, 2010

  13. Pirmiausiai pagal tave šis script’as būtų portable jeigu rašyčiau jį sh, o ne bash, nes „bash neportabilus“. Jau įrodžiau kodėl bash yra portabiliau negu sh. Dabar kabiniesi prie portabilumo. Kas toliau? Kabinsies, kodėl tavo skaitomuose komiksų žurnaluose 10, o ne 11 puslapių?
    Tu pats nežinai ką reiškia portable ir čia rašai kliedesius, kuriuos po kiek laiko ištrinsiu. Portable – reiškia, jog programą gali lengvai pritaikyti kitai sistemai, bet nebūtinai iš karto paleisti visiškai tą patį kodą. Tai viena. Tu ką siūlai? Duot C programą visom sistemom, net tom, kuriose IPTABLES natyviai neįmanomas?
    Tu nežinai, jog IPTABLES natyviai tik Linux, o kabiniesi kodėl mano script’as tik Linux’ui skirtas. Tai antra.
    Kabiniesi dėl one.lt blokavimo su IPTABLES, jog jis nėra visu 100% efektyvus, tačiau nežinai kito, geresnio būdo ir jo nepateiki (blokuoti visą internetą ir leisti tik kai kuriuos puslapius – čia brutaliausias ir kvailiausias būdas filtruoti tinklą). Tai trečia.
    Kabiniesi prie to, ko neparašiau (RELATED ir ESTABLISHED). Tai ketvirta.
    Jeigu pas tave patį bash nė kvapo ir tu naudoji tokią Linux distribuciją, kurioje jo nėra ir pats turi įdiegti, tai akivaizdu, jog kabiniesi iš oro – tokios Linux distribucijos vartotojas turėtų žinoti kaip įdiegti bash ir juo naudotis, kodėl bash, o ne sh ir t. t. Įdiegti bash arba išsiversti be jo tokiam vartotojui tikrai neturėtų būti problema, plius vartotojas tą ankčiau ar vėliau turėtų padaryti, nes dauguma Linux script’ų rašomi dažniau bash’ui, o ne sh. Tai penkta.

    Apskritai, jeigu jau einam į tokį lygį, tai aš irgi galiu tau kai ką patart: išlįsk iš Delfio su tokiais kvailais priekabiais komentarais ir neieškok prie ko kabintis. (:

    By Ernestas on Sau 6, 2010

Sorry, comments for this entry are closed at this time.