<!--
     The FreeBSD Documentation Project

     $FreeBSD$
     Original revision: 1.7
-->

<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man;
]>

<article>
  <articleinfo>
    <title>Dialup-firewalling sa FreeBSD-om</title>

    <authorgroup>
      <author>
        <firstname>Marc</firstname>
        <surname>Silver</surname>

        <affiliation>
          <address><email>marcs@draenor.org</email></address>
        </affiliation>
      </author>
    </authorgroup>

    <pubdate>$Date: 2002-02-06 17:01:34 $</pubdate>

    <abstract>
      <para>Ovaj članak dokumentuje kako podesiti firewall koristeći PPP dialup
sa FreeBSD-om i IPFW-om, kao i posebno podešavanje firewall-a na
dialup sa dinamički dodeljenim IP adresama. Ovaj dokument ne pokriva
podešavanje same PPP konekcije.</para>
    </abstract>
  </articleinfo>

  <sect1 id="preface">
    <title>Uvod</title>
    
    <para>Dialup-firewalling sa FreeBSD-om</para>
    
    <para>Ovaj dokument pokušava da objasni postupak koji je potreban da bi se
	podesio firewall na FreeBSD-u u slučaju kada imate dinamički
	dodeljenu IP adresu. Mnogo truda je bilo uloženo u to da ovaj
	dokument budeš što informativniji i tačniji, svaki vaš
	komentar/sugestija <ulink URL="mailto:marcs@draenor.org">autoru</ulink> je 
	dobrodošla.</para>
   </sect1>

  <sect1 id="kernel">
    <title>Opcije pri konfigurisanju kernela</title>
    
    <para>Prva stvar koju morate da uradite jeste da rekompajlirate kernel
	FreeBSD-a. Ako vam je potrebno više informacija o tome kako da
	rekompajlirate kernel, onda je svakako najbolje mesto da počnete poglavlje 
	o konfigurisanju kernela u <ulink
    URL="http://www.freebsd.org/handbook/kernelconfig.html">Priričniku</ulink>.
	Morate iskompajlirati kernel sa sledećim opcijama:</para>

    <variablelist>
      <varlistentry>
        <term><literal>options IPFIREWALL</literal></term>

        <listitem>
          <para>Ukljucuje firewall kod u kernel.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><literal>options IPFIREWALL_VERBOSE</literal></term>

        <listitem>
          <para>Šalje logovane pakete system logger-u.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><literal>options
            IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>

        <listitem>
          <para>Limitira broj ekvivalentnih unosa u log. Ovo sprečava da se vaš log prepuni 
		  sa mnogo jednakih unosa. <replaceable>100</replaceable> je razuman broj, ali možete 
		  promeniti ovaj podatak prema vašim potrebama.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><literal>options IPDIVERT</literal></term>

        <listitem>
          <para>Omogućava <emphasis>preusmeravanje</emphasis> socket-a, o čemu će kasnije 
		  biti reči.</para>
        </listitem>
      </varlistentry>
    </variablelist>

    <para>Postoje jos neke opcije koje nisu obavezne, a koje možete ukompajlirati u vaš kernel 
	kako bi ste poboljšali bezbednost vašeg sistema. Ove opcije nisu neophodne, ali će neki 
	paranoidniji korisnici svakako želeti da ih upotrebe.</para>

    <variablelist>
      <varlistentry>
        <term><literal>options TCP_RESTRICT_RST</literal></term>

        <listitem>
          <para>Ova opcija blokira sve TCP RST pakete. Ovo je najbolje koristiti za sisteme 
		  koji bi mogli biti izloženi SYN flooding-u (IRC serveri su dobar primer), ili sisteme 
		  za koje je poželjno da im se ne mogu lako skenirati portovi.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><literal>options TCP_DROP_SYNFIN</literal></term>

        <listitem>
          <para>Ako uključite ovu opciju u kernel, biće ignorisani sci SYN i FIN paketi. Ovo 
		  onemogućava alate kao sto je nmap, itd. da odrede TCP/IP stek masine, ali onemogućava 
		  podršku za RFC1644 ekstenzije. Ovo NIJE preporučljivo ako će mašina raditi kao web 
		  server.</para>
        </listitem>
      </varlistentry>
     </variablelist>

    <para>Nemojte odmah da restartujete mašinu pošto rekompajlirate kernel. Uz malo sreće moraćete 
	samo jednom da uradite restartovanje da bi ste zavrsili instalaciju firewall-a.</para>
  </sect1>

  <sect1 id="rcconf">
    <title>Izmene <filename>/etc/rc.conf</filename> fajla potrebne za podizanje 
      firewall-a</title>
    
    <para>Sada je potrebno da uradimo odredjene izmene na
      <filename>/etc/rc.conf</filename> fajlu kako bi smo omogućili podizanje firewall-a. 
	  Jednostavno dodajte sledeće linije:</para>
    
    <programlisting>firewall_enable="YES"
firewall_script="/etc/firewall/fwrules"
natd_enable="YES"
natd_interface="tun0"
natd_flags="-dynamic"</programlisting>

    <para>Za više informacija o tome pogledajte u
      <filename>/etc/defaults/rc.conf</filename> i procitajte
      &man.rc.conf.5;</para>
  </sect1>
  
  <sect1>
    <title>Iskljcivanje PPP prevodjenja adresa</title>
    
    <para>Moguće je da već koristite prevodjenje adresa (network address translation-NAT) 
	koji je ugrađen u PPP. U tom slučaju moraćete da ga isključite, kao sto sledeći primeri 
	koriste &man.natd.8; da bi uradili istu stvar.</para>

    <para>Ako već imate podešen ppp, verovatno imate blok instrukcija za automatsko podizanje 
	PPP-a i to verovatno izgleda otprilike ovako:</para>

    <programlisting>ppp_enable="YES"
ppp_mode="auto"
ppp_nat="YES"
ppp_profile="<replaceable>profile</replaceable>"</programlisting>

    <para>Ako je tako, obrišite <literal>ppp_nat="YES"</literal> line. Takodje ćete morati 
	da uklonite <literal>nat enable yes</literal> ili <literal>alias enable yes</literal> 
	u <filename>/etc/ppp/ppp.conf</filename> fajlu.</para>
  </sect1>

  <sect1 id="rules">
    <title>Podešavanje firewall-a</title>
    
    <para>Sada smo već pri kraju. Sve što je preostalo jeste da definišemo pravila po kojim 
	će se firewall ponašati i posle toga možete da restartujete mašinu i firewall bi trebao 
	da bude podignut i aktivan. Svakako razumem da će svako želeti nešto drugačija pravila za 
	njihov firewall, tako da sam pokušao da napišem pravila koja će odgovarati većini 
	korisnika dialup konekcije. Možete lako modifikovati već postojeća pravila kao osnovu za 
	vaš set pravila. Krenimo prvo sa osnovama zatvorenog firewall-inga. Ono što bi trebalo da 
	uradite jeste da u osnovnoj konfiguraciji sve zatvorite i onda po potrebi otvorite samo ono
	što vam je potrebno. Pravila se pišu tako da se prvo pišu pravila dozvole (allow), a onda 
	pravila zabrane (deny). Pretpostavka je da ćete prvo dodati pravila dozvole, a zatim sve 
	ostalo zabraniti. :)</para>

    <para>Napravimo sada direktorijum /etc/firewall. Udjite u taj direktorijum i potom napravite 
	file fwrules koji smo naznačili u rc.conf fajlu i editujte ga prema vašim potrebama. Molim 
	vas da obratite pažnju na to da možete da promenite ime ovog fajla kako vama odgovara. Ovo 
	uputsvo samo daje ovo ime kao primer. </para>

    <para>Pogledajmo sada primer konfiguracionog fajla, gde ćete videti i detalje podešavanja:. 
	</para>

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


# Definišite firewall komadu (kao u /etc/rc.firewall) radi
# lakšeg referenciranja. Omogućava lakše čitanje 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 mrežne karte i localhost.
# Proverite da li ste promenili identifikaciju mrežne karte pre
# nego što restartujete mašinu (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

# Pošto 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 sledeće
# servise na ovoj mašini. U ovom primeru ljudi mogu da se
# konektuju na ssh i apache (ili neki drugi web server koji
# sluša 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 šalje RESET svim ident paketima.
$fwcmd add reset log tcp from any to any 113 in recv tun0

# Omogući izlazne DNS upite SAMO ka određenim serverima.
$fwcmd add allow udp from any to <replaceable>x.x.x.x</replaceable> 53 out xmit tun0

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

# Dozvoli ICMP (potreban za ping i traceroute). Možda ćete
# želeti da ovo onemogućite, 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</programlisting>

    <para>Sada imate potpuno funkcionalan firewall koji ce dozvoliti konekcije 
	na portove 80 i 22, i koji će prijaviti pokušaj konekcije na bilo koji 
	drugi port. Sada bi trebalo da možete bezbedno da restartujete mašinu i 
	posle restarta bi vaš firewall trebao fino da radi. Ako pronadjete neku 
	grešku ili natrčite na neki problem, ili imate bilo koju sugestiju kako bi 
	unapredio ovu dokumentaciju, molim vas da mi napišete email.</para>
  </sect1>

  <sect1>
    <title>Pitanja</title>
    
    <qandaset>
      <qandaentry>
        <question>
          <para>Zašto koristite natd i ipfw kada bi mogli da koristite 
		  ugrađene ppp filtre?</para>
        </question>
        
        <answer>
          <para>Moraću da budem iskren na ovom mestu i da kažem da nemam 
		  određen razlog zašto zaista koristim natd i ipfw umesto ugradjenih 
		  ppp filtera. Posle razgovora koje sam imao sa raznim ljudima, došli 
		  smo do konsezusa da je ipwf definitivno moćniji kao i konfigurabilniji 
		  od ppp filtera sto mu daje poen više za funkcionalnost, kao i poen 
		  manje za lakoću korišćenja. Jedan od razloga zbog kojeg više volim 
		  ipwf jeste što preferiram da se firewalling radi na nivou kernela a 
		  ne na nivou korisničkog programa.</para>
        </answer>
      </qandaentry>

      <qandaentry>
        <question>
          <para>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 sprečio 
		  pokušaj konekcija sa udaljene mašine na internu mašinu?</para>
        </question>

        <answer>
          <para>Jednostavan odgovor je ne. Razlog je to sto natd radi prevodjenje 
		  adresa za <emphasis>sve</emphasis> sto je preusmereno kroz tun0. Sto se 
		  natd-a tiče, dolazeći paketi će govoriti samo o dinamički dodeljenoj 
		  IP adresi a NE o internoj mreži. Primetimo ipak da firewall-u možete 
		  dodati pravilo nalik na <literal>$fwcmd add deny all from any to 
		  192.168.0.0:255.255.0.0 via tun0</literal> koje bi ograničilo host 
		  u vašoj internoj mreži da izađe uz pomoć firewall-a.</para>
        </answer>
      </qandaentry>

      <qandaentry>
        <question>
          <para>Mora da je nešto pogrešno. Pratio sam vaša uputstva od reči do reči 
		  i sada sam potpuno zatvoren.</para>
        </question>

        <answer>
          <para>Ovaj tutorial pretpostavlja da koristite
            <emphasis>userland-ppp</emphasis>, i iz tog razloga dati set  
            pravila radi na <devicename>tun0</devicename> interfejsu, to odgovara 
			prvoj konekciji ostvarenoj sa &man.ppp.8; (odn.
            <emphasis>user-ppp</emphasis>).  Dodatne konekcije bi koristile
            <devicename>tun1</devicename>, <devicename>tun2</devicename> 
			itd.</para>

          <para>Takođe bi trebalo da primetite da &man.pppd.8; koristi ppp0 
            <devicename>ppp0</devicename> interfejs, tako da ako zelite
            da ostvarite konekciju pomocu &man.pppd.8;-a morate zameniti
            <devicename>tun0</devicename> sa <devicename>ppp0</devicename>. 
            Brz način da podesite firewall u tom slučaju je prikazan dole.
			Originalni set pravila je sačuvan
            <filename>fwrules_tun0</filename>.</para>

          <screen>
            &prompt.user; <userinput>cd /etc/firewall</userinput>
            /etc/firewall&prompt.user; <userinput>su</userinput>
            <prompt>Password:</prompt>
            /etc/firewall&prompt.root; <userinput>mv fwrules fwrules_tun0</userinput>
            /etc/firewall&prompt.root; <userinput>cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules</userinput>
          </screen>

          <para>Da bi ste saznali da li trenutno koristite &man.ppp.8; ili
            &man.pppd.8; mozete pogledati izlaz &man.ifconfig.8;-a kada uspostavite vezu.  
			Pod uslovom da uspostavite konekciju sa &man.pppd.8;-om videćete nešto kao 
			(prikazane su samo relevatne linije):</para>

          <screen>
            &prompt.user; <userinput>ifconfig</userinput>
            <emphasis>(skipped...)</emphasis>
            ppp0: flags=<replaceable>8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1524</replaceable>
                    inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --&gt; <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xff000000</replaceable>
            <emphasis>(preskočeno...)</emphasis>
            </screen>

          <para>OPod uslovom da je konekcija uspostavljena sa &man.ppp.8;-om
            (<emphasis>user-ppp</emphasis>) trebalo bi da dobijete nesto nalik 
			na slede'e linije:</para>

          <screen>
            &prompt.user; <userinput>ifconfig</userinput>
            <emphasis>(skipped...)</emphasis>
            ppp0: flags=<replaceable>8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1500</replaceable>
            <emphasis>(skipped...)</emphasis>
            tun0: flags=<replaceable>8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1524</replaceable>
                    <emphasis>(IPv6 stuff skipped...)</emphasis>
                    inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --&gt; <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xffffff00</replaceable>
                    Opened by PID <replaceable>xxxxx</replaceable>
            <emphasis>(preskočeno...)</emphasis>
            </screen>
        </answer>
      </qandaentry>
    </qandaset>
  </sect1>
</article>
