OpenBSD tulemüür vana

Allikas: Kuutõrvaja

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 - carp, pfsync (sessioonide sünkroniseerimine klustri õlgade vahel)

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

  1. Tulemüüri KALAKE ja DMZ võrkude liidestel töötab nimeteenus.
  2. KALAKE ja DMZ võrgu arvutite vaikelüüsiks ning nimeserveriks on vastavalt 192.168.100.254 ja 10.0.100.254.
  3. Kohtvõrgu osast KALAKE, kus asuvad kasutajate töökohaarvutid pääseb piiramatult avalikku internetti ning DMZ võrku.
  4. Tulemüüris tehakse NAT-teisendust DMZ ning KALAKE võrgus paiknevatele arvutitele.
  5. 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.
  6. DMZ võrgust ei saa algatada ühendusti kuskil suunas va tulemüüri liidesel töötav nimeserver.
  7. 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)
  8. 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

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.

Pftop-kalake-dmz-up-altq.gif

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.

Pftop-kalake-dmz-up-view-long.gif

pftop programmi kasutamine batch režiimis toimub nt selliselt

# pftop -b -f "inbound and dst net 192.168.1.4" -w 120 -o long 
pfTop: Up State 1-3/3 (1052), View: default, Order: none
PR      DIR SRC                     DEST                             STATE                AGE       EXP     PKTS   BYTES
tcp     In  192.168.10.10:39416     192.168.1.4:22          ESTABLISHED:ESTABLISHED  05:30:40 294:13:31      645   73932
tcp     In  192.168.10.249:45805    192.168.1.4:5666          TIME_WAIT:TIME_WAIT    00:00:28  00:01:02       18    1909
tcp     In  192.168.10.249:45875    192.168.1.4:80           FIN_WAIT_2:FIN_WAIT_2   00:00:02  00:01:28       10    1114

kus

  • -w 120 - määrab väljundi ridade pikkuse, kui see on kitsas, siis nt esitatakse STATE väärtused arvuliselt
  • -f järel on esitatud filter, mis kitsendab väljundit

pfctl

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 -vvvsA' - ankrute nimekiri
  • 'pfctl -a ftp-proxy/* -vvvsA - ankru all olevate ankrute nimekiri
  • 'pfctl -a 'ftp-proxy/15272.22' -sr' - ftp-proxy ankru juures olevate reeglite vaatamine, 15272.22 ankru nime saab vaatada eelmise käsu väljundist

tcpstat

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

Multipath

Multipath (equal-cost multipath routing, http://www.ietf.org/rfc/rfc2992.txt) viitab asjaolule, et ühe ja sama sihtpunkti (nt, hosti või võrgu sh vaikelüüsi) kohta on ruutingutabelis mitu sissekannet, kusjuures tuum kasutab paketi väljasaatmisel neid kõiki, sama src ip jaoks kasutatakse sama teed. Reegline kasutatakse multipathi juhtumil, kui tulemüüril on mitu välisühendust ning väljuvat liiklust soovitakse nende vahel jaotada.

Läbi tulemüüri võrku 192.168.0.0/16 suunduva liikluse jagamiseks kahe välisühenduse peale sobib multipath seadistamiseks öelda

# route add -mpath 192.168.0.0/16 10.10.0.1
# route add -mpath 192.168.0.0/16 10.22.0.1
# sysctl net.inet.ip.multipath=1

kus

  • 192.168.0.0/16 sihtvõrk
  • 10.10.0.1 - ühe välisühenduse lüüsi aadress
  • 10.22.0.1 - teise välisühenduse lüüsi aadress
  • net.inet.ip.multipath - multipath sisselülitamiseks tuleb parameetri väärtuseks seada üks

Lisaks tuleb seadista sobivalt paketifilter, nt

pass in quick on $if_sise inet proto tcp from 172.17.2.0/16 to 192.168.0.0/16 tag MPATH
pass out quick on $if_ext_1 inet tagged MPATH nat-to 10.10.0.254
pass out quick on $if_ext_2 inet tagged MPATH nat-to 10.22.0.254

kus

  • esimene reegel lubab tulemüüri sisse sisevõrgust lähtuva liikluse ja tähitab selle sildiga MPATH
  • kaks ülejäänud reeglit lubavad liiklust välja mõlema välisühenduse kaudu kasutades silti MPATH
  • kuna sisevõrgus kasutatakse privaatseid aadresse, siis lisaks kaks ülejäänud reeglit teisendavad väljuvate pakettide lähteaadressi tulemüüri ühe ja teise välisühenduse poolse seadme avalikuks aadressiks

Multipath kasutamisel on mõttekas jälgida välisühenduste korrasolekut nt ifstated abil ning vajadusel multipath sellega ümber seadistada, vastasel korral võib juhtuda, et tuum otsustab saata pakette välja mitte-töötava kanali kaudu. Multipath tehnika kasutab ruutingutabeli võimalusi, alternatiiviks oleks saavutada sarnane tulemus paketifiltri route-to abil.

Kasulikud lisamaterjalid

reject ja blackhole ruuting

Paketifiltri toimele sarnast tulemust on võimalik saavutada ka ruutingutabelis vastavaid omadusi kasutades

  • reject puhul ei ruudita pakette vastavasse võrku kusjuures vastuseks saadetakse icmp unreachable teade
# route add 192.168.223.0/24 127.0.0.1 -reject
  • blackhole puhul lihtsal ignoreeritakse pakette
# route add 192.168.223.0/24 127.0.0.1 -blackhole

Mitme ruutingutabeli kasutamine

TODO

Aadressiteisendused OpenBSD 4.7 versiooni paketifiltriga

Alates 20090913 4.6-currentist ning eeldatavasti 2010 aasta mais ilmuvas 4.7 reliisis on kasutusel uuenenud paketifiltri aadressiteisenduste esitamise süntaks. Enam ei saa kasutada nat ja rdr direktiive ning nende asemel sobib kasutada match direktiive vastavalt parameetritega rdr-to ja nat-to.

Näiteks selline suhteliselt konstrueeritud näide, siseneval seadmel toimub paketi dst aadressi teisendus ja väljuval seadmel src aadressi teisendus

 rdr on $ext_if inet proto tcp from <kontor> to $ext_if port 10171 tag TO_SSH_ARVUTI -> 10.193.235.11 port 22
 nat on $int_if inet tagged TO_SSH_ARVUTI -> 10.193.235.1
 ...
 pass in quick on $ext_if inet tagged TO_SSH_ARVUTI label "JSext_ssh_arvuti" $udpopts (tcp.established 1064000)
 pass out quick on $int_if inet tagged TO_SSH_ARVUTI label "JVint_ssh_arvuti"  $udpopts (tcp.established 1064000)

esitub uue süntaksi abil selliselt

 match in on $ext_if inet proto tcp from <kontor> to $ext_if port 10171 tag TO_SSH_ARVUTI rdr-to 10.193.235.11 port 22
 pass in quick on $ext_if inet tagged TO_SSH_ARVUTI label "JSext_ssh_arvuti" $udpopts (tcp.established 1064000)
 
 match out on $int_if inet tagged TO_SSH_ARVUTI nat-to 10.193.235.1
 pass out quick on $int_if inet tagged TO_SSH_ARVUTI label "JVint_ssh_arvuti"  $udpopts (tcp.established 1064000)

Uuendus võimaldab otsekoheselt logida pakettide klappimist ka aadressteisendavate reeglitega. Selleks tuleb kasutada 'in' ja 'out' järel 'log' parameetrit, nt

 match out log on $int_if inet tagged TO_SSH_ARVUTI nat-to 10.193.235.1

ning tulemus on sarnane

 11:14:35.923593 rule 7/(match)  pass in on em3:   192.168.96.138.62157 >  192.168.121.158.10171: S 1840348112:1840348112(0) .. (DF)
 11:14:35.923595 rule 5/(match)  match in on em3:  192.168.138.62157    >  192.168.121.158.10171: S 1840348112:1840348112(0) .. (DF)
 11:14:35.923607 rule 11/(match) pass out on em2:  192.168.96.138.62157 >  192.168.235.11.22: S 1840348112:1840348112(0) .. (DF)
 11:14:35.923608 rule 9/(match)  match out on em2: 192.168.96.138.62157 >  192.168.235.11.22: S 1840348112:1840348112(0) .. (DF)

Kasulikud lisamaterjalid

Võrguseadmete seadmegrupid

Paketifiltri reeglite rakendamist saab seostada lisaks nö tavalistele seadmetele (nt füüsilised, vlan seadmed) ka seadmegruppidega. Vaikimisi on olemas sellised seadmegrupid

  • pfsync - paketifiltri olekutabelis sünkroniseerimise seade
  • carp - carp seadmed
  • vlan - vlan seadmed
  • egress - sellesse grupp kuulub seade, mille kaudu jõuab kõnealusest arvutist välja tema vaikelüüsini

Kasutaja saab seadmegrupi kirjelda lisades sinna esimese seadme

 # ifconfig em0 group seadmegrupinimi

ja eemaldada öelda

 # ifconfig em0 -group seadmegrupinimi

Seadme seadmegruppidesse kuulumist saab küsida

 # ifconfig em0
 ..
 groups: seadmegrupinimi

Märkused

  • Tundub, et PF abil ei saa kirjutada ümber OpenBSD arvutis genereeritud paketi dst ip aadressi ja porti.
  • Tundub, et PF abil ei saa kirjutada ümber OpenBSD arvutisse jõudnud paketi src ip aadressi ja porti.

Misc

  • Sedasi saab vaadata 10.0.6.240 peale minevat kümmet aktiivsemat ip aadressi
# while [ 1 == 1 ]; do pftop -w 160 -f 'dst host 10.0.6.240 and out' -b -a | awk {'print $3'} | cut -d : -f 1| sort | uniq -c | sort -n | tail -n 10; sleep 10; clear; done

Lingid