Auteur Sujet: Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm  (Lu 59900 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Tutoriel pour générer des pertes de paquets / latence / gigue sur un équipement avec NetEm

Matériel nécessaire : 2 cartes réseau Ethernet.

Il faut installer Linux Ubuntu (ou Linux Debian), car on va mettre en place un pont afin que les 2 interface Ethernet de ton PC deviennent les 2 ports d'un Switch.

On va commencer par rajouter les paquets nécessaire. Dans la logithèque Ubuntu, il faut installer les logiciels suivants :
- bridge-utils (permet faire le switch virtuel)
- wireshark (pour faire une capture)
Configuration de Wireshark : Pour faire une capture avec wireshark sans le démarrer en root, copiez / collez ces 4 lignes dans un terminal :
sudo addgroup -quiet -system wireshark
sudo chown root:wireshark /usr/bin/dumpcap
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
sudo usermod -a -G wireshark VOTRE_LOGIN
(Note : pensez a changer VOTRE_LOGIN par votre login ubuntu)

Note : Il n'y a rien à installer pour NetEm, il est directement intégré au noyau Linux d'Ubuntu.

Configuration réseau :
Dans un terminal, taper la commande sudo nano -w /etc/network/interfaces
Cela permet d'éditer le fichier de configuration réseau en tant que super-utilisateur.
Le fichier est vide, car la configuration est laissée a un outil graphique plus simple. Pour faire un pont, on est obligé de passer par cet configuration en fichier texte.


# The loopback network interface
auto lo
iface lo inet loopback

#-------------- ETH 0
auto eth0
iface eth0 inet manual

#-------------- ETH 1
auto eth1
iface eth1 inet manual

#-------------- BRIDGE 0

auto br0
iface br0 inet manual
# Si vous avez besoin d'internet sur le PC bridge : commentez la précédente ligne et enlevez le commentaire des 5 lignes suivantes :
#iface br0 inet static
   #address 192.168.1.90
   #netmask 255.255.255.0
   #gateway 192.168.1.254
   #dns-nameservers 192.168.1.254 8.8.8.8
   bridge_ports eth0 eth1
   bridge_stp off
   bridge_fd 0
   bridge_maxwait 0

J'ai commenté L'IP / masque / passerelle car je n'ai pas besoin d'accès Internet. Pour que le PC ait aussi accés à Internet, il suffit de remplire les données et d'enlever les commentaires.

Branchements :
Si on souhaite introduire des pertes de paquets sur un décodeur TV, il faut connecter la box sur un port Ethernet et le décodeur TV sur le second port Ethernet du PC. Redémarrer ensuite le PC. Normalement le décodeur TV devrait fonctionne normalement (par défaut il n'y a ni pertes, ni ping supplèmentaire).

Commande Netm pour générer les pertes sur les paquets émis par l'interface Eth0 :
- Premier lancement avec 1% de paquet perdu :  sudo tc qdisc add dev eth0 root netem loss 1%
- Modification des pertes à 0,3% : sudo tc qdisc change dev eth0 root netem loss 0.3%
- Arrêt des pertes de paquets : sudo tc qdisc change dev eth0 root netem loss 0%

Commande Netm pour générer les pertes sur les paquets émis par l'interface Eth1 :
- Premier lancement avec 1% de paquet perdu :  sudo tc qdisc add dev eth1 root netem loss 1%
- Modification des pertes à 0,3% : sudo tc qdisc change dev eth1 root netem loss 0.3%
- Arrêt des pertes de paquets : sudo tc qdisc change dev eth1 root netem loss 0%

Commande NetEm pour rajouter du délai sur les paquets émis par l'interface Eth0 :
- Premier lancement avec 100ms de latence : sudo tc qdisc add dev eth0 root netem delay 100ms
- Modification de la latence à 10ms : sudo tc qdisc change dev eth0 root netem delay 10ms
- Suppression de la latence supplèmentaire : sudo tc qdisc change dev eth0 root netem delay 0ms

Rajouter de la latence au démarrage d'une machine :
sudo nano /etc/cron.d/latence
Placer la commande cron suivante :

# Ajout de 10ms de latence sur l'interface enp1s0
@reboot root /usr/sbin/tc qdisc add dev enp1s0 root netem delay 10ms
Note: le fichier /etc/cron.d/latence n'a pas besoin d'être executable

Pour aller plus loin avec NetEm : http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

Capture Wireshark :
Il est possible de faire des captures su l'interface br0 mais aussi eth0 et eth1. Pour voir les pertes de paquets générées sur l'interface Eth0, il est nécessaire de faire la capture sur Eth0, les pertes n'étant pas présentes en entrée sur Eth1 ni sur br0.

Pour ceux qui se demandent à quoi correspondent le nom des interface sous Linux, voici un récapitulatif :
- eth0 : première interface Ethernet (ancienne appellation)
- eth1 : seconde interface Ethernet (ancienne appellation)
- em1 : première interface Ethernet intégrée (nouvelle appellation)
- em2 : seconde interface Ethernet intégrée (nouvelle appellation)
- p1p1 : première interface Ethernet de la 1ère carte Ethernet additionnelle (nouvelle appellation)
- p1p2 : seconde interface Ethernet de la 1ère carte Ethernet additionnelle (nouvelle appellation)
- p2p1 : première interface Ethernet de la 2ème carte Ethernet additionnelle (nouvelle appellation)
- wlan0 : première carte Wi-Fi
- br0 : le bridge que l'on va rajouter ci-dessous
- br1 : Second bridge dans le cas où on réalise plusieurs bridge
- lo : LoopBack qui est une interface virtuelle présent sous linux pour que 127.0.0.1 soit ton PC


Note : Pour faire un bridge avec une carte WiFi (pour un PC portable), vous avez un tutoriel là : https://wiki.debian.org/fr/BridgeNetworkConnections


Cet article et les photos qui l'illustrent est publié sous la licence Creative Commons CC BY-SA 4.0, afin de permettre sa diffusion par les autres médias (il faut citer l'auteur, Vivien GUEANT, mettre un lien vers cet article et réutiliser la même licence).
Tutoriel pour comprendre comment reprendre un contenu CC BY-SA 4.0.

vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Autre méthode : Il est également possible de définir des alias pour mettre en place le pont

Commandes :
- pogo        : monter le pont
- postop      : démonter le pont         
- pert        : perturber le flux - arg          
         1) s (si première perturbation)    
         2) port (sortie du pont)      
         3) % perte            

Définition des Alias :


$ alias
alias dir='dir --color=auto'
alias helpme='cat /var/local/doc_alias.txt'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -l'
alias ls='ls --color=auto'
alias pert='sudo /var/local/create_perturbation.sh'
alias pogo='sudo ifconfig eth2 0.0.0.0 up &&
     sudo ifconfig eth0 0.0.0.0 up &&
     sudo brctl addbr br0 &&
     sudo brctl addif br0 eth0 &&
     sudo brctl addif br0 eth2 &&
     sudo ifconfig br0 up'
alias postop='sudo ifconfig br0 down &&
       sudo brctl delif br0 eth0 &&
       sudo brctl delif br0 eth2 &&
       sudo brctl delbr br0
       #sudo ifconfig -dynamic eth0 &&
       sudo ifconfig eth0 up &&
       #sudo ifconfig -dynamic addr eth0 &&
       sudo ifconfig eth2 up'



Fichier /var/local/create_perturbation.sh :

#!/bin/sh

echo "   ----------------------------------   "
echo "   | first use arguments : s eth X% |   "
echo "   | after : eth X%       |   "
echo "   ----------------------------------   "

if [$# = 3]
then
   sudo tc qdisc add dev "$2" root netem loss "$3"%
else
   sudo tc qdisc change dev "$1" root netem loss "$2"%
fi


Configurer un serveur pour qu'il soit à 100ms de + que normalement même aprés un reboot :
(c'est la configuration pour le serveur http://100ms.lafibre.info/ )

sudo nano -w /etc/rc.local

rajouter la ligne
/sbin/tc qdisc add dev eth0 root netem delay 100ms
avant la ligne "exit 0"


vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Configuration réseau d'un PC possédant 2 cartes PCI avec 4 ports ethernet soit un total de 9 ports Ethernet.

Eth0 - carte réseau intégré au PC : Pour l’accès  à Internet sur le PC
Eth1 et Eth5 (premier port de chaque carte PCI) : Premier swith (br0) pour perturber un premier équipement
Eth2 et Eth6 (second port de chaque carte PCI) : Second swith (br1) pour perturber un premier équipement
Eth3 et Eth7 : Troisième switch (br2)
Eth4 et Eth8 : Quatrième switch(br3)


auto lo
iface lo inet loopback

#-------------- ETH 0
#auto eth0
#iface eth0 inet dhcp

auto eth0
iface eth0 inet static
address 192.168.1.101
netmask 255.255.255.0
gateway 192.168.1.254


#-------------- BRIDGE 0

auto eth1
iface eth1 inet manual

auto eth5
iface eth5 inet manual

auto br0
iface br0 inet manual
bridge_ports eth1 eth5
bridge_stp off
bridge_fd 0
bridge_maxwait 0


#-------------- BRIDGE 1

auto eth2
iface eth2 inet manual

auto eth6
iface eth6 inet manual

auto br1
iface br1 inet manual
bridge_ports eth2 eth6
bridge_stp off
bridge_fd 0
bridge_maxwait 0


#-------------- BRIDGE 2

auto eth3
iface eth3 inet manual

auto eth7
iface eth7 inet manual

auto br2
iface br2 inet manual
bridge_ports eth3 eth7
bridge_stp off
bridge_fd 0
bridge_maxwait 0


#-------------- BRIDGE 3

auto eth4
iface eth4 inet manual

auto eth8
iface eth8 inet manual

auto br3
iface br3 inet manual
bridge_ports eth4 eth8
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Grincheux

  • Technicien agréé Orange et Bouygues Telecom
  • Abonné Orange adsl
  • *
  • Messages: 131
  • Mathenay (39)
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #3 le: 12 août 2011 à 22:39:05 »
Je vais approfondir NetEm, c'est hard et Linux j'aime pas. Je viens d'installer Ubuntu 11 la semaine dernière, je vais tester.

Un MTU de 1500 ne me semble pas optimum. Le mien en général est de 1442.

vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #4 le: 12 août 2011 à 22:58:28 »
Sur ton ubuntu lance simplement la commande sudo tc qdisc add dev eth0 root netem delay 100ms dans un terminal et tu vas voir que ta latence à pris 100ms de plus.

Le tuto avec les 2 cartes Ethernet c'est si tu souhaite rajouter de la latence (ou des pertes de paquets) à un 2ème PC.

J'ai compris que tu n'aimais pas trop la ligne de commande : ne t’inquiète pas il est possible de s'en passer pour un usage classique de Linux, maintenant cela permet des fonctions avancées (qui généralement n'existent pas avec Windows).

Grincheux

  • Technicien agréé Orange et Bouygues Telecom
  • Abonné Orange adsl
  • *
  • Messages: 131
  • Mathenay (39)
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #5 le: 12 août 2011 à 23:04:43 »
Je ferai des essais ce week-end.

corrector

  • Invité
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #6 le: 14 août 2011 à 00:41:55 »
Je vais approfondir NetEm, c'est hard et Linux j'aime pas.
En quoi si ce n'est pas indiscret?

Grincheux

  • Technicien agréé Orange et Bouygues Telecom
  • Abonné Orange adsl
  • *
  • Messages: 131
  • Mathenay (39)
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #7 le: 14 août 2011 à 09:42:14 »
Je n'aime pas Linux et mes connaissances en réseau / téléphonie sont très loin des votres.

bdecagny

  • Invité
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #8 le: 06 septembre 2011 à 16:01:41 »
FYI

pour ce qui est de la perte de paquet, Netem est effectivement fonctionnel mais peut poser des problèmes si on souhaite avoir un effet un peu plus complexe et maitrisé.
En effet, l'option de correlation est relativement obscure et peu fonctionnelle (même buggée si on écoute certaines personnes sur le net)
Une solution possible est une évolution de Netem qu'un petit groupe a développé nommée NetemCLG.
Cette version est fonctionnelle et permet de générer des bursts de pertes de façon très précise.
Seul inconvéniant : il faut appliquer les patchs aux sources de tc et iproute2 et recompiler un kernel.
OK et testé sur kernel 2.6.32.46

http://netgroup.uniroma2.it/twiki/bin/view.cgi/Main/NetemCLG

Enjoy !!

vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #9 le: 16 décembre 2013 à 11:45:00 »
Perdre des paquets sur l'IP $1 pendant une durée $2 :

Voici un petit script pour supprimer l'intégralité des paquets d'une IP $1 pendant une durée $2
#!/bin/dash
/sbin/iptables -A FORWARD -d $1 -j DROP
/bin/sleep $2
/sbin/iptables -F


Voici un petit script pour supprimer l'intégralité des paquets UDP pendant une durée $1
#!/bin/dash
/sbin/iptables -A FORWARD -p udp -j DROP
/bin/sleep $1
/sbin/iptables -F


Voici un petit script pour supprimer l'intégralité des paquets pendant une durée $1
#!/bin/dash
/sbin/iptables -A FORWARD -j DROP
/bin/sleep $1
/sbin/iptables -F

corrector

  • Invité
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #10 le: 16 décembre 2013 à 12:57:50 »
Attention, ça supprime aussi les autres règles!

vivien

  • Administrateur
  • *
  • Messages: 47 079
    • Twitter LaFibre.info
Tutoriel pour générer des pertes de paquets / latence / gigue avec NetEm
« Réponse #11 le: 14 mars 2017 à 15:02:28 »
J'ai un petit souci : la commande iptables -A FORWARD -j DROP ne permet plus de droper les paquets qui passent sur mon pont.

J'ai un PC portable (Ubuntu 16.04.2) avec deux cartes réseaux : enp4s0 et enp9s0
J'ai mis un pont entre ces deux ports : bridge_ports enp4s0 enp9s0

Le flux passe bien dans les deux sens, mais impossible de lui appliquer des règles iptables comme iptables -A FORWARD -j DROP qui devrait bloquer le flux.

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

#-------------- Carte Interne
auto enp9s0
iface enp9s0 inet manual

#-------------- Carte Externe
auto enp4s0
iface enp4s0 inet manual

#-------------- BRIDGE 0
auto br0
iface br0 inet static
   address 192.168.1.90
   netmask 255.255.255.0
   gateway 192.168.1.254
   dns-nameservers 192.168.1.254 8.8.8.8
   bridge_ports enp4s0 enp9s0
   bridge_stp off
   bridge_fd 0
   bridge_maxwait 0