                    Dialup-firewalling sa FreeBSD-om

  Marc Silver

   <marcs@draenor.org>

   $Date: 2002-02-06 17:01:34 $

   Ovaj clanak dokumentuje kako podesiti firewall koristeci PPP
   dialup sa FreeBSD-om i IPFW-om, kao i posebno podesavanje
   firewall-a na dialup sa dinamicki dodeljenim IP adresama. Ovaj
   dokument ne pokriva podesavanje same PPP konekcije.

     --------------------------------------------------------------

1 Uvod

   Dialup-firewalling sa FreeBSD-om

   Ovaj dokument pokusava da objasni postupak koji je potreban da bi
   se podesio firewall na FreeBSD-u u slucaju kada imate dinamicki
   dodeljenu IP adresu. Mnogo truda je bilo ulozeno u to da ovaj
   dokument budes sto informativniji i tacniji, svaki vas
   komentar/sugestija autoru je dobrodosla.

     --------------------------------------------------------------

2 Opcije pri konfigurisanju kernela

   Prva stvar koju morate da uradite jeste da rekompajlirate kernel
   FreeBSD-a. Ako vam je potrebno vise informacija o tome kako da
   rekompajlirate kernel, onda je svakako najbolje mesto da pocnete
   poglavlje o konfigurisanju kernela u Priricniku. Morate
   iskompajlirati kernel sa sledecim opcijama:

   options IPFIREWALL

           Ukljucuje firewall kod u kernel.

   options IPFIREWALL_VERBOSE

           Salje logovane pakete system logger-u.

   options IPFIREWALL_VERBOSE_LIMIT=100

           Limitira broj ekvivalentnih unosa u log. Ovo sprecava da
           se vas log prepuni sa mnogo jednakih unosa. 100 je razuman
           broj, ali mozete promeniti ovaj podatak prema vasim
           potrebama.

   options IPDIVERT

           Omogucava preusmeravanje socket-a, o cemu ce kasnije biti
           reci.

   Postoje jos neke opcije koje nisu obavezne, a koje mozete
   ukompajlirati u vas kernel kako bi ste poboljsali bezbednost vaseg
   sistema. Ove opcije nisu neophodne, ali ce neki paranoidniji
   korisnici svakako zeleti da ih upotrebe.

   options TCP_RESTRICT_RST

           Ova opcija blokira sve TCP RST pakete. Ovo je najbolje
           koristiti za sisteme koji bi mogli biti izlozeni SYN
           flooding-u (IRC serveri su dobar primer), ili sisteme za
           koje je pozeljno da im se ne mogu lako skenirati portovi.

   options TCP_DROP_SYNFIN

           Ako ukljucite ovu opciju u kernel, bice ignorisani sci SYN
           i FIN paketi. Ovo onemogucava alate kao sto je nmap, itd.
           da odrede TCP/IP stek masine, ali onemogucava podrsku za
           RFC1644 ekstenzije. Ovo NIJE preporucljivo ako ce masina
           raditi kao web server.

   Nemojte odmah da restartujete masinu posto rekompajlirate kernel.
   Uz malo srece moracete samo jednom da uradite restartovanje da bi
   ste zavrsili instalaciju firewall-a.

     --------------------------------------------------------------

3 Izmene /etc/rc.conf fajla potrebne za podizanje firewall-a

   Sada je potrebno da uradimo odredjene izmene na /etc/rc.conf fajlu
   kako bi smo omogucili podizanje firewall-a. Jednostavno dodajte
   sledece linije:

 firewall_enable="YES"
 firewall_script="/etc/firewall/fwrules"
 natd_enable="YES"
 natd_interface="tun0"
 natd_flags="-dynamic"

   Za vise informacija o tome pogledajte u /etc/defaults/rc.conf i
   procitajte rc.conf(5)

     --------------------------------------------------------------

4 Iskljcivanje PPP prevodjenja adresa

   Moguce je da vec koristite prevodjenje adresa (network address
   translation-NAT) koji je ugrad/en u PPP. U tom slucaju moracete da
   ga iskljucite, kao sto sledeci primeri koriste natd(8) da bi
   uradili istu stvar.

   Ako vec imate podesen ppp, verovatno imate blok instrukcija za
   automatsko podizanje PPP-a i to verovatno izgleda otprilike ovako:

 ppp_enable="YES"
 ppp_mode="auto"
 ppp_nat="YES"
 ppp_profile="profile"

   Ako je tako, obrisite ppp_nat="YES" line. Takodje cete morati da
   uklonite nat enable yes ili alias enable yes u /etc/ppp/ppp.conf
   fajlu.

     --------------------------------------------------------------

5 Podesavanje firewall-a

   Sada smo vec pri kraju. Sve sto je preostalo jeste da definisemo
   pravila po kojim ce se firewall ponasati i posle toga mozete da
   restartujete masinu i firewall bi trebao da bude podignut i
   aktivan. Svakako razumem da ce svako zeleti nesto drugacija
   pravila za njihov firewall, tako da sam pokusao da napisem pravila
   koja ce odgovarati vecini korisnika dialup konekcije. Mozete lako
   modifikovati vec postojeca pravila kao osnovu za vas set pravila.
   Krenimo prvo sa osnovama zatvorenog firewall-inga. Ono sto bi
   trebalo da uradite jeste da u osnovnoj konfiguraciji sve zatvorite
   i onda po potrebi otvorite samo ono sto vam je potrebno. Pravila
   se pisu tako da se prvo pisu pravila dozvole (allow), a onda
   pravila zabrane (deny). Pretpostavka je da cete prvo dodati
   pravila dozvole, a zatim sve ostalo zabraniti. :)

   Napravimo sada direktorijum /etc/firewall. Udjite u taj
   direktorijum i potom napravite file fwrules koji smo naznacili u
   rc.conf fajlu i editujte ga prema vasim potrebama. Molim vas da
   obratite paznju na to da mozete da promenite ime ovog fajla kako
   vama odgovara. Ovo uputsvo samo daje ovo ime kao primer.

   Pogledajmo sada primer konfiguracionog fajla, gde cete videti i
   detalje podesavanja:.

 # Pravila za konfigurisanje firewall-a
 # Written by Marc Silver (marcs@draenor.org)
 # http://draenor.org/ipfw
 # Slobodna distribucija


 # Definisite firewall komadu (kao u /etc/rc.firewall) radi
 # lakseg referenciranja. Omogucava lakse citanje istog .
 fwcmd="/sbin/ipfw"

 # Prisiljava preuzimanje novih pravila prilikom restartovanja.
 $fwcmd -f flush

 # Preusmerava sve pakete kroz tunnel interfejs.
 $fwcmd add divert natd all from any to any via tun0

 # Dozvoljava protok svih podataka kroz mrezne karte i localhost.
 # Proverite da li ste promenili identifikaciju mrezne karte pre
 # nego sto restartujete masinu (moja je bila fxp0) :)
 $fwcmd add allow ip from any to any via lo0
 $fwcmd add allow ip from any to any via fxp0

 # Dozvoli sve konekcije koje ja iniciram
 $fwcmd add allow tcp from any to any out xmit tun0 setup

 # Posto su konekcije napravljene, dozvoli im da ostanu otvorene
 $fwcmd add allow tcp from any to any via tun0 established

 # Svima na internetu je dozvoljeno da se konektuju na sledece
 # servise na ovoj masini. U ovom primeru ljudi mogu da se
 # konektuju na ssh i apache (ili neki drugi web server koji
 # slusa na portu 80)
 $fwcmd add allow tcp from any to any 80 setup
 $fwcmd add allow tcp from any to any 22 setup

 # Ova linija salje RESET svim ident paketima.
 $fwcmd add reset log tcp from any to any 113 in recv tun0

 # Omoguci izlazne DNS upite SAMO ka odred/enim serverima.
 $fwcmd add allow udp from any to x.x.x.x 53 out xmit tun0

 # Dozvoli im da daju povratnu infomaciju.... :)
 $fwcmd add allow udp from x.x.x.x 53 to any in recv tun0

 # Dozvoli ICMP (potreban za ping i traceroute). Mozda cete
 # zeleti da ovo onemogucite, ali to mojim potrebama odgovara
 $fwcmd add 65435 allow icmp from any to any

 # Zabrani sve ostalo.
 $fwcmd add 65435 deny log ip from any to any

   Sada imate potpuno funkcionalan firewall koji ce dozvoliti
   konekcije na portove 80 i 22, i koji ce prijaviti pokusaj
   konekcije na bilo koji drugi port. Sada bi trebalo da mozete
   bezbedno da restartujete masinu i posle restarta bi vas firewall
   trebao fino da radi. Ako pronadjete neku gresku ili natrcite na
   neki problem, ili imate bilo koju sugestiju kako bi unapredio ovu
   dokumentaciju, molim vas da mi napisete email.

     --------------------------------------------------------------

6 Pitanja

   6.1. Zasto koristite natd i ipfw kada bi mogli da koristite
   ugrad/ene ppp filtre?

   6.2. Ako interno koristim privatnu adresu, kao npr. u 192.168.0.0
   opsegu, mogu li dodati komandu kao npr. $fwcmd add deny all from
   any to 192.168.0.0:255.255.0.0 via tun0 u pravila kako bih sprecio
   pokusaj konekcija sa udaljene masine na internu masinu?

   6.3. Mora da je nesto pogresno. Pratio sam vasa uputstva od reci
   do reci i sada sam potpuno zatvoren.

   6.1. Zasto koristite natd i ipfw kada bi mogli da koristite
   ugrad/ene ppp filtre?

   Moracu da budem iskren na ovom mestu i da kazem da nemam odred/en
   razlog zasto zaista koristim natd i ipfw umesto ugradjenih ppp
   filtera. Posle razgovora koje sam imao sa raznim ljudima, dosli
   smo do konsezusa da je ipwf definitivno mocniji kao i
   konfigurabilniji od ppp filtera sto mu daje poen vise za
   funkcionalnost, kao i poen manje za lakocu koriscenja. Jedan od
   razloga zbog kojeg vise volim ipwf jeste sto preferiram da se
   firewalling radi na nivou kernela a ne na nivou korisnickog
   programa.

   6.2. Ako interno koristim privatnu adresu, kao npr. u 192.168.0.0
   opsegu, mogu li dodati komandu kao npr. $fwcmd add deny all from
   any to 192.168.0.0:255.255.0.0 via tun0 u pravila kako bih sprecio
   pokusaj konekcija sa udaljene masine na internu masinu?

   Jednostavan odgovor je ne. Razlog je to sto natd radi prevodjenje
   adresa za sve sto je preusmereno kroz tun0. Sto se natd-a tice,
   dolazeci paketi ce govoriti samo o dinamicki dodeljenoj IP adresi
   a NE o internoj mrezi. Primetimo ipak da firewall-u mozete dodati
   pravilo nalik na $fwcmd add deny all from any to
   192.168.0.0:255.255.0.0 via tun0 koje bi ogranicilo host u vasoj
   internoj mrezi da izad/e uz pomoc firewall-a.

   6.3. Mora da je nesto pogresno. Pratio sam vasa uputstva od reci
   do reci i sada sam potpuno zatvoren.

   Ovaj tutorial pretpostavlja da koristite userland-ppp, i iz tog
   razloga dati set pravila radi na tun0 interfejsu, to odgovara
   prvoj konekciji ostvarenoj sa ppp(8) (odn. user-ppp). Dodatne
   konekcije bi koristile tun1, tun2 itd.

   Takod/e bi trebalo da primetite da pppd(8) koristi ppp0 ppp0
   interfejs, tako da ako zelite da ostvarite konekciju pomocu
   pppd(8)-a morate zameniti tun0 sa ppp0. Brz nacin da podesite
   firewall u tom slucaju je prikazan dole. Originalni set pravila je
   sacuvan fwrules_tun0.

             % cd /etc/firewall
             /etc/firewall% su
             Password:
             /etc/firewall# mv fwrules fwrules_tun0
             /etc/firewall# cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules
          

   Da bi ste saznali da li trenutno koristite ppp(8) ili pppd(8)
   mozete pogledati izlaz ifconfig(8)-a kada uspostavite vezu. Pod
   uslovom da uspostavite konekciju sa pppd(8)-om videcete nesto kao
   (prikazane su samo relevatne linije):

             % ifconfig
             (skipped...)
             ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000
             (preskoceno...)
            

   OPod uslovom da je konekcija uspostavljena sa ppp(8)-om (user-ppp)
   trebalo bi da dobijete nesto nalik na slede'e linije:

             % ifconfig
             (skipped...)
             ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
             (skipped...)
             tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     (IPv6 stuff skipped...)
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00
                     Opened by PID xxxxx
             (preskoceno...)
            

     --------------------------------------------------------------

           This, and other documents, can be downloaded from
                   ftp.FreeBSD.org/pub/FreeBSD/doc/.

 For questions about FreeBSD, read the documentation before contacting
                        <questions@FreeBSD.org>.
   For questions about this documentation, e-mail <doc@FreeBSD.org>.
