<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lolo's blog &#187; Firewall</title>
	<atom:link href="http://blog.unix-scripts.info/category/firewall/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.unix-scripts.info</link>
	<description></description>
	<lastBuildDate>Sun, 31 Jan 2010 19:13:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ah completel&#8230;. et le BGP</title>
		<link>http://blog.unix-scripts.info/2009/09/03/ah-completel-et-le-bgp/</link>
		<comments>http://blog.unix-scripts.info/2009/09/03/ah-completel-et-le-bgp/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 21:52:25 +0000</pubDate>
		<dc:creator>blog</dc:creator>
				<category><![CDATA[Firewall]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.unix-scripts.info/?p=160</guid>
		<description><![CDATA[Ma nouvelle fibre Completel (bah oui, c&#8217;est pas si cher&#8230;) a été installée aujourd&#8217;hui, apres pas mal de péripeties (amiante, autorisations administratives, &#8230;). Vient la conf du routeur. Le NOC Completel envoie au technicien sur site une conf Cisco. Malheureusement&#8230; &#8230; <a href="http://blog.unix-scripts.info/2009/09/03/ah-completel-et-le-bgp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ma nouvelle fibre Completel (bah oui, c&#8217;est pas si cher&#8230;) a été installée aujourd&#8217;hui, apres pas mal de péripeties (amiante, autorisations administratives, &#8230;).</p>
<p>Vient la conf du routeur.</p>
<p>Le NOC Completel envoie au technicien sur site une conf Cisco. Malheureusement&#8230; la conf n&#8217;est pas bonne (interfaces shutdown, &#8230;). Bref, le client (moi) rectifie la conf. Le peer est enfin accessible depuis le routeur.</p>
<p>Le routeur n&#8217;est par contre pas accessible depuis une liaison internet quelconque.</p>
<p>Appel au support, oui, la plage n&#8217;est pas routée sur notre réseau mais ça n&#8217;est pas grave, vous allez faire du BGP.</p>
<p>Hmmmmm, ok, soit, je vais faire du BGP, mais si la plage d&#8217;interco n&#8217;est pas routée sur le réseau de l&#8217;opérateur &#8230;.</p>
<p>Encor un bel exemple d&#8217;incompétence de Completel&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unix-scripts.info/2009/09/03/ah-completel-et-le-bgp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passerelle Haute dispo sous OpenBSD</title>
		<link>http://blog.unix-scripts.info/2008/08/22/passerelle-haute-dispo-sous-openbsd/</link>
		<comments>http://blog.unix-scripts.info/2008/08/22/passerelle-haute-dispo-sous-openbsd/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 18:38:46 +0000</pubDate>
		<dc:creator>blog</dc:creator>
				<category><![CDATA[Firewall]]></category>
		<category><![CDATA[OpenBSD]]></category>

		<guid isPermaLink="false">http://blog.unix-scripts.info/?p=125</guid>
		<description><![CDATA[OpenBSD c&#8217;est bien, mangez en, enfin, installez le. Je serai presque devenu barbu. Passons aux choses sérieuses: Les contraintes: - Passrelle redondante (carp) - Firewall performant (pf) - Connexion WAN redondante (ifstated) - Gestion de VPN (IPSEC et/ou SSL) (racoon, &#8230; <a href="http://blog.unix-scripts.info/2008/08/22/passerelle-haute-dispo-sous-openbsd/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>OpenBSD c&#8217;est bien, mangez en, enfin, installez le.</p>
<p>Je serai presque devenu barbu.</p>
<p>Passons aux choses sérieuses:</p>
<p>Les contraintes:<br />
- Passrelle redondante (carp)<br />
- Firewall performant (pf)<br />
- Connexion WAN redondante (ifstated)<br />
- Gestion de VPN (IPSEC et/ou SSL) (racoon, openvpn)<br />
- Alerte par mail en cas de défaillance d&#8217;un ISP (postfix)<br />
- Partage de la table d&#8217;etat des connexions entre les 2 machines (pfsync)</p>
<p>Nous commençons par l&#8217;installation d&#8217;OpenBSD sur 2 machines de test (avant mise en prod sur des serveurs dignes de ce nom).</p>
<p>Ces machines sont des dc7700 de chez hp.</p>
<p>Un bug dans la gestion ACPI empeche une installation par défaut d&#8217;OpenBSD (comme linux d&#8217;ailleurs).</p>
<p>Au boot, nous allons donc désactiver l&#8217;acpi</p>
<p><code><br />
boot -c<br />
>disable acpi<br />
>quit<br />
</code></p>
<p>Nous pouvons installer OpenBSD sans problème &#8230;. enfin presque&#8230; il est nécessaire de choisir un miroir http ou ftp pour ne pas faire échouer l&#8217;installation car le CD-Rom n&#8217;est pas très bien pris en charge.</p>
<p>Au reboot, à la fin de l&#8217;installation, il ne faut pas oublier de désactiver, à nouveau, l&#8217;acpi</p>
<p>Une fois la machine bootée nous modifions le kernel pour que cette modification soit prise en compte lors du boot<br />
<code><br />
# config -e -o bsd.new /bsd<br />
>disable acpi<br />
>quit<br />
#cp bsd.new /bsd &#038;&#038; reboot<br />
</code></p>
<p>Il faudra procéder à une installation identique sur la 2eme machine.</p>
<p>Ces 2 machines s&#8217;appelleront fw-001 et fw-002<br />
Les adresses ip seront:<br />
fw-001:<br />
<code><br />
192.168.0.192 pour em0<br />
192.168.0.140 pour carp0<br />
212.0.0.3 pour carp1<br />
213.0.0.3 pour carp2<br />
212.0.0.1 pour fxp0 (ISP1)<br />
213.0.0.1 pour ste0 (ISP2)<br />
</code></p>
<p>fw-002:<br />
<code><br />
192.168.0.193 pour em0<br />
192.168.0.140 pour carp0<br />
212.0.0.3 pour carp1<br />
213.0.0.3 pour carp2<br />
212.0.0.2 pour fxp0 (ISP1)<br />
213.0.0.2 pour ste0 (ISP2)<br />
</code></p>
<p>Configurons les interfaces de fw-001:<br />
Contenu de /etc/hostname.carp0<br />
<code><br />
inet 192.168.0.140 255.255.255.0 192.168.0.255 vhid 1 carpdev em0 pass youpilesamis<br />
</code></p>
<p>Contenu de /etc/hostname.carp1<br />
<code><br />
inet 212.0.0.3 255.255.255.0 212.0.0.255 vhid 2 carpdev fxp0 pass youpilesamiswan<br />
</code></p>
<p>Contenu de /etc/hostname.carp2<br />
<code><br />
inet 213..0.0.3 255.255.255.0 213.0.0.255 vhid 3 carpdev ste0 pass youpilesamisnm<br />
</code></p>
<p>Contenu de /etc/hostname.fxp0<br />
<code><br />
inet 212.0.0.1 255.255.255.0 212.0.0.255 description WAN-001<br />
! route add default 212.0.0.254 -mpath<br />
</code></p>
<p>Contenu de /etc/hostname.em0<br />
<code><br />
inet 192.168.0.192 255.255.255.0 192.168.0.255 description LAN-001<br />
</code></p>
<p>Contenu de /etc/hostname.pfsync0<br />
<code><br />
up syncdev ste2<br />
</code></p>
<p>Contenu de /etc/hostname.ste0<br />
<code><br />
inet 213.0.0.1 255.255.255.0 213.0.0.255 description WAN-001<br />
! route add default 213.0.0.254 -mpath<br />
</code></p>
<p>Configurons les interfaces de fw-002:<br />
Contenu de /etc/hostname.carp0<br />
<code><br />
inet 192.168.0.140 255.255.255.0 192.168.0.255 vhid 1 carpdev em0 advskew 100 pass youpilesamis<br />
</code></p>
<p>Contenu de /etc/hostname.carp1<br />
<code><br />
inet 212.0.0.3 255.255.255.0 212.0.0.255 vhid 2 carpdev fxp0 advskew 100 pass youpilesamiswan<br />
</code></p>
<p>Contenu de /etc/hostname.carp2<br />
<code><br />
inet 213..0.0.3 255.255.255.0 213.0.0.255 vhid 3 carpdev ste0 advskew 100 pass youpilesamisnm<br />
</code></p>
<p>Contenu de /etc/hostname.fxp0<br />
<code><br />
inet 212.0.0.2 255.255.255.0 212.0.0.255 description WAN-002<br />
! route add default 212.0.0.254 -mpath<br />
</code></p>
<p>Contenu de /etc/hostname.em0<br />
<code><br />
inet 192.168.0.193 255.255.255.0 192.168.0.255 description LAN-002<br />
</code></p>
<p>Contenu de /etc/hostname.pfsync0<br />
<code><br />
up syncdev ste2<br />
</code></p>
<p>Contenu de /etc/hostname.ste0<br />
<code><br />
inet 213.0.0.2 255.255.255.0 213.0.0.255 description WAN-002<br />
! route add default 213.0.0.254 -mpath<br />
</code></p>
<p>Note: Il est <strong>imperatif</strong> de laisser /etc/mygate vide afin de ne pas avoir une seule et unique route vers le WAN.</p>
<p>Il est temps de lancer les connexions réseau:<br />
<code><br />
#sh /etc/netstart<br />
</code></p>
<p>Nous pouvons pinguer l&#8217;exterieur, mais les machines de l&#8217;exterieur ne peuvent pas pinguer notre passerelle de manière fiable (probleme de reverse path).</p>
<p>Nous allons donc créer une conf pf afin de regler ce problème:</p>
<p><code><br />
#Variables<br />
#192.168.0.1 -> 254<br />
lan_net = "192.168.0.0/24"<br />
#Interfaces LAN + 2WAN<br />
int_if  = "em0"<br />
ext_if1 = "fxp0"<br />
ext_if2 = "ste0"<br />
#Gateway wan 1<br />
ext_gw1 = "212.0.0.254"<br />
#Interface de synchro carp<br />
sync_carp = "ste2"<br />
#Loopback<br />
loopback_if = "lo0"<br />
#Adresses carp (flottantes)<br />
ext_carp1 = "212.0.0.3"<br />
ext_carp2 = "213.0.0.3"<br />
ext_gw2 = "213.0.0.254"<br />
admin_net = "{ VOS IP DES MACHINES POUVANT FAIRE DU SSH }"<br />
admin_ports = "{ 22, 1022 }"<br />
#DNS de mon LAN<br />
dns_servers = "{ 192.168.0.1/32, 192.168.0.2/31 }"</p>
<p>#Ne rien filtere ni sur lo0 ni sur l'interface de synchro (cable croisé)<br />
set skip on {$loopback_if, $sync_carp}</p>
<p>#On normalise les paquets entrants par le WAN (1+2)<br />
scrub log on {$ext_if1, $ext_if2} all random-id min-ttl 254 max-mss 1452 reassemble tcp fragment reassemble</p>
<p>#On autorise les machines du LAN à sortir sur internet en NAT (Attention cette pratique est déconseillée pour des machines Windows)<br />
nat on $ext_if1 from $lan_net to any -> $ext_carp1<br />
nat on $ext_if2 from $lan_net to any -> $ext_carp2</p>
<p>#Policy par défaut<br />
#On bloque tout ce qui n'a pas été autorisé<br />
block  in log  from any to any<br />
block out log from any to any</p>
<p>#On autorise pfsync et carp à communiquer sur les interfaces voulues<br />
pass quick on { $sync_carp } proto pfsync keep state (no-sync)<br />
pass on { $ext_if1 $ext_if2 $int_if } proto carp keep state</p>
<p>#Pour transmettre les paquets de la passerelle au LAN<br />
pass out on $int_if from any to $lan_net</p>
<p>#Paquets pour la passerelle<br />
pass in quick on $int_if from $lan_net to $int_if</p>
<p>#Sortie sur wan1, puis wan2, puis wan1, ...<br />
#NAT -> Sortie<br />
# en TCP<br />
pass in on $int_if route-to \<br />
    { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \<br />
    proto tcp from $lan_net to any flags S/SA modulate state</p>
<p># en UDP + ICMP<br />
pass in on $int_if route-to \<br />
    { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \<br />
    proto { udp, icmp } from $lan_net to any keep state</p>
<p># On autorise les requetes DNS et les connexions de la passerelle vers le LAN<br />
pass out quick on $int_if inet proto { tcp, udp } to $dns_servers port domain keep state<br />
pass out quick on $int_if inet proto tcp to $lan_net port ssh keep state</p>
<p># Permet de pinguer la passerelle de l'exterieur sur ses 2 interfaces et avoir un chemin de retour cohérent<br />
pass in on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto icmp icmp-type {echoreq, echorep} keep state<br />
pass in on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto icmp icmp-type {echoreq, echorep} keep state</p>
<p>#Administration distante (SSH)<br />
pass in on $ext_if1 reply-to ($ext_if1 $ext_gw1) inet proto tcp from $admin_net port $admin_ports keep state<br />
pass in on $ext_if2 reply-to ($ext_if2 $ext_gw2) inet proto tcp from $admin_net port $admin_ports keep state</p>
<p># Regles de sortie de la passerelle<br />
pass out on $ext_if1 proto icmp keep state<br />
pass out on $ext_if2 proto icmp keep state<br />
pass out on $ext_if1 proto {tcp, udp} keep state<br />
pass out on $ext_if2 proto {tcp, udp} keep state<br />
</code></p>
<p>Une fois ce fichier créé, il faut activer pf:<br />
<code><br />
#pfctl -f /etc/pf.conf &#038;&#038; pfctl -e<br />
</code></p>
<p>Il faudra répliquer ces opération sur la 2eme machine.</p>
<p>Il est important de modifier certaines valeurs de /etc/sysctl.conf<br />
<code><br />
net.inet.ip.forwarding=1<br />
net.inet.carp.allow=1    # Allow the firewall to accept CARP packets<br />
net.inet.ip.multipath=1 # MultiPath<br />
net.inet.carp.preempt=1 # 1=Enable carp(4) preemption<br />
</code><br />
&#8230;et /etc/rc.conf.local<br />
<code><br />
netd=NO<br />
pf=YES<br />
pflog_enable=YES<br />
</code></p>
<p>Une fois ces opérations faites et les machines rebootées, tout doit fonctionner.</p>
<p>C&#8217;est bien beau tout ça, mais si une connexion WAN &#8220;tombe&#8221; nous routons toujours en round robin vers les 2 connexions.</p>
<p>Il faut donc détecter cette défaillance.</p>
<p>Nous utiliserons pour cela le demon ifstated<br />
Contenu de /etc/ifstated.conf<br />
<code><br />
ext1_connectivity = '( "ping -q -c 1 -w 1 myexternal_host > /dev/null" every 3)'<br />
ext2_connectivity = '( "ping -q -c 1 -w 1 my2ndexternal_host > /dev/null" every 3)'</p>
<p>state ext1ok_ext2ok {<br />
    init {<br />
        run "logger C1OK C2OK"<br />
        run "route delete default 212.0.0.254 -mpath"<br />
        run "route delete default 213.0.0.254 -mpath"<br />
        run "route add default 212.0.0.254 -mpath"<br />
        run "route add default 213.0.0.254 -mpath"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf.conf_ok_ok pf_state.conf"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf_nat_state.conf_ok_ok pf_nat_state.conf"<br />
        run "pfctl -f /etc/pf.conf"<br />
    }<br />
    if $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1ok_ext2nok<br />
    }<br />
    if ! $ext1_connectivity &#038;&#038; $ext2_connectivity {<br />
    set-state ext1nok_ext2ok<br />
    }<br />
    if ! $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1nok_ext2nok<br />
    }<br />
}</p>
<p>state ext1ok_ext2nok {<br />
    init {<br />
        run "logger C OK -- C N-OK"<br />
        run "route delete default 212.0.0.254 -mpath"<br />
        run "route delete default 213.0.0.254 -mpath"<br />
        run "route add default 212.0.0.254 -mpath"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf.conf_ok_nok pf_state.conf"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf_nat_state.conf_ok_nok pf_nat_state.conf"<br />
        run "pfctl -f /etc/pf.conf"<br />
    }</p>
<p>    if $ext1_connectivity &#038;&#038; $ext2_connectivity {<br />
    set-state ext1ok_ext2ok<br />
    }</p>
<p>    if ! $ext1_connectivity &#038;&#038; $ext2_connectivity {<br />
    set-state ext1nok_ext2ok<br />
    }</p>
<p>    if ! $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1nok_ext2nok<br />
    }</p>
<p>}</p>
<p> state ext1nok_ext2ok {<br />
    init {<br />
        run "logger Completel C NOK -- C OK"<br />
        run "route delete default 212.0.0.254 -mpath"<br />
        run "route delete default 213.0.0.254 -mpath"<br />
        run "route add default 213.0.0.254 -mpath"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf.conf_nok_ok pf_state.conf"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf_nat_state.conf_nok_ok pf_nat_state.conf"<br />
        run "pfctl -f /etc/pf.conf"<br />
    }</p>
<p>    if $ext1_connectivity &#038;&#038; $ext2_connectivity {<br />
    set-state ext1ok_ext2ok<br />
    }</p>
<p>    if $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1ok_ext2nok<br />
    }</p>
<p>    if ! $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1nok_ext2nok<br />
    }<br />
 }</p>
<p> state ext1nok_ext2nok {<br />
    init {<br />
        run "logger N-OK --  N-OK"<br />
        run "route delete default 212.0.0.254 -mpath"<br />
        run "route delete default 213.0.0.254 -mpath"<br />
        run "route add default 212.0.0.254 -mpath"<br />
        run "route add default 213.0.0.254 -mpath"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf.conf_nok_nok pf_state.conf"<br />
        run "cd /etc/pf &#038;&#038; ln -fs pf_nat_state.conf_nok_nok pf_nat_state.conf"<br />
        run "pfctl -f /etc/pf.conf"<br />
    }</p>
<p>    if $ext1_connectivity &#038;&#038; $ext2_connectivity{<br />
    set-state ext1ok_ext2ok<br />
    }</p>
<p>    if $ext1_connectivity &#038;&#038; ! $ext2_connectivity {<br />
    set-state ext1ok_ext2nok<br />
    }</p>
<p>    if ! $ext1_connectivity &#038;&#038; $ext2_connectivity {<br />
    set-state ext1nok_ext2ok<br />
    }</p>
<p> }</p>
<p></code><br />
Les 4 blocs state ext&#8230; correspondent aux 4 états possibles des 2 connexions:<br />
- Up + Up<br />
- Up + Down<br />
- Down + Up<br />
- Down + Down</p>
<p>Nous avons donc maintenant une passerelle redondante faisant de la NAT du CARP, du PFSYNC (synchronisation des tables du firewall).</p>
<p>Reste à ajouter les VPN, un proxy pour les postes du LAN</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unix-scripts.info/2008/08/22/passerelle-haute-dispo-sous-openbsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
