IP Filter
Sisukord
- 1 Sissejuhatus
- 2 IP Filtri toetuse lisamine
- 3 IP pakettide filtrimine
- 4 Dünaamiline filtrimine
- 5 Kehtestatud reeglite vaatamine
- 6 Logimine
- 7 Maskeerimine ehk NAT
- 8 Ümbersuunamine
- 9 Squidi vahendusserver nähtamatus režiimis
- 10 Maskeeritud masina serveri vahendamine
- 11 Automaatne IP Filtri käivitamine
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