25 avril 2024

Mirroring réseau avec OpenVSwitch

Dans cet article, nous allons parler mirroring, ou l’art de dupliquer les paquets réseau.

I – Problématique

Lors de mes tests avec Suricata, j’ai été confronté à un soucis de performance. En effet, en mettant ce dernier directement sur mon routeur, celui accusait une petite latence qui me faisait perdre des paquets. Du coup, j’ai du trouver une solution palliative, et c’est ainsi que le mirroring m’est apparu comme une solution viable.

J’ai tout d’abord testé la méthode Iptable (et oui, on peut !) mais celle ci n’était pas des plus convaincantes…

Pour info, il faut rajouter ces lignes la par ex…

iptables -t mangle -A INPUT -j TEE --gateway 10.10.1.3
iptables -t mangle -A FORWARD -j TEE --gateway 10.10.1.3
iptables -t mangle -A PREROUTING -j TEE --gateway 10.10.1.3
iptables -t mangle -A POSTROUTING -o eth0 -j TEE --gateway 10.10.1.3

Malheureusement, dans mon cas, cela engendre encore des pertes de paquets…

Bref….

OpenVswitch se voulant similaire en terme de fonctionnalités aux switchs hardware, il était évident que le SPAN (Switched Port ANalyzer), ou mirroring était LA solution.

Dans mon cas, je bosse avec plusieurs bridge (voir mes articles sur Xen). Br0 étant le switch qui est relie ma VM Routeur à l’extérieur et Brint étant mon switch interne qui relie mes autres VMs.

Impossible de faire du mirroring entre deux switchs, ce qui aurait été pourtant pratique dans mon cas.

J’ai testé également une solution qui consistait à créer un switch supplémentaire Brmonit, puis en créant des patchs port entre br0 et brmonit, puis ensuite en branchant une interface de l’IDS sur ce nouveau switch et à mirrorer, etc… ça ne fonctionnait pas.

 

II – Solution

Mon IDS aura donc une interface sur le switch Br0 mais sans IP dessus ( Il faut éviter tout flux sortant dessus sinon Online va me couper le port réseau de ma box. En effet, la Mac que je déclare est « bidon » et inconnue de chez eux.)

Pour rappel, voila la configuration réseau de mon routeur dans xen :

vif = [ 'vifname=routeur.0,ip=IPFO1 ,mac=MACFO1,bridge=br0',
        'vifname=routeur.1,ip=10.10.1.2 ,mac=00:16:3E:A0:02:02,bridge=brint.10',
        'vifname=routeur.2,ip=10.20.1.2 ,mac=00:16:3E:A0:02:20,bridge=brint.20',
        'vifname=routeur.3,ip=10.99.1.2 ,mac=00:16:3E:A0:02:99,bridge=brint.99',
        'vifname=routeur.4,ip=IPFO2,mac=MACFO2,bridge=br0']

Et voila la configuration de mon ids dans xen (j’ai rajouté l’interface ids.4

vif = [ 'vifname=ids.0,ip=10.10.1.3 ,mac=00:16:3E:A0:05:10,bridge=brint.10',
        'vifname=ids.1,ip=10.20.1.3 ,mac=00:16:3E:A0:05:20,bridge=brint.20',
        'vifname=ids.3,ip=10.99.1.3 ,mac=00:16:3E:A0:05:99,bridge=brint.99',
        'vifname=ids.4,ip=10.99.99.99 ,mac=00:16:3E:00:1B:2B,bridge=br0']

Coté IDS, dans le fichier /etc/network/interfaces, j’ai ajouté :

auto eth3
 iface eth3 inet manual

Je veux donc répliquer le trafic qui passe sur routeur.0 vers ids.4. Il faut donc taper cette commande :

dom0# ovs-vsctl -- set Bridge br0 mirrors=@m -- --id=@routeur.0 get Port routeur.0 -- --id=@ids.4 get Port ids.4 -- --id=@m create Mirror name=monmiroir select-dst-port=@routeur.0 select-src-port=@routeur.0 output-port=@ids.4

Autre exemple, si je veux voir tout le trafic de l’ensemble des ports d’un switch (exemple avec un ids interne que j’ai branché sur mon switch interne brint, ou le port idsint.4 sera le port qui recevra l’ensemble du traffic :

dom0# ovs-vsctl -- set Bridge brint mirrors=@m -- --id=@idsint.4 get Port idsint.4 -- --id=@m create Mirror name=monautremiroir select_all=1 output-port=@idsint.4

Et voila. Un tcpdump sur l’interface en question dans la VM IDS devrait vous montrer tous les paquets…

ids# tcpdump -i eth3

Pour information, vous pouvez connaitre les miroirs sur un switch avec :

dom0# ovs-vsctl list Bridge nomduswitch

Et pour les effacer :

dom0# ovs-vsctl clear Bridge nomduswitch mirrors

 

Article sur Suricata à venir prochainement !

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *