Ruutiv mitmeharuline tulemüür

Allikas: Kuutõrvaja
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Tulemüüri ja võrgu konseptsioon

On asutus Loomaaed mil domeen zoo.tartu.ee. Asutusele on ISP poolt terve C klass IP aadresse. See on omakorda jagatud veel mitmeks eri võrguks. On kontorivõrk, on serverite võrk, on majutatud serverite võrk (mitmesugused hobi ja teadlaste projektid, loodusuurijate serverid ja loomade jälgimise kaamerad jms). Lisaks kõigele sellele on olemas veel NATitud sisevõrk ning kasutust leiab uus edumeelne protokoll IPV6.

Asutusel on olemas server millel piisavalt CPU jõudlust ning kokku on masinas ülesannete täitmiseks neli võrgukaarti.

NB! Põhieesmärk on luua tulemüür mis eraldab võrke, roudib pakette ning blokeerib mustade nimekirjade alusel halbu aadresse. Eelduseks on see, et kõigil serveritel on juba olemas oma isiklik personaalne tulemüür kõhus.

Vaja on mingisugust kontrollkihti reeglite ja kasutaja ette. Ehk siis kogematta tehtud näpuviga ei hävitaks kogu meie serveriparki ja kontorit hoobilt. Näiteks mingi fireholi laadne wrapper ees on üsnagi hea kuna suudab vigase süntaksi tagasi tõrjuda enne kui iptablesi käskudeks selle moondab jms.

Mõned ideed miks sedalaadi tulemüüri üldse vaja?

  • Annab koha kust lülitada „halbu“ aadresse välja.
  • Võimaldab piirata kontori windows masinaid
  • Võimaldab eraldada majutatud võrgu masinad kontorist
  • Pakub keskpunkti load-balance tegemiseks
  • Võimaldab kehtestada kiirusepiiranguid majutatud võrgule
  • Annab NATitud sisevõrku läpakatele

Nõutavad tingimused tulemüüri tarkvarale

  • Lihtne süntaks reeglite kirjutamiseks, või kirjutamise abivahend.
  • Saaks kasutada lisaks filtreerimisele ka ruutimiseks
  • Oleks maailmas piisavalt levinud (arendatud)
  • Tasuta (võiks olla opensource ning aktiivne st suure kasutajatebaasiga ja aktiivses arenduses)
  • Võimaldaks erinevaid (koormus ja võrguühenduste)graafikuid joonistada
  • Peab olema võimeline hakkama saada suure hulga reeglitega ja massiivse hulga ühendustega. Näiteks

mingi 10 000 ühendust kogu serveripargile pole eriti ulmeline olukord millega tarkvara peab suutma hakkama saada ja seejuures mitte piduriks jääma. Vaja on, et lisaks reeglite töötlusele oskaks tarkvara ka pakette kiirelt ruutida.

Mõningad kaalutud tarkvaralised/riistvaralised lahendused ja esilekerkinud puudused

  • Juniper – Liiga kallis raud (Garantiileping on kulukas ja ilma garantiita paha)
  • Pfsense – Ilus aga puudus IPV6 tugi
  • Checkpoint – kallis ja haldus liiga Windowsi sõbralik
  • Haljas iptables – keeruline käsitsi kirjutada, vead kerged tekkima.
  • Iptables ja Firehol – mitmesugused puudused (ipv6 puudus nt)
  • Cisco – PIX liiga primitiivne ja erinevad haldusmoodulite hankimine taas kallis

Packet Filter tundub lahendavat enamus nõudmistest ja on ülal mainitud lahenduste puudustest vaba. PF juures jääb vaid ainult osustada kas kasutada OpenBSD'd või FreeBSD'd. Hetkel sai osustatud FreeBSD kasuks kuna selle SMP (mitmiktuumade) osa on rohkem arendatud ning FreeBSD on oma laiemalt leviku tõttu suuremale hulgale inimestele tuttav. See samas ei tähenda, et allolevaid reegleid ei saaks kasutada OpenBSD juures. Ainult RC.CONF seadistus tuleb sellpuhul erinev. Lisaks on tulemüüri konseptsioon ideeliselt kasutatav igasuguste Linuxiliste ja "karbitulemüüride" puhul.

Packet Filteri peamine miinus, puuduvad igasugused helperid. Näiteks SIP protokolli läbilasuks. Samas on aga talle olemas hulga erinevaid proxysid, millede kasutamine lisab küll keerukust aga aitab probleemist üle saada.

Võrgu poliitika

  • jäme joon - füüsilised ühendused.
  • noolega punktiirjoon - tulemüürist lubatud ühendused (nool tähistab suunda, kust-kuhu).

Serverivork.png

C klassiks mis jagatud on 193.40.45.0/24 Ruuteri IP aadress on 193.40.45.1

  • Serverivõrk
    • seest välja ühendused oleksid kõik lahti
    • väljast sisse kõikühendused lahti va serveritele:
    • temperatuur.zoo.edu.ee ja monitoorija.zoo.edu.ee

(viimased kaks on vanad legacy serverid mille portidele ei tahaks lubada välismaad)

  • Kontorivõrk
    • Seest välja ühendused kõik lahti
    • väljast sisse liikuvad kõik ühendused kinni va:
    • kontor.zoo.edu.ee
    • Serverivõrk

Lisaks ei jagaks DHCP teenus edaspidi enam läpakatele ja ajutistele arvutitele väliseid IP aadresse vaid sisemisi NATitavaid aadresse.

  • Majutatud võrk
    • sees välja kõik lahti
    • väljas sisse kõik lahti

Lahendus ja pf.conf faili seadistus

kasutusel võimalikult palju tabeleid, kuna tabelid tõenäoliselt eraldi reeglitest kiiremad. Olemas eraldi nn mustad nimekirjad kuhu saab kiiresti vajadusel "halbu" aadresse lisada.

NB! Tähele tasub panna, et võrreldes tavalise ühe võrgukaardiga tulemüüriga on reeglid nö tagurpidi keeratud.

Põhimõte tulemüüri valmistamisel oli, mitte kirjutada iga masina kohta käivaid piiranguid üldisesse tulemüüri vaid jätta spetsiifilised porte piiravad reeglid edasi olema igas masinas eraldi Kesksest tulemüürist kehtestatakse üldised piirangud - või siis lubamised.

PS!: Reeglite süntaks on järgmine:

[pass/block(drop/return)] [in/out] [log] [quick] [on interface] [inet/inet6] \
[proto <tcp/udp/icmp/icmp6>] [from src_addr [port src_port]] [to dst_addr [port dst_port]] \
[flags tcp_flags] [state]
 ext_if = "fxp0"
 server_if = "fxp1"
 kontor_if  = "fxp2"
 majutatud_if = "fxp3"

 # Optimiseerimised
 set optimization normal
 set block-policy drop
 set skip on lo0
 set limit states 1048576
 
 #set state-defaults pflow
 # mitu erinevat remote ip aadressi saavad samaagselt state'isid pidada. 
 #See peaks olema koos state   limiidiga
 set limit src-nodes 30000
 
 scrub in all
 scrub out all random-id max-mss 1440
 
 # Ruuteri enda aadressid
 table <my_addresses> const { 193.40.45.2, 193.40.45.33, 193.40.45.77 }

 # Globaalne tabel kus olevad aadressid koheselt blokeeritakse
 table <global_block_in_from> { 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16,  240.0.0.0/4, fc00::/7 }

 # Blokeerime spämmarite ligipääsu postiserveritele
 table <smtp_block_in_from> persist

 # Serverite võrgu aadressid millele ligipääs blokeeritud
 table <server_block_out_to> const { 193.40.45.60, 193.40.45.61 }

 # Kontori aadressid millele lubatakse ligipääs väljast
 table <kontor_pass_out_to> const { 193.40.45.78 }

 # Serverite võrk lubatakse kontorivõrgule ligi
 table <kontor_pass_out_from> const { 193.40.45.33/26 }

 # Nat reegel kontori privaataadressidele
 nat on $ext_if inet from 192.168.0.0/16 to any -> ($kontor_if:0)

 # IPv6 link-local on lubatud
 pass quick to fe80::/10
 pass quick from fe80::/10

 #* Sisenev võrk
 #
 pass on $ext_if all
 
 # Nende masinatega internetist me ei suhtle
 block in log quick on $ext_if from <global_block_in_from> label "global_block_in"
 
 # Keelame mõnedele kirjade saatmise
 block in log quick on $ext_if proto tcp from <smtp_block_in_from> to any port 25 label "smtp_block_in"

 # Paarile serverile piirame ligipääsu
 block in log quick on $ext_if to <server_block_out_to> label "server_block_out"
 
 # Ruuterile piirame ligipääsu väljast
 block in log quick on $ext_if proto { tcp, udp } to <my_addresses> label "global_block_in"
 
 #* Serverivõrk
 #
 # - seest välja ühendused oleksid kõik lahti
 # - väljast sisse kõik ühendused lahti va:
 
 pass on $server_if all keep state
  
 #* Kontorivõrk
 #
 # - Seest välja ühendused kõik lahti
 # - väljast sisse liikuvad kõik ühendused kinni va:
 #   - serverivõrguga liiklus
 
 block log on $kontor_if all label "blocked_kontor"
 pass in on $kontor_if all keep state
 pass out on $kontor_if from $kontor_if to $kontor_if:network
 pass out on $kontor_if from <kontor_pass_out_from> keep state label "kontor_pass_out"
 pass out on $kontor_if to <kontor_pass_out_to> keep state label "kontor_pass_out"
 
 #* Majutatud võrk
 #
 # - seest välja kõik lahti
 # - väljast sisse kõik lahti:
 
 pass on $majutatud_if all keep state 
 
 # -- END --

Blokitud IP-de tabelisse saab lisada aadressi või aadressivahemiku käsuga

# pfctl -t global_block_in_from -T add 218.70.0.0/16
# pfctl -t smtp_block_in_from -T add 218.70.0.0/16

Tabelis olevaid aadresse saab vaadata käsuga

# pfctl -t global_block_in_from -T show
# pfctl -t smtp_block_in_from -T show

Ja tabelist saab kustutada ridu käsuga

# pfctl -t global_block_in_from -T delete 218.70.0.0/16
# pfctl -t smtp_block_in_from -T delete 218.70.0.0/16

Selleks, et vabaneda liiga vanadest kirjetest tabelites on olemas järgnev käsk.

# /sbin/pfctl -t jobud -Te 86400
..
15/15 addresses expired.

Aeg tuleb anda sekundites. Seejärel kustutatakse tabelist kõik 24 tundi vanad ja vanemad kirjed. ps: Pacet Filteri reloadimine kustutab ka tabelite sisu. Flushitakse kõik peale olekute.

RC.CONF faili seadistus

 hostname="tulemyyr"
 
 sshd_enable="YES"
 gateway_enable="YES"
 
 defaultrouter="193.40.45.1"
 ifconfig_fxp0="inet 193.40.45.2 netmask 255.255.255.224"
 # nn serverid
 ifconfig_fxp1="inet 193.40.45.33 netmask 255.255.255.224"
 # nn kontor
 ifconfig_fxp2="inet 193.40.45.75 netmask 255.255.255.224"
 ifconfig_fxp2_alias0="192.168.1.254 netmask 255.255.255.0"
  
 pf_enable="YES"
 pflog_enable="YES"
 pf_conf="/etc/pf.conf"
 
 Vaikimisi on IPv6 routing keelatud seepärast tuleb see eraldi veel lubada, samuti rtadvd deemon.
 ipv6_enable="YES"
 ipv6_gateway_enable="YES"
 
 rtadvd_enable="YES"
 rtadvd_interfaces="igb1 bge0 nfe0"
 
 # ipv6 aadressid testimiseks
 ipv6_ifconfig_fxp2="fec0:0:0:1::1/64"
 ipv6_ifconfig_fxp3="fec0:0:0:2::1/64"
 ipv6_ifconfig_fxp4="fec0:0:0:3::1/64"

Tähelepanekuid ehitamisel

Kui serveril on IPMI liides tuleb see paigaldada võrku mis asub väljaspool tulemüüri haardeulatust.

Ajutise failoveri saavutamiseks piisab kui kõrval hoida konfitud ja töövalmis sarnane server. Kleepida serverile kaabelduse skeem st mis kaabel kuhu ümber tõsta. Igaks-juhuks teisele kettale kloonitud esimese ketta opsüsteem. Kui aega piisavalt võib mõelda sealt edasi ka CARP & PFsync rakendamisele.

Tasuks vältida integreeritud kaarte ning nvidia kaarte. Soovituslikud oleksid Inteli tooted.

Graafikute joonistamiseks võib käivitada SNMP teenuse.

Abiks

Packet_filteri_optimiseerimine

http://home.nuug.no/~peter/pf/bsdcan2012/