Anatomie d’une architecture (4)

Conception d’un Firewall Rouge en Haute-Disponiblité (2ème Partie)

Je considère que vos deux futures firewalls son prêt, sous OpenBSD et dispose au minimum de 3 cartes réseaux.

CARP est un protocole permettant à un même groupe d’hôtes de partager la même adresse IP.

Il supporte Ipv4 et Ipv6, mais personnellement, je bloque tout les flux ipv6 actuellement.

NB : je vous invite si vous avez le temps à lire l’Ipv6 Security Guide de Juniper.

Si vous avez activé PF (PacketFilter), n’oubliez pas d’autoriser le protocole CARP :

pass out on $carp_dev proto carp keep state

Dans votre fichier /etc/sysctl.conf, ajouter les entrées suivantes :

net.inet.carp.preempt=1
net.inet.carp.allow=1

Pour les insérer à chaud :

# sysctl -w net.inet.carp.allow=1

Maintenant sur chaque Firewall, nous allons créer l’interface CARP côté rouge :

# ifconfig carp0 create

Puis configurer l’interface (dans un fichier également hostname.carp0 pour qu’il soit effectif au reboot) :

#ifconfig carp0 vhid 1 pass motdepasse carpdev sis0 advskew 1 192.168.0.1 netmask 255.255.255.0

Dans le fichier :

inet 192.168.0.1 255.255.255.0 192.168.0.255 vhid 1 carpdev sis0 advskew 1 pass motdepasse

Sur le deuxième Firewall, changer la valeur advskew de 1 à 100.

Explications :

VHID : C’est l’identifiant unique qui unit les deux interfaces du groupe de firewall.

CARPDEV : l’interface sur laquelle monter le CARP

ADVSKEW : Plus grand est ce nombre moins de chance cette interface à d’être le maître au démarrage

ADVBASE (optionnel): délai en seconde de vérification de l’état des cartes (1 seconde par défaut)

Un petit ifconfig sur le maître (advskew = 1) :

carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr 00:00:5e:00:01:01
carp: MASTER carpdev sis0 vhid 1 advbase 1 advskew 1
groups: carp
inet6 fe80::200:5eff:fe00:101%carp0 prefixlen 64 scopeid 0x6
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255

Sur l’esclave :

carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr 00:00:5e:00:01:01
carp: BACKUP carpdev em0 vhid 1 advbase 1 advskew 100
groups: carp
inet6 fe80::200:5eff:fe00:101%carp0 prefixlen 64 scopeid 0x6
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255

Maintenant, débrancher le cable réseau , arreter le ou un ifconfig carp0 down sur le maître :

# ifconfig carp0 down

#ifconfig

carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr 00:00:5e:00:01:01
carp: INIT carpdev sis0 vhid 1 advbase 1 advskew 1
groups: carp
inet6 fe80::200:5eff:fe00:101%carp0 prefixlen 64 scopeid 0x6
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255

Sur l’esclave, vous devriez voir l’interface CARP0 passée en MASTER en 1 seconde et si vous faites un test ping d’une autre machine sur le 192.168.0.1, vous ne devriez quasiment rien voir.

Magique 😀

Mais maintenant vous vous dites, « oui mais si j’ai du trafic sur mon firewall-A ??? » et là je vous réponds « pfsync ».

Pfsync permet de synchroniser les états firewalls entre les deux noeuds du cluster.

Dans la cas d’un basculement, le trafic n’est pas interrompu.

Comme pour CARP, nous autorisons PFSYNC dans nos règles PF :

pass on $sync_if proto pfsync

Sur les deux firewalls, nous dédions une interface réseau à pfsync (les deux FW reliés par un cable croisé par exemple) :

# ifconfig pfsync0 syncdev sis2
# ifconfig pfsync0 up

PS: Cela marche aussi sur un lien série 😉

Par défaut psync fait du multicast. Je vous conseille fortement d’utiliser l’attribut « syncpeer x.x.x.x » pour spécifier l’ip de l’autre Firewall :

# ifconfig pfsync0 syncpeer 192.168.0.5 syncdev sis2

Dans une politique de sécurité poussée, vous devriez utiliser IPsec pour encapsuler les flux psync entre les deux firewalls.

Et voila comment en quelques minutes, vous avez montée un Firewall en haute-disponibilité et entièrement redondant.

Vous ferez les mêmes manipulations côtés pattes Vertes afin d’avoir une HA coté LAN aussi :

    +----|   WAN/Internet |-------+
         |                        |
     sis0|                        |sis0
      +-----+                  +-----+
      | fw1 |-sis2--------sis2-| fw2 |
      +-----+                  +-----+
     sis1|                        |sis1
         |                        |
      ---+----------LAN-----------+---


Nous avons donc maintenant une VIP coté rouge en 192.168.0.1

C’est sur cette IP que vous allez configurér la Freebox en mode… DMZ.

Tout ce qui arrivera sur votre Freebox en entrée, sera redirigé sur votre cluster de Firewall. Ce qui vous permettra de gérer vos translations de port sans avoir à rebooter la Freebox… Ni vos Firewalls d’ailleurs, il est abérant de devoir rebooter un équipement réseau pour appliquer une règle réseau.

NB: Vous pouvez également ne rediriger sur 192.168.0.1 que des plages de porst, l’avantage est de laisser la Freebox bloquer les ports « pourris » (135,139 etc…) et donc d’avoir un premier étage Rouge de blocage.

Ne vous reste plus qu’à configurer votre /etc/pf.conf (le fichier de configuration de PacketFilter) :

Lire PF pour les nuls

Exemple de règle sur une interface CARP :

pass in quick inet proto udp from any to carp1 port 123

Je vous laisse peaufiner votre fichier de configuration PF afin de répondre au mieux à vos propres règles firewall.

A faire, ajouter une autre carte réseau sur vos deux firewalls et monter une interface CARP2 Jaune pour votre DMZ 😀

Petit exemple en dessin :

Schema

Prochaine étape, monter le Firewall Vert qui contrôlera les flux inter-vlans et les sorties sur Internet.

Ce billet a été posté dans OpenBSD, sécurité. Bookmark le permalink.

Comments are closed.