<!--
     The FreeBSD Italian Documentation Project
-->

<chapter id="firewall">
  <title>Il firewall e &os;</title>

  <sect1 id="firewall-intro">
    <title>Prima di un filtro la sicurezza</title>

    <para>Prima di analizzare alcuni dei pi&ugrave; importanti sistemi di
      firewall maggiormente utilizzati con &os;, credo che sia opportuno
      indicare come rendere sicura una macchina &os; a prescindere dai sistemi
      di firewall e di filtro aggiuntivi.  La guida di riferimento per la
      sicurezza nei sistemi &os; &egrave; contenuta nell'handbook alla URL
      <ulink
        url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/security.html">http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/security.html</ulink>.</para>
  </sect1>

  <sect1 id="firewall-rc-conf">
    <title>Modificare il file <filename>/etc/rc.conf</filename></title>

    <para>Una macchina &os; appena installata generalmente esegue come default
      tre applicazioni di rete</para>

    <orderedlist>
      <listitem>
        <para><application>Openssh</application> per la gestione remota del
          sistema</para>
      </listitem>

      <listitem>
        <para><application>Sendmail</application> come relay per l'inltro dei
          messaggi di elettronica</para>
      </listitem>

      <listitem>
        <para><application>Syslog</application> per la gestione e
          l'archiviazione dei log di sistema</para>
      </listitem>
    </orderedlist>

    <para>Di seguito vediamo come disabilitare queste applicazioni senza
      intaccare le funzionalit&agrave; del sistema stesso.  Modificando come
      segue il file <filename>/etc/rc.conf</filename> bloccheremo l'esecuzione
      del demone <application>sendmail</application> e
      <application>sshd</application></para>

    <programlisting>sendmail_enable="NONE"
sshd_enable="NO"</programlisting>

    <para>Sempre modificando il file <filename>/etc/rc.conf</filename>
      potremmo abilitare il demone del <application>syslogd</application>
      alla sola registrazione degli eventi del sistema locale.  Come default il
      demone <application>syslog</application> di &os;, grazie al protocollo
      UDP, consente la registrazione gli eventi di sistema anche per le altre
      macchine della rete.</para>

    <programlisting>syslogd_enable="YES"
syslogd_flags="-ss"</programlisting>

    <para>Nel caso si disponga di un sistema che esegue il logging
      centralizzato &egrave; anche possibile specificare al demone
      <application>syslogd</application> di accettare l'invio dei messaggi
      anche da alcuni host remoti</para>

    <programlisting>syslogd_flags="-a 192.168.1.0/24 -a *.merlinobbs.net"</programlisting>

    <para>In alcuni casi &egrave; consigliabile verificare che non vi sia in
      esecuzione il servizio &man.inetd.8;</para>

    <programlisting>inetd_enable="NO"</programlisting>

    <para>Il servizio &man.inetd.8; viene comunemente utilizzato per
      controllare alcuni servizi di sistema come il demone del &man.telnetd.8;
      oppure il demone del <application>pop3</application>.  Il demone
      &man.telnetd.8;, nel tempo, &egrave; stato sostituito dal demone
      &man.sshd.8; (Secure Shell) che utilizza la crittografia per rendere il
      transito dei dati sicuro, mentre il demone del
      <application>pop3</application> da accesso agli utenti remoti e
      consente la consultazione ed il download dei messaggi di posta
      elettronica.  Nel caso in cui sia necessario utilizzare il servizio
      dell'&man.inetd.8; il file <filename>/etc/rc.conf</filename> deve
      contenere questa linea</para>

    <programlisting>inetd_enable="YES"</programlisting>

    <para>Dato corso alle modifiche sinora consigliate, compresa la
      disattivazione del servizio &man.inetd.8;, la nostra macchina &os; non
      dovrebbe pi&ugrave; eseguire alcun demone, quindi nessuna applicazione
      che utilizza il protocollo TCP o UDP dovrebbe essere attiva.  Per
      maggiore sicurezza &egrave; comunque sempre una norma verificare la
      situazione accertandosi dell'esistenza di eventuali socket grazie al
      comando &man.sockstat.1;</para>

    <screen>&prompt.root; <userinput>sockstat -4</userinput>
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS</screen>

    <para>Un'altro sistema per verificare l'esistenza di eventuali programmi
      in ascolto &egrave; quello di utilizzare l'utility &man.netstat.1;</para>

    <screen>&prompt.root; <userinput>netstat -a | grep LISTEN</userinput></screen>

    <para>Per migliorare ancora di pi&ugrave; la sicurezza del sistema si
      possono suggerire altre modifiche da apportare al file
      <filename>/etc/rc.conf</filename>.  Nel caso in cui si vogliano registrare
      tutte le scansioni remote e tutti i tentativi di accesso alle porte
      chiuse del sistema potr&agrave; essere utilizzata questa entry</para>

    <programlisting>log_in_vain="YES"</programlisting>

    <para>un'altra opzione molto interessante offerta da &os; &egrave; la
      possibilità di effettuare il system accounting quindi registrare delle
      informazioni statatistiche relative sia ai comandi utilizzati che alle
      attivit&agrave; svolte dagli utenti, le informazioni verranno memorizzate
      nella directory <filename>/var/account</filename> e per visualizzare le
      informazioni potremmo successivamente ricorrere alle utility
      &man.sa.8; e &man.lastcomm.1;</para>

    <programlisting>accounting_enable="YES"</programlisting>

    <para>ripulire la directory <filename>/tmp</filename> all'avviamento del
      sistema, in alcuni casi, pu&ograve; essere una buona idea</para>

    <programlisting>clear_tmp_enable="YES"</programlisting>

    <para>un attacker si pu&ograve; servire di diverse tecniche per ottenere
      informazioni su un sistema remoto, il maleintenzionato potrebbe
      inviare dei pacchetti speciali verso un nostro server e ottenere alcune
      informazioni relativamente al tipo di sistema operativo utilizzato</para>

    <programlisting>tcp_drop_synfin="YES"</programlisting>

    <para>Questa opzione da attivare in <filename>/etc/rc.conf</filename>
      &egrave; RFC compliance e non deve essere utilizzata su una macchina che
      esegue un web server</para>
  </sect1>

  <sect1 id="firewall-inetd">
    <title>Utilizziamo il file <filename>/etc/inetd.conf</filename></title>

    <para>Abbiamo detto in precedenza che, molto spesso, non &egrave; possibile
      rinunciare al servizio dell'&man.inetd.8;.  In tale ipotesi &egrave;
      necessario per&ograve; bloccare l'eventuale rilascio di informazioni sul
      sistema.  Per raggiungere questo risultato sar&agrave; necessario operare
      sul file <filename>/etc/inetd.conf</filename>.  Nel caso si utilizzi il
      demone &man.telnetd.8; per fornire accesso da postazioni remote, grazie
      allo switch <option>-h</option> potremmo disabilitare la visualizzazione
      del banner del &man.telnetd.8;</para>

    <programlisting>telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h</programlisting>

    <para>Un'ulteriore swirch <option>-U</option> pu&ograve; essere utilizzato
      per effettuare la traduzione dell'indirizzo IP dell'host remoto in un
      corrispondente nome di host.  Se non sar&agrave; possibile effettuare la
      traduzione la sessione telnet non verr&agrave; avviata e non sar&agrave;
      disponibile l'accesso al sistema</para>

    <programlisting>telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U</programlisting>

    <para>Se non si vuole offrire accesso al sistema tramite telnet &egrave;
      bene utilizzare il carattere &num; per remmare la corrispondente linea nel
      file <filename>/etc/inetd.conf</filename></para>

    <programlisting>#telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h</programlisting>

    <para>Nel caso si utilizzi il demone %man.ftpd.8; potremo anche abilitare
      il logging delle connessioni.  Nel file
      <filename>/etc/inetd.conf</filename> dovremo inserire lo switch
      <option>-l -l</option> che consentir&agrave; di registrare qualsiasi tipo
      di informazione</para>

    <programlisting>ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l</programlisting>
  </sect1>

  <sect1 id="firewall-TCP-Wrappers">
    <title>TCP Wrappers</title>

    <para>Il <emphasis>Tcp Wrappers</emphasis> &egrave; una utility che
      consente di impostare dei controlli molto accurati sull'utilizzo dei
      servizi di rete, in particolare consente di definire quali hosts
      dispongono dell'autorizzazione di accesso ad un demone specifico,
      <emphasis>TCP Wrappers</emphasis> inoltre fornisce un sistema avanzato
      di logging delle connessioni che si appoggia sulla syslog facility di
      sistema.  Per avere maggiori dettagli &egrave; una buona idea consultare
      il sito web dell'autore <ulink
        url="http://wzv.win.tue.nl/">Wietse Venema</ulink>.</para>

    <para>Il &man.telnetd.8;, come abbiamo detto, &egrave; un vecchio sistema
      che consente la gestione remota del sistema, &man.telnet.1; infatti non
      esegue la crittografia dei pacchetti quindi &egrave; un sistema
      totalmente insicuro.  Oggi la gestione remota avviene tramite
      <application>OpenSSH</application> (Secure Shell), per avviare il demone
      &man.sshd.8; dovremo editare come segue il file
      <filename>/etc/rc.conf</filename></para>

    <programlisting>sshd_enable="YES"</programlisting>

    <para>Per vincolare e/o bloccare l'accesso remoto al demone &man.sshd.8;
      (Secure Shell) possiamo anche far ricorso al sistema del
      <emphasis>Tcp_wrapper</emphasis>.  Editiamo il file
      <filename>/etc/hosts.allow</filename>, cancelliamo tutte le linee
      assicurandoci della presenza delle direttive seguenti.</para>

    <programlisting># hosts.allow access control file for "tcp wrapped" applications.
#
ALL : localhost 127.0.0.1 : allow
sshd : 192.168.1.0/255.255.255.0 : allow
ALL : ALL : deny
#
# sshd : 202.202.202.0/255.255.255.248 202.202.201.185/255.255.255.255 : allow</programlisting>

    <para>Nella configurazione appena enunciata, localhost (127.0.0.1) &egrave;
      autorizzato a tutto mentre il demone &man.sshd.8; risponde solo alle
      richieste provenienti dal network 192.168.1.0/24, tutto il resto &egrave;
      negato.  A questo punto sar&agrave; necessario riavviare il sistema per
      rendere operative le modifiche.</para>

    <note>
      <para>nei sistemi &os; l'utilizzo del file
        <filename>/etc/hosts.deny</filename> viene altamente sconsigliato, il
        mio consiglio &egrave; quello di utilizzare il file
        <filename>/etc/hosts.allow</filename> per elencare tutte le regole
        di accesso e di negazione.</para>
    </note>
  </sect1>

  <sect1 id="firewall-info">
    <title>Risorse sulla sicurezza</title>

    <para>Ecco un utile elenco di risorse web dalle quali si possono reperire
      informazioni, notizie ed eventuali soluzioni per applicare patch e
      risolvere eventuali problemi di sicurezza di &os;</para>

    <itemizedlist>
      <listitem>
        <para>The &os; Security Notifications archives: URL <ulink
          url="http://lists.freebsd.org/pipermail/freebsd-security-notifications/">http://lists.freebsd.org/pipermail/freebsd-security-notifications/</ulink></para>
      </listitem>

      <listitem>
        <para>The &os; Security Notifications lists: URL <ulink
          url="http://lists.freebsd.org/mailman/listinfo/freebsd-security-notifications">http://lists.freebsd.org/mailman/listinfo/freebsd-security-notifications</ulink></para>
      </listitem>

      <listitem>
        <para>The &os; web site: URLs <ulink
          url="http://www.freebsd.org/">http://www.freebsd.org/</ulink></para>
      </listitem>
    </itemizedlist>

    <para>Nella lista della <emphasis>Security Notifications</emphasis>
      vengono trattati i problemi di sicurezza di &os;, non si tratta di una
      lista di discussione in quanto questa lista consente agli utenti di
      ricevere tutte le informazioni e le eventuali patch sulla sicurezza di
      &os;.</para>
  </sect1>

  <sect1 id="firewll-ipfw-into">
    <title>Introduzione ad IPFW</title>

    <para>
      Come molti altri sistemi operativi di rete, anche &os; fornisce diversi
      sistemi di firewalling, di filtraggio e di gestione dei pacchetti.  Nel
      nostro caso parleremo molto brevemente di <application>IPFW</application>
      che &egrave; lo stumento nativo per la gestione del firewalling di
      &os;. Questa applicazione viene compilata nel Kernel e consente di
      utilizzare &os; sia come strumento per il filtraggio dei pacchetti
      (<emphasis>Packet Filter Firewall</emphasis>) che come strumento di
      analisi dei pacchetti che lo attraversano grazie alle sue capacit&agrave;
      <emphasis>statefull inspection</emphasis>.</para>

    <para>Un firewall di tipo <emphasis>packet filter</emphasis> &egrave;
      ottimo per la gestione di sistemi di protezione di frontiera e
      necessiata di una memoria di sistema molto limitata.</para>

    <para>Un firewall del tipo <emphasis>statefull inspection</emphasis>
      richiede diversa memoria RAM, la memoria di sistema viene infatti
      utilizzata per analizzare e trattenere le connessioni che attraversano
      le due o pi&ugrave; interfaccie di rete che compongono l'apparato.</para>

    <para>Se volete ottenere un maggiore dettaglio ed ulteriori spiegazioni
      ed informazioni sul firewalling con &os;.  Vi rimando a leggere
      un'interessante articolo di Stefano Riva alla URL
      <ulink
        url="http://www.gufi.org/testi.php3?key=vari:ipfwregole">http://www.gufi.org/testi.php3?key=vari:ipfwregole</ulink>,
      di seguito vi fornisco uno script che consente la realizzazione di un
      firewall del tipo <emphasis>statefull inspection</emphasis> per un host
      singolo:</para>

    <para>Per avviare le funzioni di firewalling non &egrave; necessario
      ricompilare il Kernel, per inizializzare il firewall all'avvio del
      sistema dovremo aggiungere le seguenti righe al file
      <filename>/etc/rc.conf</filename></para>

    <programlisting>firewall_enable="YES"
firewall_type="/usr/local/etc/firewall.conf"</programlisting>

    <para>Ecco il file <filename>/usr/local/etc/firewall.conf</filename></para>

    <programlisting>#############################################################
# regole di firewalling per FreeBSD 4.8                     #
# tipologia : host singolo                                  #
# Manteiner : Stefano Tagliaferri                           #
# Ultima modifica: 04212003-01                              #
# nome del file : /usr/local/etc/firewall.conf              #
#############################################################
#
#############################################################
# PER ABILITARE LE FUNZIONALITA' DI FIREWALLING SARA        #
# NECESSARIO MODIFICARE IL FILE "/etc/rc.conf" INSERENDO    #
# LE SEGUENTI RIGHE:                                        #
# firewall_enable="YES"                                     #
# firewall_type="/usr/local/etc/firewall.conf"              #
#############################################################
# le connessioni di cui abbiamo mantenuto lo stato
# vengono fatte passare
add check-state
# RFC 1918 ed altri subnet illegali
add drop all from 0.0.0.0/8 to any
add drop all from 10.0.0.0/8 to any
add drop all from 169.254.0.0/16 to any # MS dhcp default address
add drop all from 172.16.0.0/12 to any
add drop all from 192.0.2.0/24 to any # reserved for docs
add drop all from 192.168.0.0/16 to any
add drop all from 204.152.64.0/23 to any # SUN cluster interconnect
add drop all from 240.0.0.0/4 to any
# Blocchi dello IANA e reti non utilizzate
#
# consenti a questo host di connettersi ovunque
add allow all from 127.0.0.1 to any
add allow all from 192.168.0.10 to 192.168.0.10
add pass tcp from 192.168.0.10 to any out setup keep-state
add pass udp from 192.168.0.10 to any out keep-state
add pass ip from 192.168.0.10 to any out
add deny all from 192.168.0.10 to any
# Blocca routing illegale
add deny ip from any to any ipoptions rr
add deny ip from any to any ipoptions ts
add deny ip from any to any ipoptions lsrr
add deny ip from any to any ipoptions ssrr
# Blocca riconoscimento Sistema Operativo by Nmap
add deny tcp from any to any tcpflags syn,fin
add deny tcp from any to any tcpflags syn,rst
# Altre porcherie
add deny tcp from any 0 to any
add deny tcp from any to any 0
add deny udp from any 0 to any
add deny udp from any to any 0
# clausola di frag per la gestione dei frammenti IP
add allow all from any to any frag
# (TCP) permette alla WAN di accedere ai servizi
add pass tcp from any to 192.168.0.10 25 in # smtp
#add pass tcp from any to 192.168.0.10 80 in # web
add pass tcp from any to 192.168.0.10 110 in # pop3
#add pass tcp from any to 192.168.0.10 443 in # web SSL
# (TCP) macchine privilegiate accesso ssh
add pass tcp from 192.168.0.5 to 192.168.0.10 22 in # ssh
add pass tcp from 192.168.0.5 to 192.168.0.10 80 in # web
add pass udp from 192.168.0.5 to 192.168.0.10 161 in # snmp
#add pass tcp from 192.168.0.5 to 192.168.0.10 3128 in # squid
#add pass tcp from 10.10.75.3 to 192.168.0.10 22 in # ssh
# permette alla WAN di accedere ad alcuni servizi UDP
#add pass udp from any to 192.168.0.10 1024-65535 in
# (ICMP) troubleshooting di rete, gestione e controllo
# 0=Echo Replay
# 3=destination unrechable
# 8=Echo Request
# 11=TTL Execeeded
add pass icmp from any to 192.168.0.10 icmptypes 0,3,8,11
# blocca tutto il resto
add deny all from any to any
# EOF -DjSpider8 04212003</programlisting>
  </sect1>

  <sect1 id="firewall-natd">
    <title>Il demone &man.natd.8; ed il firewalling avanzato</title>

    <para>&os; si fa apprezzare anche come piattaforma dedicata alle soluzioni
      di <emphasis>routing</emphasis> e <emphasis>firewalling</emphasis>
      avanzato.  Oltre all'applicazione &man.ipfw.8;, di cui abbiamo trattato
      in precedenza, esiste anche il demone &man.natd.8;, questo applicativo
      consente di effettuare le pi&ugrave; avantate tecniche di
      <emphasis>NAT</emphasis> (Network Address Translation) e di
      <emphasis>PAT</emphasis> (Port Address Translation).</para>

    <para>In breve vediamo alcune delle caratteristiche del sistema che
      abbiamo dedicato a tale scopo ed alcune delle procedure che abbiamo
      seguito per preparare ed hardinizzare il sistema.</para>

    <para>Nel nostro caso stiamo utilizzando una macchina i386 con le seguenti
      caratteristiche:</para>

    <itemizedlist>
      <listitem>
        <para>Processore Athlon XP+ 2400 (1800 Mhz)</para>
      </listitem>

      <listitem>
        <para>Scheda madre ECS K7S5A Pro</para>
      </listitem>

      <listitem>
        <para>Ram 256 Mb</para>
      </listitem>

      <listitem>
        <para>&os; 4.8</para>
      </listitem>
    </itemizedlist>

    <para>L'inizializzazione della macchina prevede l'installazione
      completa del sistema operativo, l'aggiornamento dei sorgenti, dei port
      e della documentazione con il conseguente rebuild dell'intero sistema e,
      naturalmente del suo Kernel.</para>
  </sect1>

  <sect1 id="firewall-kernel">
    <title>Impostazioni del Kernel e modifiche al file
      <filename>/etc/rc.conf</filename></title>

    <para>Per abilitare le opzioni di firewalling e le funzionalit&agrave; di
      NAT, PAT e Dummynet, il Kernel dovr&agrave; essere ricompilato con le
      seguenti opzioni:</para>

    <programlisting># firewalling
options IPFIREWALL                    # firewall
options IPFIREWALL_VERBOSE            # abilita il logging
options IPFIREWALL_VERBOSE_LIMIT=0    # valore che limita il logging
#options IPFIREWALL_DEFAULT_TO_ACCEPT # autorizza tutto per default
options RANDOM_IP_ID # questa opzione limita quello che un
                     # osservatore remoto riesce ad osservare per
                     # determinare il rate del packet generation
options IPDIVERT                      # divert sockets
options DUMMYNET                      # contabilità del traffico</programlisting>

    <para>Le opzioni di cui sopra vanno inserite di seguito alla sezione
      <emphasis>pseudo-device</emphasis>, per maggiori dettagli &egrave; bene
      consultare il file <filename>/usr/src/sys/i386/conf/LINT</filename>.  Nel
      caso specifico, procediamo con l'abilitazione del firewalling e rendiamo
      possibile il logging attraverso il demone &man.syslogd.8;, si prevede
      anche l'attivazione del demone che si occupa di gestire il NAT
      (Network Address Translation) nonch&egrave; il sistema di limitazione e
      della contabilit&agrave; del traffico.  Una definizione molto importante
      per un sistema che deve svolgere il compito di firewall &egrave; quella di
      impostare la politica a <literal>deny any any</literal> (blocca
      tutto).</para>

    <sect2>
      <title>Attiviamo il NAT (Network Address Translation)</title>

      <para>Per attivare il demone &man.natd.8; ed il sistema di firewall
        dobbiamo procedere ad alcune modifiche del file
        <filename>/etc/rc.conf</filename></para>

      <programlisting># impostazioni di rete
defaultrouter="200.201.202.254" # il nostro default gateway
gateway_enable="YES"            # abilita l'IP forwarding
hostname="pluto.dominio.com"
ifconfig_xl0="inet 200.201.202.140 netmask 255.255.255.248"
ifconfig_xl1="inet 192.168.0.254 netmask 255.255.255.0"
#
# impostazione del firewall ed del nat
firewall_enable="YES"          # abilita firewalling
firewall_type="OPEN"           # script standard /etc/rc.firewall
natd_enable="YES"              # abilita il demone natd
natd_interface="xl0"           # interfaccia che esegue il forwarding
                               # si tratta dell'interfaccia di outside
                               # ovvero quella collegata con internet
natd_flags="-f /etc/natd.conf" # file delle configurazioni addizionali per il natd</programlisting>

      <para>Le modifiche che abbiamo apportato al file di override dell'init
        di &os; (<filename>/etc/rc.conf</filename>) possono essere suddivise
        logicamente in due parti</para>

      <orderedlist>
        <listitem>
          <para>La prima parte &egrave; quella espressamente dedicata al
            networking dove viene definito il default gateway, si abilitata
            la regola che consente il packetforwarding e vengono impostate le
            interfaccie di rete di cui il sitema si compone;</para>
        </listitem>

        <listitem>
          <para>la seconda parte riguarda l'abilitazione vera e propria del
            firewall, l'abilitazione del demone &man.natd.8;, la definizione
            dell'interfaccia di rete che eseguir&agrave; la traduzione degli
            indirizzi con la definizione del file che conterr&agrave; le
            impostazioni principali per il demone &man.natd.8;.</para>
        </listitem>
      </orderedlist>

      <para>Nel nostro caso stiamo trattando di un sistema con una duplice
        interfaccia di rete (<emphasis>dual-homed host</emphasis>), dove
        l'interfaccia <devicename>xl0</devicename> fa parte della rete
        pubblica internet (outside) mentre l'interfaccia
        <devicename>xl1</devicename> fa parte di una rete privata (inside).
        L'interfaccia pubblica (outside) &egrave; quella che traduce gli
        indirizzi e le porte eseguendo il NAT (Network Address Translation) o
        il PAT (Port Address Translation).  Per definire le regole che verranno
        utilizzate dal demone &man.natd.8; e per dare corso alla traduzione
        degli indirizzi e delle porte, dovremo necessariamente creare un file
        di configurazione del natd <filename>/etc/natd.conf</filename></para>

      <programlisting>interface xl0
use_sockets yes
same_ports yes</programlisting>

      <para>Nel file viene definita, nel nostro caso viene ribadita,
        l'interfaccia di rete che eseguir&agrave; il NAT (outside), le
        istruzioni <literal>use_socket yes</literal> e
        <literal>same_ports yes</literal> sono fondamentali per il corretto
        funzionamento di alcuni protocolli applicativi (layer7) come l'FTP
        (<emphasis>File Transfer Protocol</emphasis>) e l'IRC
        (<emphasis>Internet relay chat</emphasis>).</para>

      <para>Dopo aver compilato il Kernel, apportato le modifiche al file
        <filename>/etc/rc.conf</filename> e aver creato il file
        <filename>/etc/natd.conf</filename>, con il quale abbiamo definito le
        regole del nat, sar&agrave; finalmente possibile riavviare la nostra
        macchina &os;.  Al successivo riavvio il sistema funzioner&agrave; come
        firewall ed eseguir&agrave; la tecnica del NAT (Network Address
        Translation), le impostazioni del sistema vengono caricate
        automaticamente dal file <filename>/etc/rc.firewall</filename>.  In
        queste condizioni operative la base di protezione &egrave; nulla.
        Lo script <filename>/etc/rc.firewall</filename> consente accesso a
        tutti i servizi che sono attivi sulla macchina eseguendo il solo demone
        &man.natd.8;.</para>
    </sect2>

    <sect2>
      <title>Ridirezione delle porte (PAT)</title>

      <para>Normalmente l'installazione di un firewall pu&ograve; includere una
        zona ulteriore denominata DMZ (Zona demilitarizzata), una terza
        interfaccia di rete pu&ograve; essere tranquillamente installata sul
        firewall, questa interfaccia viene collegata con una rete LAN dove
        verranno installati tutti i servers che saranno eventualmente
        accessibili al pubblico.  Uno di questi server pu&ograve; essere, ad
        esempio, un mail-relay.  Questo sistema accetta tutta la posta in
        entrata prima che la stessa raggiunga un mailserver centrale come
        Microsoft Exchange.  Molte Corporation utilizzano dei mail-relay
        che eseguono lo scanning dei contenuti della posta elettronica, filtrano
        e validano tutti i messaggi in entrata ed in uscita ricorrendo a dei
        prodotti come amavisd-new, o a sistemi antivirus o per finire a sistemi
        antispam.  Esistono due tipi diversi di approccio al sistema della
        ridirezione, verifichiamo la semplice ridirezione delle porte che
        prende anche il nome di PAT (Port Address Translation).  Assumiamo che
        il network di DMZ utilizzi lo spazio di indirizzamento 10.0.0.0 con
        una network di classe C (netmask 255.255.255.0), l'interfaccia di
        DMZ del firewall &egrave; 10.0.0.1 e la macchina mail-relay &egrave;
        la 10.0.0.2.  La ridirezione della porta viene effettuata modificando
        il file <filename>/etc/rc.conf</filename>.</para>

      <programlisting>natd_flags=""</programlisting>

      <para>dovr&agrave; essere modificato con</para>

      <programlisting>natd_flags="-redirect_port tcp 10.0.0.2:25 25"</programlisting>

      <para>In questo modo verr&agrave; ridirezionata la porta 25
        dall'interfaccia di rete che esegue in nat verso la porta 25 della
        macchina mail-relay alla quale abbiamo assegnato l'indirizzo IP
        10.0.0.2.</para>

      <para>Riferimenti: <ulink
        url="http://www.jimi.dk/freebsd/NAT-Firewall.php">http://www.jimi.dk/freebsd/NAT-Firewall.php</ulink></para>
    </sect2>

    <sect2>
      <title>Ridirezione degli indirizzi (NAT)</title>

      <para>Il secondo sistema &egrave; quello che riguarda la ridirezione del
        traffico da un'indirizzo IP della rete di outside ad un indirizzo
        IP della rete di DMZ, questa tecnica prende anche il nome di tecnica
        del NAT (Network Address Translation) o NAT statico</para>

      <programlisting>natd_flags=""</programlisting>

      <para>dovr&agrave; essere cambiato in</para>

      <programlisting>natd_flags="-redirect_address 10.0.0.2 200.201.202.140"</programlisting>

      <para>dove l'indirizzo IP 200.201.202.140 &egrave; l'indirizzo
        dell'interfaccia che esegue il NAT o qualsiasi indirizzo pubblico
        disponibile sulla interfaccia di rete che esegue il NAT (interfaccia
        di outside). Molte opzioni avanzate e facilities sono disponibili
        consultando le pagine di man (man <ulink
          url="http://www.freebsd.org/cgi/man.cgi?query=natd&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+4.9-stable&amp;format=html">natd</ulink>).</para>

      <para>Riferimenti: <ulink
        url="http://www.jimi.dk/freebsd/NAT-Firewall.php">http://www.jimi.dk/freebsd/NAT-Firewall.php</ulink></para>
    </sect2>

    <sect2>
      <title>Limitazioni di banda (DUMMYNET)</title>

      <para>&os; viene fornito con un sistema di limitazione e di gestione del
        traffico che viene incluso nel kernel che prende il nome di DUMMYNET.
        Dummynet in origine era stato pensato dagli sviluppatori come uno
        strumento di test per il controllo della congestione del traffico TCP
        ma poi si è rilevato utile in altri contesti.  Dummynet pu&ograve;
        essere utilizzato per abbassare la velocit&agrave; di un link
        internet molto veloce ed evitare quindi possibili attacchi di tipo
        DoS (Denial of Service).  Assumiamo che necessitiamo di molta banda
        per eseguire il download di programmi dal server nella rete 1.1.1.1.
        Inseriamo nel file di configurazione
        <filename>/etc/rc.firewall</filename> le seguenti righe</para>

      <para>in prima istanza costruiamo la pipe</para>

      <programlisting>add pipe 1 ip from any to 1.1.1.0/24</programlisting>

      <para>poi configuriamo la pipe</para>

      <programlisting>pipe 1 config bw 256Kbit/s</programlisting>

      <para>Questa impostazione limita la banda per il network 1.1.1.0/24 a
        256 Kbit/s.  &Egrave; molto realistico limitare la banda disponibile
        per gestire tutte le transazioni relative al traffico e-mail: mail
        di dimensioni molto grandi possono saturare interamente la banda
        disponibile relativa alla connessione internet</para>

      <para>in prima istanza costruiamo la pipe</para>

      <programlisting>add pipe 1 ip from any to 10.0.0.2</programlisting>

      <para>poi configuriamo la pipe</para>

      <programlisting>pipe 1 config bw 256Kbit/s</programlisting>

      <para>Questa impostazione limita la banda a 256 Kbit/s nelle connessioni
        verso l'indirizzo 10.0.0.2, altre informazioni relative ad altre
        feature, come il packet delay possono essere trovate nelle man page
        di &man.ipfw.8; e &man.dummynet.4;.</para>

      <para>Riferimenti: <ulink
          url="http://www.jimi.dk/freebsd/NAT-Firewall.php">http://www.jimi.dk/freebsd/NAT-Firewall.php</ulink></para>
    </sect2>
  </sect1>

  <sect1 id="firewall-dualhomed">
    <title>Realizzare un firewall <emphasis>dual-homed</emphasis></title>

    <para>Ora definiamo un firewall con regole stringenti rendendo la macchina
      sicura.  Verr&agrave; eseguito il NAT, il PAT e verranno bloccati tutti
      gli accessi da reti e da host non autorizzati inclusa la tecnica di
      mascheramento degli indirizzi ip denominata
      <emphasis>ipspoofing</emphasis>, procederemo in questo senso creando un
      file personalizzato, le regole di firewalling verranno caricate
      direttamente all'avvio del sistema.</para>

    <para>Di seguito forniamo uno schema di riferimento:</para>

    <programlisting>Public 202.201.202.0/24
-------------------------------
                         |
                         |xl0 - 202.201.202.140
                         -----------
                         |         |
                         |         |---lo0 (127.0.0.1)
                         |         |
                         -----------
                         |xl1 - 192.168.0.254
Private 192.168.0.0/24   |
-------------------------------</programlisting>

    <para>Creiamo il file <filename>/usr/local/etc/firewall.conf</filename>,
      il file contiene le regole principali di un sistema dual-homed, per
      abilitare lo script al boot del sistema seguire le indicazioni fornite nel
      file stesso:</para>

    <programlisting>#############################################################
# PER ABILITARE LE FUNZIONALITA' DI FIREWALLING SARA'       #
# NECESSARIO MODIFICARE IL FILE "/etc/rc.conf" INSERENDO    #
# LE SEGUENTI RIGHE:                                        #
# firewall_enable="YES"                                     #
# firewall_type="/usr/local/etc/firewall.conf"              #
# funzionalita' di natd                                     #
#############################################################
# natd
add divert natd all from any to any via xl0
# autorizza localhost
add allow ip from any to any via lo0
add deny ip from any to 127.0.0.0/8
# le connessioni di cui abbiamo mantenuto lo stato
# vengono fatte passare
add check-state
# RFC 1918
add drop all from 0.0.0.0/8 to any in recv xl0
add drop all from 10.0.0.0/8 to any in recv xl0
add drop all from 127.0.0.0/8 to any in recv xl0
add drop all from 169.254.0.0/16 to any in recv xl0
add drop all from 172.16.0.0/12 to any in recv xl0
add drop all from 192.0.2.0/24 to any in recv xl0
#
add drop all from 200.201.202.140 to any in recv xl0
#
add drop all from 192.168.0.0/16 to any in recv xl0
add drop all from 204.152.64.0/23 to any in recv xl0
add drop all from 240.0.0.0/4 to any in recv xl0
# Blocchi IANA e reti non utilizzate
add drop all from 1.0.0.0/8 to any
add drop all from 2.0.0.0/8 to any
add drop all from 5.0.0.0/8 to any
add drop all from 7.0.0.0/8 to any
add drop all from 23.0.0.0/8 to any
add drop all from 27.0.0.0/8 to any
add drop all from 31.0.0.0/8 to any
add drop all from 37.0.0.0/8 to any
add drop all from 39.0.0.0/8 to any
add drop all from 41.0.0.0/8 to any
add drop all from 42.0.0.0/8 to any
add drop all from 49.0.0.0/8 to any
add drop all from 50.0.0.0/8 to any
add drop all from 58.0.0.0/8 to any
add drop all from 59.0.0.0/8 to any
add drop all from 60.0.0.0/8 to any
#
# 65.*/8 - 79.*/8
add drop all from 70.0.0.0/8 to any
add drop all from 71.0.0.0/8 to any
add drop all from 72.0.0.0/8 to any
add drop all from 73.0.0.0/8 to any
add drop all from 74.0.0.0/8 to any
add drop all from 75.0.0.0/8 to any
add drop all from 76.0.0.0/8 to any
add drop all from 77.0.0.0/8 to any
add drop all from 78.0.0.0/8 to any
add drop all from 79.0.0.0/8 to any
#
# 80.*/8 - 95.*/8
add drop all from 83.0.0.0/8 to any
add drop all from 84.0.0.0/8 to any
add drop all from 85.0.0.0/8 to any
add drop all from 86.0.0.0/8 to any
add drop all from 87.0.0.0/8 to any
add drop all from 88.0.0.0/8 to any
add drop all from 89.0.0.0/8 to any
add drop all from 90.0.0.0/8 to any
add drop all from 91.0.0.0/8 to any
add drop all from 92.0.0.0/8 to any
add drop all from 93.0.0.0/8 to any
add drop all from 94.0.0.0/8 to any
add drop all from 95.0.0.0/8 to any
#
# 96.*/8 - 111.*/8
add drop all from 96.0.0.0/8 to any
add drop all from 97.0.0.0/8 to any
add drop all from 98.0.0.0/8 to any
add drop all from 99.0.0.0/8 to any
add drop all from 100.0.0.0/8 to any
add drop all from 101.0.0.0/8 to any
add drop all from 102.0.0.0/8 to any
add drop all from 103.0.0.0/8 to any
add drop all from 104.0.0.0/8 to any
add drop all from 105.0.0.0/8 to any
add drop all from 106.0.0.0/8 to any
add drop all from 107.0.0.0/8 to any
add drop all from 108.0.0.0/8 to any
add drop all from 109.0.0.0/8 to any
add drop all from 110.0.0.0/8 to any
add drop all from 111.0.0.0/8 to any
#
# 112.*/8 - 126.*/8
add drop all from 112.0.0.0/8 to any
add drop all from 113.0.0.0/8 to any
add drop all from 114.0.0.0/8 to any
add drop all from 115.0.0.0/8 to any
add drop all from 116.0.0.0/8 to any
add drop all from 117.0.0.0/8 to any
add drop all from 118.0.0.0/8 to any
add drop all from 119.0.0.0/8 to any
add drop all from 120.0.0.0/8 to any
add drop all from 121.0.0.0/8 to any
add drop all from 122.0.0.0/8 to any
add drop all from 123.0.0.0/8 to any
add drop all from 124.0.0.0/8 to any
add drop all from 125.0.0.0/8 to any
add drop all from 126.0.0.0/8 to any
#
# 220.*/8 - 223.*/8
add drop all from 223.0.0.0/8 to any
#
# scassacazzo
add drop all from 213.45.36.6 to any
add drop all from 193.109.43.254 to any
# consenti a questo host di connettersi ovunque
add allow all from 200.201.202.140 to 200.201.202.140
add pass tcp from 200.201.202.140 to any out setup keep-state
add pass udp from 200.201.202.140 to any out keep-state
add pass ip from 200.201.202.140 to any out
add deny all from 200.201.202.140 to any
# Blocca routing illegale
add deny ip from any to any ipoptions rr
add deny ip from any to any ipoptions ts
add deny ip from any to any ipoptions lsrr
add deny ip from any to any ipoptions ssrr
# Blocca riconoscimento Sistema Operativo by Nmap
add deny tcp from any to any tcpflags syn,fin
add deny tcp from any to any tcpflags syn,rst
# Altre porcherie
add deny tcp from any 0 to any
add deny tcp from any to any 0
add deny udp from any 0 to any
add deny udp from any to any 0
# clausola di frag per la gestione dei frammenti IP
add allow all from any to any frag
add allow ip from any to any via xl1
add allow ip from 200.201.202.140 to any via xl0
# permette alla WAN di accedere ad alcuni servizi UDP
#add pass udp from any to 200.201.202.140 1024-65535 in
# (ICMP) troubleshooting di rete, gestione e controllo
# 0=Echo Replay
# 3=destination unrechable
# 8=Echo Request
# 11=TTL Execeeded
#add pass icmp from any to 200.201.202.140 icmptypes 0,3,8,11
# prima blocca gli ip poi lascia passare il resto
add deny ip from any to 127.0.0.1 in
add deny ip from any to 200.201.202.140 in
add deny ip from any to 192.168.0.254 in
add allow ip from any to any
# EOF -DjSpider8 06072003</programlisting>
  </sect1>
</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "book" "chapter")
     End:
-->
