
Aujourd'hui on installe
FreeBSD et on utilise
DummyNet pour ajouter du temps de latence aux paquets IP et limiter la bande passante.
"dummynet is a flexible tool originally designed for testing networking protocols, and since then (mis)used for bandwidth management."
L'outil était prévu pour tester les protocols et quelqu'un a rajouté (sans doute à l'arrache) le controle de bande passante. Par conséquent ce n'est sans doute pas le meilleur outil mais il a le mérite d'être le plus simple que j'ai trouvé.
J'aurais préféré utiliser
netem sous linux hélas ce dernier ne traite que le flux sortant. Il faut jouer des pieds et des mains pour lui faire traiter les flûx entrant et sortant.
Notons enfin l'article de
Wikipedia sur le sujet: "
Network Emulation".
L'installation de FreeBSD est facile mais en mode texte et demande quelques connaissances informatiques. J'ai installé la version 6.1 RC1 par FTP au travers d'un proxy HTTP. C'est plus rapide de télécharger les 24Mo du
CD-Rom d'installation minimaliste et de faire l'installation par FTP que de télécharger les ISO complètes.
Une fois installé il faut activer le firewall. Dans /etc/rc.conf ajouter les lignes:
- firewall_enable="YES"
- firewall_type="open"
- gateway_enable="YES" #si besoin
... et rebooter. Je n'ai pas cherché les commandes qui permettrait de ne pas rebooter (sans doute sysctl).
En "pingant" la machine j'obtient moins de 1ms sur un réseau 100Mbits avec un taux de transfert de 8Mo/s : une situation normale.
Il faut déjà recompiler le kernel :) Rien d'étonant pour FreeBSD puisque la section "Common Tasks" du
Handbook contient un paragraphe "
Building and Installing a Custom Kernel". Ca m'amuse de trouver la recompilation du kernel dans la section "Tâches courante" :)
Si comme moi vous n'aviez pas installé les sources du kernel il faut utiliser sysinstall (menu > > > ) pour installer le paquet manquant.
Copier le fichier /usr/src/sys/i386/conf/GENERIC dans /usr/src/sys/i386/conf/MYKERNEL, puis rajouter les lignes:
- options IPFIREWALL
- options IPFIREWALL_DEFAULT_TO_ACCEPT
- options IPFIREWALL_FORWARD
- options IPFIREWALL_VERBOSE
- options IPFIREWALL_VERBOSE_LIMIT=100
- options DUMMYNET
- options IPDIVERT
Puis lancer:
- cd /usr/src/sys/i386/conf
- /usr/sbin/config MYKERNEL
- cd ../compile/MYKERNEL
- make cleandepend #si nécessaire
- make depend && make && make install
Un petit reboot plus tard (dans un /etc/rc.local par exemple):
- sysctl net.inet.ip.fw.one_pass=0
- natd -interface rl0 -redirect_port tcp super.host.com:8888 9999 #on redirige le port 9999 de notre machine vers super.host.com:8888
- /sbin/ipfw -f flush
- /sbin/ipfw add pipe 1 ip from any to any
- /sbin/ipfw pipe 1 config bw 128Kbits/s queue 10 delay 200ms
- /sbin/ipfw add divert natd ip from any to any
et voilà tout les accès IP à votre machine (même le localhost) sont limités à 128Kbits/s avec une latence de 200ms. On obtient donc un ping de 400ms et un taux de transfert approximatif de 12Ko/s. La machine peut maintenant être utilisée pour filtrer les accès à super.host.com:9999.
D'autres paramètres peuvent être changé avec DummyNet comme un pourcentage de perte de paquets, de paquets désordonnés, de paquets corrompu ou encore de parquets doublés. On peu aussi simuler des routes variables.