<!--
     The FreeBSD Dutch Documentation Project

     $FreeBSD$
     $FreeBSDnl: nl_NL.ISO8859-1/books/handbook/firewalls/chapter.sgml,v 1.30 2005/04/24 18:55:42 siebrand Exp $
     Gebaseerd op: 1.57
-->

<chapter id="firewalls">
  <chapterinfo>
    <authorgroup>
      <author>
	<firstname>Joseph J.</firstname>
	<surname>Barbish</surname>
	<contrib>Bijgedragen door </contrib>
      </author>
    </authorgroup>
    <authorgroup>
      <author>
	<firstname>Brad</firstname>
	<surname>Davis</surname>
	<contrib>Omgezet naar SGML en bijgewerkt door </contrib>
      </author>
    </authorgroup>
    <authorgroup>
      <author>
	<firstname>Siebrand</firstname>
	<surname>Mazeland</surname>
	<contrib>Vertaald door </contrib>
      </author>
    </authorgroup>
  </chapterinfo>

  <title>Firewalls</title>

  <indexterm><primary>firewall</primary></indexterm>

  <indexterm>
    <primary>beveiliging</primary>

    <secondary>firewalls</secondary>
  </indexterm>

  <sect1 id="firewalls-intro">
    <title>Inleiding</title>

    <para>Firewalls bieden de mogelijkheid om inkomend en uitgaand
      verkeer op een systeem te filteren.  Een firewall gebruikt
      daarvoor een of meer groepen regels (<quote>rules</quote>) om
      netwerkpakketten te inspecteren als ze binnenkomen of weggaan
      door netwerkverbindingen en staat dat verkeer dan toe of
      blokkeert het.  De regels van een firewall kunnen
      &eacute;&eacute;n of meerdere eigenschappen van pakketten
      onderzoeken waaronder, maar niet uitsluitend, het protocol, het
      bron- of bestemmingsadres en de bron- en bestemmingspoort.</para>

    <para>Firewalls kunnen de veiligheid van een host of netwerk enorm
      vergroten.  Ze kunnen &eacute;&eacute;n of meer van de volgende
      dingen doen:</para>

    <itemizedlist>
      <listitem>
	<para>Applicaties, diensten en machines op een intern
	  netwerk te beschermen tegen ongewild verkeer van het
	  internet.</para>
      </listitem>

      <listitem>
	<para>Toegang tot internet voor interne hosts te limiteren
	  of uitschakelen.</para>
      </listitem>

      <listitem>
	<para>Ondersteuning bieden voor netwerkadres vertaling
	  (<quote>network address translation</quote> of
	  <acronym>NAT</acronym>), waarmee er vanaf een intern
	  netwerk met private <acronym>IP</acronym> adressen een
	  internetverbinding gedeeld kan worden met &eacute;&eacute;n
	  <acronym>IP</acronym> adres of met een groep van publieke
	  adressen die automatisch wordt toegewezen.</para>
      </listitem>
    </itemizedlist>

    <para>Na het lezen van dit hoofdstuk weet de lezer:</para>

    <itemizedlist>
      <listitem>
	<para>Hoe pakketfilteringsregels op de juiste wijze
	  samengesteld kunnen worden;</para>
      </listitem>

      <listitem>
	<para>De verschillen tussen de firewalls die bij &os;
	  worden geleverd;</para>
      </listitem>

      <listitem>
	<para>Hoe de OpenBSD firewall <application>PF</application> te
	  gebruiken en in te stellen;</para>
      </listitem>

      <listitem>
	<para>Hoe <application>IPFILTER</application> te gebruiken en
	  in te stellen;</para>
      </listitem>

      <listitem>
	<para>Hoe <application>IPFW</application> te gebruiken en in te
	  stellen.</para>
      </listitem>
    </itemizedlist>

    <para>Er wordt aangenomen dat de lezer van dit hoofdstuk:</para>

    <itemizedlist>
      <listitem>
	<para>Basisbegrip heeft van &os; en internetconcepten.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="firewalls-concepts">
    <title>Firewallconcepten</title>

    <indexterm>
      <primary>firewall</primary>

      <secondary>sets regels</secondary>
    </indexterm>

    <para>Er zijn twee basismogelijkheden om sets met regels te maken
      voor firewalls: <quote>inclusief</quote> of
      <quote>exclusief</quote>.  Een exclusieve firewall staat al het
      verkeer door behalve het verkeer dat past bij de set met regels.
      Een inclusieve firewall doet het tegenovergestelde.  Die staat
      alleen verkeer toe dat past bij de regels en blokkeert al het
      overige verkeer.</para>

    <para>Inclusieve firewalls zijn in het algemeen veiliger dan
      exclusieve firewalls omdat ze het risico op het toestaan van
      ongewild verkeer door een firewall aanzienlijk reduceren.</para>

    <para>De beveiliging kan nog verder vergroot worden met een
      <quote>stateful firewall</quote>.  Een stateful firewall houdt
      bij welke connecties er door de firewall tot stand zijn gekomen
      en laat alleen verkeer door dat bij een bestaande connectie hoort
      of onderdeeel is van een connectie in opbouw.  Het nadeel van een
      stateful firewall is dat die kwetsbaar kan zijn voor Ontzegging
      van Dienst (DoS) aanvallen als er een groot aantal nieuwe
      verbindingen binnen korte tijd wordt opgezet.  Met de meeste
      firewalls is het mogelijk een combinatie te maken van stateful en
      niet stateful gedrag om een optimale firewall voor een site te
      maken.</para>
  </sect1>

  <sect1 id="firewalls-apps">
    <title>Firewallsoftware</title>

    <para>&os; heeft drie soorten firewallsoftware in de
      basisinstallatie.  Dat zijn: IPFILTER (ook bekend als IPF),
      IPFIREWALL (ook bekend als IPFW) en de pakketfilter van
      OpenBSD (ook bekend als PF).  &os; heeft ook twee ingebouwde
      pakketten voor het regelen van verkeer (in de basis het
      beheersen van bandbreedtegebruik): &man.altq.4; en
      &man.dummynet.4;.  Dummynet is traditioneel sterk verbonden met
      <acronym>IPFW</acronym> en <acronym>ALTQ</acronym> met
      <acronym>IPF</acronym>/<acronym>PF</acronym>.  IPF, IPFW en PF
      gebruiken allemaal regels om de toegang van pakketten tot een
      systeem te regelen, hoewel ze dat op andere manieren doen en de
      syntaxis voor regels anders is.</para>

    <para>De reden dat er meerdere firewallpakketten in &os; zitten is
      dat verschillende mensen verschillende eisen en voorkeuren
      hebben.  Geen enkel firewallpakket is het beste.</para>

    <para>De schrijver van dit artikel geeft de voorkeur aan IPFILTER
      omdat daarmee stateful regels minder complex zijn toe te passen
      in een omgeving waar <acronym>NAT</acronym> wordt gebruikt en
      IPF heeft een ingebouwde ftp proxy waardoor de regels voor het
      veilig gebruiken van FTP eenvoudiger worden.</para>

    <para>Omdat alle firewalls gebaseerd zijn op het inspecteren van
      aangegeven controlevelden in pakketten, moet iemand die sets van
      firewallregels opstelt begrijpen hoe <acronym>TCP</acronym>/IP
      werkt, welke waarde de controlevelden kunnen hebben en hoe die
      waarden gebruikt worden in normaal verkeer.  Op de volgende
      webpagina wordt een prima uitleg gegeven: <ulink
	url="http://www.ipprimer.com/overview.cfm"></ulink>.</para>
  </sect1>

  <sect1 id="firewalls-pf">
    <title>De OpenBSD Packet Filter (PF) en
      <acronym>ALTQ</acronym></title>

    <indexterm>
      <primary>firewall</primary>

      <secondary>PF</secondary>
    </indexterm>

    <para>Vanaf juli 2003 is de OpenBSD firewalltoepassing
      <acronym>PF</acronym> geporteerd naar &os; wn bwschikbaar gekomen
      in de &os; Portscollectie.  In november 2004 was &os;&nbsp;5.3 de
      eerste release die <acronym>PF</acronym> bevatte is integraal
      onderdeel van het basissysteem.  <acronym>PF</acronym> is een
      complete en volledige firewall die optioneel
      <acronym>ALTQ</acronym> bevat (Alternate Queuing).
      <acronym>ALTQ</acronym> biedt Quality of Service
      (<acronym>QoS</acronym>) bandbreedtebeheersing waardoor een
      bepaalde bandbreedte gegarandeerd kan worden aan verschillende
      diensten op basis van filterregels.  Het OpenBSD project zorgt
      voor een erg goed gebruikershandboek voor PF (PF User's Guide)
      dat niet in dit onderdeel wordt opgenomen omdat dat niet nodig
      is.</para>

    <para>Hieronder wordt de beschikbaarheid van PF voor de
      verschillende &os; releases en versies weergegeven:</para>

    <informaltable frame="none" pgwide="1">
      <tgroup cols="2">
	<thead>
	  <row>
	    <entry>&os; Versie</entry>
	    <entry>PF Beschikbaarheid</entry>
	  </row>
	</thead>

	<tbody>
	  <row>
	    <entry>Pre-4.X versie</entry>

	    <entry>PF is niet beschikbaar voor uitgaven van &os; ouder
	      dan de tak 4.X.</entry>
	  </row>

	  <row>
	    <entry>Alle versies van de tak 4.X</entry>
	    <entry>PF is beschikbaar als onderdeel van KAME.</entry>
	  </row>

	  <row>
	    <entry>5.X uitgaven voor 5.3-RELEASE</entry>

	    <entry>De port <filename
		role="package">security/pf</filename> kan gebruikt
	      worden om PF te installeren op deze versie van &os;.
	      Deze uitgaven waren gericht op ontwikkelaars en mensen
	      die een voorproefje wilden hebben van vroege versies van
	      5.X.  Het wordt sterk aangeraden om te upgraden naar
	      5.3-RELEASE of een nieuwere versie van &os;.</entry>
	  </row>

	  <row>
	    <entry>5.3-RELEASE en latere versies</entry>

	    <entry>PF onderdeel van het basissysteem.  Gebruik de port
	      <filename role="package">security/pf</filename> op deze
	      versies van &os; <emphasis>niet</emphasis>.  Dat werkt
	      niet en dus dient de &man.pf.4;-ondersteuning uit het
	      basissysteem gebruikt te worden.</entry>
	  </row>
	</tbody>
      </tgroup>
    </informaltable>

    <para>Meer informatie staat op de <quote>PF voor &os;</quote>
      website: <ulink
	url="http://pf4freebsd.love2party.net/"></ulink>.</para>

    <para>Het OpenBSD PF gebruikershandboek staat hier: <ulink
	url="http://www.openbsd.org/faq/pf/"></ulink>.</para>

    <warning>
      <para>PF in &os;&nbsp;5.X staat op het niveau van OpenBSD versie
	3.5.  De port uit de &os; Portscollectie is op het niveau van
	OpenBSD versie 3.4.  Houd dit in gedachten bij het doornemen
	van het gebruikershandboek.</para>
    </warning>

    <sect2>
      <title>PF inschakelen</title>

      <para>PF zit in de basisinstallatie van &os; voor versies vanaf
	5.3 als aparte <quote>run time</quote> laadbare module.  Een
	systeem laadt de PF laadbare module dynamisch in de kernel als
	<literal>pf_enable="YES"</literal> in
	<filename>rc.conf</filename> staat.  In de laadbare module is
	loggen via &man.pflog.4; ingeschakeld.</para>

      <note>
	<para>De module verwacht dat <literal>options INET</literal> en
	  <literal>device bpf</literal> beschikbaar zijn.  Tenzij
	  <literal>NOINET6</literal> was ingesteld (bijvoorbeeld in
	  &man.make.conf.5;) tijdens het bouwen, is ook
	  <literal>options INET6</literal> nodig.</para>
      </note>
    </sect2>

    <sect2>
      <title>Kernelopties</title>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>device pf</secondary>
       </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>device pflog</secondary>
      </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>device pfsync</secondary>
      </indexterm>

      <para>Het is niet verplicht om PF in te schakelen door het mee
	te compileren in de &os; kernel.  Dit wordt alleen beschreven
	als achtergrondinformatie.  Door PF in de kernel te
	compileren wordt de laadbare module niet gebruikt.</para>

      <para>Voorbeeld kernelinstellingen voor PF staan beschreven in
	de <filename>/usr/src/sys/conf/NOTES</filename> kernel source
	en worden hier weergegeven:</para>

      <programlisting>device pf
device pflog
device pfsync</programlisting>

      <para><literal>device pf</literal> schakelt ondersteuning voor de
	<quote>Packet Filter</quote> firewall in.</para>

      <para><literal>device pflog</literal> schakelt het
	optionele &man.pflog.4; pseudo netwerkapparaat in dat gebruikt
	kan worden om verkeer te loggen naar een &man.bpf.4;
	descriptor.  De &man.pflogd.8; daemon kan gebruikt worden om
	de logboekinformatie naar schijf te schrijven.</para>

      <para><literal>device pfsync</literal> schakelt het
	optionele &man.pfsync.4; pseudo netwerkapparaat in waarmee de
	<quote>state</quote> wijzigingen gemonitord kunnen worden.
	Omdat dit geen onderdeel is van de laadbare module, moet dit
	in een aangepaste kernel gebouwd worden om het te kunnen
	gebruiken.</para>

      <para>Deze instellingen worden pas actief nadat een kernel
	waarvoor deze instellingen zijn gemaakt is gebouwd en
	ge&iuml;nstalleerd.</para>
    </sect2>

    <sect2>
      <title>Beschikbare opties voor
	<filename>rc.conf</filename></title>

      <para>De volgende instellingen moeten in <filename>/etc/rc.conf
	</filename> staan om PF bij het booten te activeren:</para>

      <programlisting>pf_enable="YES"                 # Schakel PF in (laad module als nodig)
pf_rules="/etc/pf.conf"         # bestand met regels voor pf
pf_flags=""                     # aanvullende vraagen voor opstarten pfctl
pflog_enable="YES"              # start pflogd(8)
pflog_logfile="/var/log/pflog"  # waar pflogd het logboekbestand moet opslaan
pflog_flags=""                  # aanvullende vlaggen voor opstarten pflogd</programlisting>

      <para>Als er een LAN achter de firewall staat en er pakketten
	doorgestuurd moeten worden naar computers op dat LAN of als
	NAT actief is, dan moet de volgende optie ook ingesteld
	worden:</para>

      <programlisting>gateway_enable="YES"            # Schakel in als LAN gateway</programlisting>
    </sect2>

    <sect2>
      <title><acronym>ALTQ</acronym> inschakelen</title>

      <para><acronym>ALTQ</acronym> is alleen beschikbaar door de
	opties in de &os; Kernel te compileren.
	<acronym>ALTQ</acronym> wordt niet door alle
	netwerkkaartstuurprogramma's ondersteund.  In &man.altq.4;
	staat een lijst met ondersteunde stuurprogramma's voor de
	betreffende versie.  Met de volgende opties wordt
	<acronym>ALTQ</acronym> ingeschakeld en additionele
	functionaliteit toegevoegd:</para>

      <programlisting>options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build</programlisting>

      <para><literal>options ALTQ</literal> schakelt het
	<acronym>ALTQ</acronym> framework in.</para>

      <para><literal>options ALTQ_CBQ</literal> schakelt Class Based
	Queuing (<acronym>CBQ</acronym>) in.  Met
	<acronym>CBQ</acronym> kan de bandbreedte van een verbinding
	worden opgedeeld in verschillende klasses of wachtrijen om
	verkeer te prioriteren op basis van filterregels.</para>

      <para><literal>options ALTQ_RED</literal> schakelt Random Early
	Detection (<acronym>RED</acronym>) in.  <acronym>RED</acronym>
	wordt gebruikt om netwerkverstopping te voorkomen.
	<acronym>RED</acronym> doet dit door de lengte van de wachtrij
	te meten en die te vergelijken met de minimale en maximale
	drempelwaarden voor de wachtrij.  Als de wachtrij groter is
	dan de maximale waarde worden alle nieuwe pakketten genegeerd.
	Het werkt naar zijn naam, dus <acronym>RED</acronym> negeert
	willekeurig pakketten van verschillende verbindingen.</para>

      <para><literal>options ALTQ_RIO</literal> schakelt Random Early
	Detection In and Out in.</para>

      <para><literal>options ALTQ_HFSC</literal> schakelt de
	Hierarchical Fair Service Curve Packet Scheduler in.  Meer
	informatie over <acronym>HFSC</acronym> staat op <ulink
	  url="http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html"></ulink>.</para>

      <para><literal>options ALTQ_PRIQ</literal> schakelt Priority
	Queuing (<acronym>PRIQ</acronym>) in.  <acronym>PRIQ</acronym>
	laat verkeerd dat in een hogere wachtrij staat altijd eerder
	door.</para>

      <para><literal>options ALTQ_NOPCC</literal> schakelt
	<acronym>SMP</acronym> ondersteuning voor
	<acronym>ALTQ</acronym> in.  Deze optie is verplicht op
	<acronym>SMP</acronym> systemen.</para>
    </sect2>
  </sect1>

  <sect1 id="firewalls-ipf">
    <title>De IPFILTER (IPF) firewall</title>

    <indexterm>
      <primary>firewall</primary>

      <secondary>IPFILTER</secondary>
    </indexterm>

    <note>
      <para>Aan dit onderdeel wordt nog gewerkt.  De inhoud is wellicht
	niet altijd volledig en juist.</para>
    </note>

    <para>Darren Reed is de auteur van IPFILTER, dat niet afhankelijk
      is van &eacute;&eacute;n besturingssysteem.  Het is een open
      source applicatie die is geporteerd naar &os;, NetBSD, OpenBSD,
      SunOS, HP/UX en Solaris besturingssystemen.  IPFILTER wordt
      actief ondersteund en onderhouden en er worden regelmatig nieuwe
      versies uigebracht.</para>

    <para>IPFILTER is gebaseerd op een firewall aan de kernelkant en
      een <acronym>NAT</acronym> mechanisme dat gecontroleerd en
      gemonitord kan worden door programma's in userland.  De
      firewallregels kunnen ingesteld of verwijderd worden met het
      hulpprogramma &man.ipf.8;.  De <acronym>NAT</acronym> regels
      kunnen ingesteld of verwijderd worden met &man.ipnat.1;.  Het
      programma &man.ipfstat.8; kan actuele statistieken leveren voor
      de kernelonderdelen van IPFILTER.  &man.ipmon.8; kan acties van
      IPFILTER wegschrijven naar logboekbestanden van het
      systeem.</para>

    <para>IPF is oorspronkelijk geschreven met logica die regels
      verwerkte volgens het principe <quote>de laatst passende regel
        wint</quote> en gebruikte toen alleen staatloze regels.  In de
      loop der tijd is IPF verbeterd en zijn de opties
      <literal>quick</literal> en <literal>keep state</literal>
      toegevoegd waarmee de logica van het verwerken van regels
      drastisch is gemoderniseerd.  In de offici&euml;le documentatie
      van IPF worden de verouderde regels en verwerkingslogica
      behandeld.  De moderne functies worden alleen behandeld als
      opties, waardoor hun nut dat er een veiliger firewall mee te
      maken volledig onderbelicht blijft.</para>

    <para>De instructies in dit hoofdstuk zijn gebaseerd op regels die
      gebruik maken van de optie <literal>quick</literal> en de
      stateful optie <literal>keep state</literal>.  Dit is het
      raamwerk waarmee een set van inclusieve firewallregels wordt
      samengesteld.</para>

    <para>Een inclusieve firewall staat alleen pakketten toe die
      voldoen aan de regels.  Op die manier kan er in de hand
      gehouden worden welke diensten van binnen de firewall naar
      buiten mogen en welke diensten op het private netwerk vanaf
      het internet bereikbaar zijn.  Al het andere verkeer wordt
      vanuit het ontwerp standaard geblokkeerd en gelogd.
      Inclusieve firewalls zijn veel veiliger dan exclusieve
      firewalls.  Het is ook de enige wijze voor de opzet van een
      firewall die in dit hoofdstuk wordt behandeld.</para>

    <para>Voor een gedetailleerde uitleg over de verwerking van de
      verouderde regels zie
      <ulink
	url="http://www.obfuscation.org/ipf/ipf&ndash;howto.html#TOC_1"></ulink>
      en <ulink
	url="http://coombs.anu.edu.au/~avalon/ip&ndash;filter.html"></ulink>.</para>

    <para>De IPF FAQ is te vinden op <ulink
	url="http://www.phildev.net/ipf/index.html"></ulink>.</para>

    <sect2>
      <title>IPF inschakelen</title>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>inschakelen</secondary>
      </indexterm>

      <para>IPF zit in de basisinstallatie van &os; als een aparte
	<quote>run time</quote> laadbare module.  Een systeem laadt de
	IPF kernel laadbare module dynamisch als
	<literal>ipfilter_enable="YES"</literal> in
	<filename>rc.conf</filename> staat.  Voor de laadbare module
	zijn de opties <literal>logging</literal> en <literal>default
	  pass all</literal> ingeschakeld.  IPF hoeft niet in de
	kernel gecompileerd te worden om het standaardgedrag te
	wijzigen naar <literal>block all</literal>.  Dat is mogelijk
	door als laatste regel een regel toe te voegen die al het
	verkeer blokkeert.</para>
    </sect2>

    <sect2>
      <title>Kernelopties</title>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFILTER</secondary>
      </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFILTER_LOG</secondary>
      </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFILTER_DEFAULT_BLOCK</secondary>
      </indexterm>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>kernelopties</secondary>
      </indexterm>

      <para>Het is niet verplicht om IPF in te schakelen door de
	volgende opties in de &os; kernel te compileren.  Dit wordt
	alleen beschreven als achtergrondinformatie.  Door IPF in de
	kernel te compileren wordt de laadbare module niet
	gebruikt.</para>

      <para>Voorbeeld kernelinstellingen voor IPF staan beschreven in
	de <filename>/usr/src/sys/i386/conf/LINT</filename>in de
	kernelbroncode
	(<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/LINT</filename>
	voor &os;&nbsp;4.X) en worden hier beschreven:</para>

      <programlisting>options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK</programlisting>

      <para><literal>options IPFILTER</literal> schakelt ondersteuning
	voor de <quote>IPFILTER</quote> firewall in.</para>

      <para><literal>options IPFILTER_LOG</literal> schakelt de
	optie in waarmee IPF verkeer kan loggen door het naar het
	<devicename>ipl</devicename> pakketloggende
	pseudo&ndash;apparaat te schrijven voor iedere regel met het
	sleutelwoord <literal>log</literal> erin.</para>

      <para><literal>options IPFILTER_DEFAULT_BLOCK</literal>
	wijzigt het standaardgedrag zodat ieder pakket waarop geen
	enkele <literal>pass</literal> regel van toepassing is
	wordt geblokkeerd.</para>

      <para>Deze instelling worden pas actief nadat een kernel
	waarvoor deze instellingen zijn gemaakt is gebouwd en
	ge&iuml;nstalleerd.</para>
    </sect2>

    <sect2>
      <title>Beschikbare opties voor rc.conf</title>

      <para>De volgende instellingen moeten in <filename>/etc/rc.conf
	  </filename> staan om IPF bij het booten te activeren:</para>

      <programlisting>ipfilter_enable="YES"             # Start ipf firewall
ipfilter_rules="/etc/ipf.rules"   # laad regels uit het doelbestand
ipmon_enable="YES"                # Start IP monitor log
ipmon_flags="-Ds"                 # D = start als daemon
                                  # s = log naar syslog
                                  # v = log tcp window, ack, seq
                                  # n = vertaal IP & poort naar namen</programlisting>

      <para>Als er een LAN achter de firewall staat dat gebruik maakt
	van <acronym>IP</acronym> adressen uit de privaat reeks, dan
	moet de volgende optie ook ingesteld worden om
	<acronym>NAT</acronym> functionaliteit in te schakelen:</para>

      <programlisting>gateway_enable="YES"              # Schakel in als LAN gateway
ipnat_enable="YES"                # Start ipnat functie
ipnat_rules="/etc/ipnat.rules"    # bestand met regels voor ipnat</programlisting>
    </sect2>

    <sect2>
      <title>IPF</title>

      <indexterm><primary><command>ipf</command></primary></indexterm>

      <para>&man.ipf.8; wordt gebruikt om het bestand met
	firewallregels te laden.  Gewoonlijk wordt er een bestand
	aangemaakt waarin de situatieafhankelijke regels staan
	waarmee in &eacute;&eacute;n keer de bestaande regels kunnen
	worden vervangen:</para>

      <screen>&prompt.root; <userinput>ipf -Fa -f /etc/ipf.rules</userinput></screen>

      <para><option>-Fa</option>: verwijder alle interne tabellen
	met regels.</para>

      <para><option>-f</option>: laad het aangegeven
	bestand met regels.</para>

      <para>Hiermee wordt het mogelijk wijzigingen te maken aan het
	bestand met eigen regels en met &man.ipf.8; de firewall aan
	te passen met verse regels zonder het systeem te booten.
	Deze methode is erg handig om nieuwe regels te testen omdat
	dit zo vaak als nodig gedaan kan worden.</para>

      <para>In &man.ipf.8; worden alle opties die beschikbaar zijn
	toegelicht.</para>

      <para>&man.ipf.8; verwacht dat het bestand met regels een
	standaard tekstbestand is.  Het accepteert geen bestand met
	regels dat is opgesteld als een script dat gebruik maakt van
	substitutie.</para>

      <para>Er is wel een mogelijkheid om IPF regels op te stellen
	en gebruik te maken van substitutie.  Meer informatie staat
	in <xref linkend="firewalls-ipf-rules-script">.</para>
    </sect2>

    <sect2>
      <title>IPFSTAT</title>

      <indexterm><primary><command>ipfstat</command></primary></indexterm>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>statistieken</secondary>
      </indexterm>

      <para>&man.ipfstat.8; haalt de totalen van de statistieken op
	die horen bij de firewall sinds die is gestart en toont deze.
	Het kan ook zijn dat de tellers in tussentijd op nul zijn
	gesteld met <command>ipf &ndash;Z</command>.</para>

      <para>In &man.ipfstat.8; worden alle details behandeld.</para>

      <para>Standaard ziet &man.ipfstat.8; uitvoer er ongeveer als
	volgt uit:</para>

      <screen>input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
input packets logged: blocked 99286 passed 0
output packets logged: blocked 0 passed 0
packets logged: input 0 output 0
log failures: input 3898 output 0
fragment state(in): kept 0 lost 0
fragment state(out): kept 0 lost 0
packet state(in): kept 169364 lost 0
packet state(out): kept 431395 lost 0
ICMP replies: 0 <acronym>TCP</acronym> RSTs sent: 0
Result cache hits(in): 1215208 (out): 1098963
IN Pullups succeeded: 2 failed: 0
OUT Pullups succeeded: 0 failed: 0
Fastroute successes: 0 failures: 0
<acronym>TCP</acronym> cksum fails(in): 0 (out): 0
Packet log flags set: (0)</screen>

      <para>Als er als optie <option>-i</option> voor inkomend of
	<option>-o</option> voor uitgaand wordt meegegeven, dan wordt
	de juiste lijst met regels die de kernel op dat moment gebruikt
	weergegeven.</para>

      <para><command>ipfstat &ndash;in</command> toont de tabel met
	regels voor inkomend verkeer met regelnummers</para>

      <para><command>ipfstat &ndash;on</command> toont de tabel met
	regels voor uitgaand verkeer met regelnummers</para>

      <para>De uitvoer ziet er ongeveer als volgt uit:</para>

      <screen>@1 pass out on xl0 from any to any
@2 block out on dc0 from any to any
@3 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>

      <para><command>ipfstat &ndash;ih</command> toont de tabel met
	regels voor inkomend verkeer, waarbij voor iedere regel staat
	hoe vaak die van toepassing was.</para>

      <para><command>ipfstat &ndash;oh</command> toont de tabel met
	regels voor uitgaand verkeer, waarbij voor iedere regel staat
	hoe vaak die van toepassing was.</para>

      <para>De uitvoer ziet er ongeveer als volgt uit:</para>

      <screen>2451423 pass out on xl0 from any to any
354727 block out on dc0 from any to any
430918 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>

      <para>Een van de belangrijkste functies van
	<command>ipfstat</command> is de vlag <option>-t</option>
	waarmee de staat-tabel wordt getoond op een wijze die
	vergelijkbaar is met de wijze waarop &man.top.1; de draaiende
	&os; procestabel toont.  Als een firewall wordt aangevallen dan
	geeft deze functie de mogelijkheid om de pakketten van de
	aanvaller te identificeren en nader te onderzoeken.  De
	optionele subvlaggen bieden de mogelijkheid om een bron of
	bestemmings <acronym>IP</acronym> adres, poort of protocol aan
	te geven dat gemonitord moet worden.  Details zijn na te lezen
	in &man.ipfstat.8;.</para>
    </sect2>

    <sect2>
      <title>IPMON</title>

      <indexterm><primary><command>ipmon</command></primary></indexterm>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>loggen</secondary>
      </indexterm>

      <para>Om &man.ipmon.8; te laten werken zoals bedoeld, moet de
	kerneloptie <literal>IPFILTER_LOG</literal> aan staan.  Dit
	commando kan op twee verschillende wijzen gebruikt worden.
	De standaard is van toepassing als het commando op de
	commandoregel wordt ingegeven zonder de optie
	<option>-D</option>.</para>

      <para>De daemon wordt gebruikt als continu een systeemlogboek
	bijgewerkt moet worden zodat het mogelijk is om
	gebeurtenissen in het verleden te bekijken.  Zo zijn &os; en
	IPFILTER ingesteld om samen te werken.  &os; heeft ingebouwde
	mogelijkheden om automatisch syslogs te roteren.  Daarom is
	het beter om de uitvoer naar &man.syslogd.8; te geschrijven
	dan naar een gewoon bestand.  In <filename>rc.conf</filename>
	is te zien dat de instelling <literal>ipmon_flags</literal>
	de waarde <option>-Ds</option> heeft:</para>

      <programlisting>ipmon_flags="-Ds" # D = start als daemon
                  # s = log naar syslog
                  # v = log tcp window, ack, seq
                  # n = vertaal IP & poort naar namen</programlisting>

      <para>De voordelen van loggen zijn duidelijk.  Het biedt de
	mogelijkheid om na het feit informatie na te zien als: welke
	pakketten heeft de firewall laten vallen, waar kwamen ze
	vandaan en waar gingen ze heen?  Dit zijn allemaal voordelen
	als het gaat om uitvinden waar een aanvaller vandaan komt en
	wat hij heeft geprobeerd.</para>

      <para>Zelfs als loggen is ingeschakeld logt IPF nog niets uit
	zichzelf.  De beheerder van de firewall beslist welke actieve
	regels iets weg moeten schrijven door het sleutelwoord
	<literal>log</literal> aan die regels toe te voegen.
	Gewoonlijk worden alleen <literal>deny</literal> regels
	gelogd.</para>

      <para>Het is heel normaal om als laatste regel een
	<literal>deny</literal> regel aan de set met regels toe te
	voegen waar het sleutelwoord <literal>log</literal> in staat.
	Zo krijgt een beheerder alle pakketten te zien waarop geen
	enkele regel van toepassing was.</para>
    </sect2>

    <sect2>
      <title>Loggen met IPMON</title>

      <para><application>Syslogd</application> heeft een eigen methode
	om logboekgegevens te scheiden.  Het maakt gebruik van speciale
	groepen die <quote>facility</quote> en <quote>level</quote>
	heten.  &man.ipmon.8; in <option>-Ds</option> mode gebruikt
	<literal>local0</literal> als <quote>facility</quote>naam.
	Alle door &man.ipmon.8; gelogde gegevens gaan naar
	<literal>local0</literal>.  De nu volgende levels kunnen
	gebruikt worden om de gelogde gegevens nog verder uit elkaar te
	trekken als dat gewenst is.</para>

      <screen>LOG_INFO &ndash; pakketten gelogd met het sleutelwoord "log" als actie in plaats van pass of block.
LOG_NOTICE &ndash; gelogde pakketten die ook zijn doorgelaten
LOG_WARNING &ndash; gelogde pakketten die ook geblokkeerd zijn
LOG_ERR &ndash; gelogde pakketten die een verkeerde opbouw hebben, "short"</screen>
      <!-- XXX: "can be considered short" == "with incomplete header" -->

      <para>Om IPFILTER alle gelogde gegevens naar
	<filename>/var/log/ipfilter.log</filename> te laten schrijven,
	dient dat bestand te bestaan.  Dat kan met het volgende
	commando:</para>

      <screen>&prompt.root; <userinput>touch /var/log/ipfilter.log</userinput></screen>

      <para>De syslogfunctie wordt beheerd met instellingen in
	<filename>/etc/syslog.conf</filename>.
	<filename>syslog.conf</filename> biedt aanzienlijke
	flexibiliteit in hoe syslog omgaat met systeemberichten die
	door softwaretoepassingen als IPF worden gegeven.</para>

      <para>Zo kan de volgende instelling toegevoegd worden aan
	<filename>/etc/syslog.conf</filename>:</para>

      <programlisting>local0.* /var/log/ipfilter.log</programlisting>

      <para><literal>local0.*</literal> betekent dat alle
	logberichten naar de aangegeven plaats geschreven moeten
	worden.</para>

      <para>Om de wijzigingen in
	<filename>/etc/syslog.conf</filename> actief te maken kan er
	gereboot worden of is het mogelijk de syslogtaak een schop te
	geven zodat <filename>/etc/syslog.conf</filename> opnieuw
	wordt ingelezen met <command>/etc/rc.d/syslogd
	  reload</command>.  Voor &os;&nbsp;4.X is dit <command>killall
	  -HUP syslogd</command>.  Het PID
	(procesnummer) is te achterhalen door een overzicht van taken
	te tonen met <command>ps &ndash;ax</command>.  Het PID is het
	nummer in de linker kolom voor de regel waarop
	<quote>syslog</quote> staat.</para>

      <para>Vaak wordt vergeten
	<filename>/etc/newsyslog.conf</filename> te wijzigen om het
	nieuw aangemaakte logboekbestand te laten roteren.</para>
    </sect2>

    <sect2>
      <title>De opmaak van gelogde berichten</title>

      <para>Berichten die door <command>ipmon</command> wordt gezonden
	bestaan uit velden die gescheiden worden door een spatie.
	Velden die in alle berichten zitten zijn:</para>

      <orderedlist>
	<listitem>
	  <para>De datum waarop het pakket is ontvangen.</para>
	</listitem>

	<listitem>
	  <para>De tijd waarop het pakket is ontvangen weergegeven
	    als HH:MM:SS.F voor uren, minuten, seconden en fracties
	    van een seconde.  De fractie kan meerdere cijfers lang
	    zijn.</para>
	</listitem>

	<listitem>
	  <para>De naam van de interface waarop het pakket is
	    ontvangen, bijvoorbeeld
	    <devicename>dc0</devicename>.</para>
	</listitem>

	<listitem>
	  <para>De groep en regelnummer van de regel, bijvoorbeeld
	    <literal>@0:17</literal>.</para>
	</listitem>
      </orderedlist>

      <para>Deze kunnen ingezien worden met
	<command>ipfstat -in</command>.</para>

      <orderedlist>
	<listitem>
	  <para>De acties: <literal>p</literal> voor doorgelaten
	    (<quote>passed</quote>), <literal>b</literal> voor
	    geblokkeerd (<quote>blocked</quote>),
	    <literal>S</literal> voor een verkeerd pakket
	    (<quote>short packet</quote>), <literal>n</literal> voor
	    dat er geen enkele regel van toepassing was,
	    <literal>L</literal> voor een logboekregel.  De volgorde
	    waarin deze acties getoond worden is: S, p, b, n, L.  Een
	    hoofdletter <literal>P</literal> of <literal>B</literal>
	    betekent dat het pakket gelogd is vanwege een globale
	    instelling, niet vanwege &eacute;&eacute;n regel in het
	    bijzonder.</para>
	</listitem>

	<listitem>
	  <para>De adressen.  Dit zijn eigenlijk drie velden: het
	    bronadres en poort gescheiden door een komma het symbool
	    &ndash;> en het bestemmingsadres en poort.
	    <literal>209.53.17.22,80 &ndash;>
	      198.73.220.17,1722</literal>.</para>
	</listitem>

	<listitem>
	  <para>Achter <literal>PR</literal> staat de naam van het
	    protocol of het nummer, bijvoorbeeld <literal>PR
	      tcp</literal>.</para>
	</listitem>

	<listitem>
	  <para>Achter <literal>len</literal> staan de lengte van de
	    pakketkop en de totale lengte van het pakket,
	    bijvoorbeeld <literal>len 20 40</literal>.</para>
	</listitem>
      </orderedlist>

      <para>Als het pakket een <acronym>TCP</acronym> pakket is, dan
	is er nog een veld dat begint met een verbindingsstreepje
	met daarachter letters die overeenkomen met vlaggen die
	ingeschakeld waren.  In &man.ipmon.8; is een lijst met
	letters en bijbehorende vlaggen te vinden.</para>

      <para>Als het pakket een ICMP pakket is, dan worden aan het
	einde twee velden toegevoegd.  Het eerste is altijd
	<literal>ICMP</literal> en het volgende het ICMP bericht en
	subbericht type, gescheiden door een slash, bijvoorbeeld
	<literal>ICMP 3/3</literal> voor <quote>een poort niet
	bereikbaar</quote> bericht.</para>
    </sect2>

    <sect2 id="firewalls-ipf-rules-script">
      <title>Script met regels met substitutie bouwen</title>

      <para>Geoefende gebruikers van IPF maken een bestand dat de
	regels bevat en stellen dat op zo'n manier op dat het
	uitgevoerd kan worden als een script met substitutie.  Het
	grote voordeel van deze werkwijze is dat er dan alleen de
	waarde van een variabele gewijzigd hoeft te worden en dat
	als het script opnieuw wordt uitgevoerd, op alle plaatsen
	waar de variabele wordt gebruikt, de nieuwe waarde in de
	regels wordt opgenomen.  Omdat het een script is, kan
	substitutie gebruik worden om vaak voorkomende waarden
	de defini&euml;ren zodat ze in meerdere regels vervangen
	kunnen worden.  Dit wordt ge&iuml;llustreerd in het
	onderstaande voorbeeld.</para>

      <para>De syntaxis die in het script wordt gebruikt is
	compatibel met de shells <command>sh</command>,
	<command>csh</command> en <command>tcsh</command>.</para>

      <para>Velden waarvoor substitutie van toepassing is worden
	vooraf gegaan door het dollarteken
	<literal>&dollar;</literal>.</para>

      <para>Definities worden niet vooraf gegaan door het voorvoegsel
	&dollar;.</para>

      <para>De waarden van een definitie moet omsloten worden door
	dubbele aanhalingstekens (<literal>"</literal>).</para>

      <para>Een set regels begint wellicht als volgt:</para>

      <programlisting>############## Begin IPF regels script #########################
oif="dc0"            # naam van de uitgaande interface
odns="192.0.2.11"    # IP adres van DNS server ISP
myip="192.0.2.7"     # statische IP adres gekregen van ISP
ks="keep state"
fks="flags S keep state"

# Er kan gekozen worden om dit script te gebruiken om een eigen
# /etc/ipf.rules script te maken of dit script kan gebruikt worden
# "as is"
#
# Haal bij &eacute;&eacute;n van deze regels het commentaarteken weg
# en plaats hem bij de ander.
#
# 1) Deze kan gebruikt worden om /etc/ipf.rules te maken:
#cat &gt; /etc/ipf.rules &lt;&lt; EOF
# 2) Deze kan gebruikt worden om het script "as is" te starten:
# Let op: er moet een lege regel zijn na het EOF teken.
/sbin/ipf -Fa -f - &lt;&lt; EOF

# Verleen toegang tot de DNS van de ISP.
pass out quick on &dollar;oif proto tcp from any to &dollar;odns port = 53 &dollar;fks
pass out quick on &dollar;oif proto udp from any to &dollar;odns port = 53 &dollar;ks

# Sta uitgaand verkeer voor niet beveiligd www verkeer toe
pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 80 &dollar;fks

# Sta uitgaand verkeer voor beveiligd www verkeer toe (https over TLS SSL)
pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 443 &dollar;fks
EOF
################## Einde IPF regels script ########################</programlisting>

      <para>Dat is alles.  De regels zijn niet van belang in dit
	voorbeeld, maar tonen hoe substitutievelden worden
	gedefinieerd en hoe ze worden gebruikt.  Als het bovenstaande
	voorbeeld de inhoud van
	<filename>/etc/ipf.rules.script</filename> was, dan kon het
	geladen worden door het vanaf de commandoregel aan te
	roepen:</para>

      <screen>&prompt.root; <userinput>sh /etc/ipf.rules.script</userinput></screen>

      <para>Er is wel een probleem met het gebruik van regels in
	combinatie met substitutie.  IPF snapt het niet en kan deze
	scripts niet direct lezen.</para>

      <para>Dit script kan gebruikt worden op &eacute;&eacute;n van de
        volgende twee manieren:</para>

      <itemizedlist>
	<listitem>
	  <para>Haal het commentaarteken weg bij de regel die begint met
	    <literal>cat</literal> en zet het commentaarteken bij de
	    regel die begint met <literal>/sbin/ipf</literal>.  Plaats
	    <literal>ipfilter_enable="YES"</literal> in
	    <filename>/etc/rc.conf</filename> zoals gewoonlijk en start
	    het script eenmalig na elke wijziging om
	    <filename>/etc/ipf.rules</filename> te maken of bij te
	    werken.</para>
	</listitem>

	<listitem>
	  <para>Schakel IPFILTER uit in de systeem opstart scripts door
	    <literal>ipfilter_enable="NO"</literal> toe te voegen aan
	    <filename>/etc/rc.conf</filename> (dit is de
	    standaardwaarde).</para>

	  <para>Voeg een script zoals de volgende toe aan de
	    <filename>/usr/local/etc/rc.d</filename> opstart
	    directory.  Het script zou een duidelijke naam
	    moeten hebben zoals <filename>ipf.loadrules.sh</filename>.
	    De <filename>.sh</filename> is noodzakelijk.</para>

	  <programlisting>#!/bin/sh
sh /etc/ipf.rules.script</programlisting>

	  <para>De permissies op dit script moeten zijn: lezen,schrijven
	  en uitvoeren voor de gebruiker <username>root</username>.</para>

	  <screen>&prompt.root; <userinput>chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh</userinput></screen>
	</listitem>
      </itemizedlist>

      <para>Als het systeem nu herstart, worden de regels via het
	script gestart.</para>
    </sect2>

    <sect2>
      <title>Sets van IPF regels</title>

      <para>Een set regels is een groep <command>ipf</command> regels
	die is gemaakt om pakketten toe te staan of te blokkeren op
	basis van de eigenschappen van dat pakket.  De
	bi-directionele uitwisseling van pakketten tussen hosts
	bestaat uit een gesprek dat een sessie heet.  De set van
	firewallregels beoordeelt pakketten twee keer: als het
	aankomt van de host op het publieke internet en als het de
	host weer verlaat op de weg terug naar de host op het
	publieke internet.  Iedere <acronym>TCP</acronym>/IP dienst
	als telnet, www, mail, etc, heeft zijn eigen protocol, bron
	<acronym>IP</acronym> adres en bestemmings
	<acronym>IP</acronym> adres of de bron- en bestemmingspoort.
	Deze attributen vormen de basis voor het opstellen van regels
	waarmee diensten toegelaten of geblokkeerd kunnen
	worden.</para>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>volgorde regelverwerking</secondary>
      </indexterm>

      <para>IPF is oorspronkelijk geschreven met logica die regels
	verwerkte volgens het principe <quote>de laatst passende
	regel wint</quote> en gebruikte toen alleen staatloze regels.
	In de loop der tijd is IPF verbeterd en zijn de opties
	<quote>quick</quote> en <quote>keep state</quote> toegevoegd
	waarmee de logica van het verwerken van regels drastisch is
	gemoderniseerd.</para>

      <para>De instructies in dit hoofdstuk zijn gebaseerd op regels
	die gebruik maken van de optie <parameter>quick</parameter>
	en de stateful optie <parameter>keep state</parameter>.  Dit
	is het raamwerk waarmee een set van inclusieve firewallregels
	wordt samengesteld.</para>

      <para>Een inclusieve firewall staat alleen diensten toe die
	voldoen aan de regels.  Op die manier kan er in de hand
	gehouden worden welke diensten van binnen de firewall naar
	buiten mogen en welke diensten op het private netwerk vanaf
	het internet bereikbaar zijn.  Al het andere verkeer wordt
	vanuit het ontwerp standaard geblokkeerd en gelogd.
	Inclusieve firewalls zijn veel veiliger dan exclusieve
	firewalls.  Het is ook de enige wijze voor de opzet van een
	firewall die in dit hoofdstuk wordt behandeld.</para>

      <warning>
	<para>Werk bij het wijzigen van firewallregels <emphasis>zeer
	    voorzichtig</emphasis>.  Met sommige instellingen is een
	  server <emphasis>niet meer bereikbaar</emphasis>.  Om het
	  veilig te spelen is het aan te raden de eerste instellingen
	  vanaf het console te maken, in plaats van via
	  <application>ssh</application>.</para>
      </warning>
    </sect2>

    <sect2>
      <title>Regelsyntaxis</title>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>regelsyntaxis</secondary>
      </indexterm>

      <para>De regelsyntaxis die hier wordt besproken is versimpeld
	door alleen de moderne stateful regels en de <quote>eerste
	  van toepassing zijnde regel wint</quote> te belichten.  De
	complete regelsyntaxis is na te lezen in &man.ipf.8</para>

      <para>Het karakter <literal>#</literal> wordt gebruikt om het
	begin van een opmerking te markeren en zowel op een eigen
	regel als achter een firewallregel staan.  Lege regels worden
	genegeerd.</para>

      <para>Regels bevatten sleutelwoorden die in een bepaalde
	volgorde van links naar rechts op een regel horen te staan.
	Sleutelwoorden worden vet weergegeven.  Sommige
	sleutelwoorden hebben subopties die zelf ook weer
	sleutelwoorden hebben die ook weer subopties kunnen hebben.
	Alle opties die hier direct onder staan, worden daaronder
	uitgebreid weergegeven en verderop in dit hoofdstuk in een
	aparte paragraaf behandeld.</para>

      <!-- This section is probably wrong.. See the OpenBSD flag -->
      <!-- What is the "OpenBSD flag"?  Reference please -->

      <para><replaceable>ACTIE IN/UIT OPTIES SELECTIE STATEFUL
	PROTO BRON_ADR,BEST_ADR OBJECT POORT_NUM TCP_VLAG STATEFUL
	</replaceable></para>

      <para><replaceable>ACTIE</replaceable> = block | pass</para>

      <para><replaceable>IN/UIT</replaceable> = in | out</para>

      <para><replaceable>OPTIES</replaceable> = log | quick | on
	interfacenaam</para>

      <para><replaceable>SELECTIE</replaceable> = protowaarde |
	bron/bestemming IP | poort = nummer | flags
	flag&ndash;value</para>

      <para><replaceable>PROTO</replaceable> = tcp/udp | udp | tcp |
	icmp</para>

      <para><replaceable>BRON_ADR,BEST_ADR</replaceable> = all | from
	object to object</para>

      <para><replaceable>OBJECT</replaceable> = IP adres | any</para>

      <para><replaceable>POORT_NUM</replaceable> = poortnummer</para>

      <para><replaceable>TCP_VLAG</replaceable> = S</para>

      <para><replaceable>STATEFUL</replaceable> = keep state</para>

      <sect3>
	<title>ACTIE</title>

	<para>De actie geeft aan wat er met het pakket gedaan moet
	  worden als het van toepassing is op de rest van de
	  filterregel.  Iedere regel <emphasis>moet</emphasis> een
	  actie hebben.  De volgende acties zijn mogelijk:</para>

	<para><literal>block</literal> geeft aan dat het pakket
	  moet verdwijnen als de parameters van toepassing zijn het
	  het pakket.</para>

	<para><literal>pass</literal> geeft aan dat het pakket
	  doorgelaten moet worden als de parameters van toepassing
	  zijn op het pakket.</para>
      </sect3>

      <sect3>
	<title>IN/UIT</title>

	<para>Een verplicht onderdeel voor iedere filterregel waarin
	  expliciet wordt aangegeven op welke zijde van de in/uit
	  hij van toepassing is.  Het volgende sleutelwoord moet
	  <parameter>in</parameter> of <parameter>out</parameter>
	  zijn, anders is de regel syntactisch onjuist.</para>

	<para><literal>in</literal> betekent dat de regel van
	  toepassing is op inkomende pakketten.</para>

	<para><literal>out</literal> betekent dat de regel van
	  toepassing is op inkomende pakketten.</para>
      </sect3>

      <sect3>
	<title>OPTIES</title>

	<note>
	  <para>Deze opties moeten in de volgorde waarin ze hier
	    beschreven staan gebruikt worden.</para>
	</note>

	<para><literal>log</literal> geeft aan dat het pakket naar het
	  <devicename>ipl</devicename> logboekbestand geschreven moeten
	  worden (zoals verderop beschreven staat in de paragraaf
	  <quote>Loggen</quote>) als de regel van toepassing is op
	  het pakket.</para>

	<para><literal>quick</literal> geeft aan dat als een regel van
	  toepassing is, dat de laatste regel moet zijn die wordt
	  gecontroleerd, waardoor er een pad wordt
	  <quote>kortgesloten</quote> waardoor de volgende regels voor
	  dat pakket niet meer gecontroleerd worden.  Deze optie is
	  voor de moderne regels eigenlijk verplicht.</para>

	<para><literal>on</literal> geeft de interface aan die in de
	  parameters meegenomen moet worden.  De namen van interfaces
	  kunnen getoond worden met &man.ifconfig.8;.  Als deze optie
	  wordt gebruikt, kan een regel alleen van toepassing zijn als
	  het pakket door de aangegeven interface gaat in de richting
	  die is aangegeven
	  (<literal>in</literal>/<literal>out</literal>).  Ook deze
	  optie is verplicht voor de moderne regels.</para>

	<para>Als een pakket wordt gelogd, dan wordt de kop van het
	  pakket weggeschreven naar het <devicename>ipl</devicename>
	  pakketloggende pseudo&ndash;apparaat.  Direct na het
	  sleutelwoord <literal>log</literal> mogen de volgende opties
	  gebruikt worden (in de aangegeven volgorde):</para>

	<para><literal>body</literal> geeft aan dat de eerste 128 bytes
	  van de inhoud van het pakket worden opgeslagen na de
	  kop.</para>

	<para><literal>first</literal>; als het sleutelwoord
	  <literal>log</literal> samen met <parameter>keep
	    state</parameter> wordt gebruikt, wordt het aangeraden om
	  deze optie ook te gebruiken zodat alleen het pakket dat als
	  eerste in de sessie van toepassing was en niet ook alle
	  pakketten die daarna in de sessie volgens
	  <literal>keep state</literal> van toepassing
	  zijn.</para>
      </sect3>

      <sect3>
	<title>SELECTIE</title>

	<para>De sleutelwoorden in deze paragraaf worden gebruikt om
	  attributen van het pakket dat wordt ge&iuml;nspecteerd te
	  beschrijven om te bepalen of een regel wel of niet van
	  toepassing is.  Er is een sleutelwoord
	  <option>subject</option> en er zijn subopties waarvan er
	  &eacute;&eacute;n of meer gekozen moeten worden.  De
	  volgende attributen zijn beschikbaar voor het proces en
	  moeten in de aangegeven volgorde worden gebruikt:</para>
      </sect3>

      <sect3>
	<title>PROTO</title>

	<para><literal>proto</literal> is het <option>subject</option>
	  sleutelwoord dat moet worden aangegeven samen met een van de
	  sleutelwoorden uit de subopties.  De waarde geeft een bepaald
	  protocol aan dat van toepassing moet zijn.  Ook deze optie is
	  verplicht voor de moderne regels.</para>

	<para><literal>tcp/udp</literal>, <literal>tcp</literal>,
	  <literal>udp</literal>, <literal>icmp</literal> of ieder
	  ander protocol dat in <filename>/etc/protocols</filename>
	  staat wordt herkend en kan gebruikt worden.  Het bijzondere
	  protocol sleutelwoord <literal>tcp/udp</literal> kan gebruikt
	  worden om zowel voor <acronym>TCP</acronym> als
	  UDP pakketten van toepassing te laten zijn.  Het is
	  toegevoegd voor het gemak om vrijwel gelijke regels te
	  voorkomen.</para>
      </sect3>

      <sect3>
	<title>BRON_ADR/BEST_ADR</title>

	<para>Het sleutelwoord <literal>all</literal> is in feite
	  hetzelfde als <literal>from any to any</literal> zonder
	  overige parameters.</para>

	<para><literal>from bron to dest</literal>; de
	  sleutelwoorden <literal>from</literal> en
	  <literal>to</literal> worden gebruikt om te testen op
	  <acronym>IP</acronym> adressen.  In regels moet zowel een
	  bron als bestemmings <acronym>IP</acronym> adres
	  aangegeven worden.  <literal>any</literal> is een
	  bijzonder sleutelwoord dat van toepassing is voor ieder
	  <acronym>IP</acronym> adres als in <literal>from any to
	    any</literal> of <literal>from 0.0.0.0/0 to any</literal>
	  of <literal>from any to 0.0.0.0/0</literal> of
	  <literal>from 0.0.0.0 to any</literal> of <literal>from
	  any to 0.0.0.0</literal>.</para>

	<para><acronym>IP</acronym> adressen mogen ingevoerd worden
	  in de vorm numeriek, door punten gescheiden
	  adres/maskerlengte of als een enkelvoudig
	  <acronym>IP</acronym> adres in de vorm numeriek, door
	  punten gescheiden.</para>

	<para>Het is vaak lastig om te komen tot een reeks adressen
	  in de vorm adres/masker.  De volgende webpagina kan daar
	  wellicht bij helpen: <ulink
	    url="http://jodies.de/ipcalc"></ulink>.</para>
      </sect3>

      <sect3>
	<title>POORT</title>

	<para>Als in een regel op een poort wordt gecontroleerd, voor
	  bron- of bestemmingspoort of beiden, dan is dat alleen van
	  toepassing op <acronym>TCP</acronym> en UDP pakketten.  Bij
	  het maken van poortvergelijkingen kunnen zowel de dienstnamen
	  uit <filename>/etc/services</filename> als een uit een
	  natuurlijk getal bestaand poortnummer ingesteld worden.  Als
	  de poort onderdeel is van het <literal>from</literal> object
	  dan wordt het vergeleken met het poortnummer van de bron en
	  als het onderdeel is van het <literal>to</literal> object,
	  dan wordt het vergeleken met het poortnummer van de
	  bestemming.  Het gebruik van het <literal>to</literal> object
	  is in de moderne regels verplicht en neemt de vorm aan van
	  <literal>from any to any port = 80</literal>.</para>

	<para>Poortvergelijkingen kunnen op verschillende manieren
	  ingesteld worden met een aantal verschillende operators.
	  Er kunnen ook reeksen van poorten ingesteld worden.</para>

	<para><literal>port =</literal> of een van de volgende
	  operators: <literal>!=, &lt;, &gt;, &lt;, &gt;=, eq, ne,
	    lt, gt, le, ge</literal>.</para>

	<para>Reeksen van poorten worden met de volgende optie
	  aangegeven: <parameter>port &lt;&gt;</parameter> of
	  <parameter>&gt;&lt;</parameter>.</para>

	<warning>
	  <para>De volgende twee parameters die betrekking hebben op
	    bron en bestemming, zijn verplicht in de moderne
	    regels.</para>
	</warning>
      </sect3>

      <sect3>
	<title>TCP_VLAG</title>

	<para>Vlaggen zijn alleen beschikbaar voor het filteren
	  van <acronym>TCP</acronym>.  De letters staan voor
	  de mogelijke vlaggen die bekeken kunnen worden in de
	  kop van een <acronym>TCP</acronym> pakket.</para>

	<para>In de moderne regels wordt de optie <literal>flags
	    S</literal> gebruikt om het verzoek tot het starten van
	  een <acronym>TCP</acronym> sessie.</para>
      </sect3>

      <sect3>
	<title>STATEFUL</title>

	<para><literal>keep state</literal> geeft aan dat in een regel
	  met <literal>pass</literal> voor alle pakketten die van
	  toepassing zijn stateful gefilterd moet worden.</para>

	<note>
	  <para>Deze optie is voor moderne regels verplicht.</para>
	</note>
      </sect3>
    </sect2>

    <sect2>
      <title>Stateful filteren</title>

      <indexterm>
	<primary>IPFILTER</primary>

	<secondary>stateful filteren</secondary>
      </indexterm>

      <para>Met stateful filteren wordt verkeer benaderd als een
	uitwisseling van pakketten tussen twee kanten die een sessie
	zijn.  Als het is ingeschakeld, dan maakt het
	<option>keep state</option> mechamisme dynamisch interne
	regels voor pakketten die in de sessie horen te volgen.  Het
	kan bekijken of de karakteristieken van de sessie tussen
	verzender en ontvanger de juiste procedure volgen.  Alle
	pakketten die niet passen in de sessie, worden automatisch
	geblokkeerd.</para>

      <para><literal>keep state</literal> staat ook ICMP pakketten toe
	die gerelateerd zijn aan een <acronym>TCP</acronym> of UDP
	sessie.  Dus als er een ICMP type 3 code 4 komt in antwoord op
	websurfen, dat wordt toegestaan van binnen naar buiten door een
	<literal>keep state</literal> regel, dan wordt dat toegelaten.
	Pakketten waarvan IPF zeker is dat ze onderdeel zijn van de
	sessie worden toegelaten, zelfs als ze van een ander protocol
	zijn.</para>

      <para>Wat er gebeurt: pakketten die naar buiten gaan op de
	interface die met internet is verbonden worden eerst
	vergeleken met de dynamische staattabel.  Als een pakket
	voldoet aan de verwachting van het volgende pakket in de
	sessie, dan mag het de firewall verlaten en wordt de
	staattabel bijgewerkt.  De overige pakketten worden
	vergeleken met de set van regels voor uitgaand
	verkeer.</para>

      <para>Pakketten die binnenkomen op de interface die met
	internet is verbonden worden eerst vergeleken met de
	dynamische staattabel.  Als een pakket voldoet aan de
	verwachting van het volgende pakket in de sessie, dan mag het
	de firewall verlaten en wordt de staattabel bijgewerkt.  De
	overige pakketten worden vergeleken met de set van regels
	voor uitgaand verkeer.</para>

      <para>Als de sessie wordt be&euml;indigd wordt hij uit de
	dynamische staattabel verwijderd.</para>

      <para>Met stateful filteren is het mogelijk om de focus te
	leggen op het blokkeren of toestaan van nieuwe sessies.
	Als een nieuwe sessie tot stand mag komen, dan worden alle
	volgende pakketten automatisch doorgelaten en al het
	vervalste verkeer wordt automatisch tegegehouden.  Als een
	nieuwe sessie wordt geweigerd, dan wordt geen enkel pakket
	doorgelaten.  Met stateful filteren zijn er uitgebreide
	mogelijkheden voor onderzoek om bescherming te bieden tegen
	de veelheid aan aanvallen die tegenwoorden door aanvallers
	worden uitgevoerd.</para>
    </sect2>

    <sect2>
      <title>Voorbeeld van inclusieve regels</title>

      <para>De onderstaande regels zijn een voorbeeld van hoe een
	erg veilige inclusieve firewall opgezet kan worden.  Een
	inclusieve firewall staat alleen diensten toe die passen bij
	de <parameter>pass</parameter> regels en blokkeert al het
	overige verkeer.  Alle firewalls hebben tenminste twee
	interfaces waarop regels van toepassing zijn om de firewall
	te laten werken.</para>

      <para>Alle &unix; systemen en dus ook &os; zijn zo ontworpen
	dat ze voor interne communicatie de interface
	<devicename>lo0</devicename> en <acronym>IP</acronym> adres
	<hostid role="ipaddr">127.0.0.1</hostid> gebruiken.  De
	firewall moet dit interne verkeer gewoon doorgang laten
	vinden.</para>

      <para>Voor de interface die is verbonden met het publieke
	internet worden regels gemaakt waarmee sessies naar het
	internet mogelijk gemaakt worden en toegang wordt gegeven
	voor pakketten die uit die sessies terug komen.  Dit kan
	de PPP interface <devicename>tun0</devicename> zijn of de
	netwerkkaart die is verbonden met een xDSL of
	kabelmodem.</para>

      <para>In gevallen dat er &eacute;&eacute;n of meer netwerkkaarten
	zijn aangesloten op het LAN achter de firewall, dan moeten er
	op de firewall regels zijn om het verkeer tussen die interfaces
	vrije doorgang te geven.</para>

      <para>De regels worden opgedeeld in drie onderdelen: alle
	interfaces met vrije doorgang, uitgaand op publieke
	interfaces en inkomend op publieke interfaces.</para>

      <para>In iedere sectie moeten zo staan dat de regels die het
	meest gebruikt worden v&oacute;&oacute;r de regels die minder
	vaak gebruikt worden staan.  De laatste regel van een onderdeel
	geeft aan dat al het overige verkeer op die interface in die
	richting geblokkeerd en gelogd moet worden.</para>

      <para>In het onderdeel Uitgaand staan alleen regels met
	<parameter>pass</parameter> die parameters bevatten om
	individuele diensten beschikbaar te maken zodat er internet
	toegang is.  Al die regels moeten gebruik maken van
	<parameter>quick</parameter>, <parameter>on</parameter>,
	<parameter>proto</parameter>, <parameter>port</parameter> en
	<parameter>keep state</parameter>.  De regels met
	<parameter>proto tcp</parameter> maken ook gebruik van
	<parameter>flag</parameter> om te bekijken of het een pakket
	betreft voor het opzetten van een sessie om de stateful
	functionaliteit aan te sturen.</para>

      <para>In het onderdeel Inkomend staan alle regels voor het
	blokkeren van ongewenste pakketten eerst om twee redenen.
	Als eerste kan het zo zijn dat wat er wordt geblokkeerd
	later toegestaan zou worden door regels die diensten
	toestaan.  De tweede reden is dat nu ongewenste pakketten
	die vaak voor komen en die bij voorkeur niet in de
	logboeken voor komen niet meer van toepassing zijn op de
	laatste regel van het onderdeel waarin ze zouden worden
	gelogd.  Met de laatste regel van dit onderdeel worden
	alle overige pakketten geblokkeerd en gelogd en ze kunnen
	bewijsmateriaal zijn in een zaak tegen iemand die heeft
	geprobeerd een systeem aan te vallen.</para>

      <para>Voor al het verkeer dat wordt geweigerd wordt geen
	antwoord gestuurd.  De pakketten verdwijnen gewoon.  Zo weet
	een aanvaller niet of een pakket het doelsysteem wel heeft
	bereikt.  Zo kan een aanvaller geen informatie verzamelen
	over een systeem: hoe minder informatie er over een systeem
	beschikbaar is, hoe meer tijd iemand erin moet steken voordat
	er iets slechts gedaan kan worden.  Zo wordt bijvoorbeeld
	een inkomend verzoek van een <quote>nmap OS fingerprint</quote>
	gelogd omdat een aanvaller zoiets zou proberen.</para>

      <para>We raden aan om als er logmeldingen komen van een regel
	met <literal>log first</literal> het commando
	<command>ipfstat&nbsp;-hio</command> uit te voeren om te
	bekijken hoe vaak de regel van toepassing is geweest om te
	kijken of de firewall overspoeld wordt, m.a.w. aangevallen
	wordt.</para>

      <para>Als er pakketten gelogd worden waarvan de beheerder het
	poortnummer niet herkent, dan is de functie van dat poortnummer
	na te zoeken in <filename>/etc/services</filename> of op <ulink
	  url="http://www.securitystats.com/tools/portsearch.php"></ulink>.</para>

      <para>Op de volgende link worden poortnummers van Trojans
	beschreven: <ulink
	  url="http://www.simovits.com/trojans/trojans.html"></ulink>.</para>

      <para>De onderstaande set regels is een complete en erg veilige
	inclusieve set met regels voor een firewall die de auteur
	zelf heeft gebruikt op zijn syteem.  Deze set met regels is
	een aanrader en eenvoudig aan te passen door commentaar te
	maken van een regel voor een dienst die niet gewenst
	is.</para>

      <para>Logberichten die niet gewenst zijn, zijn uit te sluiten
	door ze met een regel te blokkeren in het begin van het
	onderdeel Inkomend.</para>

      <para>Voor de onderstaande regels dient de
	<devicename>dc0</devicename> interfacenaam in iedere regel
	vervangen te worden door de interfacenaam van de netwerkkaart
	in het systeem die met het publieke internet is verbonden.
	Voor gebruikers van PPP zou dat <devicename>tun0</devicename>
	zijn.</para>

      <para>Dit zou de inhoud van <filename>/etc/ipf.rules</filename>
	kunnen zijn:</para>

      <programlisting>#################################################################
# Geen beperkingen op de interface aan de LAN kant.
# Niet nodig als er geen LAN is.
################################################################

#pass out quick on xl0 all
#pass in quick on xl0 all

#################################################################
# Geen beperkingen op de loopback interface
#################################################################
pass in quick on lo0 all
pass out quick on lo0 all

#################################################################
# Interface aan het publieke internet (onderdeel Uitgaand).
# Inspecteer verzoeken om een sessie te starten van achter de
# firewall op het private netwerk of vanaf de server zelf naar
# het publieke internet.
#################################################################

# Geef toegang tot de DNS server van de ISP.
# xxx moet het IP adres van de DNS van de ISP zijn.
# Dupliceer deze regels als een ISP meedere DNS servers heeft.
# Haal het IP adres evt. uit /etc/resolv.conf.
pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state
pass out quick on dc0 proto udp from any to xxx port = 53 keep state

# Geef toegang tot de DHCP server van de ISP voor kabel- en
# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden
# van PPP naar het publieke internet. In dat geval kan de hele groep
# verwijderd worden. Gebruik de volgende regel en controleer het
# logboek voor het IP adres. Wijzig dan het IP adres in de regel
# commentaar hieronder en verwijder de eerste regel.
pass out log quick on dc0 proto udp from any to any port = 67 keep state
#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state

# Sta niet beveiligd www verkeer toe.
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state

# Sta beveiligd www verkeer over TLS SSL toe.
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state

# Sta het verzenden en ontvangen van e-mail toe.
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state

# Sta Time toe.
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state

# Sta NNTP nieuws toe.
pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state

# Sta lokale en LAN gebruiker toe niet beveiligde FTP te gebruiken
# (zowel passieve als actieve modes).  Deze functie maakt gebruik van
# de in IPNAT ingebouwde FTP proxy die in het bestand met nat regels
# staat om dit in &eacute;&eacute;n regel te laten werken. Als er met
# pkg_add packages toegevoegd moeten kunnen worden op een systeem, dan
# is deze regel nodig.
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state

# Sta beveiligde FTP, Telnet en SCP toe.
# Deze functie maakt gebruik van SSH (secure shell)
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state

# Sta uitgaande niet beveiligde telnet toe.
pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state

# Sta de &os; CVSUP functie toe.
pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state

# Sta ping toe naar het publieke internet.
pass out quick on dc0 proto icmp from any to any icmp&ndash;type 8 keep state

# Sta whois toe vanaf overal naar het publieke internet.
pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state

# Blokkeer en log het eerste voorkomen van al het andere dat probeert
# buiten te komen. Deze regel dwingt de 'block all' logica af.
block out log first quick on dc0 all

#################################################################
# Interface aan het publieke internet (onderdeel Inkomend).
# Inspecteert pakketten die van het publieke internet komen
# met als bestemming de host zelf of het private netwerk.
#################################################################

# Blokkeer al het verkeer voor niet&ndash;routeerbare of gereserveerde
# adresreeksen.
block in quick on dc0 from 192.168.0.0/16 to any    #RFC 1918 privaat IP
block in quick on dc0 from 172.16.0.0/12 to any     #RFC 1918 privaat IP
block in quick on dc0 from 10.0.0.0/8 to any        #RFC 1918 privaat IP
block in quick on dc0 from 127.0.0.0/8 to any       #loopback
block in quick on dc0 from 0.0.0.0/8 to any         #loopback
block in quick on dc0 from 169.254.0.0/16 to any    #DHCP auto&ndash;config
block in quick on dc0 from 192.0.2.0/24 to any      #gereserveerd voor documentatie
block in quick on dc0 from 204.152.64.0/23 to any   #Sun cluster interconnect
block in quick on dc0 from 224.0.0.0/3 to any       #Klasse D & E multicast

##### Blokkeer wat vervelende dingen ############
# die niet in de logboeken moeten komen.

# Blokkeer flagmenten.
block in quick on dc0 all with frags

# Block korte TCP pakketten.
block in quick on dc0 proto tcp all with short

# Blokkeer source gerouteerde pakketten.
block in quick on dc0 all with opt lsrr
block in quick on dc0 all with opt ssrr

# Blokkeer pogingen voor nmap OS fingerprint.
# Log first occurrence of these so I can get their IP address
block in log first quick on dc0 proto tcp from any to any flags FUP

# Blokkeer alles met speciale opties.
block in quick on dc0 all with ipopts

# Blokkeer publieke pings.
block in quick on dc0 proto icmp all icmp&ndash;type 8

# Blokkeer ident.
block in quick on dc0 proto tcp from any to any port = 113

# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie.
# Netbios is de &windows; bestandsdeeldienst.
# Blokkeer &windows; hosts2 name server verzoeken 81.
block in log first quick on dc0 proto tcp/udp from any to any port = 137
block in log first quick on dc0 proto tcp/udp from any to any port = 138
block in log first quick on dc0 proto tcp/udp from any to any port = 139
block in log first quick on dc0 proto tcp/udp from any to any port = 81

# Sta inkomend verkeer toe van de DHCP server van de ISP. Deze regel
# moet het IP adres van de DHCP server van de ISP bevatten omdat die
# de enige toegestane bron van dit type pakketten moet zijn. Alleen
# van belang voor kabel en xDSL instellingen. Deze regel is niet nodig
# voor PPP verbindingen naar het publieke internet.  Dit is hetzelfde
# IP adres dat in het Uitgaande onderdeel is opgezocht.
pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state

# Sta inkomend webverkeer toe omdat er een Apache server draait.
pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state

# Sta niet beveiligde telnet sessie toe vanaf het publieke internet.
# Dit heeft het label <quote>niet veilig</quote> omdat gebruikersnaam en
# wachtwoord als platte tekst over internet gaan. Als er geen telnet
# server draait, hoeft deze regel niet actief te zijn.
#pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state

# Sta beveiligde FTP, telnet en SCP toe vanaf internet.
# Deze functie gebruik SSH(secure shell).
pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state

# Blokkeer en log het eerste voorkomen van al het andere dat probeert
# binnen te komen. Het loggen van alleen het eerste voorkomen stopt
# een ontzegging van dienst aanval die gericht is op het laten
# vollopen van de partitie waarop de logboeken staan. Deze regel dwingt
# de 'block all' logica af.
block in log first quick on dc0 all
################### Einde van de regels ###################################</programlisting>
    </sect2>

    <sect2>
      <title><acronym>NAT</acronym></title>

      <indexterm><primary>NAT</primary></indexterm>

      <indexterm>
	<primary>IP masquerading</primary>

	<see>NAT</see>
      </indexterm>

      <indexterm>
	<primary>network address translation</primary>

	<see>NAT</see>
         </indexterm>

      <indexterm>
	<primary>netwerkadres vertaling</primary>

	<see>NAT</see>
         </indexterm>

      <para><acronym>NAT</acronym> staat voor Network Address
	Translation (netwerkadres vertaling).  In &linux; heet dit IP
	Masquerading.  Een van de vele mogelijkheden die IPF
	<acronym>NAT</acronym> kan bieden is het delen van
	&eacute;&eacute;n <acronym>IP</acronym> adres op het publieke
	internet met een LAN achter een firewall.</para>

      <para>De vraag zou kunnen rijzen waarom iemand dat zou willen.
	ISP's wijzen normaliter namelijk dynamisch een
	<acronym>IP</acronym> adres toe aan hun niet-commerci&euml;le
	gebruikers.  Dynamisch betekent hier dat het
	<acronym>IP</acronym> adres iedere dat er wordt ingebeld of
	dat de kabel- of xDSL-modem uit- en aangeschakeld wordt
	anders kan zijn.  Dit <acronym>IP</acronym> adres is het
	adres waarmee een netwerkapparaat bekend is op het publieke
	internet.</para>

      <para>Stel dat er vijf PC's in een huis staan en iedere
	computer in dat huis heeft toegang tot internet nodig.  Dan
	zouden er bij een ISP vijf individuele accounts moeten zijn
	en vijf telefoonlijnen om dat te realiseren.</para>

      <para>Met <acronym>NAT</acronym> is er maar &eacute;&eacute;n
	account bij een ISP nodig en moeten er vier PC's met kabels
	op een switch aangesloten waarop ook een &os; systeem is
	aangesloten dat als gateway gaat opereren.
	<acronym>NAT</acronym> zal automatisch de private LAN
	<acronym>IP</acronym> adressen van alle PC's vertalen naar
	een enkel publiek <acronym>IP</acronym> adres als de
	pakketten de firewall naar het internet verlaten.</para>

      <para><acronym>NAT</acronym> wordt vaak gebruikt zonder
	toestemming of wetenschap van een ISP en in de meeste
	gevallen is het, als het wordt ontdekt, grond voor een ISP
	om de account op te zeggen.  Commerci&euml;le gebruikers
	betalen veel meer voor hun internet verbindingen en krijgen
	vaak een reeks statische <acronym>IP</acronym> adressen die
	nooit verandert.  Een ISP verwacht en staat toe dat
	commerci&euml;le gebruikers <acronym>NAT</acronym> inzetten
	voor connectiviteit voor hun interne netwerk.</para>

      <para>Er is een speciale reeks van <acronym>IP</acronym>
	adressen gereserveerd voor <acronym>NAT</acronym> op LANs.
	Volgens RFC 1918 kunnen de volgende reeksen
	<acronym>IP</acronym> adressen gebruikt worden op private
	netwerken die nooit direct op het publieke internet
	gerouteerd worden.</para>

      <informaltable frame="none" pgwide="1">
	<tgroup cols="3">
	  <colspec colwidth="1*">

	  <colspec colwidth="1*">

	  <colspec colwidth="1*">

	  <tbody>
	    <row>
	      <entry>Eerste IP</entry>

	      <entry>&ndash;</entry>

	      <entry>Laatste IP</entry>
	    </row>

	    <row>
	      <entry><hostid role="ipaddr">10.0.0.0</hostid></entry>

	      <entry>&ndash;</entry>

	      <entry><hostid role="ipaddr">10.255.255.255</hostid></entry>
	    </row>

	    <row>
	      <entry><hostid role="ipaddr">172.16.0.0</hostid></entry>

	      <entry>&ndash;</entry>

	      <entry><hostid role="ipaddr">172.31.255.255</hostid></entry>
	    </row>

	    <row>
	      <entry><hostid role="ipaddr">192.168.0.0</hostid></entry>

	      <entry>&ndash;</entry>

	      <entry><hostid role="ipaddr">192.168.255.255</hostid></entry>
	    </row>
	  </tbody>
	</tgroup>
      </informaltable>
    </sect2>

    <sect2>
      <title>IP<acronym>NAT</acronym></title>

      <indexterm>
	<primary>NAT</primary>

	<secondary>en IPFILTER</secondary>
      </indexterm>

      <indexterm><primary><command>ipnat</command></primary></indexterm>

      <para><acronym>NAT</acronym> regels worden geladen met
	<command>ipnat</command>.  De <acronym>NAT</acronym> regels
	worden vaak opgeslagen in <filename>/etc/ipnat.rules
	</filename>.  Meer details staan in &man.ipnat.1;.</para>

      <para>Bij het maken van wijzigingen aan de
	<acronym>NAT</acronym> regels nadat <acronym>NAT</acronym>
	gestart is, wordt aangeraden de wijziging aan het bestand met
	regels te maken en daarna met <command>ipnat</command>
	<option>-CF</option> alle actieve <acronym>NAT</acronym> regels
	te wissen.  Daarna kunnen de regels uit het bestand weer als
	volgt geladen worden:</para>

      <screen>&prompt.root; <userinput>ipnat -CF -f /etc/ipnat.rules</userinput></screen>

      <para>Gebruiksgegevens over <acronym>NAT</acronym> kunnen
	getoond worden met:</para>

      <screen>&prompt.root; <userinput>ipnat -s</userinput></screen>

      <para>De huidige inhoud van de <acronym>NAT</acronym> tabellen
	kan getoond worden met:</para>

      <screen>&prompt.root; <userinput>ipnat -l</userinput></screen>

      <para>Met het volgende commando kan de uitgebreide rapportage
	worden ingeschakeld en dan wordt informatie over het
	verwerken van verkeer en de actieve regels getoond:</para>

      <screen>&prompt.root; <userinput>ipnat &ndash;v</userinput></screen>
    </sect2>

    <sect2>
      <title>IP<acronym>NAT</acronym> regels</title>

      <para><acronym>NAT</acronym> regels zijn erg flexibel en er
	kunnen veel dingen mee gedaan worden om behoeften van
	bedrijven en thuisgebruikers in te vullen.</para>

      <para>De syntaxis van de regels die hier wordt toegelicht is
	vereenvoudigd om te passen bij een niet-commerci&euml;le
	omgeving.  De complete syntaxis is na te lezen in
	&man.ipnat.5;.</para>

      <para>De syntaxis voor een <acronym>NAT</acronym> regel ziet er
	ongeveer als volgt uit:</para>

      <programlisting>map <replaceable>IF</replaceable> <replaceable>LAN_IP_REEKS</replaceable> &ndash;> <replaceable>PUBLIEK_ADRES</replaceable></programlisting>

      <para>De regel begint met het sleutelwoord
	<literal>map</literal>.</para>

      <para><replaceable>IF</replaceable> dient vervangen te worden
	door de aanduiding van de externe interface.</para>

      <para><replaceable>LAN_IP_REEKS</replaceable> is de reeks die
	clients op een LAN gebruiken, meestal iets van <hostid
	  role="ipaddr">192.168.1.0/24</hostid>.</para>

      <para><replaceable>PUBLIEK_ADRES</replaceable> kan het publieke
	<acronym>IP</acronym> adres zijn of een speciaal sleutelwoord
	<literal>0.32</literal>, wat betekent dat het
	<acronym>IP</acronym> adres van <replaceable>IF</replaceable>
	gebruikt moet worden.</para>
    </sect2>

    <sect2>
      <title>Hoe <acronym>NAT</acronym> werkt</title>

      <para>Een pakket komt vanaf het LAN aan bij de firewall en
	heeft een publieke bestemming.  Het wordt verwerkt door de
	filterregels voor inkomend verkeer en daarna krijgt
	<acronym>NAT</acronym> de kans zijn regels op het pakket toe
	te passen.  De regels worden van boven naar beneden toegepast
	en de eerste regel die van toepassing is wint.
	<acronym>NAT</acronym> controleert voor alle regels het
	pakket op interfacenaam en bron <acronym>IP</acronym> adres.
	Als de interfacenaam van een pakket past bij een
	<acronym>NAT</acronym> regel dan wordt het bron
	<acronym>IP</acronym> adres van dat pakket gecontroleerd, dat
	is dus een <acronym>IP</acronym> adres op het private LAN,
	om te bekijken of het valt in de reeks die is opgegeven aan
	de linkerkant van een <acronym>NAT</acronym> regel.  Als ook
	dat klopt, dan wordt het bron <acronym>IP</acronym> adres van
	het pakket vervangen (<quote>rewritten</quote>) door een
	publiek <acronym>IP</acronym> adres dat verkregen kan zijn
	met het sleutelwoord <literal>0.32</literal>.
	<acronym>NAT</acronym> werkt dan zijn interne
	<acronym>NAT</acronym> tabel bij, zodat als er een pakket uit
	die sessie terugkomt van het publieke internet, dat pakket
	weer gepast kan worden bij het originele private
	<acronym>IP</acronym> adres en door de firewallregels
	gefilterd kan worden om daarna, als dat mag, naar een client
	gestuurd te worden.</para>
    </sect2>

    <sect2>
      <title>IP<acronym>NAT</acronym> inschakelen</title>

      <para>Voor IP<acronym>NAT</acronym> zijn de onderstaande
	instellingen in <filename>/etc/rc.conf</filename>
	beschikbaar.</para>

      <para>Om verkeer tussen interfaces te kunnen routeren:</para>

      <programlisting>gateway_enable="YES"</programlisting>

      <para>Om IP<acronym>NAT</acronym> automatisch te starten:</para>

      <programlisting>ipnat_enable="YES"</programlisting>

      <para>Om aan te geven waar de IP<acronym>NAT</acronym> regels
	staan:</para>

      <programlisting>ipnat_rules="/etc/ipnat.rules"</programlisting>
    </sect2>

    <sect2>
      <title><acronym>NAT</acronym> voor een groot LAN</title>

      <para>Voor netwerken met grote aantallen PC's of netwerken
	met meerdere LAN's kan het een probleem worden om al die
	private <acronym>IP</acronym> adressen met &eacute;&eacute;n
	enkel publiek <acronym>IP</acronym> adres te vervangen,
	omdat vaak dezelfde poortnummers gebruikt worden.  Er zijn
	twee manieren om dit probleem op te lossen.</para>

      <sect3>
	<title>Aangeven welke poorten te gebruiken</title>

	<para>Een normale regel voor NAT ziet er als volgt uit:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 0.32</programlisting>

	<para>Met de bovenstaande regel blijft de bronpoort
	  ongewijzigd als het pakket door IP<acronym>NAT</acronym>
	  gaat.  Door gebruik te maken van het sleutelwoord
	  <literal>portmap</literal> kan IP<acronym>NAT</acronym>
	  ingesteld worden om alleen bronpoorten in de aangegeven reeks
	  te gebruiken.  Zo stelt de onderstaande regel in dat
	  IP<acronym>NAT</acronym> de bronpoort aanpast naar een
	  poortnummer dat in de aangegeven reeks valt:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 0.32 portmap tcp/udp 20000:60000</programlisting>

	<para>Het kan nog eenvoudiger door gebruik te maken van het
	  sleutelwoord <literal>auto</literal> zodat
	  IP<acronym>NAT</acronym> zelf bepaalt welke poorten gebruikt
	  kunnen worden:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 0.32 portmap tcp/udp auto</programlisting>
      </sect3>

      <sect3>
	<title>Meerdere publieke adressen gebruiken</title>

	<para>In grote netwerken komt er een moment waarop er gewoon
	  te veel adressen zijn om te bedienen met &eacute;&eacute;n
	  <acronym>IP</acronym> adres.  De volgende regel vertaalt
	  alle verbindingen naar <hostid
	    role="ipaddr">204.134.75.1</hostid>:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 204.134.75.1</programlisting>

	<para>Dit kan gewijzigd worden naar een reeks addressen met
	  de volgende regel:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 204.134.75.1&ndash;10</programlisting>

	<para>Er kan ook een subnet aangegeven worden met een CIDR
	  notatie als in het volgende voorbeeld:</para>

	<programlisting>map dc0 192.168.1.0/24 &ndash;> 204.134.75.0/24</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>Poorten omleiden</title>

      <para>Het is erg gebruikelijk om een webserver, mailserver,
	database server en DNS server op verschillende computers
	op een LAN te draaien.  Het uitgaande verkeer van die
	servers kan dan met <acronym>NAT</acronym>  afgehandeld
	worden, maar er moet ook ingesteld worden dat inkomend
	verkeer bij de juiste computer terecht komt.
	IP<acronym>NAT</acronym> gebruikt daarvoor de opties in
	<acronym>NAT</acronym> waarmee verkeer omgeleid kan worden.
	Als bijvoorbeeld een webserver op <hostid
	  role="ipaddr">10.0.10.25</hostid> draait en het publieke
	<acronym>IP</acronym> adres zou <hostid
	  role="ipaddr">20.20.20.5</hostid> zijn, dan zou dit mogelijk
	zijn met &eacute;&eacute;n van de volgende twee regels:</para>

	<programlisting>map dc0 20.20.20.5/32 port 80 &ndash;> 10.0.10.25 port 80
map dc0 0/32 port 80 &ndash;> 10.0.10.25 port 80</programlisting>

	<para>Voor een DNS server op een LAN die ook vanuit internet
	  bereikbaar met zijn en die draait op <hostid
	    role="ipaddr">10.0.10.33</hostid> zou de regel er als
	  volgt uit zien:</para>

	<programlisting>map dc0 20.20.20.5/32 port 53 &ndash;> 10.0.10.33 port 53 udp</programlisting>
    </sect2>

    <sect2>
      <title>FTP en <acronym>NAT</acronym></title>

      <para>FTP is dinosaurus uit het tijdperk van voor internet was
	zoals het nu is, toen onderzoeksinstellingen met elkaar
	verbonden waren via huurlijnen en FTP de aangewezen methode
	was om bestanden met elkaar uit te wisselen.  Maar bij het
	gebruik van FTP worden gebruikersnaam en wachtwoord als
	platte tekst verzonden en het protocol is nooit aangepast.
	FTP is er in twee smaken: actief en passief.  Het verschil
	zit 'm in hoe het datakanaal wordt opgezet.  De passieve
	variant is veiliger voor een gebruiker omdat bij deze variant
	beide communicatiekanalen door de client zelf worden opgezet.
	Op de volgende link zijn details over FTP na te lezen:
	<ulink
	  url="http://www.slacksite.com/other/ftp.html"></ulink>.</para>

      <sect3>
	<title>IP<acronym>NAT</acronym> regels</title>

	<para>IP<acronym>NAT</acronym> heeft een een speciale FTP proxy
	  ingebouwd die kan worden ingeschakeld met een
	  <acronym>NAT</acronym> <literal>map</literal> regel.  Die kan
	  al het uitgaande verkeer monitoren wat betreft
	  opstartverzoeken voor sessies voor actieve en passieve FTP en
	  dynamisch tijdelijke filterregels maken die alleen het
	  poortnummer dat echt in gebruik is voor het datakanaal
	  doorlaten.  Hiermee wordt een veiligheidsrisico dat normaal
	  gepaard gaat met FTP, namelijk het toestaan van grote reeksen
	  hoge poortnummers, weggenomen.</para>

	<para>De volgende regel handelt al het FTP verkeer van het
	  LAN af:</para>

	<programlisting>map dc0 10.0.10.0/29 &ndash;> 0/32 proxy port 21 ftp/tcp</programlisting>

	<para>De regel hieronder handelt het FTP verkeer van de
	  gateway zelf af:</para>

	<programlisting>map dc0 0.0.0.0/0 &ndash;> 0/32 proxy port 21 ftp/tcp</programlisting>

	<para>Deze laatste regel handelt al het niet&ndash;FTP
	  verkeer voor het LAN af:</para>

	<programlisting>map dc0 10.0.10.0/29 &ndash;> 0/32</programlisting>

	<para>De FTP <parameter>map</parameter> regel hoort voor de
	  normale regels te staan.  Alle pakketten worden als eerste
	  vergeleken met de eerste regel en zo verder.  Eerst wordt
	  gekeken over de interfacenaam overeenkomt, daarna het
	  bron <acronym>IP</acronym> adres van het LAN en dan of het
	  een FTP pakket is.  Als dat allemaal klopt, dan maakt de
	  speciale FTP proxy een tijdelijke filterregel die de
	  pakketten uit de FTP sessie naar binnen en buiten doorlaat
	  en ook NAT toepast op de FTP pakketten.  Alle pakketten
	  van het LAN die niet van het protocoltype FTP zijn en dus
	  niet bij de eerste regel passen, worden tegen de derde
	  regel gehouden die van toepassing is vanwege de interface
	  en bron <acronym>IP</acronym> adres, zodat er dan
	  <acronym>NAT</acronym> op toegepast wordt.</para>
      </sect3>

      <sect3>
	<title>IP<acronym>NAT</acronym> FTP filterregels</title>

	<para>Als de <acronym>NAT</acronym> FTP proxy wordt gebruikt
	  is er maar &eacute;&eacute;n filterregel voor FTP
	  nodig.  Zonder de FTP proxy zouden er drie regels nodig
	  zijn:</para>

	<programlisting># Sta LAN client toe te FTP-en naar internet
# Actieve en passieve modes
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state

# Sta opzetten van het datakanaal voor passieve mode toe voor hoge poorten
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state

# Laat het datakanaal van de FTP server binnen voor actieve mode
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state</programlisting>
      </sect3>

      <sect3>
	<title>FTP <acronym>NAT</acronym> proxy bug</title>

	<para>Vanaf &os;&nbsp;4.9, waar IPFILTER versie 3.4.31 bij zit,
	  werkt de FTP proxy volgens de documentatie tot de sessie
	  wordt afgesloten.  Als dit wordt gedaan dan worden
	  pakketten die terug komen van de FTP server geblokkeerd en
	  gelogd als inkomend op poort 21.  De <acronym>NAT</acronym>
	  FTP proxy lijkt zijn tijdelijke regels te vroeg te
	  verwijderen, nog voordat het antwoord van de FTP server
	  dat de verbinding gesloten kan worden is ontvangen.  Er is
	  een PR gepost op de ipf mailinglijst.</para>

	<para>Hoewel dit niet opgelost kan worden, is het mogelijk
	  een regel in te stellen waarmee de ongewilde logboekregels
	  niet ontstaan.  Als alternatief is het mogelijk ze gewoon
	  te negeren.  De meeste mensen maken niet zoveel gebruik van
	  uitgaande FTP.</para>

	<programlisting>block in quick on rl0 proto tcp from any to any port = 21</programlisting>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="firewalls-ipfw">
    <title>IPFW</title>

    <indexterm>
      <primary>firewall</primary>

      <secondary>IPFW</secondary>
    </indexterm>

    <note>
      <para>Aan dit onderdeel wordt nog gewerkt.  De inhoud is wellicht
	niet altijd volledig en juist.</para>
    </note>

    <para>IPFIREWALL (IPFW) is een firewall die binnen &os; wordt
      ontwikkeld en onderhouden door vrijwilligers, leden van de
      staf.  Het maakt gebruik van verouderde staatloze regels en een
      verouderde techniek om te realiseren wat eenvoudige stateful
      logica zou kunnen heten.</para>

    <para>De set voorbeeldregels van IPFW (die in
      <filename>/etc/rc.firewall</filename> staat) uit de standaard
      &os; installatie is redelijk eenvoudig en niet voorbereid om
      zonder wijzigingen gebruikt te worden.  Het voorbeeld maakt geen
      gebruik van stateful filteren, wat een voordeel is in de meeste
      situaties.  Daarom worden deze regels niet als basis gebruikt in
      dit onderdeel.</para>

    <para>De staatloze syntaxis van IPFW is krachtig door de
      technisch geavanceerde mogelijkheden van de regelsyntaxis die
      de kennis van de gemiddelde gebruiker van firewalls ver
      overstijgt.  IPFW is gericht op de professionele gebruiker
      of de gevorderde thuisgebruiker die hoge eisen stelt aan de
      wijze waarop er met pakketten wordt omgegaan.  Voordat de
      kracht van de IPFW regels echt ingezet kan worden, moet de
      gebruiker veel weten over de verschillende protocollen en
      de wijze waarop pakketten in elkaar zitten.  Het tot op dat
      niveau behandelen van stof valt buiten de doelstellingen van
      dit boek.</para>

    <para>IPFW bestaat uit zeven componenten: de verwerkingseenheid
      voor de firewallregels, verantwoording, loggen, regels met
      <parameter>divert</parameter> (omleiden) waarmee
      <acronym>NAT</acronym> gebruikt kan worden en de speciale
      gevorderde mogelijkheden voor bandbreedte management DUMMYNET,
      de bridge mogelijkheden en de ipstealth mogelijkheden.</para>

    <sect2 id="firewalls-ipfw-enable">
      <title>IPFW inschakelen</title>

      <indexterm>
	<primary>IPFW</primary>

	<secondary>inschakelen</secondary>
      </indexterm>

      <para>IPFW zit bij de basisinstallatie van &os; als een losse
	in run-time laadbare module.  Het systeem laadt de kernel
	module dynamisch als in <filename>rc.conf</filename>
	<literal>firewall_enable="YES"</literal> staat.  IPFW hoeft
	niet in de &os; kernel gecompileerd te worden, tenzij het
	nodig is dat <acronym>NAT</acronym> beschikbaar is.</para>

      <para>Na het rebooten van een systeem met
	<literal>firewall_enable="YES"</literal> in
	<filename>rc.conf</filename> is het volgende bericht op het
	scherm te zien tijdens het booten:</para>

      <screen>ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled</screen>

      <para>In de laadbare module zit de mogelijkheid om te loggen
	gecompileerd.  In <filename>/etc/sysctl.conf</filename> kan een
	instelling gemaakt worden waardoor loggen na volgende herstarts
	wordt ingeschakeld:</para>

      <programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
    </sect2>

    <sect2 id="firewalls-ipfw-kernel">
      <title>Kernelopties</title>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFIREWALL</secondary>
      </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFIREWALL_VERBOSE</secondary>
      </indexterm>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFIREWALL_VERBOSE_LIMIT</secondary>
      </indexterm>

      <indexterm>
	<primary>IPFW</primary>

	<secondary>kernelopties</secondary>
      </indexterm>

      <para>Het is niet verplicht om IPFW in te schakelen door het
	mee te compileren in de &os; kernel, tenzij de
	<acronym>NAT</acronym> functionaliteit beschikbaar moet zijn.
	Dit wordt alleen beschreven als achtergrondinformatie.
	Door IPFW in de kernel te compileren wordt de laadbare module
	niet gebruikt.</para>

      <programlisting>options    IPFIREWALL</programlisting>

      <para>Met <literal>IPFIREWALL</literal> wordt IPFW ingeschakeld
	als deel van de kernel.</para>

      <programlisting>options    IPFIREWALL_VERBOSE</programlisting>

      <para>Met <literal>IPFIREWALL_VERBOSE</literal> wordt het
	loggen van pakketten die worden verwerkt met IPFW mogelijk
	als het sleutelwoord <option>log</option> in een regel
	staat.</para>

      <programlisting>options    IPFIREWALL_VERBOSE_LIMIT=5</programlisting>

      <para>Limiteert het aantal pakketten dat per regel wordt gelogd
	via &man.syslogd.8;.  Deze optie kan gebruikt worden in
	vijandige omgevingen waar de activiteit van een firewall gelogd
	moet worden.  Hierdoor kan een mogelijke ontzegging van dienst
	aanval door syslog flooding voorkomen worden.</para>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPFIREWALL_DEFAULT_TO_ACCEPT</secondary>
      </indexterm>

      <programlisting>options    IPFIREWALL_DEFAULT_TO_ACCEPT</programlisting>

      <para>Met <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal> wordt
	standaard alles door de firewall doorgelaten.  Dit wordt
	aangeraden als iemand voor het eerst een firewall
	opzet.</para>

      <programlisting>options    IPV6FIREWALL
options    IPV6FIREWALL_VERBOSE
options    IPV6FIREWALL_VERBOSE_LIMIT
options    IPV6FIREWALL_DEFAULT_TO_ACCEPT</programlisting>

      <para>Voor de bovenstaande opties geldt dat ze hetzelfde doen
	als de opties voor IPv4, alleen doen ze dat voor IPv6.  Als
	IPv6 niet wordt gebruikt, dan wordt aangeraden de optie
	<literal>IPV6FIREWALL</literal> te gebruiken zonder regels,
	zodat al het IPv6 verkeer wordt geblokkeerd.</para>

      <indexterm>
	<primary>kernelopties</primary>

	<secondary>IPDIVERT</secondary>
      </indexterm>

      <programlisting>options    IPDIVERT</programlisting>

      <para>Met <literal>IPDIVERT</literal> wordt de
	<acronym>NAT</acronym> functionaliteit ingeschakeld.</para>

      <warning>
	<para>Als <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal>
	  niet wordt gebruikt of de regels van de firewall staan geen
	  verkeer toe, dan worden alle pakketten van en naar de
	  machine waar dit voor geldt geblokkeerd.</para>
      </warning>
    </sect2>

    <sect2 id="firewalls-ipfw-rc">
      <title><filename>/etc/rc.conf</filename> opties</title>

      <para>Als IPFW niet in de kernel is gecompileerd, dan moet het
	geladen worden met de volgende instellingen in
	<filename>/etc/rc.conf</filename>:</para>

      <programlisting>firewall_enable="YES"</programlisting>

      <para>Om de firewallregels uit een bestand te laden kan de
	volgende instelling gebruikt worden:</para>

      <programlisting>firewall_script="/etc/ipfw.rules"</programlisting>

      <para>Om loggen in te schakelen:</para>

      <programlisting>firewall_logging="YES"</programlisting>

      <warning>
	<para>Het enige dat de variabele
	  <varname>firewall_logging</varname> doet is de sysctlt
	  variabele <varname>net.inet.ip.fw.verbose</varname> op de
	  waarde <literal>1</literal> zetten (zie <xref
	    linkend="firewalls-ipfw-enable">).  Er is geen variabele in
	  <filename>rc.conf</filename> om logboeklimieten in te
	  stellen, maar dat kan ingesteld worden via een sysctl
	  variabele, handmatig of via het bestand
	  <filename>/etc/sysctl.conf</filename>:</para>

	<programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
      </warning>
    </sect2>

    <sect2 id="firewalls-ipfw-cmd">
      <title>Het commando <command>IPFW</command></title>

      <indexterm><primary><command>ipfw</command></primary></indexterm>

      <para><command>ipfw</command> wordt gebruikt om met de hand
	regels toe te voegen of te verwijderen als IPFW actief is.
	Het probleem met deze methode is dat, als het systeem down
	wordt gebracht, alle regels die gewijzigd of verwijderd zijn
	verloren gaan.  Door alle regels in een bestand op te nemen
	dat bij het booten wordt geladen of door het bestand waarin
	de wijzigingen zijn gemaakt als een machine draait te laden
	bestaat die probleem niet.</para>

      <para>Met <command>ipfw</command> kunnen de actieve regels van
	de firewall op het scherm getoond worden.  De
	verantwoordingsmogelijkeden van &man.ipfw.8; maken
	dynamisch tellers aan voor iedere regel en houden die bij
	voor alle pakketten die van toepassing zijn op die regel.
	Dit biedt ook een mogelijkheid om een regel te testen.</para>

      <para>Om alle regels in volgorde te tonen:</para>

      <screen>&prompt.root; <userinput>ipfw list</userinput></screen>

      <para>Om alle regels te tonen met de tijd waarop deze voor het
	laatst van toepassing was:</para>

      <screen>&prompt.root; <userinput>ipfw &ndash;t list</userinput></screen>

      <para>Het volgende commando kan gebruikt worden om de
	verantwoordingsinformatie, pakettellers en de regel zelf te
	tonen.  De eerste kolom is het regelnummer met daarachter
	het aantal keren dat de regel van toepassing was voor
	inkomend verkeer, gevolgd door het aantal keren dat de regel
	van toepassing was voor uitgaand verkeer.  Als laatste wordt
	de regel zelf getoond:</para>

      <screen>&prompt.root; <userinput>ipfw &ndash;a list</userinput></screen>

      <para>Ook kunnen onder de statische regels de dynamische regels
	getoond worden:</para>

      <screen>&prompt.root; <userinput>ipfw &ndash;d list</userinput></screen>

      <para>En de dynamische regels die verlopen zijn:</para>

      <screen>&prompt.root; <userinput>ipfw &ndash;d &ndash;e list</userinput></screen>

      <para>De tellers op nul gesteld worden:</para>

      <screen>&prompt.root; <userinput>ipfw zero</userinput></screen>

      <para>Alleen de tellers voor regel
	<replaceable>NUM</replaceable> op nul stellen:</para>

      <screen>&prompt.root; <userinput>ipfw zero NUM</userinput></screen>
    </sect2>

    <sect2 id="firewalls-ipfw-rules">
      <title>Sets van IPFW regels</title>

      <para>Een set regels is een groep &man.ipfw.8; regels die is
	gemaakt om pakketten toe te staan of te blokkeren op basis
	van de eigenschappen van dat pakket.  De bi-directionele
	uitwisseling van pakketten tussen hosts bestaat uit een
	gesprek dat een sessie heet.  De set van firewallregels
	beoordeelt pakketten twee keer: als het aankomt van de host
	op het publieke internet en als het de host weer verlaat op
	de weg terug naar de host op het publieke internet.  Iedere
	<acronym>TCP</acronym>/<acronym>IP</acronym> dienst als
	telnet, www, mail, etc, heeft zijn eigen protocol, bron
	<acronym>IP</acronym> adres en bestemmings
	<acronym>IP</acronym> adres of de bron- en bestemmingspoort.
	Deze attributen vormen de basis voor het opstellen van
	regels waarmee diensten toegelaten of geblokkeerd kunnen
	worden.</para>

      <indexterm> 
	<primary>IPFW</primary>

	<secondary>volgorde regelverwerking</secondary>
      </indexterm>

      <para>Als een pakket de firewall binnenkomt wordt het
	vergeleken met de eerste regel in de set regels en zo gaat
	dat voor iedere regel vanaf boven tot beneden.  Als een
	regel van toepassing is op een pakket, dan wordt het
	actieveld van de regel uitgevoerd.  Dit wordt de
	<quote>de eerst passende regel wint</quote> zoekmethode
	genoemd.  Als een pakket bij geen enkele regel past, dan
	wordt de standaardregel 65535 toegepast, die alle pakketten
	weigert zonder een antwoord terug te sturen naar de
	verzender.</para>

      <note>
	<para>Het zoeken gaat door na regels met
	  <literal>count</literal>, <literal>skipto</literal> en
	  <literal>tee</literal>.</para>
      </note>

      <para>De instructies in dit onderdeel zijn gebaseerd op regels
	die gebruik maken van de stateful opties <parameter>keep
	  state</parameter>, <parameter>limit</parameter>,
	<parameter>in</parameter>/<parameter>out</parameter> en
	<parameter>via</parameter>.  Dit is het raamwerk waarmee een
	set van inclusieve firewallregels wordt samengesteld.</para>

      <para>Een inclusieve firewall staat alleen diensten toe die
	voldoen aan de regels.  Op die manier kan er in de hand
	gehouden worden welke diensten van binnen de firewall naar
	buiten mogen en welke diensten op het private netwerk vanaf
	het internet bereikbaar zijn.  Al het andere verkeer wordt
	vanuit het ontwerp standaard geblokkeerd en gelogd.
	Inclusieve firewalls zijn veel veiliger dan exclusieve
	firewalls.  Het is ook de enige wijze voor de opzet van een
	firewall die in dit hoofdstuk wordt behandeld.</para>

      <warning>
	<para>Er wordt aangeraden voorzichtig te zijn als er vanaf
	  het netwerk aan de firewallregels wordt gewerkt omdat het
	  gevaar bestaat buitengesloten te worden.</para>
      </warning>

      <sect3 id="firewalls-ipfw-rules-syntax">
	<title>Regelsyntaxis</title>

	<indexterm>
	  <primary>IPFW</primary>

	  <secondary>regelsyntaxis</secondary>
	</indexterm>

	<para>De regelsyntaxis zoals hier toegelicht is vereenvoudigd
	  door alleen te tonen wat nodig is om een standaard
	  inclusieve set met firewallregels te maken.  De complete
	  beschijving van alle mogelijkheden staat in
	  &man.ipfw.8;.</para>

	<para>Regels bevatten sleutelwoorden die in een bepaalde
	  volgorde van links naar rechts op een regel horen te staan.
	  Sleutelwoorden worden vet weergegeven.  Sommige
	  sleutelwoorden hebben subopties die zelf ook weer
	  sleutelwoorden hebben die ook weer subopties kunnen
	  hebben.</para>

	<para>Het karakter <literal>#</literal> wordt gebruikt om
	  het begin van een opmerking te markeren en kan zowel op een
	  eigen regel als achter een firewallregel staan.  Lege
	  regels worden genegeerd.</para>

	<para><replaceable>CMD REGEL_NUMMER ACTIE LOGGEN SELECTIE
	    STATEFUL</replaceable></para>

	<sect4>
	  <title>CMD</title>

	  <para>Iedere regel moet beginnen met
	    <parameter>add</parameter> om hem toe te voegen aan de
	    tabel met regels.</para>
	</sect4>

	<sect4>
	  <title>REGEL_NUMMER</title>

	  <para>Iedere regel moet een regelnummer hebben.</para>
	</sect4>

	<sect4>
	  <title>ACTIE</title>

	  <para>Bij een regel kunnen &eacute;&eacute;n of meer acties
	    horen die worden uitgevoerd als een regel geldt voor een
	    pakket.</para>

	  <para><parameter>allow | accept | pass |
	      permit</parameter></para>

	  <para>Deze opties betekenen allemaal hetzelfde: als de
	    regel geldt voor een pakket, laat dat pakket dan door en
	    stop met het zoeken naar geldende regels.</para>

	  <para><parameter>check&ndash;state</parameter></para>

	  <para>Vergelijkt het pakket met de tabel met dynamische
	    regels.  Als het erin staat, dan wordt de actie van
	    de dynamisch door deze regel gemaakte regel uitgevoerd.
	    Anders wordt er verder gezocht door de regels.  Een
	    regel met <parameter>check&ndash;state</parameter> heeft
	    geen selectiecriteria.  Als er geen regel met
	    <parameter>check&ndash;state</parameter> in de set met
	    regels staat, dan wordt de tabel met dynamische regels
	    bij het eerste voorkomen van
	    <parameter>keep&ndash;state</parameter> of
	    <parameter>limit</parameter> gecontroleerd.</para>

	  <para><parameter>deny | drop</parameter></para>

	  <para>Deze opties betekenen hetzelfde: als de regel geldt
	    voor een pakket, blokkeer dat pakket dan en stop met het
	    zoeken naar geldende regels.</para>
	</sect4>

	<sect4>
	  <title>Loggen</title>

	  <para><parameter>log</parameter> of
	    <parameter>logamount</parameter></para>

	  <para>Als een regel met het sleutelwoord
	    <parameter>log</parameter> van toepassing is op een
	    pakket, dan wordt er een bericht naar &man.syslogd.8;
	    geschreven met de facilitynaam SECURITY.  Er wordt alleen
	    een bericht geschreven als het aantal voor die regel
	    gelogde pakketten niet groter is dan de instelling
	    <parameter>logamount</parameter>.  Als
	    <parameter>logamount</parameter> niet is ingesteld, dan
	    wordt de limiet uit de &man.sysctl.8; variabele
	    net.inet.ip.fw.verbose_limit gehaald.  In beide gevallen
	    bestaat er in het geval de waarde nul is geen limiet.
	    Als de limiet is bereikt, dan kan het loggen weer
	    ingeschakeld worden door de teller voor het loggen weer
	    op nul te stlelen voor die regel met
	    <command>ipfw</command>
	    <parameter>zero</parameter>.</para>

	  <note>
	    <para>Er wordt gelogd als een pakket zeker past bij een
	    regel, maar voordat de actie (bijvoorbeeld
	    <parameter>accept</parameter> of
	    <literal>deny</literal>) op een pakket wordt
	    toegepast.  Uiteindelijk bepaalt de gebruiker zelf voor
	    welke regels loggen wordt ingeschakeld.</para>
	  </note>
	</sect4>

	<sect4>
	  <title>Selectie</title>

	  <para>De sleutelwoorden in deze paragraaf beschrijven de
	    attributen van een pakket die bekeken worden bij het
	    bepalen of een regel wel of niet op een pakket van
	    toepassing is.  De attributen waarop gecontroleerd kan
	    worden moeten in de beschreven volgorde gebruikt
	    worden.</para>

	  <para><parameter>udp | tcp | icmp</parameter></para>

	  <para>Naast de hierboven aangegeven protocollen kunnen alle
	    in <filename>/etc/protocols</filename> beschreven
	    protocollen gebruikt worden.  De waarde die wordt
	    opgegeven is het protocol dat van toepassing moet zijn.
	    Dit attribuut is verpicht.</para>

	  <para><parameter>from bron to best</parameter></para>

	  <para>De sleutelwoorden <literal>from</literal> en
	    <literal>to</literal> worden gebruikt om te bekijken
	    of een regel van toepassing is op <acronym>IP</acronym>
	    adressen.  Een regel moet zowel bron- als
	    bestemmingsadressen bevatten.  <literal>any</literal> is
	    een bijzonder sleutelwoord dat van toepassing is op alle
	    <acronym>IP</acronym> adressen.  <literal>me</literal> is
	    een bijzonder sleutelwoord dat van toepassing is op alle
	    <acronym>IP</acronym> adressen die ingesteld zijn op
	    interfaces van een &os; systeem.  Zo kan dit onderdeel dus
	    bijvoorbeeld de volgende vormen aannemen:
	    <literal>from me to any</literal>,
	    <literal>from any to me</literal>,
	    <literal>from 0.0.0.0/0 to any</literal>,
	    <literal>from any to 0.0.0.0/0</literal>,
	    <literal>from 0.0.0.0 to any</literal>,
	    <literal>from any to 0.0.0.0</literal>,
	    <literal>from me to 0.0.0.0</literal>.
	    <acronym>IP</acronym> adressen mogen ingevoerd worden
	    in de vorm numeriek, door punten gescheiden
	    adres/maskerlengte of als een enkelvoudig
	    <acronym>IP</acronym> adres in de vorm numeriek, door
	    punten gescheiden.  De volgende link kan hulp verschaffen
	    bij het schrijven van <acronym>IP</acronym> adressen in
	    de vorm adres/maskerlengte: <ulink
	      url="http://jodies.de/ipcalc"></ulink>  Dit attribuut
	    is verpicht.</para>

	  <para><parameter>poortnummer</parameter></para>

	  <para>Wordt gebruikt voor protocollen die poortnummers
	    ondersteunen (als <acronym>TCP</acronym> en UDP).  Het
	    gebruik van een poortnummer is verplicht.  Er mogen ook
	    dienstnamen uit <filename>/etc/services</filename>
	    gebruikt worden in plaats van nummers.</para>

	  <para><parameter>in | out</parameter></para>

	  <para>Is op respectievelijk inkomende of uitgaande
	    pakketten van toepassing.  De sleutelwoorden
	    <literal>in</literal> of <literal>out</literal>
	    zijn verplicht in een regel.</para>

	  <para><parameter>via IF</parameter></para>

	  <para>Deze parameter geeft aan op welke interface de regel
	    van toepassing is, waarbij <literal>IF</literal> de
	    exacte naam van de bedoelde interface is.</para>

	  <para><parameter>setup</parameter></para>

	  <para>Dit is een verplicht sleutelwoord waarmee wordt
	    aangegeven dat er gezocht wordt naar een pakket met het
	    verzoek tot het opstarten van een <acronym>TCP</acronym>
	    sessie.</para>

	  <para><parameter>keep&ndash;state</parameter></para>

	  <para>Dit is een verplicht sleutelwoord.  Als er een pakket
	    op een regel met <parameter>keep&ndash;state</parameter>
	    van toepassing is, dan wordt er door de firewall een
	    dynamische regel gemaakt die bi&ndash;directioneel
	    verkeer zal toestaan tussen bron en bestemming en de
	    bijbehorende poorten voor hetzelfde protocol.</para>

	  <para><parameter>limit {bron&ndash;adr | bron&ndash;poort |
	      best&ndash;adr | best&ndash;poort}</parameter></para>

	  <para>De firewall staat maar <replaceable>N</replaceable>
	    verbindingen toe met dezelfde groep parameters uit een
	    regel.  Er kunnen &eacute;&eacute;n of meer van de
	    parameters bron- of bestemmingsadres en bron- en
	    bestemmingspoort gebruikt worden.
	    <parameter>limit</parameter> en
	    <parameter>keep&ndash;state</parameter> kunnen niet in
	    dezelfde regel gebruikt worden.
	    <parameter>limit</parameter> geeft dezelfde mogelijkheden
	    als <parameter>keep&ndash;state</parameter> en voegt daar
	    zijn eigen mogelijkheden aan toe.</para>
	</sect4>
      </sect3>

      <sect3>
	<title>Regeloptie stateful</title>

	<indexterm>
	  <primary>IPFW</primary>

	  <secondary>stateful filteren</secondary>
	</indexterm>

	<para>Bij stateful filteren wordt verkeer bekeken als
	  bi&ndash;directioneel verkeer dat samen een sessie vormt.
	  Het heeft de mogelijkheid om te bepalen of de sessie
	  tussen de zender en de ontvanger op de juiste wijze
	  voortgaat.  Alle pakketten die niet precies in de
	  verwachting van een sessie passen worden automatisch als
	  fout geblokkeerd.</para>

	<para><parameter>check&ndash;state</parameter> wordt gebruikt
	  om aan te geven waar IPFW regels tegen de mogelijkheden
	  voor dynamische regels gehouden moeten worden.  Als er
	  een passende regel bij een pakket wordt gevonden, dan kan
	  dat pakket de firewall verlaten en wordt een nieuwe regel
	  gemaakt voor het volgende pakket dat wordt verwacht in de
	  sessie.  Als er geen regel van toepassing is op het pakket,
	  dan wordt de volgende regel in de groep regels
	  getest.</para>

	<para>De mogelijkheden voor dynamische regels zijn kwetsbaar
	  voor een aanval die SYN&ndash;flood heet, waarmee wordt
	  geprobeerd een zeer groot aantal regels aan te laten maken.
	  Om deze aanval tegen te gaan, is er vanaf &os; versie 4.5
	  de optie <parameter>limit</parameter> beschikbaar.  Met deze
	  optie kan het maximaal aantal simultane sessies geregeld
	  worden op basis van bron en bestemmingsvelden.  Als het
	  aantal sessies gelijk aan het maximale aantal sessies is,
	  wordt een pakket voor een nieuwe sessie geweigerd.</para>
      </sect3>

      <sect3>
	<title>Firewallberichten loggen</title>

	<indexterm>
	  <primary>IPFW</primary>

	  <secondary>loggen</secondary>
	</indexterm>

	<para>De voordelen van loggen zijn duidelijk.  Het biedt de
	  mogelijkheid om na het feit informatie na te zien als:
	  welke pakketten heeft de firewall laten vallen, waar kwamen
	  ze vandaan en waar gingen ze heen.  Dit zijn allemaal
	  voordelen als het gaat om uitvinden waar een aanvaller
	  vandaan komt en wat hij heeft geprobeerd.</para>

	<para>Zelfs als logging is ingeschakeld logt IPFW nog niets
	  uit zichzelf.  De beheerder van de firewall beslist welke
	  actieve regels iets weg moeten schrijven door het
	  sleutelwoord <parameter>log</parameter> aan die regels toe
	  te voegen.  Gewoonlijk worden alleen
	  <parameter>deny</parameter> regels gelogd.  Dit geldt
	  bijvoorbeeld voor de <parameter>deny</parameter> regel
	  voor inkomende <acronym>ICMP</acronym> pings.  Het is
	  gebruikelijk om de standaard <command>ipfw</command> regel
	  te dupliceren, daar <parameter>log</parameter> in op te
	  nemen, en deze als laatste in de set met regels te
	  plaatsen.  Zo zijn alle pakketten te zien die niet voldeden
	  aan ook maar &eacute;&eacute;n regel.</para>

	<para>Loggen heeft ook mogelijke nadelen.  Het is mogelijk om
	  te veel te loggen en dan om te komen in logboekgegevens
	  die uiteindelijk een schijf kunnen vullen.  Een DoS aanval
	  om een schijf met logs te vullen is een van de oudst bekende
	  typen DoS aanvallen.  Logberichten van de firewall worden
	  niet alleen naar &man.syslogd.8; geschreven, maar ook op
	  het <username>root</username> console getoond waar ze snel
	  erg vervelend kunnen worden.</para>

	<para>De kerneloptie
	  <literal>IPFIREWALL_VERBOSE_LIMIT=5</literal> beperkt het
	  aantal opeenvolgende berichten dat naar &man.syslogd.8;
	  wordt geschreven voor &eacute;&eacute;n specifieke regel.
	  Als deze optie is ingeschakeld, worden in dit geval
	  maximaal vijf berichten voor dezelfde regel gemeld.  Als er
	  meer berichten op dezelfde regel zouden zijn, zou dat als
	  volgt aan &man.syslogd.8; gemeld worden:</para>

	<programlisting>last message repeated 45 times</programlisting>

	<para>Standaard worden alle gelogde pakketten weggeschreven
	  naar <filename>/var/log/security</filename>, wat is
	  ingesteld in <filename>/etc/syslog.conf</filename>.</para>
      </sect3>

      <sect3 id="firewalls-ipfw-rules-script">
	<title>Regelscript bouwen</title>

	<para>De meeste ervaren gebruikers van IPFW maken een bestand
	  waarin de regels staan en stellen dat zo op dat het als
	  script uitgevoerd kan worden.  Het grootste voordeel van
	  deze methode is dat de firewallregels allemaal vervangen
	  kunnen worden zonder dat het systeem geboot moet worden.
	  Deze methode is ook erg geschikt voor het testen van regels
	  omdat de procedure zo vaak als nodig uitgevoerd kan worden.
	  Omdat het een script is, kan er gebruik gemaakt worden van
	  substitutie zodat veel gebruikte waarden verduidelijkt
	  kunnen worden.  In het volgende voorbeeld wordt hier
	  gebruik van gemaakt.</para>

	<para>De syntaxis die in het script wordt gebruikt is
	  compatibel met de shells <command>sh</command>,
	  <command>csh</command> en <command>tcsh</command>.  Velden
	  waarvoor substitutie van toepassing is worden vooraf gegaan
	  door het dollarteken &dollar;.  Definities worden niet
	  vooraf gegaan door het voorvoegsel &dollar;.  De waarden
	  van een definitie moet omsloten worden door "dubbele
	  aanhalingstekens".</para>

	<para>Een bestand met regels kan als volgt beginnen:</para>

	<programlisting>############### begin voorbeeldscript ipfw regels ##############
#
ipfw &ndash;q &ndash;f flush       # Verwijder alle bestaande regels.
# Stel standaarden in.
oif="tun0"             # uitgaande interface.
odns="192.0.2.11"      # IP adres DNS server ISP.
cmd="ipfw &ndash;q add "     # Voorvoegsel voor regel.
ks="keep&ndash;state"        # Te lui om iedere keer in te typen.
&dollar;cmd 00500 check&ndash;state
&dollar;cmd 00502 deny all from any to any frag
&dollar;cmd 00501 deny tcp from any to any established
&dollar;cmd 00600 allow tcp from any to any 80 out via &dollar;oif setup &dollar;ks
&dollar;cmd 00610 allow tcp from any to &dollar;odns 53 out via &dollar;oif setup &dollar;ks
&dollar;cmd 00611 allow udp from any to &dollar;odns 53 out via &dollar;oif &dollar;ks
################### einde voorbeeldscript ipfw regels ###########</programlisting>

	<para>Dat is alles.  De feitelijke functie van de regels is
	  in dit voorbeeld van ondergeschikt belang.  Dit was slechts
	  een voorbeeld om het gebruik van substitutie te
	  illustreren.</para>

	<para>Als het bovenstaande voorbeeld het de inhoud van
	  <filename>/etc/ipfw.rules</filename> was, dan kon het
	  herladen worden met het volgende commando:</para>

	<screen>&prompt.root; <userinput>sh /etc/ipfw.rules</userinput></screen>

	<para><filename>/etc/ipfw.rules</filename> zou overal kunnen
	  staan met iedere gewenste naam.</para>

	<para>Wat in het bovenstaande voorbeeld met een bestand is
	  gerealiseerd, kan ook met de hand:</para>

	<screen>&prompt.root; <userinput>ipfw &ndash;q &ndash;f flush</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00500 check&ndash;state</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00502 deny all from any to any frag</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00501 deny tcp from any to any established</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00600 allow tcp from any to any 80 out via tun0 setup keep&ndash;state</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00610 allow tcp from any to 192.0.2.11 53 out via tun0 setup keep&ndash;state</userinput>
&prompt.root; <userinput>ipfw &ndash;q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep&ndash;state</userinput></screen>
      </sect3>

      <sect3>
	<title>Set met stateful regels</title>

	<para>De volgende set met regels, waarin geen gebruik gemaakt
	  wordt van <acronym>NAT</acronym>, is een voorbeeld van hoe
	  een erg veilige inclusieve firewall kan worden opgezet.
	  Een inclusieve firewall laat alleen diensten toe waarvoor
	  <parameter>pass</parameter> regels van toepassing zijn en
	  blokkeert al het andere verkeer.  Alle firewalls hebben
	  tenminste twee interfaces waarvoor regels moeten zijn die
	  de firewall in staat stellen zijn werk te doen.</para>

	<para>Alle &unix; systemen en dus ook &os; zijn zo ontworpen
	  dat ze voor interne communicatie de interface
	  <devicename>lo0</devicename> en <acronym>IP</acronym> adres
	  <hostid role="ipaddr">127.0.0.1</hostid> gebruiken.  De
	  firewall moet dit interne verkeer gewoon doorgang laten
	  vinden.</para>

	<para>Voor de interface die is verbonden met het publieke
	  internet worden regels gemaakt waarmee sessies naar het
	  internet mogelijk gemaakt worden en toegang wordt gegeven
	  voor pakketten die uit die sessies terug komen.  Dit kan
	  de PPP interface <devicename>tun0</devicename> zijn of de
	  netwerkkaart die is verbonden met een xDSL of
	  kabelmodem.</para>

	<para>In gevallen dat er meer dan &eacute;&eacute;n
	  netwerkkaart is aangesloten op het private netwerk achter
	  de firewall, moeten er op de firewall regels zijn om het
	  verkeer tussen die interfaces vrije doorgang te
	  geven.</para>

	<para>De regels worden opgedeeld in drie onderdelen: alle
	  interfaces met vrije doorgang, uitgaand op publieke
	  interfaces en inkomend op publieke interfaces.</para>

	<para>De volgorde van de regels in iedere sectie voor
	  publieke interfaces moet zo zijn dat de regels die het
	  meest gebruikt worden v&oacute;&oacute;r de regels staan
	  die minder vaak gebruikt worden.  De laatste regel van een
	  onderdeel geeft aan dat al het overige verkeer op die
	  interface in die richting geblokkeerd en gelogd moet
	  worden.</para>

	<para>In het onderdeel Uitgaand staan alleen regels met
	  <parameter>allow</parameter> die parameters bevatten om
	  individuele diensten beschikbaar te maken zodat er internet
	  toegang is.  Al die regels moeten gebruik maken van
	  <parameter>proto</parameter>, <parameter>port</parameter>,
	  <parameter>in/out</parameter>, <parameter>via</parameter>
	  en <parameter>keep-state</parameter>.  De regels met
	  <parameter>proto tcp</parameter> maken ook gebruik van
	  <parameter>setup</parameter> om te bekijken of het een
	  pakket betreft voor het opzetten van een sessie om de
	  stateful functionaliteit aan te sturen.</para>

	<para>In het onderdeel Inkomend staan alle regels voor het
	  blokkeren van ongewenste pakketten eerst om twee redenen.
	  Als eerste kan het zo zijn dat wat er wordt geblokkeerd
	  later toegestaan zou worden door regels die diensten
	  toestaan.  De tweede reden is dat nu ongewenste pakketten
	  die vaak voorkomen en die bij voorkeur niet in de logboeken
	  voorkomen niet meer van toepassing zijn op de laatste regel
	  van het onderdeel waarin ze zouden worden gelogd.  Met de
	  laatste regel van dit onderdeel worden alle overige
	  pakketten geblokkeerd en gelogd en ze kunnen
	  bewijsmateriaal zijn in een zaak tegen iemand die heeft
	  geprobeerd een systeem aan te vallen.</para>

	<para>Voor al het verkeer dat wordt geweigerd wordt geen
	  antwoord gestuurd.  Die pakketten verdwijnen gewoon.  Zo
	  weet een aanvaller niet of een pakket het doelsysteem wel
	  heeft bereikt.  Zo kan een aanvaller geen informatie
	  verzamelen over een systeem: hoe minder informatie er over
	  een systeem beschikbaar is, hoe veiliger het is.  Als er
	  pakketten gelogd worden waarvan de beheerder het poortnummer
	  niet herkent, dan is de functie van dat poortnummer na te
	  zoeken in <filename>/etc/services</filename> of op <ulink
	    url="http://www.securitystats.com/tools/portsearch.php"></ulink>.
	  Op de volgende link worden poortnummers van Trojans
	  beschreven: <ulink
	    url="http://www.simovits.com/trojans/trojans.html"></ulink>.</para>
      </sect3>

      <sect3>
	<title>Voorbeeld van een set inclusieve regels</title>

	<para>Het volgende voorbeeld is een complete inclusieve set
	  regels die geen gebruik maakt van <acronym>NAT</acronym>.
	  Deze set met regels is een aanrader en eenvoudig aan te
	  passen door commentaar te maken van een regel voor een
	  dienst die niet gewenst is.  Logberichten die niet gewenst
	  zijn, zijn uit te sluiten door ze met een regel te
	  blokkeren in het begin van het onderdeel Inkomend.  Voor de
	  onderstaande regels dient de <devicename>dc0</devicename>
	  interfacenaam in iedere regel vervangen te worden door de
	  interfacenaam van de netwerkkaart in het systeem die met
	  het publieke internet is verbonden.  Voor gebruikers van
	  PPP zou dat <devicename>tun0</devicename> zijn.</para>

	<para>Er zit een structuur in de regels:</para>

	<itemizedlist>
	  <listitem>
	    <para>Alle regels die controleren op het verzoek voor het
	      opzetten van een sessie gebruiken
	      <parameter>keep&ndash;state</parameter>.</para>
	  </listitem>

	  <listitem>
	    <para>Alle diensten die vanaf internet bereikbaar zijn
	      gebruiken <parameter>limit</parameter> om
	      <quote>flooding</quote> te voorkomen.</para>
	  </listitem>

	  <listitem>
	    <para>Alle regels gebruiken <parameter>in</parameter> of
	      <parameter>out</parameter> om de richting aan te
	      geven.</para>
	  </listitem>

	  <listitem>
	    <para>Alle regels gebruiken <parameter>via
	      interfacenaam</parameter> om aan te geven op welke
	      interface de regel van toepassing is.</para>
	  </listitem>
	</itemizedlist>

	<para>De volgende regels zouden in
	  <filename>/etc/ipfw.rules</filename> kunnen staan:</para>

	<programlisting>################ Begin bestand met IPFW regels ###############################
# Verwijder eerst de bestaande regels.
ipfw &ndash;q &ndash;f flush

# Stel commando voorvoegsel in.
cmd="ipfw &ndash;q add"
pif="dc0"     # Interfacenaam van NIC die verbinding
              # met het publieke internet heeft.

#################################################################
# Geen beperkingen op de interface aan de LAN kant. Alleen nodig
# als er een LAN is. Wijzig xl0 naar de gebruikte interfacenaam.
#################################################################
#&dollar;cmd 00005 allow all from any to any via xl0

#################################################################
# Geen beperkingen op de loopback interface.
#################################################################
&dollar;cmd 00010 allow all from any to any via lo0

#################################################################
# Sta het pakket toe als het aan de tabel met dynamische regels
# was toegevoegd met een 'allow keep&ndash;state' commando.
#################################################################
&dollar;cmd 00015 check&ndash;state

#################################################################
# Interface aan het publieke internet (onderdeel Uitgaand).
# Inspecteer verzoeken om een sessie te starten van achter de
# firewall op het private netwerk of vanaf de server zelf naar
# het publieke internet.
#################################################################

# Geef toegang tot de DNS server van de ISP.
# x.x.x.x moet het IP adres van de DNS van de ISP zijn.
# Dupliceer deze regels als een ISP meedere DNS servers heeft.
# Haal het IP adres evt. uit /etc/resolv.conf
&dollar;cmd 00110 allow tcp from any to x.x.x.x 53 out via &dollar;pif setup keep&ndash;state
&dollar;cmd 00111 allow udp from any to x.x.x.x 53 out via &dollar;pif keep&ndash;state

# Geef toegang tot de DHCP server van de ISP voor kabel- en
# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden
# van PPP naar het publieke internet. In dat geval kan de hele groep
# verwijderd worden. Gebruik de volgende regel en controleer het
# logboek voor het IP adres. Wijzig dan het IP adres in de regel
# commentaar hieronder en verwijder de eerste regel.
&dollar;cmd 00120 allow log udp from any to any 67 out via &dollar;pif keep&ndash;state
#&dollar;cmd 00120 allow udp from any to x.x.x.x 67 out via &dollar;pif keep&ndash;state

# Sta niet beveiligd www verkeer toe.
&dollar;cmd 00200 allow tcp from any to any 80 out via &dollar;pif setup keep&ndash;state

# Sta beveiligd www verkeer over TLS SSL toe.
&dollar;cmd 00220 allow tcp from any to any 443 out via &dollar;pif setup keep&ndash;state

# Sta het verzenden en ontvangen van e-mail toe.
&dollar;cmd 00230 allow tcp from any to any 25 out via &dollar;pif setup keep&ndash;state
&dollar;cmd 00231 allow tcp from any to any 110 out via &dollar;pif setup keep&ndash;state

# Sta de FreeBSD CVSUP functie toe voor uid root.
&dollar;cmd 00240 allow tcp from me to any out via &dollar;pif setup keep&ndash;state uid root

# Sta ping toe.
&dollar;cmd 00250 allow icmp from any to any out via &dollar;pif keep&ndash;state

# Sta Time toe naar buiten.
&dollar;cmd 00260 allow tcp from any to any 37 out via &dollar;pif setup keep&ndash;state

# Sta NNTP nieuws toe naar buiten.
&dollar;cmd 00270 allow tcp from any to any 119 out via &dollar;pif setup keep&ndash;state

# Sta beveiligde FTP, Telnet en SCP toe naar buiten.
# Deze functie maakt gebruik van SSH (secure shell).
&dollar;cmd 00280 allow tcp from any to any 22 out via &dollar;pif setup keep&ndash;state

# Sta whois toe naar buiten.
&dollar;cmd 00290 allow tcp from any to any 43 out via &dollar;pif setup keep&ndash;state

# Blokkeer en log al het andere dat probeert buiten te komen.
# Deze regel dwingt de 'block all' logica af.
&dollar;cmd 00299 deny log all from any to any out via &dollar;pif

#################################################################
# Interface aan het publieke internet (onderdeel Inkomend).
# Inspecteert pakketten die van het publieke internet komen
# met als bestemming de host zelf of het private netwerk.
#################################################################

# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde
# adresreeksen.
&dollar;cmd 00300 deny all from 192.168.0.0/16 to any in via &dollar;pif   #RFC 1918 privaat IP
&dollar;cmd 00301 deny all from 172.16.0.0/12 to any in via &dollar;pif     #RFC 1918 privaat IP
&dollar;cmd 00302 deny all from 10.0.0.0/8 to any in via &dollar;pif        #RFC 1918 privaat IP
&dollar;cmd 00303 deny all from 127.0.0.0/8 to any in via &dollar;pif       #loopback
&dollar;cmd 00304 deny all from 0.0.0.0/8 to any in via &dollar;pif         #loopback
&dollar;cmd 00305 deny all from 169.254.0.0/16 to any in via &dollar;pif    #DHCP auto&ndash;config
&dollar;cmd 00306 deny all from 192.0.2.0/24 to any in via &dollar;pif      #gereserveerd voor documentatie
&dollar;cmd 00307 deny all from 204.152.64.0/23 to any in via &dollar;pif   #Sun cluster interconnect
&dollar;cmd 00308 deny all from 224.0.0.0/3 to any in via &dollar;pif       #Klasse D & E multicast

# Blokkeer publieke pings.
&dollar;cmd 00310 deny icmp from any to any in via &dollar;pif

# Blokkeer ident.
&dollar;cmd 00315 deny tcp from any to any 113 in via &dollar;pif

# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie.
# Netbios is de Windows® bestandsdeeldienst.
# Blokkeer Windows hosts2 name server verzoeken 81.
&dollar;cmd 00320 deny tcp from any to any 137 in via &dollar;pif
&dollar;cmd 00321 deny tcp from any to any 138 in via &dollar;pif
&dollar;cmd 00322 deny tcp from any to any 139 in via &dollar;pif
&dollar;cmd 00323 deny tcp from any to any 81 in via &dollar;pif

# Blokkeer gefragmenteerde pakketten.
&dollar;cmd 00330 deny all from any to any frag in via &dollar;pif

# Blokkeer ACK pakketten die niet in de table met dynamische regels
# staan.
&dollar;cmd 00332 deny tcp from any to any established in via &dollar;pif

# Geef toegang tot de DHCP server van de ISP voor kabel- en
# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden
# van PPP naar het publieke internet. In dat geval kan de hele groep
# verwijderd worden. Hier wordt hetzelfde IP adres gebruikt als in de
# sectie voor Uitgaand verkeer.
#&dollar;cmd 00360 allow udp from any to x.x.x.x 67 in via &dollar;pif keep&ndash;state

# Sta inkomend webverkeer toe omdat er een Apache server draait.
&dollar;cmd 00400 allow tcp from any to me 80 in via &dollar;pif setup limit src&ndash;addr 2

# Sta beveiligde FTP, telnet en SCP toe vanaf internet.
&dollar;cmd 00410 allow tcp from any to me 22 in via &dollar;pif setup limit src&ndash;addr 2

# Sta niet beveiligde telnet sessie toe vanaf het publieke internet.
# Dit heeft het label ``niet veilig'' omdat gebruikersnaam en
# wachtwoord als platte tekst over internet gaan. Als er geen telnet
# server draait, hoeft deze regel niet actief te zijn.
&dollar;cmd 00420 allow tcp from any to me 23 in via &dollar;pif setup limit src&ndash;addr 2

# Weiger en log alle niet toegestane inkomende verbindingen van buiten.
&dollar;cmd 00499 deny log all from any to any in via &dollar;pif

# Al het andere verkeer wordt standaard geblokkeerd. Weiger en log alle
# pakketten die tot hier zijn gekomen om te bekijken welke het waren.
&dollar;cmd 00999 deny log all from any to any
################ Einde bestand met IPFW regels ########################</programlisting>
      </sect3>

      <sect3>
	<title>Voorbeeld <acronym>NAT</acronym> en stateful
	  regels</title>

	<indexterm>
	  <primary>NAT</primary>

	  <secondary>en IPFW</secondary>
	</indexterm>

	<para>Om <acronym>NAT</acronym> met IPFW te gebruiken moeten
	  een aantal instellingen gemaakt worden.  In het
	  instellingenbestand voor de kernel moet <literal>option
	  divert</literal> toegevoegd worden aan de andere
	  IPFIREWALL opties.</para>

	<para>Naast de normale IPFW opties in
	  <filename>/etc/rc.conf</filename> zijn de volgende
	  nodig:</para>

	<programlisting>natd_enable="YES"                   # Schakel NATD in
natd_interface="rl0"                # interfacenaam voor de publieke internet NIC
natd_flags="&ndash;dynamic &ndash;m"            # &ndash;m = behoud poortnummers als mogelijk</programlisting>

	<para>Stateful regels samen met de
	  <parameter>divert</parameter> natd regel gebruiken maakt
	  het schrijven van regels veel gecompliceerder.  De plaats
	  van de regels met <parameter>check&ndash;state</parameter>
	  en <parameter>divert natd</parameter> zijn van kritiek
	  belang.  De logica bestaat niet langer uit het eenvoudigweg
	  van boven naar beneden doorwerken van de regels.  Er wordt
	  dan ook een nieuw type actie gebruik:
	  <parameter>skipto</parameter>.  Bij het gebruik van
	  <parameter>skipto</parameter> is het verplicht iedere regel
	  te nummeren zodat duidelijk is waar een
	  <parameter>skipto</parameter> precies heen springt.</para>

	<para>Hieronder staat een groep regels zonder commentaar
	  waarin een manier om pakketten door de groep regels te
	  leiden wordt aangegeven.</para>

	<para>De verwerking begint met de eerste regel en er wordt
	  steeds een volgende regel gecontroleerd tot het einde
	  wordt bereikt of totdat een regel op het gecontroleerde
	  pakket van toepassing is, op dat pakket wordt toegepast
	  en de verwerking van regels daardoor stopt.  In het
	  voorbeeld zijn de regels 100, 101, 450, 500, and 510 van
	  belang.  Die regels regelen de vertaling van inkomende en
	  uitgaande pakketten zodat er in de tabel met de
	  dynamische <parameter>keep&ndash;state</parameter> regels
	  altijd het private <acronym>IP</acronym> adres staat.
	  Daarnaast is het van belang op te merken dat er in alle
	  <parameter>allow</parameter> en
	  <parameter>deny</parameter> regels de richting van het
	  pakket wordt gecontroleerd (inkomend of uitgaand) en over
	  welke interface het pakket gaat.  Merk ook op dat alle
	  uitgaande verzoeken voor het starten van een sessie met
	  een <parameter>skipto</parameter> naar regel 500 gaan voor
	  <acronym>NAT</acronym>.</para>

	<para>Stel dat een gebruiker zijn webbrowser gebruikt om een
	  webpagina op te halen.  Webpagina's gebruiken poort 80 voor
	  communicatie.  Er komt een pakket de firewall binnen dat
	  niet past bij regel 100 omdat het naar buiten gaat en niet
	  naar binnen.  Het komt voorbij regel 101 omdat dit het
	  eerste pakket is en er dus nog niets voor in de dynamische
	  keep-state tabel staat.  Als het pakket bij 125 aankomt
	  blijkt het te passen bij die regel.  Het gaat naar buiten
	  door de interface aan het publieke internet.  Het pakket
	  heeft dan nog steeds het bron <acronym>IP</acronym> adres
	  van het private LAN.  Als blijkt dat deze regel geldt, dan
	  gebeuren er twee dingen: door
	  <parameter>keep&ndash;state</parameter> wordt er een regel
	  in de dynamische keep&ndash;state tabel gezet en wordt de
	  aangegeven actie uitgevoerd.  De actie is onderdeel van de
	  informatie uit de dynamische tabel.  In dit geval is het
	  <literal>skipto 500</literal>.  In regel 500 wordt
	  <acronym>NAT</acronym> op het <acronym>IP</acronym> adres
	  van het pakket toegepast en dan kan het weg.  Het volgende
	  is van groot belang.  Dit pakket komt aan op zijn
	  bestemming en als er een antwoord terug komt, dan begint de
	  verwerking van dat pakket weer van voor af aan.  Nu voldoet
	  het aan regel 100 en dus wordt het bestemmingsadres
	  vertaald naar het bijbehorende <acronym>IP</acronym> adres
	  op het LAN.  Daarna past het bij de
	  <parameter>check&ndash;state</parameter> regel en wordt een
	  vermelding in de tabel gevonden wat betekent dat er een
	  bestaande sessie is en wordt het doorgelaten naar het LAN.
	  Het gaat dan naar de PC op het LAN die als eerste een
	  pakket heeft verzonden en die verstuurt een nieuw pakket
	  met de vraag om een volgend segment met data naar de
	  server.  Nu blijkt bij controle van de
	  <parameter>check&ndash;state</parameter> regel dat die op
	  het pakket van toepassing moet zijn en er staat een
	  vermelding in de tabel voor uitgaand verkeer.  Daarom wordt
	  de bijbehorende actie <parameter>skipto 500</parameter>
	  uitgevoerd.  Het pakket springt naar regel 500, er wordt
	  <acronym>NAT</acronym> op toegepast en het kan zijn weg
	  vervolgen.</para>

	<para>Wat betreft binnenkomende pakketten wordt alles dat
	  onderdeel is van een bestaande sessie automatisch
	  afgehandeld door de
	  <literal>check&ndash;state</literal> regel en de juist
	  geplaatste <literal>divert natd</literal> regels.  Nu hoeven
	  alleen de foute pakketten nog geweigerd te worden en moet
	  ondersteuning voor inkomende diensten ingesteld worden.  In
	  dit geval draait er een Apache server op de gateway machine
	  die vanaf internet bereikbaar moet zijn.  Het nieuwe
	  inkomende pakket past bij regel 100 en het
	  <acronym>IP</acronym> adres wordt aangepast aan het interne
	  <acronym>IP</acronym> adres van de gateway machine.  Dat
	  pakket wordt dan gecontroleerd op alle ongewenste
	  eigenschappen en komt uiteindelijk aan bij regel 425 die
	  van toepassing blijkt te zijn.  In dat geval kunnen er twee
	  dingen gebeuren: de pakketregel wordt in de dynamische
	  keep&ndash;state tabel gezet, maar nu wordt het aantal nieuwe
	  sessies dat van het bron <acronym>IP</acronym> adres komt
	  gelimiteerd tot twee.  Dit is een bescherming tegen DoS
	  aanvallen op de dienst die op dat poortnummer wordt
	  aangeboden.  De actie is <literal>allow</literal>, dus het
	  pakket wordt tot het LAN toegelaten.  Voor het antwoord
	  herkent de <literal>check&ndash;state</literal> regel dat het
	  pakket bij een bestaande sessie hoort, stuurt het naar regel
	  500 voor <acronym>NAT</acronym> en stuurt het via de
	  uitgaande interface weg.</para>

	<para>Voorbeeld Set Regels #1:</para>

	<programlisting>#!/bin/sh
cmd="ipfw &ndash;q add"
skip="skipto 500"
pif=rl0
ks="keep&ndash;state"
good_tcpo="22,25,37,43,53,80,443,110,119"

ipfw &ndash;q &ndash;f flush

&dollar;cmd 002 allow all from any to any via xl0  # exclude LAN traffic
&dollar;cmd 003 allow all from any to any via lo0  # exclude loopback traffic

&dollar;cmd 100 divert natd ip from any to any in via &dollar;pif
&dollar;cmd 101 check&ndash;state

# Toegestaan uitgaand verkeer.
&dollar;cmd 120 &dollar;skip udp from any to xx.168.240.2 53 out via &dollar;pif &dollar;ks
&dollar;cmd 121 &dollar;skip udp from any to xx.168.240.5 53 out via &dollar;pif &dollar;ks
&dollar;cmd 125 &dollar;skip tcp from any to any &dollar;good_tcpo out via &dollar;pif setup &dollar;ks
&dollar;cmd 130 &dollar;skip icmp from any to any out via &dollar;pif &dollar;ks
&dollar;cmd 135 &dollar;skip udp from any to any 123 out via &dollar;pif &dollar;ks

# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde
# adresreeksen.
&dollar;cmd 300 deny all from 192.168.0.0/16  to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 301 deny all from 172.16.0.0/12   to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 302 deny all from 10.0.0.0/8      to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 303 deny all from 127.0.0.0/8     to any in via &dollar;pif  #loopback
&dollar;cmd 304 deny all from 0.0.0.0/8       to any in via &dollar;pif  #loopback
&dollar;cmd 305 deny all from 169.254.0.0/16  to any in via &dollar;pif  #DHCP auto&ndash;config
&dollar;cmd 306 deny all from 192.0.2.0/24    to any in via &dollar;pif  #gereserveerd voor documentatie
&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif  #Sun cluster
&dollar;cmd 308 deny all from 224.0.0.0/3     to any in via &dollar;pif  #Klasse D & E multicast

# Toegestaan inkomend verkeer.
&dollar;cmd 400 allow udp from xx.70.207.54 to any 68 in &dollar;ks
&dollar;cmd 420 allow tcp from any to me 80 in via &dollar;pif setup limit src&ndash;addr 1

&dollar;cmd 450 deny log ip from any to any

# Dit is de 'skipto' locatie voor de uitgaande stateful regels.
&dollar;cmd 500 divert natd ip from any to any out via &dollar;pif
&dollar;cmd 510 allow ip from any to any

######################## Einde regels  ##################</programlisting>

	<para>Het volgende voorbeeld doet vrijwel hetzelfde als het
	  bovenstaande, maar volgt een zelfdocumenterende stijl voor
	  het opstellen van regels en commentaar waardoor minder
	  ervaren gebruikers beter kunnen begrijpen wat de regels
	  doen.</para>

	<para>Voorbeeld Set Regels #2:</para>

	<programlisting>
#!/bin/sh
################ Begin bestand met IPFW regels ###############################
# Verwijder eerst de bestaande regels.
ipfw &ndash;q &ndash;f flush

# Stel commando voorvoegsel in.
cmd="ipfw &ndash;q add"
skip="skipto 800"
pif="rl0"     # Interfacenaam van NIC die verbinding
              # met het publieke internet heeft.

#################################################################
# Geen beperkingen op de interface aan de LAN kant.
# Wijzig xl0 naar de gebruikte interfacenaam.
#################################################################
&dollar;cmd 005 allow all from any to any via xl0

#################################################################
# Geen beperkingen op de loopback interface.
#################################################################
&dollar;cmd 010 allow all from any to any via lo0

#################################################################
# Controleer of pakket inkomend is. NAT in dat geval.
#################################################################
&dollar;cmd 014 divert natd ip from any to any in via &dollar;pif

#################################################################
# Sta het pakket toe als het aan de tabel met dynamische regels
# was toegevoegd met een 'allow keep&ndash;state' commando.
#################################################################
&dollar;cmd 015 check&ndash;state

#################################################################
# Interface aan het publieke internet (onderdeel Uitgaand).
# Inspecteer verzoeken om een sessie te starten van achter de
# firewall op het private netwerk of vanaf de server zelf naar
# het publieke internet.
#################################################################

# Geef toegang tot de DNS server van de ISP.
# x.x.x.x moet het IP adres van de DNS van de ISP zijn.
# Dupliceer deze regels als een ISP meedere DNS servers heeft.
# Haal het IP adres evt. uit /etc/resolv.conf
&dollar;cmd 020 &dollar;skip tcp from any to x.x.x.x 53 out via &dollar;pif setup keep&ndash;state

# Geef toegang tot de DHCP server van de ISP voor kabel en xDSL.
&dollar;cmd 030 &dollar;skip udp from any to x.x.x.x 67 out via &dollar;pif keep&ndash;state

# Sta niet beveiligd www verkeer toe.
&dollar;cmd 040 &dollar;skip tcp from any to any 80 out via &dollar;pif setup keep&ndash;state

# Sta beveiligd www verkeer over TLS SSL toe.
&dollar;cmd 050 &dollar;skip tcp from any to any 443 out via &dollar;pif setup keep&ndash;state

# Sta het verzenden en ontvangen van e-mail toe.
&dollar;cmd 060 &dollar;skip tcp from any to any 25 out via &dollar;pif setup keep&ndash;state
&dollar;cmd 061 &dollar;skip tcp from any to any 110 out via &dollar;pif setup keep&ndash;state

# Sta de FreeBSD CVSUP functie toe voor uid root.
&dollar;cmd 070 &dollar;skip tcp from me to any out via &dollar;pif setup keep&ndash;state uid root

# Sta ping toe naar het publieke internet.
&dollar;cmd 080 &dollar;skip icmp from any to any out via &dollar;pif keep&ndash;state

# Sta Time toe.
&dollar;cmd 090 &dollar;skip tcp from any to any 37 out via &dollar;pif setup keep&ndash;state

# Sta NNTP nieuws toe.
&dollar;cmd 100 &dollar;skip tcp from any to any 119 out via &dollar;pif setup keep&ndash;state

# Sta beveiligde FTP, Telnet en SCP toe.
# Deze functie maakt gebruik van SSH (secure shell).
&dollar;cmd 110 &dollar;skip tcp from any to any 22 out via &dollar;pif setup keep&ndash;state

# Sta whois toe.
&dollar;cmd 120 &dollar;skip tcp from any to any 43 out via &dollar;pif setup keep&ndash;state

# Sta NPT tijdserver toe.
&dollar;cmd 130 &dollar;skip udp from any to any 123 out via &dollar;pif keep&ndash;state

#################################################################
# Interface aan het publieke internet (onderdeel Inkomend).
# Inspecteert pakketten die van het publieke internet komen
# met als bestemming de host zelf of het private netwerk.
#################################################################

# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde
# adresreeksen.
&dollar;cmd 300 deny all from 192.168.0.0/16  to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 301 deny all from 172.16.0.0/12   to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 302 deny all from 10.0.0.0/8      to any in via &dollar;pif  #RFC 1918 privaat IP
&dollar;cmd 303 deny all from 127.0.0.0/8     to any in via &dollar;pif  #loopback
&dollar;cmd 304 deny all from 0.0.0.0/8       to any in via &dollar;pif  #loopback
&dollar;cmd 305 deny all from 169.254.0.0/16  to any in via &dollar;pif  #DHCP auto&ndash;config
&dollar;cmd 306 deny all from 192.0.2.0/24    to any in via &dollar;pif  #gereserveerd voor documentatie
&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif  #Sun cluster
&dollar;cmd 308 deny all from 224.0.0.0/3     to any in via &dollar;pif  #Klasse D & E multicast

# Blokkeer ident.
&dollar;cmd 315 deny tcp from any to any 113 in via &dollar;pif

# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie.
# Netbios is de Windows® bestandsdeeldienst.
# Blokkeer Windows hosts2 name server verzoeken 81.
&dollar;cmd 320 deny tcp from any to any 137 in via &dollar;pif
&dollar;cmd 321 deny tcp from any to any 138 in via &dollar;pif
&dollar;cmd 322 deny tcp from any to any 139 in via &dollar;pif
&dollar;cmd 323 deny tcp from any to any 81  in via &dollar;pif

# Blokkeer gefragmenteerde pakketten.
&dollar;cmd 330 deny all from any to any frag in via &dollar;pif

# Blokkeer ACK pakketten die niet in de table met dynamische regels
# staan.
&dollar;cmd 332 deny tcp from any to any established in via &dollar;pif

# Geef toegang tot de DHCP server van de ISP voor kabel- en
# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden
# van PPP naar het publieke internet. In dat geval kan de hele groep
# verwijderd worden. Hier wordt hetzelfde IP adres gebruikt als in de
# sectie voor Uitgaand verkeer.
&dollar;cmd 360 allow udp from x.x.x.x to any 68 in via &dollar;pif keep&ndash;state

# Sta inkomend webverkeer toe omdat er een Apache server draait.
&dollar;cmd 370 allow tcp from any to me 80 in via &dollar;pif setup limit src&ndash;addr 2

# Sta beveiligde FTP, telnet en SCP toe vanaf internet.
&dollar;cmd 380 allow tcp from any to me 22 in via &dollar;pif setup limit src&ndash;addr 2

# Sta niet beveiligde telnet sessie toe vanaf het publieke internet.
# Dit heeft het label ``niet veilig'' omdat gebruikersnaam en
# wachtwoord als platte tekst over internet gaan. Als er geen telnet
# server draait, hoeft deze regel niet actief te zijn.
#&dollar;cmd 390 allow tcp from any to me 23 in via &dollar;pif setup limit src&ndash;addr 2

# Weiger en log alle niet toegestane inkomende verbindingen vanaf het
# publieke internet.
&dollar;cmd 400 deny log all from any to any in via &dollar;pif

# Weiger en log alle niet toegestane uitgaande verbindingen naar
# internet.
&dollar;cmd 450 deny log all from any to any out via &dollar;pif

# Dit is de 'skipto' locatie voor de uitgaande stateful regels
&dollar;cmd 800 divert natd ip from any to any out via &dollar;pif
&dollar;cmd 801 allow ip from any to any

# Al het andere verkeer wordt standaard geblokkeerd. Weiger en log alle
# pakketten die tot hier zijn gekomen om te bekijken welke het waren.
&dollar;cmd 999 deny log all from any to any
################ Einde bestand met IPFW regels ########################</programlisting>
      </sect3>
    </sect2>
  </sect1>
</chapter>

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