ernetas
Vasaris 16, 2007

IPTABLES naudojimas

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:
# 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 ir pan.).
# emerge net-firewall/iptables
Tai būtų Portage IPTABLES instaliavimo komanda.
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ų tinklapyje 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

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. Ši komanda duos priėjimą prie

# 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 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 Pixel.lt ar nėra straipsnių apie saugumą arba apžvelkite IPTABLES dokumentaciją).

Panašūs straipsniai


“IPTABLES naudojimas” komentarų: 10

  1. enc

    kuom iptables geriau už OpenBSD pf? Be to labai klysti, kad IPChains buvo naudojama 2.4 branduolyje. Tiek IPTABLES tiek IPCHAINS galima pasirinkti perkompiliuojant branduoli. Straipsnis pernelyg ilgas, todėl net nesivarginau jo viso skaityti.

  2. ernetas

    O aš kažkur rašiau, kad IPTABLES geriau už OpenBSD PF?
    Kalbėdamas apie IPChains aš nesakiau, kad jo negalima paleisti ant kitų branduolių.

  3. care

    o kas tie scenarijai? keistai skamba :)

  4. ernetas

    Script’ai.
    Kitą kartą prirašysiu “(iš angl. k. scripts)” (: .

  5. mazas

    SUPER STRAIPSNIS :) Bent jau mokytis padejo :)

  6. Arturas

    Man taip pat padejo mokytis sitas straipsnis. Dekui autoriui

  7. Siaip

    Siaip pastebejimai.
    Nelabai supratau, kokiu tikslu tiek daug vietos iptables straipsnyje skiriama kernel kompiliavimui ar lilo su grub konfiguravimui. Cia, mano manymu, kito - platesnio straipsnio medziaga. Uztektu nurodyti kokie pakeitimai kernelyje privalo buti padaryti, kad iptables veiktu ir trumpos komandos tam pasiekti.

  8. mg

    Siaip dar galetum koki nors pradini pavyzdi ideti su komentarais :)

  9. neworld

    A jeigu turiu tik remote prieėjimą prie servo ir netyčia užblokuoju visą įeinantį arba išeinantį srautą, tai bus viskas ane?

  10. epp

    Kazkodel neiseina blokuoti svetainiu adresu tokios eilutes pagalba, iptable tiesiog ismeta klaida, siulo bandyti komanda iptables -h ir skaiti helpa
    iptables -A OUTPUT -j DROP -o eth0 -d one.lt

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.