IP Filter

Allikas: Kuutõrvaja

Sissejuhatus

IP Filter on üks populaarsemaid UNIXi IP filtrimise ja NATi tegemise vahendeid. On porditud ka Solarise ja HP-UX peale. Koduleht http://coombs.anu.edu.au/~avalon/

IP pakettide filtrimine on oluline komponent tulemüüri ehitamisel. Tavaliselt seatakse IP filter tööle masinas, millel on mitu võrguseadet ja millest võrguliiklus läbi käib. IP filter analüüsib iga IP paketi päist ning talitab vastavalt konfiguratsioonifailis näidatud reeglitele. Paketi liikumist saab keelata ja lubada, kusjuures toimuvat on võimalik logida.

Lisaks sisaldab IP Filter NATi tegemise utiliite. FreeBSD NATi (Network Address Translation) oskust peetakse suhteliselt täiuslikuks. Näiteks on võimalik:

   * nn maskeerimine (ingl. k. many to one mapping) - terve alamvõrgu töökohtadele saab teha kättesaadavaks Interneti teenused, kusjuures masinad ise
     võivad kasutada privaat IP-aadresse
   * IP-aadressi ja/või pordi ümbersuunamine - vajalik veebi vahendusserveri Squid tööleseadmiseks nähtamatus (ingl. transparent) režiimis

IP Filtri toetuse lisamine

IP Filter'i kasutamiseks on kaks võimalust, kas tuumas lisada toetuse tarvis sellele vastavad read

options IPDIVERT options IPFILTER options IPFILTER_LOG

või kirjutada rc.conf'i

ipfilter_enable="YES"

Vaikimisi on IP filter selliste omadustega, et igasugune võrguliiklus on lubatud.

Peale tuuma konfiguratsioonifaili redigeerimist kompileerige ja paigaldage tuum nagu tavaliselt. IP Filtri toetuse olemasolust tuumas annab tunnistust dmesgi rida

bash# dmesg | grep "IP Filter"
IP Filter: v3.4.8 initialized.  Default = pass all, Logging = enabled

IP pakettide filtrimine

Paketifiltrimisest on eelkõige abi ruuteri ja selle taga asuva võrgu kindlustamisel, kuid samahästi võib seda kasutada ka tööjaama juures. Filtrimise reeglite kokkuseadmisel tuleb järgida põhimõtet, et kõik on keelatud peale selle, mis on lubatud.

Paketifiltrimine toimub tavaliselt tekstifailis, näiteks /etc/ipf.conf kirjeldatud reeglite alusel. Reeglid tuleb kirjutada üks reale, märgiga # alustatud ridu ignoreeritakse. Reeglid kehtestatakse programmiga ipf, nii asendatakse olemasolevad reeglid uutega

bash# ipf -Fa -f /etc/ipf.conf

Näiteks selline reegel keelab läbi xl0 võrguseadme siseneda võrgust 194.50.6.0/24 pärit TCP pakette, mis on suunatud masina 193.40.223.98 pordile 23, pakette logitakse

block in log on xl0 proto tcp from 193.50.6.0/24 to 193.40.223.98 port = 23

Iga reegli juures tuleb näidata:

   * millistele pakettidele reeglit rakendada (in on xl0 proto tcp from 193.50.6.0/24 to 193.40.223.98 port = 23) - kui konkreetne IP pakett lähtub
     võrgust 193.40.6.0/24, sisenedes FreeBSD masinasse läbi seadme xl0, sisaldab omakorda TCP paketti ja suundub masina 193.40.223.98 pordile 23, siis
     öeldakse, et ta klapib reegliga ning reeglit rakendatakse
   * mida teha (block) - reegliga klappiv pakett kas keelatakse (block) või lubatakse (pass) läbi
   * logimine (log) - reegli juures saab näidata, et lisaks keelamisele või läbi lubamisele tuleb logisse saata teade sooritatud tegevuse kohta 

IP Filtri eripäraks on, et paketti võrreldakse kõikide reeglitega, kuid rakendatakse viimast, millega pakett klappis. Filtri kirjutamisel tuleb arvestada, et filter koosneb mitmetest reeglitest moodustades terviku. Oluline on reeglite järjekord.

Näiteks soovides lubada igasugust andmevahetust, va võrgu 193.50.6.0/24 masinatega, sobivad sellised reeglid

pass in on xl0 from any to any
block in on xl0 from 193.50.6.0/24 to 193.40.223.98
pass out on xl0 from any to any
block out on xl0 from 193.40.223.98 to 193.50.6.0/24

Antud juhul kontrollitakse iga paketti kõigi reeglitega. Soovides rakendada klappivat reeglit, ilma järgnevaid reegleid edasi uurimata, tuleb kasutada parameetrit quick

pass in on xl0 from any to any
block in log quick on xl0 from 193.50.6.0/24 to 193.40.223.98
pass out xl0 from any to any
block out log on xl0 from 193.40.223.98 to 193.50.6.0/24

Reegli süntaks on selline

pass | block [in | out] [log] [quick] [on seade] [proto nimi] [from aadress] [ port = numer ] [to aadress] [port = number]

Kus

   * pass | block - reegliga klappivat paketti lubatakse või keelatakse läbi seadme liikuda
   * in | out - reeglit rakendatakse läbi seadme sisse või välja liikuvatele pakettidele
   * log - klappiv pakett logitakse
   * quick - kõnealust reeglit rakendatakse ilma järgnevaid reegleid kontrollimata
   * on seade - reeglit rakendatakse läbi võrguseadme 'seade' liikuvaile pakettidele
   * proto - reeglit rakendatakse protokollile 'nimi' vastavatele pakettidele või datagrammidele (võimlikud väärtused on tcp, udp ja icmp)
   * from aadress port = number - paketi lähteaadress-ja port
   * to aadress port = number - paketi sihtaadress-ja port 

Kui mõnda kantsulgudes toodud parameeterit ei näidata, siis on see samaväärne, kui oleks kirjas selle parameetri kõikvõimalikud väärtused. Näiteks jättes kirjutamata protokolli nime, toimib reegel kõigile protokollidele (tcp, udp,icmp). Jättes näitamata võrguseadme, toimib reegel kõigil seadmetel.

Fraasi 'from any to any' asemel on lubatud kasutada lihtsalt parameetrit any.

Reegli juures saab näidata ära ka portide vahemiku, näiteks keelame sisenemise pakettidel, mis suunduvad portidele 21,22,23,24,25 ning kõigile teistele lubame

block in log quick on xl0 from any to any port 20 >< 26
pass in quick on xl0 from any to any port 21 <> 25

Dünaamiline filtrimine

Soovides lubada masinast välja igasuguseid pakette ja sisse ainult teatud teenuste külastamist, on tavaliselt probleemiks, kuidas eristada omaalgatuslikult väljast sisse saadetud pakettidest, neid mis on vastused ise välja saadetud pakettidele. IP Filter saab sellega tublisti hakkama nii TCP, UDP kui ka ICMP protokolli puhul.

Kui masinast väljub ühendust algatav pakett, siis tehakse sissekanne IP Filtri olekutabelisse (ingl. k. state tabel). Pakettide sisselaskmisel kasutatakse esmalt seda tabelit ning lubatakse ilma pikemalt mõtlemata läbi need paketid, mis on osa nö ühendusest (nö sellepärast, et UDP ja ICMP puhul ei ole tehniliselt tegemist ühendusega, kuid IP Filter saab hakkama ka neile vastavate IP pakettidega).

Näiteks, kui masinas töötavad vaid SSH-ja veebiserver, siis aitab järgmistest reeglitest

block out quick on xl0 all
pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 80 keep state
pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 22 keep state
block in quick on xl0 all

Tulemusena on lubatud siseneda IP pakettidel, mis saabuvad läbi seadme xl0 kust tahes ning suunduvad masina 193.40.223.98 pordile 80 ning 22. Välja ei saa läbi selle seadme mitte ühtegi IP paketti, va need, mis on vastused väljast algatatud ühendustele.

Kliendiks olevas masinas on soovitav lubada sisse vaid vastuseid seest välja saadetud pakettidele

block in quick on xl0 all
pass out quick on xl0 proto tcp from 193.40.223.98 to any keep state
block out quick on xl0 all

Soovides lubada sisse vaid ühendusi algatavaid pakette ning võtta arvesse ka fragmentidega seotud erisusi, lisage reeglite lõppu 'flags S' ning 'keep frags'

block out quick on xl0 all
pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 80 flags S keep state keep frags
pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 22 flags S keep state keep frags

Soovides saada ise igale poole välja ning pakkuda vaid SSH-ja veebiserveri teenust, kasutage reegleid

pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 80 keep state
pass in quick on xl0 proto tcp from any to 193.40.223.98/32 port = 22 keep state
pass out quick on xl0 proto tcp from 193.40.223.98/32 to any keep state
block out quick on xl0 all
block in quick on xl0 all

Keelatud pakettidele vastuse saatmine

Kui potensiaalne ründaja skaneerib teie masinat, siis eeltoodud reegleid kasutades on tal lihtne aru saada, et tegu on paketifiltrimisega. Keelatud portidele ühenduse algatamised saavad time-out'i. Normaalsel juhul saadetakse ühenduse algatajale, kes pöördub pordile, millel ei vasta teenust, mingi veateade. TCP pordi puhul sobib saata vastuseks RST pakett, selleks lisage reegli algusesse parameeter return-rst. Näiteks, jätmaks potensiaalsele pahalasele muljet, et Telneti serverit polegi, so ta saab teate 'connection timed out' asemel teate 'connection refused', kasutage reeglit

block return-rst in log on xl0 proto tcp from 193.60.15.7 to 193.40.223.98 port = 23

Sarnaselt toimige ka siseneda püüdvate UDP pakettide vastustega, näiteks portmapperi teenuse jaoks

block return-icmp-as-dest(port-unr) in log on xl0 proto udp from 193.60.15.7 to 193.40.223.98 port = 111

Kehtestatud reeglite vaatamine

Kehtestatud reegleid saab vaadata käsuga ipfstat, näiteks vaatame läbi kõigi seadmete väljuvatele ja sisenevatele pakettidele toimivad reegled, näiteks kehtestatud reeglid

pass in quick on xl0 proto tcp from any to 193.40.13.133/32 port = 80 keep state
pass in quick on xl0 proto tcp from any to 193.40.13.133/32 port = 22 keep state
pass out quick on xl0 proto tcp from 193.40.13.133/32 to any keep state
pass out quick on xl0 proto udp from 193.40.13.133/32 to any keep state
pass out quick on xl0 proto icmp from 193.40.13.133/32 to any keep state
block out quick on xl0 all
block in quick on xl0 all

paistavad nii

bash# ipfstat -o
pass out quick on xl0 proto tcp from 193.40.13.133/32 to any keep state
pass out quick on xl0 proto udp from 193.40.13.133/32 to any keep state
pass out quick on xl0 proto icmp from 193.40.13.133/32 to any keep state
block out quick on xl0 from any to any

bash# ipfstat -i
pass in quick on xl0 proto tcp from any to 193.40.13.133/32 port = 23 keep state
pass in quick on xl0 proto tcp from any to 193.40.13.133/32 port = 22 keep state
block in quick on xl0 from any to any

Lisades võtme -s näeb ka andmeta liikumise statistikat.

Logimine

Parameetriga log logitud pakettide jälgimiseks andke korraldus ipmon

bash# ipmon
08/01/2001 10:43:28.456451 xl0 @0:3 p 193.40.223.98,2706 -> 193.40.5.124,113 PR tcp len 20 15360 -S K-S OUT
08/01/2001 10:44:00.543898 xl0 @0:2 b 193.50.6.9,2239 -> 193.40.223.98,23 PR tcp len 20 10240 -R IN
08/01/2001 10:44:02.992992 xl0 @0:2 b 193.50.6.9,1078 -> 193.40.223.98,79 PR udp len 20 56325 -A IN

Toodud näites on logitud xl0 seadmega seonduvalt üks lubatud (p) ja kaks keelatud paketti (b). Esimene rida näitab, et pakett liikus FreeBSDst välja (OUT) masina 193.40.5.113 auth serverile. Kaks järgmist rida näitavad, et masinast 193.50.6.9 on püütud sisendeda (IN) tehes tõenäoliselt Telnetti (23, tcp) ja Fingerit (79, udp).

Andes käsu 'ipmon /var/log/ipmon.fail' logitakse faili.

Logimisel on vahel abiks näidata parmeetri log järel ka first või body :)

Maskeerimine ehk NAT

Mida Linuxi maailmas nimetatakse IP pakettide maskeraadiks, tunneb UNIXimaailm üldiselt NATi nime all. Linuxi maskeraad on NAT erijuht - mitu-üheks ümberkirjutamine (ingl. k. many to one mapping). Kuna see on üks populaarsemaid NATi kasutamise vorme, kirjeldame seda siin eraldi punktina.

Vajadus mitu-üheks ümberkirjutuse järele tekib siis, kui te soovite teha Interneti teenused kättesaadavaks mitmele sisevõrgu töökohale, kuid teil on kasutada vaid üks avalik IP-number (193.40.223.98)

                  ((   ..-     ) 
              (                      )
         (                              )
       (                                )))
                      INTERNET
         (                       .    -)
            ((.                 )
                  (----   )
                     |
                     |
                     |  xl0 193.40.223.98
                  ---|---
                 |       |
                 |       |  FreeBSD masin
                 |       |
                  ---|---
                     | fxp0 192.168.1.1
                     |                   
               |-----|--- 192.168.1.0/24 ---|----  ...  --|------|
                           sisevork       __|__        __|__
                                         |     |      |     |
                                         |_____|      |_____| 
     
                                        192.168.1.2   192.168.1.254


Sisevõrgu tööjaamadele on omistatud privaataadressid ning nende vaikelüüsiks on seatud FreeBSD masin (192.168.1.1).

Lühidalt, mitme üheks ümberkirjutamine toimub järgmise skeemi kohaselt. Sisevõrgust Internetti suunduva IP paketi 192.168.1.0/24 võrku kuuluv lähteaadress asendatakse enne paketi Interneti poolsest seadmest väljumist selle seadme aadressiga (193.40.223.98) ning port sobiva vaba FreeBSD masina pordiga. Samal ajal jätab FreeBSD meelde, milliselt kliendilt ja millisest selle kliendi pordist see pakett tegelikult tuli. Internetist tulev vastuspakett saabub FreeBSD masinasse vastavale pordile ning saadetakse edasi tõelisele kliendile. Sellisel moel korraldab FreeBSD suhtlust sisevõrgu kliendi ja Interneti serveri vahel.

Sellise skeemi kohaselt tegutsedes jääb sisevõrgus oleval kliendil mulje, et ta suhtleb otse Interneti serveriga. Interneti server aga suhtleb enda meelest FreeBSD masinaga.

Maskeerimise korraldamiseks kasutage programmi ipnat ning sarnast konfiguratsioonifaili /etc/ipnat.conf

map xl0 192.168.1.0/24 -> 193.40.223.98

kustutades kõik eelnevad ümberkirjutused aktiviseerige see konfiguratsioonifailis kirjeldatud ümberkirjutused

bash# ipnat -FC -f /etc/ipnat.conf

Soovides näha, milliseid ühendusi parasjagu FreeBSD maskeerib, andke käsk ipnat -l

bash# ipnat -l
List of active MAP/Redirect filters:
map xl0 192.168.10.0/24  -> 193.40.223.98/32 

List of active sessions:
MAP 192.168.10.2    1021  <- -> 193.40.223.98   1021  [193.40.65.11 22]
MAP 192.168.10.3    1026  <- -> 193.40.223.98   1026  [193.40.6.114 23]
MAP 192.168.10.2    1066  <- -> 193.40.223.98   1066  [193.40.50.12 53]
MAP 192.168.10.2    1065  <- -> 193.40.223.98   1065  [193.40.50.12 53]

Antud juhul on näha, et kõneall olnud reegel on ainus ning parasjagu toimub kaks seanssi: esimene rida vastab SSHle (22) masinast 193.168.10.2 masinasse 193.40.65.11; teine rida vastab Telnetile (23) masinast 192.168.10.3 masinasse 193.40.6.114. Kaks viimast rida näitavad, et kasutati nimeserverit (53) 193.40.50.12.

Ümbersuunamine

Ümbersuunamise abil saadetakse masina mingisse porti tulnud paketid edasi kas sama masina mõnda teisse porti või mõnda teisse masinasse. Reeglina ei saa vahetult saata pakette edasi nii, et nad väljuvad sama võrguseadme kaudu, millest nad sisenesid.

Ümbersuunamist läheb vaja näiteks Squidi vahendusserveri kasutamisel automaatses (transparent) režiimis. Samuti saab ümbersuunamise abil jaotada suure koormusega virtuaalserveri koormust mitme füüsilise masina vahel, ning vahendada Internetile maskeeritud masinas töötavat serverit.

Squidi vahendusserver nähtamatus režiimis

Kasutades eelmisel skeemil kujutatud alamvõrgu lüüsina töötava FreeBSD peal Squidi vahendusserverit nähtamatus režiimis, tuleb lisaks Squidi konfigureerimisele anda järgmised pordi ümbersuunamise korraldused, näiteks failis /etc/ipnat.conf

rdr fxp0 0.0.0.0/0 port 80 -> 127.0.0.1 port 3128 tcp

Reegel tähendab, et fxp0 seadme kaudu kuhutahes (0.0.0.0/0) pordile 80 suunduvad TCP paketid tuleb saata kohaliku masina pordile 3128.

Reegli kehtestamiseks andke käsk

bash# ipnat -FC -f /etc/ipnat.conf

Maskeeritud masina serveri vahendamine

Soovides aadressile 193.40.223.98 porti 80 saabuvad veebipäringuid panna teenindama maskeraaditud võrgu masinas 192.168.1.254 pordil 8080 töötavat veebiserverit, tuleb kasutada sellist ümbersuunamist

rdr xl0 193.40.223.98 port 80 -> 192.168.1.254 port 8080 tcp

Reegel tähendab, et seadme xl0 kaudu kõikjalt aadressile 193.40.223.98 ja pordile 80 saabunud TCP paketid tuleb saata edasi aadressile 192.168.1.254 pordile 8080.

Soovides ümber suunata vaid näiteks võrgust 193.40.15.0/24 tulnud pakette, kasutage sellist reeglit

rdr xl0 from 193.40.15.0/24 193.40.223.98 port 80 -> 192.168.1.254 port 8080 tcp

Ümbersuunamise mootor hoolitseb ise selle eest, et vastuseks saadetud paketid oleksid sobivad ja ühendus toimiks.

Parasjagu toimuvaid ümbersuunamisi näeb samuti käsuga ipnat -l.

Automaatne IP Filtri käivitamine

Soovides failides /etc/ipf.conf ja /etc/ipnat.conf olevaid paketifiltrimise ja NATi reegleid arvuti algkäivitamisel kehtestada, kirjutage näiteks faili /etc/rc.conf read

ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.conf"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"

Selleks ,et mitte jääda autost välja võtmed ees ipf'is oleks soovitatav kasutada aktiveerimisel uute reeglite puhul käsku näiteks

ipf -s -Fa -f /etc/ipf.rules && sleep 60 && ipf -s