Erinevus lehekülje "OpenBSD tulemüür" redaktsioonide vahel
(→Sissejuhatus) |
(→Sissejuhatus) |
||
7. rida: | 7. rida: | ||
* liikluse prioritiseerimine - altq | * liikluse prioritiseerimine - altq | ||
* koormusjaotur - pf, relayd | * koormusjaotur - pf, relayd | ||
− | * statistika ja andmete analüüsiks kogumise vahendid (pfctl, pftop, tcpstat, pflogd, tcpdump) | + | * statistika ja andmete analüüsiks kogumise vahendid (pfctl, pftop, tcpstat, pflogd, tcpdump, symon, syweb) |
− | * VPN - IPsec, stunnel | + | * VPN - IPsec, stunnel, OpenVPN |
* redundantse tulemüüri klustri võimalus - pfsync (koos sessioonide edasiandmisega) | * redundantse tulemüüri klustri võimalus - pfsync (koos sessioonide edasiandmisega) | ||
Redaktsioon: 25. aprill 2009, kell 11:04
Sisukord
Sissejuhatus
OpenBSD operatsioonisüsteemi kasutamine võrgusõlmes on tema üheks oluliseks kasutusalaks. OpenBSD tulemüüril (ruuteril) on muu hulgas sellised omadused
- liikluse filtreerimine - pf, mitmesugustele tingimustele põhinevate piirangute seadmine sh automaatselt täituvad ja tühjenevad blacklistid, synproxy
- NAT - mitte-avalike aadressidega arvutitele interneti kättesaadavaks tegemine
- liikluse prioritiseerimine - altq
- koormusjaotur - pf, relayd
- statistika ja andmete analüüsiks kogumise vahendid (pfctl, pftop, tcpstat, pflogd, tcpdump, symon, syweb)
- VPN - IPsec, stunnel, OpenVPN
- redundantse tulemüüri klustri võimalus - pfsync (koos sessioonide edasiandmisega)
Käesoleva teksti mõistmiseks on abiks mõõdukas ettekujutus TCP/IP protokollist.
Ülesandepüstitus
Tulemüüri seadistamine algab sellest, et võimalikult täpselt ette kujutada, millist tulemust saavutada soovitakse. Olgu käesoleva pala kontekstis tegu sellise ülesandepüstitusega, mida iseloomustab skeem
internet 2 Mbit/s download | default gw, 172.16.1.18 768 kbit/s upload | | fxp0, 172.16.1.17/30 __|__ | | rl0, 10.0.100.254/24 | |------ DMZ 10.0.100.0/24 ----- |_____| | | nfe0, 192.168.100.254/24 | | |_______ KALAKE - 192.168.100.0/24 _________
ning peavad olema täidetud sellised nõuded
- Tulemüüri KALAKE ja DMZ võrkude liidestel töötab nimeteenus.
- KALAKE ja DMZ võrgu arvutite vaikelüüsiks ning nimeserveriks on vastavalt 192.168.100.254 ja 10.0.100.254.
- Kohtvõrgu osast KALAKE, kus asuvad kasutajate töökohaarvutid pääseb piiramatult avalikku internetti ning DMZ võrku.
- Tulemüüris tehakse NAT-teisendust DMZ ning KALAKE võrgus paiknevatele arvutitele.
- Avalikust internetist pääseb ainult DMZ võrgus aadressil 10.0.100.1 portidel 80 ja 443 töötava veebiserveri juurde. Isegi juhul kui sellel veebiserveri arvutil ei pakuta muudel portidel teenuseid ei ole mingit põhjust lasta tulemüürist läbi asjasse mittepuutuvaid pakette tulemüüri tagust ethernetti risustama.
- DMZ võrgust ei saa algatada ühendusti kuskil suunas va tulemüüri liidesel töötav nimeserver.
- Välisühendusest võib DMZ kasutada kuni 256 kbit/s download'iks ning 384 kbit/s upload'iks (up on tulemüürist eemale ning down tulemüüri suunal, asudes antud juhul mõtteliselt välisseadmel; st 384 kbit/s kiirusega saavad kasutajad veebiserverist andmeid kopeerida ning 256 kbit/s veebiserverisse üles laadida)
- Välisühendus kasutamine ei ole KALAKE võrgu jaoks praktiliselt piiratud.
Tulemüüri võrgu seadistamine
Peale tulemüüri paigaldamist tuleks tulemüür füüsiliselt internetist lahti ühendada, seadistada käsitsi võrguseadmetele joonisel toodud aadressid, veel parem, veenduda, et eksisteerivad sellise sisuga järgnevad failid (et failidesse kirjutatud seadistused oleksid tänu nendele failidele kehtestatud, peaks peale failide muutmist arvutile tegema alglaadimise)
# cat /etc/hostname.fxp0 inet 172.16.1.17 255.255.255.252 NONE # cat /etc/hostname.rl0 inet 10.0.100.254 255.255.255.0 NONE # cat /etc/hostname.nfe0 inet 192.168.100.254 255.255.255.0 NONE # cat /etc/mygate 172.16.1.18 # cat /etc/resolv.conf lookup file bind 127.0.0.1 # cat /etc/sysctl.conf | grep net.inet.ip.forward net.inet.ip.forwarding=1 # 1=Permit forwarding (routing) of IPv4 packets
Seejärel ühendada külge DMZ ja KALAKE kohtvõrgust mõni arvuti ning veenduda, et kui paketifilter on välja lülitatud
# pfctl -d
siis ruuting töötab. Seda võiks kontrollida nt ping programmi abil.
Nimeserveri kasutamine
Üldiselt töötavad võrku ühendatud arvutid paremini, kui nimesüsteem töötab korrektselt. Seepärast tuleb käivitada kohalikke nimeseid ja vastavaid pöördteisendusi lahendava ning nn cache'ivas rezhiimis töötava nimeserveri. Alustuseks sobib kävitada lihtsalt vaikimisi /var/named kataloogis olevate seadistustega nimeserver
# named
ning veendumaks, et ta töötab küsida
# dig @localhost localhost
Nimeserveri kasutamise kohta on üksikasjalikum juhend toodud palas 'OpenBSD levinud teenuste seadistamine ja käivitamine'.
pfctl programmi kasutamine
PF paketifiltri töö juhtimiseks on programm pfctl, mille abil saab laadida tekstifailis kirjas olevad paketifiltri reeglid ning lisaks paketifiltri välja ja sisse lülitada. Tavaliselt on reeglid kirjas failis /etc/pf.conf. Põhjalik PF paketifiltri juhend asub aadressil http://www.openbsd.org/faq/pf/index.html.
Selleks, et liiklus läbiks tulemüüri, võiks kõige lihtsamal olla süntaksiliselt korrektse /etc/pf.conf faili sisu
pass all
Reeglite laadimine ja kehtestamine toimub käsuga, nii tuleb öelda ka iga kord peale /etc/pf.conf faili muutmist muudatuste kehtestamiseks
# pfctl -f /etc/pf.conf
Vajadusel paketifiltri sisse-ning väljalülitamine toimub vastavalt käskudega
# pfctl -e # pfctl -d
PF paketifiltri kontrolli all olevate parameetrite väärtusi saab vaadata käsuga, OpenBSD v. 4.1 vastav väljund on tootud illustratsiooniks, allpool on lühidalt seda väljundit kommenteeritud
# pfctl -sa FILTER RULES: pass all flags S/SA keep state No queue in use INFO: Status: Enabled for 0 days 00:00:02 Debug: Urgent State Table Total Rate current entries 0 searches 12 6.0/s inserts 0 0.0/s removals 0 0.0/s Counters match 12 6.0/s bad-offset 0 0.0/s fragment 0 0.0/s short 0 0.0/s normalize 0 0.0/s memory 0 0.0/s bad-timestamp 0 0.0/s congestion 0 0.0/s ip-option 0 0.0/s proto-cksum 0 0.0/s state-mismatch 0 0.0/s state-insert 0 0.0/s state-limit 0 0.0/s src-limit 0 0.0/s synproxy 0 0.0/s TIMEOUTS: tcp.first 120s tcp.opening 30s tcp.established 86400s tcp.closing 900s tcp.finwait 45s tcp.closed 90s tcp.tsdiff 30s udp.first 60s udp.single 30s udp.multiple 60s icmp.first 20s icmp.error 10s other.first 60s other.single 30s other.multiple 60s frag 30s interval 10s adaptive.start 6000 states adaptive.end 12000 states src.track 0s LIMITS: states hard limit 10000 src-nodes hard limit 10000 frags hard limit 5000 tables hard limit 1000 table-entries hard limit 200000 OS FINGERPRINTS: 696 fingerprints loaded
Siinjuures tuleks tähele panna järgmisi sektsioone
- FILTER RULES - /etc/pf.conf failis sisalduv reegel kirjutati lahti 'pass all flags S/SA keep state', mis tähendab, et lisati juurde meie poolt ilmutatud kujul näitamata jäänud parameetrite vaikeväärtused
- INFO - paketifilter on sisselülitatud olekus, 'Status: Enabled for 0 days 00:00:02'
- TIMEOUTS - mitmesugused TCP/IP protokolli alusel toimuvale andmevahetusele mõju avaldavad timeout parameetrid
- LIMITS - tulemüüri ressurssikasutusele seatud piirangud
PF paketifiltri reeglite kirjutamine
MACROS sektsioonis on kirjeldatud edaspidi kasutavate muutujate väärtused.
OPTIONS sektsioonis on kirjeldatud tulemüüri tööd üldiselt mõjutavate parameetrite vaikeväärtused. Antud juhul on öeldud, et lo seadme liiklusele üldse mitte rakendada paketifiltrit.
NORMALIZATION sektsioonis on kirjas määrangud seoses IP pakettide korrastamisega, antud juhul, et tulemüüri sisenevat liiklust tuleb defragmenteerida (scrub in all).
FILTER RULES sektsioonis on kirjas paketifiltri reeglid, mille abil abil kontrollitakse tulemüüri erinevaid võrguseadmeid läbivat liiklust ja sellest tulenevalt ka tulemüüri läbivat liiklust. Filter reegli juures on kirjas
- muster, millega iga võrguseadet läbivat TCP/IP paketti sh tema liikumise suunda võrreldakse
- tegevus - pass või block
Pakette klapitatakse reeglitega nende seadistusfailis esinemise järjekorras, kusjuures viimasena paketiga klappinud reegli juures näidatud tegevus rakendatakse. Kui paketiga ei klapi ükski reegel, siis viimane ilmutamata kujul olev reegel lubab paketi läbi. Erandiks on quick parameetri kasutamine, mille puhul paketi klappimisel rakendatakse reegel kohemaid.
ALTQ sektsioonis on kirjeldatud liikluse prioritiseerimine. Liikluse prioritiseerimise üks põhjusi on kontrollida võrguseadmele vastava ühenduse täituvust, seega mõtet omab kontrollida seadmest välja suunduvat liiklust.
TRANSLATIONS RULES sektsioonis on näidatud, milliste pakettide puhul toimub IP aadresside NAT-teisendus, OpenBSD paketifiltri kontekstis tähendab see ip paketi SRC aadressi ja SRC pordi ümberkirjutust. Antud juhul ütleb reegel, et välist seadmest väljuvate pakettide puhul, mille src aadress ei ole välise interface'i aadress, tuleb SRC aadress muuta välise interface'i aadressiks.
Samuti on näidatud TRANSLATION RULES sektsioonis, milliste pakettide puhul toimub RDR-teisendus ehk port forwarding, OpenBSD paketifiltri kontekstis tähendab see ip paketi DST ip aadressi ja DST pordi ümberkirjutust. Antud juhul ütleb reegel, et välisest seadmest sisenevatel pakettidel, mille DST aadress on tulemüüri väline aadress ning DST port on 80 või 443 tuleb teha DST ip aadressi ümberkirjutus, DST port jääb samaks. Seejärel liiguvad paketid edasi uude sihtpunkti.
TRANSLATION RULES kasutamisel tuleb arvestada sellega, et rakendatakse esimesena paketiga klappiv reeglit ning FILTER RULES reegleid rakendatakse TRANSLATION RULES reeglite poolt ümber kirjutatud ip pakettidele.
Paketifiltri seadistusfailis on sektsioonide järjekord oluline, sektsioonid peavad järgnema nii nagu on näites esitatud.
# MACROS ext_if="fxp0" dmz_if="rl0" kalake_if="nfe0" # blacklist # table <blacklist> persist file "/etc/pf.table.blacklist" # yhenduste_piir="max-src-nodes 50000, max-src-conn 80, max-src-conn-rate 500 / 10, overload <blacklist> flush global" # OPTIONS set skip on lo # NORMALIZATION scrub in all # ALTQ altq on $ext_if cbq bandwidth 768Kb queue { up_dmz, up_kalake } queue up_kalake bandwidth 384Kb cbq(default,borrow) queue up_dmz bandwidth 384Kb altq on $kalake_if cbq bandwidth 2Mb queue { dn_kalake } queue dn_kalake bandwidth 2Mb cbq(default) altq on $dmz_if cbq bandwidth 256Mb queue { dn_dmz } queue dn_dmz bandwidth 256Kb cbq(default) # TRANSLATION RULES nat on $ext_if inet from !$ext_if -> $ext_if rdr on $ext_if inet proto tcp to $ext_if port { 80, 443 } -> 10.0.100.1 # FILTER RULES # keelata seadmetest siseneda pakettidel, mis sealt kindlasti siseneda ei saaks # nt kui valisest seadmest sisenab kohtvorgu src ip aadressiga pakett # block in quick on $ext_if from <blacklist> antispoof quick for { $ext_if $dmz_if $kalake_if } inet # vaikimisi on igasugune liiklus keelatud # block log all block all # lubatud on igast seadmest valjuv liiklus # (piirangud rakendatakse sisenemisel, nii on alustuseks lihtsam ja piisavalt turvaline) pass out quick all # lubatud kohtvorgust sisenev suund pass in quick on $kalake_if queue up_kalake # lubatud internetist dmz veebiserverisse liiklus # pass in quick on $ext_if proto tcp to 10.0.100.1 port { 80, 443 } synproxy state ($yhenduste_piir) queue up_dmz pass in quick on $ext_if proto tcp to 10.0.100.1 port { 80, 443 } synproxy state queue up_dmz # lubatud dmz pealt esitada tulemyyrile nimeparinguid pass in quick on $dmz_if proto udp to 10.0.100.254 port 53
Toodud reeglite kehtestamisel paketifilter asendab muutujad nende väärtustega ning kirjutatakse ilmutult välja vaikeväärtused, tulemusena moodustatakse sellised reeglid ning (ilmuvad sarnased olekud, mis on kooskõlas allpool esitatud pftop piltidega)
TRANSLATION RULES: nat on fxp0 inet from ! 172.16.1.17 to any -> 172.16.1.17 rdr on fxp0 inet proto tcp from any to 172.16.1.17 port = www -> 10.0.100.1 rdr on fxp0 inet proto tcp from any to 172.16.1.17 port = https -> 10.0.100.1 FILTER RULES: scrub in all fragment reassemble block drop all block drop in quick on ! fxp0 inet from 172.16.1.16/30 to any block drop in quick inet from 172.16.1.17 to any block drop in quick on ! rl0 inet from 10.0.100.0/24 to any block drop in quick inet from 10.0.100.254 to any block drop in quick on ! nfe0 inet from 192.168.100.0/24 to any block drop in quick inet from 192.168.100.254 to any pass out quick all flags S/SA keep state pass in quick on nfe0 all flags S/SA keep state queue up_kalake pass in quick on fxp0 inet proto tcp from any to 10.0.100.1 port = www flags S/SA synproxy state queue up_dmz pass in quick on fxp0 inet proto tcp from any to 10.0.100.1 port = https flags S/SA synproxy state queue up_dmz pass in quick on rl0 inet proto udp from any to 10.0.100.254 port = domain keep state ALTQ: queue root_fxp0 on fxp0 bandwidth 768Kb priority 0 cbq( wrr root ) {up_kalake, up_dmz} queue up_kalake on fxp0 bandwidth 384Kb cbq( borrow default ) queue up_dmz on fxp0 bandwidth 384Kb queue root_nfe0 on nfe0 bandwidth 2Mb priority 0 cbq( wrr root ) {dn_kalake} queue dn_kalake on nfe0 bandwidth 2Mb cbq( default ) queue root_rl0 on rl0 bandwidth 256Mb priority 0 cbq( wrr root ) {dn_dmz} queue dn_dmz on rl0 bandwidth 256Kb cbq( default ) STATES: all tcp 192.168.1.254:22 <- 192.168.100.1:49173 ESTABLISHED:ESTABLISHED all tcp 192.168.100.1:49173 -> 172.16.1.17:63986 -> 192.168.1.254:22 ESTABLISHED:ESTABLISHED all tcp 10.0.100.1:80 <- 172.16.1.17:80 <- 172.16.1.18:4292 ESTABLISHED:ESTABLISHED all tcp 172.16.1.18:4294 -> 10.0.100.1:80 ESTABLISHED:ESTABLISHED INFO: Status: Enabled for 0 days 01:09:36 Debug: Urgent State Table Total Rate current entries 4 searches 819078 196.1/s inserts 40 0.0/s removals 30 0.0/s
Veebiserveri suunal moodustatavate TCP ühenduste puhul kasutatakse SYN-proxy tehnikat, mis tähendab, et klient pöördub tulemüüri poole, kuid tulemüür käitub TCP kihis töötava proxyna, eriti oluline on seejuures, et tulemüür ei vahenda klienti ennem TCP 3-way handshake'ingu tegemist DMZ võrgus paiknevale veebiserverile.
Paketifiltri logimine
Kui kasutada blokeerimiseks rida
block log all
siis ilmub blokeeritud ühenduse esimene pakett pflog0 seadmele, jälgimiseks sobib kasutada programmi tcpdump, näitekse selliselt
# tcpdump -nettti pflog0
Kui paketifilter käivitatakse bootimisel automaatselt, siis käivitatakse pflogd programm, mis salvestab logi faili /var/log/pflog. Seda faili saab lugeda samuti tcpdump programmi abil
# tcpdump -n -e -ttt -r /var/log/pflog
Sel juhul tuleks lisaks jälgida, et logimise tulemusena arvuti kõvaketas täis ei saaks. Logiside roteerimist juhub newsyslog, mille seadistusfail on /etc/newsyslog.conf.
Lisaks automaatselt moodustatud pflog0 seadmele saab kasutaja tekitada ise sarnaseid seadmeid, näiteks korraldada nii, et logitakse kõik veebiserverile laekunud ühendused. Seadme moodustatakse öeldes
# ifconfig pflog1 create
Seejärel tuleb paketifiltris tekitada reegel mis lubab ja mis logib
pass in log (to pflog1) quick on $ext_if inet proto tcp from any to 192.168.1.20 port 25
Ning faili logimiseks käivitada lisaks pflogd seadmel pflog1
# pflogd -i pflog1 -f /var/log/pflog1
Kusjuures selliselt logitakse ainult ühenduse moodustamisel esimese tcp paketi esimesed 116 baiti, sest selle reegliga klapib vaid see pakett. Järgnevad ühendust moodustavad paketid ei klapi reegli endaga otseselt vaid saavad läbi täna keep state nähtusele.
Tulemüüri tegevuse analüüsimine
Kui tulemüüris on esialgseks kasutamiseks sobiv komplekti reegleid kirjeldatud ja paketifilter sisse lülitatud, siis lisaks tulemüüri ümber jäävate arvutitega teenustele ligipääsu katsetamisele st ligipääs KALAKE võrgust internetti ning internetist DMZ võrgus asuvale veebiserverile maksab uurida ka vahetult tulemüüris toimuvat. Selleks sobivad programmid
- pfctl
- pftop
- tcpstat
- tcpdump
pftop manuaalis (man pftop) on üksikasjalikult kirjeldatud programmi kasutamise võimalusi, muu seas on võimalik käivitada programm interaktiivses rezhiimis ning seejärel
- klahvi V abil valida erinevate vaadete vahel
- klahvi O abil järjestada ridu ümber
- klahvi P abil jätta parasjagu olev esitus seisma
- tühiku klahvi abil värkendada esitust
- PgUp ja PgDn või noolte abil kerida ridu üles või alla
- klahvi Q abil väljuda programmist
või käivitada sobivate võtmetega mitte-interaktiivses rezhiimis, näiteks
# pftop -a -b | less
Pildil on kujutatud pftop väljund AltQ vaates, kust on näha, et nii KALAKE kui DMZ võrgust toimub upload (KALAKE võrgust on pöördutud välja scp abil ning internetist kopeeritakse wget abil DMZ veebiserveris asuvat faili) ning rakendus limiit, kusjuures DMZ kiirus on selline nagu on reeglitega talle garanteeritud. Samuti on näha, et varem on DMZ vajadus kanali järele olnud väike ning samal ajal on KALAKE DMZ käest ressurssi laenanud, nii nagu reeglitega on lubatud.
Järgmisel pildil on kujutatud samadele ühendustele vastavad olekud (ingl. k. state), nagu näha on ühe ühendusega seotud kaks olekut, üks siseneva, teine väljuva võrguseadmega seoses.
pfctl programmi manuaalis (man pfctl) on ammendavalt kirjeldatud programmi kasutamise võimalusi, muu seas on võimalik
- 'pfctl -sa' - kuvada kõikvõimalikud andmed lühidalt
- 'pfctl -vvvsa' - sama, aga üksikasjalikumalt
- 'pfctl -sr' - kuvada FILTER RULES
- 'pfctl -rn' - kuvada TRANSLATION RULES
- 'pfctl -ss' - kuvada olekud
- 'pfctl -k src_host -k dst_host' - src_host ja dst_host suhtlemisele vastavate olekute eemaldamine tulemüürist
- 'pfctl -a 'ftp-proxy/15272.22' -sr' - ftp-proxy ankru juures olevate reeglite vaatamine, 15272.22 ankru nime saab vaatada pftop väljundist
tcpstat programmi manuaalis (man tcpstat) on ammendavalt kirjeldatud programmi kasutamise võimalusi, näites saab selliselt esitada seadmega seoses iga sekundi järel võrguliikluse statistikat
# tcpstat -i fxp0 1
Sild
Silla tekitamiseks tuleb esmalt osalevad füüsilised seadmed üles tõsta
# cat /etc/hostname.fxp0 up
# cat /etc/hostname.fxp1 up
ning öelda
# sh /etc/networks fxp0 # sh /etc/networks fxp1
Silla seadistusfaili sisu võiks olla näiteks selline
# cat /etc/bridgename.bridge0 add fxp0 add fxp1 blocknonip fxp0 blocknonip fxp0 up
ja silla üles tõstmiseks öelda
# sh /etc/netstart bridge0
Silla omadusi saab vaadata öeldes
# brconfig bridge0 bridge0: flags=41<UP,RUNNING> priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp designated: id 00:00:00:00:00:00 priority 0 fxp1 flags=3<LEARNING,DISCOVER> port 2 ifpriority 0 ifcost 0 fxp0 flags=7<LEARNING,DISCOVER,BLOCKNONIP> port 1 ifpriority 0 ifcost 0 Addresses (max cache: 100, timeout: 240):
Silla saab hävitada öeldes
# ifconfig bridge0 destroy
Silla kasutamisel peab paketifilter liiklust üle silla lubama
Märkused
- Tundub, et PF abil ei saa kirjutada ümber OpenBSD arvutis genereeritud paketi dst ip aadressi ja porti.
Lingid
- http://home.nuug.no/~peter/pf/en/long-firewall.html
- Pf ja iptables ning ipfilter testid
- http://www.benzedrine.cx/pf-paper.html
- http://undeadly.org/cgi?action=article&sid=20060927091645 (kolmeosalise artikli esimene osas, viited teistele seal)