Envoyé par unreal
Introduction
PF ou Packet Filter est le firewall développé par OpenBSD, puis porté vers divers systèmes d'exploitation, dont FreeBSD.
Comme OpenBSD peut souffrir de problèmes de performances en firewall à forte charge, nous allons étudier dans cet article le remplacement d'un firewall/forwarder de paquets sous OpenBSD par un système FreeBSD pour voir l'éventuel gain de performance que cela peut amener.
Configuration
Matérielle :
Cette configuration relativement ancienne a été choisie afin de mieux apprécier les différences de performances.
Logicielle :
Les 2 OS ont été compilés avec les optimisations d'usage (-march=athlon-xp...).
Banc de test
L'image suivante montre le plan du réseau :
Les tests de performances se font entre 192.168.100.2 et nas.localdomain ; la gw par défaut étant hell.localdomain, il faut donc ajouter une route sur nas pour assurer le retour des paquets :
On peut vérifier que la route est présente avec netstat :
Ensuite, pour activer le mode routage (forwarding) sur pffw il convient de jouer avec sysctl :
(pour que cette configuration résiste au reboot, sous FreeBSD il faut ajouter gateway_enable="YES" dans /etc/rc.conf et sous OpenBSD, il faut décommenter la ligne net.inet.ip.forwarding=1 dans /etc/sysctl.conf.)
Test de routage
Le premier test consistera à faire un transfert FTP de nas à la machine 192.168.100.2 avec pffw configuré en routeur pur. Pendant le transfert, on contrôle plusieurs chose :
Comme la charge est quelque peu variable, j'ai configuré un refresh de top toutes les cinq secondes et fait une moyenne sur 30 mesures consécutives.
Résultats :
Naturellement, la charge CPU est presque totalement du I/O wait au niveau des interfaces réseau.
Test de firewall + routage
Voici les règles de filtrage :
Il s'agit d'un ruleset assez simple par soucis de lisibilité, cependant, comme vous allez pouvoir le constater, l'ajout du firewall a une influence non négligeable sur les performances.
Transfert FTP avec FW
On reprend donc le test précédent et on ajoute les règles de filtrage.
Résultats :
Benchmark avec iPerf
Iperf est un outil permettant de mesurer le throughput d'un réseau, il s'agit donc d'un bon test pour contrôler les performances de notre firewall.
Conclusion
Il sera certainement intéressant de refaire ces tests quand le dernier PF sera porté sous FreeBSD, mais en attendant la différence de performance est telle qu'on peut prendre l'un ou l'autre selon ses préférences.
PF ou Packet Filter est le firewall développé par OpenBSD, puis porté vers divers systèmes d'exploitation, dont FreeBSD.
Comme OpenBSD peut souffrir de problèmes de performances en firewall à forte charge, nous allons étudier dans cet article le remplacement d'un firewall/forwarder de paquets sous OpenBSD par un système FreeBSD pour voir l'éventuel gain de performance que cela peut amener.
Configuration
Matérielle :
- Athlon XP 1800+
- 1Go de ram
- 2 NIC : Realtek et 3Com
Cette configuration relativement ancienne a été choisie afin de mieux apprécier les différences de performances.
Logicielle :
- OpenBSD 4.2
- FreeBSD 7.0 avec scheduler ULE
Les 2 OS ont été compilés avec les optimisations d'usage (-march=athlon-xp...).
Banc de test
L'image suivante montre le plan du réseau :
Les tests de performances se font entre 192.168.100.2 et nas.localdomain ; la gw par défaut étant hell.localdomain, il faut donc ajouter une route sur nas pour assurer le retour des paquets :
# route add -net 192.168.100.0/24 192.168.10.81
On peut vérifier que la route est présente avec netstat :
# netstat -rn | grep 192.168.100.0
192.168.100.0/24 192.168.10.81 UGS 0 0 sis0
192.168.100.0/24 192.168.10.81 UGS 0 0 sis0
Ensuite, pour activer le mode routage (forwarding) sur pffw il convient de jouer avec sysctl :
# sysctl -w net.inet.ip.forwarding=1
(pour que cette configuration résiste au reboot, sous FreeBSD il faut ajouter gateway_enable="YES" dans /etc/rc.conf et sous OpenBSD, il faut décommenter la ligne net.inet.ip.forwarding=1 dans /etc/sysctl.conf.)
Test de routage
Le premier test consistera à faire un transfert FTP de nas à la machine 192.168.100.2 avec pffw configuré en routeur pur. Pendant le transfert, on contrôle plusieurs chose :
- La vitesse de transfert (9700ko/s dans les 2 cas)
- La charge CPU de pffw à l'aide de top
Comme la charge est quelque peu variable, j'ai configuré un refresh de top toutes les cinq secondes et fait une moyenne sur 30 mesures consécutives.
Résultats :
- FreeBSD : 72,3% CPU idle
- OpenBSD : 65,9% CPU idle
Naturellement, la charge CPU est presque totalement du I/O wait au niveau des interfaces réseau.
Test de firewall + routage
Voici les règles de filtrage :
#################################################################
# Interface definitions
in_if = "xl0"
out_if = "rl0"
loopback_if = "lo0"
table <me> const { $in_if , $out_if, $loopback_if }
set limit states 100000
#################################################################
scrub in on $in_if all
scrub in on $out_if all
# Block all by default
block all
# ICMP.
pass in proto icmp all keep state
pass out proto icmp all keep state
## Host rules ##
pass on $loopback_if all
# FTP.
pass in on $out_if proto tcp from any port 20 to $out_if keep state
pass out on $out_if proto tcp from $out_if to any port > 10000 keep state
# SSH from out_if.
pass in on $out_if proto tcp to $out_if port 22 keep state
# DNS.
pass out on $out_if proto udp from $out_if to any port 53 keep state
# DHCP.
pass out on $out_if proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67 keep state
# Connexions sortantes.
pass out on $out_if proto tcp from $out_if to any port {21,22,80,443,5999} keep state
## End host rules ##
## Routing rules ##
# in -> out
pass in on $in_if proto tcp from any to ! <me> port {21,22,80,5001} keep state
pass out on $out_if proto tcp from ! <me> to any port {21,22,80,5001} keep state
# out -> in
pass in on $out_if from any to ! <me> keep state
pass out on $in_if proto tcp from ! <me> to any keep state
## End routing rules ##
# Interface definitions
in_if = "xl0"
out_if = "rl0"
loopback_if = "lo0"
table <me> const { $in_if , $out_if, $loopback_if }
set limit states 100000
#################################################################
scrub in on $in_if all
scrub in on $out_if all
# Block all by default
block all
# ICMP.
pass in proto icmp all keep state
pass out proto icmp all keep state
## Host rules ##
pass on $loopback_if all
# FTP.
pass in on $out_if proto tcp from any port 20 to $out_if keep state
pass out on $out_if proto tcp from $out_if to any port > 10000 keep state
# SSH from out_if.
pass in on $out_if proto tcp to $out_if port 22 keep state
# DNS.
pass out on $out_if proto udp from $out_if to any port 53 keep state
# DHCP.
pass out on $out_if proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67 keep state
# Connexions sortantes.
pass out on $out_if proto tcp from $out_if to any port {21,22,80,443,5999} keep state
## End host rules ##
## Routing rules ##
# in -> out
pass in on $in_if proto tcp from any to ! <me> port {21,22,80,5001} keep state
pass out on $out_if proto tcp from ! <me> to any port {21,22,80,5001} keep state
# out -> in
pass in on $out_if from any to ! <me> keep state
pass out on $in_if proto tcp from ! <me> to any keep state
## End routing rules ##
Il s'agit d'un ruleset assez simple par soucis de lisibilité, cependant, comme vous allez pouvoir le constater, l'ajout du firewall a une influence non négligeable sur les performances.
Transfert FTP avec FW
On reprend donc le test précédent et on ajoute les règles de filtrage.
Résultats :
- FreeBSD : 65,8% CPU idle
- OpenBSD : 64,2% CPU idle
Benchmark avec iPerf
Iperf est un outil permettant de mesurer le throughput d'un réseau, il s'agit donc d'un bon test pour contrôler les performances de notre firewall.
- FreeBSD : 48,9% CPU idle et 90,5Mbit/s de vitesse de transfert
- OpenBSD : 46,1% CPU idle et 90,2Mbit/s de vitesse de transfert
Conclusion
- FreeBSD l'emporte niveau I/O et certainement aussi niveau stack IP
- OpenBSD réduit l'écart quand on active les fonctionnalités de filtrage dans la mesure où FreeBSD 7.0 est livré avec le PF d'OpenBSD 4.1, qui a largement été amélioré pour la 4.2
Il sera certainement intéressant de refaire ces tests quand le dernier PF sera porté sous FreeBSD, mais en attendant la différence de performance est telle qu'on peut prendre l'un ou l'autre selon ses préférences.
Posté le 25/03/08 à 10:30