<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"  "/usr/local/share/xml/docbook/4.2/docbookx.dtd" [
<!ENTITY ie "<abbrev>i.e.</abbrev>">
<!ENTITY cf "<abbrev>c.f.</abbrev>">
<!ENTITY todo "<command>--- T O  D O :</command>">
<!ENTITY unix "<emphasis>Unix</emphasis>">
<!ENTITY bsd "<emphasis>BSD</emphasis>">
<!ENTITY xbsd "<emphasis>xBSD</emphasis>">
<!ENTITY fbsd "<emphasis >FreeBSD</emphasis>">
<!ENTITY sysV "<emphasis>System V</emphasis>">
<!ENTITY glinux "<emphasis >GNU/Linux</emphasis>">
<!ENTITY deb "<emphasis>Debian</emphasis>">
<!ENTITY inode "<foreignphrase>inode</foreignphrase>">
<!ENTITY inodes "<foreignphrase>inodes</foreignphrase>">
<!ENTITY filesystem "<foreignphrase>filesystem</foreignphrase>">
<!ENTITY awk "<command>awk</command>">
<!ENTITY sed "<command>sed</command>">
<!ENTITY verOBSD "3.4">
<!ENTITY _aut_Pre "<firstname>Ivan</firstname>">
<!ENTITY _aut_Nom "<surname>KURZWEG</surname>">
<!ENTITY _aut_eMail "<email>ivan.kurzweg@gmail.com</email>">
<!ENTITY _aut_Init "<authorinitials>IK</authorinitials>">
]>
<article class="techreport" lang="fr">
  <articleinfo>
    <author>
      <firstname>Ivan</firstname>

      <surname>KURZWEG</surname>

    </author>

    <title>Firewalling sous BSD - PF</title>

    <copyright>
      <year>2009</year>

      <holder>Ivan KURZWEG,<emphasis>ivan.kurzweg@gmail.com, 2009</emphasis></holder>

    </copyright>

    <keywordset>
      <keyword></keyword>
    </keywordset>
  </articleinfo>

  <abstract>
    <para>Introdction (cours et TP) sur le firewall PF d'OpenBSD ... Not an How-TO !! On prendra soin de consulter le man de pfctl, et de suivre l'excellente documentation PF sur le site www.openbsd.org. Ne sont pas abordées les techniques de gestion de bande passante (AltQ).

<blockquote>
		  <attribution>Cantique du SyAdmin,  Peter N. M. Hansteen</attribution>
		  <para>
This is my network. 
It is mine 
or technically my employer's, 
it is my responsibility 
and I care for it with all my heart
there are many other networks a lot like mine,
but none are just like it.
I solemnly swear 
that I will not mindlessly paste from HOWTOs.</para>
		</blockquote>


</para>
</abstract>
  <!-- ==================== 1e partie ==================== -->

  <sect1>
    <title>Firewalls</title>

    <sect2>

      <title>Définitions, principes</title>
      <para>
<itemizedlist>
	    <listitem>
				<para>Un pare-feu est un élément du réseau informatique, logiciel et/ou matériel, qui a pour fonction de faire respecter la politique de sécurité du réseau, celle-ci définissant quels sont les types de communication autorisés ou interdits.	(<ulink url="http://fr.wikipedia.org/wiki/Firewall">Wikipedia</ulink>) </para> 
				</listitem>
  
      <listitem>
				<para><acronym>Pf</acronym> : <foreignphrase>OpenBSD's Packet Filter</foreignphrase>, a été intégré dans le système base d'OpenBSD 3.0
en Décembre 2009. Le développement en urgence de PF a été causé par un problème de licence sur l'ancien système de filtrage de paquets, IPFilter.  </para> 
				</listitem>
    <listitem>
				<para><foreignphrase>Statefull</foreignphrase> : L'état peut être conservé pour un trafic spécifique. Les firewall sont configurés pour autoriser certains trafics (par exemple, le trafic sortant). L'état du trafic est mémorisé pour chaque extrémité de la connexion logique (aussi bien pour le protocole tcp (orienté connexion) que pour les protocoles udp, ou icmp) et des règles implicites sont dynamiquement chargées/retirées du firewall selon l'état de la connexion. </para> 
				</listitem>
    <listitem>
				<para><foreignphrase>Netfilter/Iptables</foreignphrase> : système de filtrage de paquet sous Linux, incluant firewalling statefull, nat, pat, ... </para> 
				</listitem>
</itemizedlist>
</para>

   </sect2>

    <sect2>

      <title>Machines Firerwalls</title>
      <para>On trouve principalement deux types de matériels :
<itemizedlist>
 <listitem>
			<para>Machines Unix, mais attention
				<itemizedlist>          
				  <listitem>
					 <para>  aux installations par défaut, qui activent des services potentiellement dangereux ...</para> 
				  </listitem>
				  <listitem>
					 <para>  à l'existence de compte sans mot de passe.</para> 
				  </listitem>  
				</itemizedlist>
           </para> 
	</listitem>
 <listitem>
			<para>Matériels dédiés (type Cisco ... ), mais
				<itemizedlist>          
				  <listitem>
					 <para> attention aux coûts !</para> 
				  </listitem>  
				</itemizedlist>
           </para> 
	</listitem>

</itemizedlist>
</para>
   </sect2>

    <sect2>

      <title>Principes</title>
      <para>Les firewalls interviennent généralement sur plusieurs plans : 
<itemizedlist>
 <listitem>
			<para>Les paquets : les firewalls interviennent généralement sur la Couche 3 IP. Ainsi, ils peuvent analyser les différents champs des paquets IP. 
           </para> 
	</listitem>
 <listitem>
			<para>Les protocoles : les fonctionnements de UDP, ICMP et de TCP imposent aux firewalls de manipuler les paquets et de stocker éventuellement un état des transactions (statefull)
           </para> 
	</listitem>
 <listitem>
			<para>Les les connexions : lors de la connexion d'un client sur un serveur, les échanges doivent être garantis par le firewall, si le traffic est autorisé
           </para> 
	</listitem>
 <listitem>
			<para>Les ports : en jouant sur les ports, les firewalls filtrent le traffic, et sont capables de redirigés des flux entrants ou sortant sur des cibles différentes. 
           </para> 
	</listitem>
 <listitem>
			<para>Les adresses : selon les adresses sources et destinations (unicast, broadcast, network ou multicast
          </para> 
	</listitem>

</itemizedlist>
</para>
   </sect2>

     </sect1>

 <!-- ==================== 2eme partie ==================== -->

  <sect1>
    <title>OpenBSD pf</title>
  
	 <sect2>
		<title>Fonctionnalités</title>
		<para>
		<itemizedlist>
		  <listitem>
			 <para>     
              c'est un stateful firewall (décisions basées sur l'état d'une connexion logique)
          </para>
		  </listitem>
    
	  <listitem>
			 <para>  
      il utilise la notion de macros (variables à expanser), ce qui permet de paramétrer le jeu de règle ; ce qui facilite la maintenance et améliore la portabilité ;
       </para>
		  </listitem>
	  <listitem>
			 <para>  
      il utilise des tables (de hachage) qui permettent de stocker de large plage d'adresses, tout en assurant un temps d'accès constant ;
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il implémente le NAT (ré-écriture des adresses sources en sortie) et la redirection (ré-écriture des adresses destination en entrée) ;
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il opère dans le mode de la « dernière correspondance gagnante », mais propose un mode de court-circuit avec le mot clé quick ;
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il propose une fonction de normalisation de trafic (scrub) qui annule toutes ambiguïtés dans les paquets reçus et à transmettre aux destinataires (en entrée ou en sortie) ;
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il supporte nativement plusieurs méthodes implémentant le contrôle de bande passante (par gestion de files de priorités selon différents algorithmes) 
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il dispose d'un mécanisme implicite d'ordonnancement des règles ;
     </para>
		  </listitem>
	  <listitem>
			 <para>  
      il dispose d'un excellent mécanisme de log et de statistiques.
          </para>
		  </listitem>
	</itemizedlist></para>
	 </sect2>

	 <sect2>
		<title>Activation sous FreeBSD</title>
		<para>Si PF est disponible directement sous OpenBSD, sa mise en oeuvre sous FreeBSD implique généralement la recompilation du noyau, ou le chargement dynamique du module pf : 

<example>
			 <title>Chargement manuel du module pf sous FreeBSD</title>
			 <programlisting width="80">	  <command># kldload pf.ko</command>
            </programlisting>
		  </example>

<example>
			 <title>Chargement automatique du module pf sous FreeBSD, fichier <filename>/boot/loader.conf</filename></title>
				 <programlisting width="80">
<![CDATA[
pf_load="YES"
pflog_load="YES"
	]]> 	

            </programlisting>
 </example>
<example>
			 <title>Modification du noyau</title>
			 <programlisting width="80">
<![CDATA[
device          pf
device          pflog
device          pfsync

options         ALTQ
options         ALTQ_CBQ
options         ALTQ_RED
options         ALTQ_RIO
options         ALTQ_HFSC
options         ALTQ_PRIQ
	]]> 
            </programlisting>
		  </example>

Dans les deux cas, il est nécessaire d'intervenir sur le fichier <filename>/etc/rc.conf</filename> pouyr activer PF au démarrage de la machine, et charger les jeux de règles : 

<example>
			 <title>Fichier <filename>rc.conf</filename></title>
			 <programlisting width="80">
<![CDATA[
pf_enable="YES"                 # Enable PF (load module if required)
pf_rules="/etc/pf.conf"         # rules definition file for pf
pf_flags=""                     # additional flags for pfctl startup
pflog_enable="YES"              # start pflogd(8)
pflog_logfile="/var/log/pflog"  # where pflogd should store the logfile
pflog_flags=""                  # additional flags for pflogd startup

gateway_enable="YES"            # Enable as LAN gateway
	]]> 
            </programlisting>
		  </example>
</para>

	 </sect2>

	 <sect2>
		<title>Contrôle de PF</title>
		<para>PF possède un puissant outil de manipulation des règles, des tables et de collecte de statistiques, <command>pftcl</command>.

<cmdsynopsis>
			 <command>	pfctl</command>
			 <arg> [-AdeghmNnOqRrvz] [-a anchor] [-D macro= value] [-F modifier]
	   [-f file] [-i interface] [-K host | network] [-k host | network]
	   [-o [level]] [-p device] [-s modifier] [-t table -T command
	   [address ...]] [-x level]</arg>
		  </cmdsynopsis>

<example>
			 <title>Utilisations de la commande <filename>pfctl</filename> </title>
			 <programlisting width="80">	
<command># pfctl -d  </command> //désactiver pf
<command># pfctl -e  </command> //activer pf       
<command># pfctl -f /etc/pf.conf -n  </command> //tester le fichier de configuration  
<command># pfctl -f  /etc/pf.conf -v </command> //charger en mode verbeux le fichier de conf  
<command># pfctl -sr  </command> //afficher le jeux de règles en cours      
<command># pfctl -s info  </command> //statistiques de filtrage  
<command># pfctl -t banned -T show  </command> //afficher le contenu de la table <varname>banned</varname>  
<command># pfctl -t banned -T add 192.168.0.12/32  </command> //ajouter un hôte à la table <varname>banned</varname>
           </programlisting>
	  </example>
</para>
	 </sect2>

	 <sect2>
		<title>Logging</title>
		<para>Lorsque les directives de <quote>log</quote> sont activés, les paquets voulus sont envoyés vers la pseudo interface pflog0. Cette pseudo  interface réseau est alors directement atteignable via les classiques outils d'analyse réseau : 

<example>
			 <title>Analyse temps réel de l'activité de PF :  </title>
			 <programlisting width="80">	
<command># tcpdump -netvli pflog0</command>
<computeroutput><![CDATA[
rule 9/(match) [uid 0, pid 2208] block in on em0: 172.17.10.31.1900 > 239.255.255.250.1900: udp 318 (ttl 127, id 51797, len 346)
rule 1/(match) [uid 0, pid 2208] block in on em0: 172.17.8.6.138 > 172.17.8.127.138: udp 201 (ttl 128, id 6662, len 229)
rule 1/(match) [uid 0, pid 2208] block in on em0: 172.17.8.6.138 > 172.17.8.127.138: udp 201 (ttl 128, id 6662, len 229, bad cksum 0!)
....
	]]>

</computeroutput>
           </programlisting>
	  </example>
Cette facilité d'analyse rend PF bien plus agréable à utiliser que Netfilter/Iptables sous Linux ! En effet, par la 
 </para>


	 </sect2>

  </sect1>
 

  <sect1>
	 <title>Configuration de PF</title>
	 <para>D'une manière générale, les règles de PF sont définies dans un seul fichier de configuration, par défaut le fichier <filename>/etc/pf.conf</filename>. Ce fichier est composé de plusieurs sections : 
<itemizedlist>
		  <listitem>
			 <para>Les définitions en utilisant les macros, les tables et les listes</para>
		  </listitem>

		  <listitem>
			 <para>les règles d'optimisation et de contrôle de bande passante</para>
		  </listitem>
		  <listitem>
			 <para>les règles de NAT</para>
		  </listitem>
		  <listitem>
			 <para>les règles de filtrage</para>
		  </listitem>
		</itemizedlist>

</para>
	 <sect2>
		<title>Listes et macros</title>
		<sect3>
		  <title>Listes</title>
Une liste permet de manipuler des valeurs de même types (liste d'adresses, liste de ports, ...). Elle sont repérées par des accolades.

<example>
			 <title>Exemples de listes  </title>
			 <programlisting width="80">	
<![CDATA[
block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any 
trusted = "{ 192.168.1.2 192.168.5.36 }"
pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22 
	]]>

           </programlisting>
Lors de l'analyse par PF du fichier de configuration, les listes sont décomposées en plusieurs règles, chacune avec une valeur de la liste.
Les listes sont donc à utiliser dans le cas d'un nombre de valeur restreint. 
	  </example>
		</sect3>

		<sect3>
		  <title>Macros</title>
Les macros sont des variables définies par l'utilisateur. En stockant des valeurs, elles facilitent la lecture du fichier de configuration et sa maintenance. 

<example>
			 <title>Exemples de macros  </title>
			 <programlisting width="80">	
<![CDATA[
host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"
ext_if = "fxp0"
block in on $ext_if from any to any
	]]>

           </programlisting>
Dans le premier exemple, les macros sont définies récursivement. 
	  </example>
		</sect3>

	 </sect2>

	 <sect2>
		<title>Les tables</title>
		<para>Une table permet le regroupement d'adresses au sein d'une même entité.  Les spécificités des tables par rapport aux listes standard sont les suivantes :
<itemizedlist>
    
			 <listitem>
				<para>
 Utilisation directe et multiple dans les règles, comparable à une macro</para></listitem>
     <listitem>
				<para> Les recherches d'une adresse sont beaucoup plus rapides (utilise moins de mémoire et de temps CPU qu'une simple liste)</para></listitem>
     <listitem>
				<para> Existence qui va au-delà du fichier de configuration où elles sont définies puisqu'elles résident ensuite en mémoire ce qui permet de leur appliquer des modifications au niveau de leur contenu. Ces modifications sont immédiatement prises en compte par Packet Filter sans avoir à recharger les règles ou à procéder à une quelconque manipulation.</para></listitem></itemizedlist>
</para>

		<sect3>
		  <title>Déclaration</title>

		  <para> Le contenu d'une table est sensiblement identique à celui que l'on peut fournir comme adresse source ou de destination dans les règles en temps normal. Il peut prendre les différentes formes suivantes :

<itemizedlist>
      <listitem>
				<para>Une adresse IP (version 4 comme 6), exemples : 192.168.0.1, 66.80.97.134</para></listitem>
      <listitem>
				<para>Une adresse en notation CIDR (version 4 comme 6) : 192.168.0.0/24</para></listitem>
      <listitem>
				<para>Un nom de machine  qui sera automatiquement remplacé par les adresses IP correspondantes (versions 4 et 6) à condition de pouvoir effectuer cette résolution (ne pas oublier de construire des règles visant à autoriser le trafic DNS)</para></listitem>
      <listitem>
				  <para>Le nom d'une interface (<varname>sis1</varname>, <varname>lo0</varname>, etc), qui sera substituée par la liste des adresses qui lui sont attribuées</para></listitem>
  
      <listitem>
				  <para>Le nom d'une interface suivie de <varname>:network</varname>, <varname>:broadcast</varname>, <varname>:peer</varname> ou <varname>:0</varname> correspondant respectivement à l'adresse réseau, l'adresse de broadcast, l'adresse d'un pair sur un lien point à point ou l'adresse principale affectée à une carte réseau (ne tient pas compte des alias)</para></listitem>
</itemizedlist>
</para>

<example>
			 <title>Exemples de tables  </title>
			 <programlisting width="80">	
<![CDATA[
table <dmz_hosts> const { \
        172.17.0.1/32,    \
        172.17.0.239/32,  \
        172.17.0.240/32   \
}
table <banned> persist	]]>
           </programlisting>
Dans le deuxième exemple, la tables banned est déclarée vide, mais persistante. On pourra donc ajouter à la volée des adresses dans cette table, et dans notre cas précis, interdire à des postes certains traffics. 
	  </example>

		  <para>La manipulation des tables est possible en utiisant la commande <command>pfctl</command> (voir chapitre précédent). </para>
		</sect3>
	 </sect2>

	 <sect2>
		<title>Options de normalisation et d'optimisations </title>
	
		<para>Dans un fichier de configuration de PF, il peut-être intéressant de spécifier un certrain nombre de valeurs, modifiant les réactions du firewall. Sont présentées les plus communes : 
<itemizedlist>
			 <listitem>
				<para><varname>block-policy</varname> : ce paramètre spécifie si les tentatives de connexion refusées sur des ports provoquent ou non un retour d'erreur (de type <parameter>connexion-refused</parameter>). Sa valeur peut-être <parameter>drop</parameter> (valeur par défaut) ou <parameter>return</parameter>. 
 <programlisting width="80">	
<![CDATA[set block-policy return	]]>
           </programlisting>
</para>
			 </listitem>
	       <listitem>
				<para><varname>skip</varname> : cette directive permet d'ignorer les règles sur une interface (typiquement la boucle locale).
 <programlisting width="80">	
<![CDATA[set skip on lo0	]]>
           </programlisting> </para>
			 </listitem>
	       <listitem>
				<para><varname>scrub</varname> : il est possible pour PF de normaliser une partie du traffic réseau en réassemblant des paquets fragmentés ou en en éliminant certains. L'utilisation commune de cette valeur est : 
 <programlisting width="80">	
<![CDATA[scrub in all	]]>
           </programlisting> 
 </para>
			 </listitem>
	       <listitem>
				<para>antispoof : cette directive permet de détecter et bloquer les tentatives d'usurpation d'adresse IP, sur les réseaux directement connectés à PF. Il permet par exemple de bloquer des paquets venant du WAN portant des adresses locales.
 <programlisting width="80">	
<![CDATA[
antispoof for $ext_if
antispoof for $int_if
	]]>
           </programlisting> 
</para>
			 </listitem>

		  </itemizedlist>
</para>
	 </sect2>



	 <sect2>
		<title>Translations d'adresses et redirections</title>
		<sect3>
		  <title>Translation d'adresses</title>
		  <para>Mécanisme indispensable à l'interconnexion de réseaux de différentes classes d'adresses, la translation d'adresse (NAT : Network Address Translation) permet de modifier les adresses sources du traffic, pour masquer par exemple la structure du LAN.  Dans l'exemple proposé en TP (cf. <xref linkend="sche1" /> schéma réseau), lors d'une connexion d'une machine du LAN (192.168.36/0/24) vers un serveur du WAN, la passerelle/pare-feu transmettrait le flux vers le WAN, en translatant l'adresse source vers sa propre adresse (172.17.0.1). Le traffic retour est alors automatiquement translaté de manière symétrique, et les paquets remis à la machine du LAN. </para>
		  <para>Sous PF, il est possible de déifnir sur quelles interfaces, pour quels flux, la translation d'adresse doit se faire. La syntaxe générale des règles NAT est la suivante : 
 <programlisting width="80">	
<![CDATA[nat [pass] [log] on interface [af] from src_addr [port src_port] to \
   dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] 
	]]>
           </programlisting>
          <itemizedlist>
				<listitem>
				  <para><varname>pass</varname> : désactive le filtrage pour les paquets translatés</para>
				</listitem>
				<listitem>
				  <para><varname>interface</varname> : l'interface sur laquelle les paquets sont translatés</para>
				</listitem>
				<listitem>
				  <para><varname>ext_addr</varname> : l'adresse (ou les adresses) sur laquelle les paquets sont translatés</para>
				</listitem>
			 </itemizedlist>
 </para>
		  <para>
<example>
				<title>Exemple de règle NAT</title>
			 <programlisting width="80">	
<![CDATA[
 ext_if = "re0"
int_if = "re1" 
localnet = $int_if:network
nat on $ext_if from $localnet to any -> ($ext_if)
block all
pass from { lo0, $localnet } to any keep state
	]]>
           </programlisting>
			 </example>
</para>
		</sect3>
		<sect3>
		  <title>Redirection de ports</title>
		  <para>La redirection de ports permet de rediriger les flux arrivant sur une interface, un port vers une machine physique, sur un port précis. Dans l'exemple proposé en TP (cf. <xref linkend="sche1" /> schéma réseau), le serveur WEB de la DMZ doit être joignable du WAN. IL faut donc rediriger les connexions sur le port HTTP vers le serveur WEB.  </para>

		  <para>
<example>
				<title>Exemple de règle de redirection</title>
			 <programlisting width="80">	
<![CDATA[
server = 192.168.1.40
rdr on $ext_if proto tcp from any to $ext_if port 80 -> $server \
   port 80 	]]>
           </programlisting>
			 </example>
</para>
		</sect3>
	 </sect2>



	 <sect2>
		<title>Filtrage  </title>
	
		<para>Les règles de filtrages sont examinées dans l'ordre d'apparition, la dernière règle correspondant au traffic examinée est appliquée. Si aucune règle ne correspond au paquet, la politique par défaut est appliquée. Dans le cas où le mot clef <varname>quick</varname> est passé dans la règle, la règle est immédiatement appliqué, sans parcourir le reste des règles. </para>

		<sect3>
		  <title>Politique par défaut</title>
		  <para>De manière générale, la politique par défaut d'un firewall est de bloqué tout traffic, puis d'autoriser unqiuement ce que l'on souhaite. 
<example>
			 <title>Politique par défaut </title>
			 <programlisting width="80">	
block in  all
block out all 
           </programlisting>
	  </example>

</para>
		</sect3>

		<sect3>
		  <title>Règles de filtrage </title>
		  <para>La syntaxe générale des règles est la suivante :
	 <programlisting width="80">	
<command>action [direction] [log] [quick] [on interface] [af] [proto protocol] \
   [from src_addr [port src_port]] [to dst_addr [port dst_port]] \
   [flags tcp_flags] [state] </command> </programlisting>

<itemizedlist>
				<listitem>
				  <para><command>action </command>: prend les mots clefs pass ou block</para>
				</listitem>
					<listitem>
				  <para><command>quick </command>: si le mot clef est présent et que le paquet correspond à la règle, l'action est immédiatement appliquée</para>
				</listitem>
					<listitem>
				  <para><command>on interface </command>: l'interface où a lieu le filtrage</para>
				</listitem>
					<listitem>
				  <para><command>state </command>: si la règle contient les mots clefs keep state, les paquets futurs correspondant à cet échange seront acceptés</para>
				</listitem>
			 </itemizedlist>

<example>
			 <title>Exemples de règles </title>
			 <programlisting width="80">	
<![CDATA[
pass in  on dc0 from 192.168.0.0/24 to 192.168.0.1
pass out on dc0 from 192.168.0.1 to 192.168.0.0/24
pass in on fxp0 proto tcp from any to fxp0 port www 
block in on fxp0 proto tcp from any to any port ssh
pass out on fxp0 proto tcp from any to any keep state 
]]>
           </programlisting>
	  </example>
</para>

		</sect3>

	 </sect2>


  </sect1>

  <sect1>
	 <title>TP</title>
	 <sect2>
		<title>Environnement</title>
		<para>Le TP peut-être réalisé pour des raisons de simplification de mise en oeuvre sur des machines virtuelles. Il s'agit de simuler un réseau LAN classique contenant : 
<itemizedlist>
			 <listitem>
				<para>LAN : une ou plusieurs machines simulant des postes de travail d'un LAN</para>
			 </listitem>
			 <listitem>
				<para>DMZ : un ou plusieurs serveurs abritant par exemple un serveur WEB, accessible depuis le WAN, et depuis le LAN en HTTP et SSH</para>
			 </listitem>
			 <listitem>
				<para>WAN : une machine simulant un poste sur Internet, qui pourra jouer le rôle d'un pirate ou d'un cilent WEB, et un serveur jouant le role de "site internet"</para>
			 </listitem>
		  </itemizedlist>
</para>
	 </sect2>
	 <sect2>
		<title>Schéma général du réseau</title>
		<para>
<figure id="sche1">
			 <title>Schéma du réseau</title>
			 <mediaobject>
				<imageobject>
				  <imagedata fileref="schema.jpg" format="JPEG"/>
				</imageobject>
			 </mediaobject>
		  </figure>
</para>
	 </sect2>
	 <sect2>
		<title>Travail à faire</title>
	<para>Les différents objectifs à atteindre : 
<itemizedlist>
			 <listitem>
				<para>Mise en place des réseaux : installation des machines (éventuellement virtuelles), des services (serveurs WEB, SSH, ...)</para>
			 </listitem>
			 <listitem>
				<para>Configuration de la passerelle : interconnexion des réseaux, tests (ICMP)</para>
			 </listitem>
			 <listitem>
				<para>Configuration du Firewall : filtrage des paquets en fonctions des réseaux, des services, etc ...</para>
			 </listitem>
		  </itemizedlist>
Charge aux stagiaires d'imaginer LEUR réseau ... 
</para>
	 </sect2>
  </sect1>

  <sect1>
	 <title>Un exemple de fichier pf.conf complet pour un serveur DNS  </title>
<para>
Le fichier de configuration suivant pourrait être appliqué à un serveur DNS. Certaines parties ont volontairement été supprimées. 
<example>
		  <title>Exemples d'un fichier <filename>pf.conf</filename> </title>
			 <programlisting witdh="100" >	
<![CDATA[

### ==========================================================================
### Macros: define common values, so they can be referenced and changed easily.
### ==========================================================================

dmz_if="xl0"
vlan_if="vlan30"

ssh_port="3022"
unPrivPorts="{ 1024 >< 65535 }"

proxy_p="3128"
ftp_RP="{ ftp, 30000:40000 }"

### ==========================================================================
### Tables: similar to macros, but more flexible for many addresses.
### ==========================================================================

table <ssh_host> const { \
        172.17.0.1/32,   \
        172.17.0.239/32, \
        172.17.0.240/32  \
} 

table <dmz_net> const {  \
        172.17.0.1/32,   \
        172.17.0.126/32, \
        172.17.0.200/32, \
        172.17.0.201/32, \
        172.17.0.223/32, \
        172.17.0.225/32, \
        172.17.0.228/31, \
        172.17.0.230/32, \
        172.17.0.231/32, \
        172.17.0.232/32, \
        172.17.0.233/32, \
        172.17.0.234/32  \
        172.17.0.237/32, \
        172.17.0.239/32, \
        172.17.0.240/28  \
}

table <auth_net> const { \
        172.17.1.0/25,   \
        172.17.2.0/25,   \
        172.17.3.0/25,   \
        172.17.4.0/25,   \
        172.17.5.0/25,   \
        172.17.6.0/25,   \
}

table <ftp_srv> const { 217.109.43.210/32 }

table <smtp_srv> const { 172.17.0.247/32 }

table <master_dns> const { 172.17.0.253/32 }

table <proxy_srv> const { 172.17.0.234/32 }

### ==========================================================================
### Options: tune the behavior of pf, default values are given.
### ==========================================================================

set limit { states 12000, frags 5000 }
set loginterface $dmz_if 
set optimization normal
set block-policy drop
set require-order yes
set fingerprints "/etc/pf.os"
set skip on lo


### ==========================================================================
### Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
### ==========================================================================

scrub in all random-id
scrub on $dmz_if all reassemble tcp
### ==========================================================================
### Filtering: authorized all on the loopback interface 
### ==========================================================================

#block quick inet6 all
block in quick log on $dmz_if from <banned_hosts>
block log all

antispoof log quick for { lo0 $dmz_if } inet

pass in  quick on $dmz_if inet proto tcp from <ssh_host> \
        to $dmz_if port $ssh_port flags S/SA modulate state

pass in  quick on $dmz_if inet proto { tcp, udp } from <dmz_net> \
        to $dmz_if port domain keep state

pass in  quick on $dmz_if inet proto { tcp, udp } from <auth_net> \
        to $dmz_if port domain keep state

pass out quick on $dmz_if inet proto tcp from $dmz_if port $unPrivPorts \
        to <smtp_srv> port smtp \
        flags S/SA modulate state

pass out quick on $dmz_if inet proto udp from $dmz_if port syslog \
        to <gkar_srv> port syslog 

pass out quick on $dmz_if inet proto udp from $dmz_if port domain \
        to <master_dns> port domain \
        keep state

pass out quick on $dmz_if inet proto udp from $dmz_if port $unPrivPorts \
        to any port domain \
        keep state

pass out quick on $dmz_if inet proto udp from $dmz_if to \
        <ntp_srv> port ntp keep state

pass out quick on $dmz_if inet proto tcp from $dmz_if port $unPrivPorts \
        to <proxy_srv> port $proxy_p \
        flags S/SA modulate state

pass out quick on $dmz_if inet proto tcp from $dmz_if port $unPrivPorts \
        to <ftp_srv> port $ftp_RP \
        flags S/SA modulate state

pass out quick on $dmz_if inet proto tcp from $dmz_if port domain \
        to <master_dns> port domain \
        flags S/SA modulate state

pass out quick on $dmz_if inet proto { tcp, udp } from $dmz_if  \
        to any port domain keep state   

pass out quick on $dmz_if inet proto icmp from $dmz_if \
        to any keep state

pass in quick on $vlan_if inet proto { udp, tcp } from <ext_lan> port $unPrivPorts \
        to $vlan_if port domain \
        keep state
 
pass in quick on $vlan_if inet proto icmp from <ext_lan> \
        to $vlan_if keep state

pass out quick on $vlan_if inet proto icmp from $vlan_if \
        to <ext_lan> keep state

	]]>
</programlisting>
</example>
</para>

  </sect1>


  <!-- =================================================================== -->
  <bibliography> 
    <title>Références</title> 

    <bibliodiv> 
      <biblioentry>
 	<title>Firewalls - Pascal Picard</title> 
 	<edition> 
 	  <ulink url="http://zero202.free.fr/cs9-fire/html/"></ulink> 
         </edition> 
      </biblioentry> 
    <biblioentry>
 	<title>FAQ OpenBSD</title> 
 	<edition> 
 	  <ulink url="http://www.openbsd.org/faq/pf/index.html"></ulink> 
         </edition> 
      </biblioentry> 
    <biblioentry>
 	<title>PF - Peter N. M. Hansteen</title> 
 	<edition> 
 	  <ulink url="http://home.nuug.no/~peter/pf/en/index.html"></ulink> 
         </edition> 
      </biblioentry>
    <biblioentry>
 	<title>The Book of PF - NO STARCH PRESS </title> 
 	<edition> 
 	  <ulink url="http://nostarch.com/frameset.php?startat=pf">Peter N.M. Hansteen</ulink> 
         </edition> 
      </biblioentry>

    </bibliodiv> 
  </bibliography> 
 </article>
